ACPI / video: Move backlight notifier to video_detect.c
authorHans de Goede <hdegoede@redhat.com>
Tue, 16 Jun 2015 14:27:52 +0000 (16:27 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 18 Jun 2015 23:11:04 +0000 (01:11 +0200)
Move the unregistering of the acpi backlight interface on registering of a
native backlight from video.c to video_detect.c where it belongs.

Note this removes support for re-registering the acpi backlight interface
when the native interface goes away. In practice this never happens and
it needlessly complicates the code.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Acked-by: Darren Hart <dvhart@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpi_video.c
drivers/acpi/video_detect.c

index bba0d875334a3cc50564c76bddfa49c38e13c779..23490f04589534d03cb61af939bdc84a2898dfa3 100644 (file)
@@ -87,6 +87,7 @@ static struct list_head video_bus_head;
 static int acpi_video_bus_add(struct acpi_device *device);
 static int acpi_video_bus_remove(struct acpi_device *device);
 static void acpi_video_bus_notify(struct acpi_device *device, u32 event);
+void acpi_video_detect_exit(void);
 
 static const struct acpi_device_id video_device_ids[] = {
        {ACPI_VIDEO_HID, 0},
@@ -146,7 +147,6 @@ struct acpi_video_enumerated_device {
 struct acpi_video_bus {
        struct acpi_device *device;
        bool backlight_registered;
-       bool backlight_notifier_registered;
        u8 dos_setting;
        struct acpi_video_enumerated_device *attached_array;
        u8 attached_count;
@@ -159,7 +159,6 @@ struct acpi_video_bus {
        struct input_dev *input;
        char phys[32];  /* for input device */
        struct notifier_block pm_nb;
-       struct notifier_block backlight_nb;
 };
 
 struct acpi_video_device_flags {
@@ -1814,59 +1813,6 @@ static void acpi_video_bus_remove_notify_handler(struct acpi_video_bus *video)
        video->input = NULL;
 }
 
-static int acpi_video_backlight_notify(struct notifier_block *nb,
-                                       unsigned long val, void *bd)
-{
-       struct backlight_device *backlight = bd;
-       struct acpi_video_bus *video;
-       enum acpi_backlight_type type;
-
-       /* A raw bl (un)registering may change native <-> video */
-       if (backlight->props.type != BACKLIGHT_RAW)
-               return NOTIFY_DONE;
-
-       video = container_of(nb, struct acpi_video_bus, backlight_nb);
-       type = acpi_video_get_backlight_type();
-
-       switch (val) {
-       case BACKLIGHT_REGISTERED:
-               if (type != acpi_backlight_video)
-                       acpi_video_bus_unregister_backlight(video);
-               break;
-       case BACKLIGHT_UNREGISTERED:
-               if (type == acpi_backlight_video)
-                       acpi_video_bus_register_backlight(video);
-               break;
-       }
-
-       return NOTIFY_OK;
-}
-
-static int acpi_video_bus_add_backlight_notify_handler(
-                                               struct acpi_video_bus *video)
-{
-       int error;
-
-       video->backlight_nb.notifier_call = acpi_video_backlight_notify;
-       video->backlight_nb.priority = 0;
-       error = backlight_register_notifier(&video->backlight_nb);
-       if (error == 0)
-               video->backlight_notifier_registered = true;
-
-       return error;
-}
-
-static int acpi_video_bus_remove_backlight_notify_handler(
-                                               struct acpi_video_bus *video)
-{
-       if (!video->backlight_notifier_registered)
-               return 0;
-
-       video->backlight_notifier_registered = false;
-
-       return backlight_unregister_notifier(&video->backlight_nb);
-}
-
 static int acpi_video_bus_put_devices(struct acpi_video_bus *video)
 {
        struct acpi_video_device *dev, *next;
@@ -1948,7 +1894,6 @@ static int acpi_video_bus_add(struct acpi_device *device)
 
        acpi_video_bus_register_backlight(video);
        acpi_video_bus_add_notify_handler(video);
-       acpi_video_bus_add_backlight_notify_handler(video);
 
        return 0;
 
@@ -1972,7 +1917,6 @@ static int acpi_video_bus_remove(struct acpi_device *device)
 
        video = acpi_driver_data(device);
 
-       acpi_video_bus_remove_backlight_notify_handler(video);
        acpi_video_bus_remove_notify_handler(video);
        acpi_video_bus_unregister_backlight(video);
        acpi_video_bus_put_devices(video);
@@ -2108,6 +2052,7 @@ static int __init acpi_video_init(void)
 
 static void __exit acpi_video_exit(void)
 {
+       acpi_video_detect_exit();
        acpi_video_unregister();
 
        return;
index d024ea02e639cf55f6a4040826d6e469fff72a52..0df15673eed206eb2337ececca140dba219f5987 100644 (file)
@@ -37,6 +37,9 @@
 ACPI_MODULE_NAME("video");
 #define _COMPONENT             ACPI_VIDEO_COMPONENT
 
+static bool backlight_notifier_registered;
+static struct notifier_block backlight_nb;
+
 static enum acpi_backlight_type acpi_backlight_cmdline = acpi_backlight_undef;
 static enum acpi_backlight_type acpi_backlight_dmi = acpi_backlight_undef;
 
@@ -257,6 +260,20 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
        { },
 };
 
+static int acpi_video_backlight_notify(struct notifier_block *nb,
+                                      unsigned long val, void *bd)
+{
+       struct backlight_device *backlight = bd;
+
+       /* A raw bl registering may change video -> native */
+       if (backlight->props.type == BACKLIGHT_RAW &&
+           val == BACKLIGHT_REGISTERED &&
+           acpi_video_get_backlight_type() != acpi_backlight_video)
+               acpi_video_unregister_backlight();
+
+       return NOTIFY_OK;
+}
+
 /*
  * Determine which type of backlight interface to use on this system,
  * First check cmdline, then dmi quirks, then do autodetect.
@@ -285,6 +302,10 @@ enum acpi_backlight_type acpi_video_get_backlight_type(void)
                acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
                                    ACPI_UINT32_MAX, find_video, NULL,
                                    &video_caps, NULL);
+               backlight_nb.notifier_call = acpi_video_backlight_notify;
+               backlight_nb.priority = 0;
+               if (backlight_register_notifier(&backlight_nb) == 0)
+                       backlight_notifier_registered = true;
                init_done = true;
        }
        mutex_unlock(&init_mutex);
@@ -349,3 +370,9 @@ int acpi_video_backlight_support(void)
        return acpi_video_get_backlight_type() != acpi_backlight_vendor;
 }
 EXPORT_SYMBOL(acpi_video_backlight_support);
+
+void __exit acpi_video_detect_exit(void)
+{
+       if (backlight_notifier_registered)
+               backlight_unregister_notifier(&backlight_nb);
+}