|
@@ -608,16 +608,16 @@ void intel_opregion_asle_intr(struct drm_i915_private *dev_priv)
|
|
|
#define ACPI_EV_LID (1<<1)
|
|
|
#define ACPI_EV_DOCK (1<<2)
|
|
|
|
|
|
-static struct intel_opregion *system_opregion;
|
|
|
-
|
|
|
+/*
|
|
|
+ * The only video events relevant to opregion are 0x80. These indicate either a
|
|
|
+ * docking event, lid switch or display switch request. In Linux, these are
|
|
|
+ * handled by the dock, button and video drivers.
|
|
|
+ */
|
|
|
static int intel_opregion_video_event(struct notifier_block *nb,
|
|
|
unsigned long val, void *data)
|
|
|
{
|
|
|
- /* The only video events relevant to opregion are 0x80. These indicate
|
|
|
- either a docking event, lid switch or display switch request. In
|
|
|
- Linux, these are handled by the dock, button and video drivers.
|
|
|
- */
|
|
|
-
|
|
|
+ struct intel_opregion *opregion = container_of(nb, struct intel_opregion,
|
|
|
+ acpi_notifier);
|
|
|
struct acpi_bus_event *event = data;
|
|
|
struct opregion_acpi *acpi;
|
|
|
int ret = NOTIFY_OK;
|
|
@@ -625,10 +625,7 @@ static int intel_opregion_video_event(struct notifier_block *nb,
|
|
|
if (strcmp(event->device_class, ACPI_VIDEO_CLASS) != 0)
|
|
|
return NOTIFY_DONE;
|
|
|
|
|
|
- if (!system_opregion)
|
|
|
- return NOTIFY_DONE;
|
|
|
-
|
|
|
- acpi = system_opregion->acpi;
|
|
|
+ acpi = opregion->acpi;
|
|
|
|
|
|
if (event->type == 0x80 && ((acpi->cevt & 1) == 0))
|
|
|
ret = NOTIFY_BAD;
|
|
@@ -638,10 +635,6 @@ static int intel_opregion_video_event(struct notifier_block *nb,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static struct notifier_block intel_opregion_notifier = {
|
|
|
- .notifier_call = intel_opregion_video_event,
|
|
|
-};
|
|
|
-
|
|
|
/*
|
|
|
* Initialise the DIDL field in opregion. This passes a list of devices to
|
|
|
* the firmware. Values are defined by section B.4.2 of the ACPI specification
|
|
@@ -797,8 +790,8 @@ void intel_opregion_register(struct drm_i915_private *dev_priv)
|
|
|
opregion->acpi->csts = 0;
|
|
|
opregion->acpi->drdy = 1;
|
|
|
|
|
|
- system_opregion = opregion;
|
|
|
- register_acpi_notifier(&intel_opregion_notifier);
|
|
|
+ opregion->acpi_notifier.notifier_call = intel_opregion_video_event;
|
|
|
+ register_acpi_notifier(&opregion->acpi_notifier);
|
|
|
}
|
|
|
|
|
|
if (opregion->asle) {
|
|
@@ -822,8 +815,8 @@ void intel_opregion_unregister(struct drm_i915_private *dev_priv)
|
|
|
if (opregion->acpi) {
|
|
|
opregion->acpi->drdy = 0;
|
|
|
|
|
|
- system_opregion = NULL;
|
|
|
- unregister_acpi_notifier(&intel_opregion_notifier);
|
|
|
+ unregister_acpi_notifier(&opregion->acpi_notifier);
|
|
|
+ opregion->acpi_notifier.notifier_call = NULL;
|
|
|
}
|
|
|
|
|
|
/* just clear all opregion memory pointers now */
|