backlight: apple_bl: Use acpi_video_get_backlight_type()
authorHans de Goede <hdegoede@redhat.com>
Tue, 7 Mar 2023 12:05:40 +0000 (13:05 +0100)
committerHans de Goede <hdegoede@redhat.com>
Thu, 16 Mar 2023 12:33:11 +0000 (13:33 +0100)
On some MacBooks both the apple_bl and the apple-gmux backlight drivers
may be able to export a /sys/class/backlight device.

To avoid having 2 backlight devices for one LCD panel until now
the apple-gmux driver has been calling apple_bl_unregister() to move
the apple_bl backlight device out of the way when it loads.

Similar problems exist on other x86 laptops and all backlight drivers
which may be used on x86 laptops have moved to using
acpi_video_get_backlight_type() to determine whether they should load
or not.

Switch apple_bl to this model too, so that it is consistent with all
the other x86 backlight drivers.

Besides code-simplification and consistency this has 2 other benefits:

1) It removes a race during boot where userspace will briefly see
   an apple_bl backlight and then have it disappear again, leading to e.g.:
   https://bbs.archlinux.org/viewtopic.php?id=269920

2) This allows user to switch between the drivers by passing
   acpi_backlight=apple_gmux or acpi_backlight=vendor on the kernel
   commandline.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org>
Acked-by: Lee Jones <lee@kernel.org>
Link: https://lore.kernel.org/r/20230307120540.389920-1-hdegoede@redhat.com
drivers/platform/x86/Kconfig
drivers/platform/x86/apple-gmux.c
drivers/video/backlight/Kconfig
drivers/video/backlight/apple_bl.c
include/linux/apple_bl.h [deleted file]

index ec7c2b4e1721cd14cc000bd8bf3cd7d9587220b6..1b3189d6e8d20fd1046602d98ad00c9d6d795f18 100644 (file)
@@ -213,7 +213,6 @@ config APPLE_GMUX
        depends on ACPI && PCI
        depends on PNP
        depends on BACKLIGHT_CLASS_DEVICE
-       depends on BACKLIGHT_APPLE=n || BACKLIGHT_APPLE
        help
          This driver provides support for the gmux device found on many
          Apple laptops, which controls the display mux for the hybrid
index 8aa81a3517b13ec0f6c77d51d8ae25322b92b7d4..4c311e1dedad4f37f1f06dc6b9f5da65b0a1739d 100644 (file)
@@ -16,7 +16,6 @@
 #include <linux/backlight.h>
 #include <linux/acpi.h>
 #include <linux/pnp.h>
-#include <linux/apple_bl.h>
 #include <linux/apple-gmux.h>
 #include <linux/slab.h>
 #include <linux/delay.h>
@@ -883,14 +882,6 @@ get_version:
                gmux_data->bdev = bdev;
                bdev->props.brightness = gmux_get_brightness(bdev);
                backlight_update_status(bdev);
-
-               /*
-                * The backlight situation on Macs is complicated. If the gmux is
-                * present it's the best choice, because it always works for
-                * backlight control and supports more levels than other options.
-                * Disable the other backlight choices.
-                */
-               apple_bl_unregister();
        }
 
        gmux_data->power_state = VGA_SWITCHEROO_ON;
@@ -1007,8 +998,6 @@ static void gmux_remove(struct pnp_dev *pnp)
                release_region(gmux_data->iostart, gmux_data->iolen);
        apple_gmux_data = NULL;
        kfree(gmux_data);
-
-       apple_bl_register();
 }
 
 static const struct pnp_device_id gmux_device_ids[] = {
index 4c33e971c0f0eb8355e48ac51a86d38bee0519d1..51387b1ef012a118c9ad54c2d19bf97d58805d65 100644 (file)
@@ -285,6 +285,7 @@ config BACKLIGHT_MT6370
 config BACKLIGHT_APPLE
        tristate "Apple Backlight Driver"
        depends on X86 && ACPI
+       depends on ACPI_VIDEO=n || ACPI_VIDEO
        help
          If you have an Intel-based Apple say Y to enable a driver for its
          backlight.
index e9e7acb577bfad513a7da6710444e29d0db432fb..aaa824437a2ae4d27e8aabe6db042494e8ebcb20 100644 (file)
@@ -24,7 +24,7 @@
 #include <linux/pci.h>
 #include <linux/acpi.h>
 #include <linux/atomic.h>
-#include <linux/apple_bl.h>
+#include <acpi/video.h>
 
 static struct backlight_device *apple_backlight_device;
 
@@ -215,32 +215,21 @@ static struct acpi_driver apple_bl_driver = {
        },
 };
 
-static atomic_t apple_bl_registered = ATOMIC_INIT(0);
-
-int apple_bl_register(void)
-{
-       if (atomic_xchg(&apple_bl_registered, 1) == 0)
-               return acpi_bus_register_driver(&apple_bl_driver);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(apple_bl_register);
-
-void apple_bl_unregister(void)
-{
-       if (atomic_xchg(&apple_bl_registered, 0) == 1)
-               acpi_bus_unregister_driver(&apple_bl_driver);
-}
-EXPORT_SYMBOL_GPL(apple_bl_unregister);
-
 static int __init apple_bl_init(void)
 {
-       return apple_bl_register();
+       /*
+        * Use ACPI video detection code to see if this driver should register
+        * or if another driver, e.g. the apple-gmux driver should be used.
+        */
+       if (acpi_video_get_backlight_type() != acpi_backlight_vendor)
+               return -ENODEV;
+
+       return acpi_bus_register_driver(&apple_bl_driver);
 }
 
 static void __exit apple_bl_exit(void)
 {
-       apple_bl_unregister();
+       acpi_bus_unregister_driver(&apple_bl_driver);
 }
 
 module_init(apple_bl_init);
diff --git a/include/linux/apple_bl.h b/include/linux/apple_bl.h
deleted file mode 100644 (file)
index 445af2e..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * apple_bl exported symbols
- */
-
-#ifndef _LINUX_APPLE_BL_H
-#define _LINUX_APPLE_BL_H
-
-#if defined(CONFIG_BACKLIGHT_APPLE) || defined(CONFIG_BACKLIGHT_APPLE_MODULE)
-
-extern int apple_bl_register(void);
-extern void apple_bl_unregister(void);
-
-#else /* !CONFIG_BACKLIGHT_APPLE */
-
-static inline int apple_bl_register(void)
-{
-       return 0;
-}
-
-static inline void apple_bl_unregister(void)
-{
-}
-
-#endif /* !CONFIG_BACKLIGHT_APPLE */
-
-#endif /* _LINUX_APPLE_BL_H */