Framebuffer drivers for devices with dedicated backlight are supposed
to set struct fb_info.bl_dev to the backlight's respective device. Use
the value to match backlight and framebuffer in the backlight core code.

Signed-off-by: Thomas Zimmermann <tzimmerm...@suse.de>
Reviewed-by: Daniel Thompson <daniel.thomp...@linaro.org>
Reviewed-by: Javier Martinez Canillas <javi...@redhat.com>
---
 drivers/video/backlight/backlight.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/video/backlight/backlight.c 
b/drivers/video/backlight/backlight.c
index 86e1cdc8e3697..48844a4f28ad3 100644
--- a/drivers/video/backlight/backlight.c
+++ b/drivers/video/backlight/backlight.c
@@ -98,7 +98,8 @@ static int fb_notifier_callback(struct notifier_block *self,
 {
        struct backlight_device *bd;
        struct fb_event *evdata = data;
-       int node = evdata->info->node;
+       struct fb_info *info = evdata->info;
+       int node = info->node;
        int fb_blank = 0;
 
        /* If we aren't interested in this event, skip it immediately ... */
@@ -110,8 +111,12 @@ static int fb_notifier_callback(struct notifier_block 
*self,
 
        if (!bd->ops)
                goto out;
-       if (bd->ops->check_fb && !bd->ops->check_fb(bd, evdata->info))
+       else if (bd->ops->check_fb && !bd->ops->check_fb(bd, info))
                goto out;
+#if IS_ENABLED(CONFIG_FB_BACKLIGHT)
+       else if (info->bl_dev && info->bl_dev != bd)
+               goto out;
+#endif
 
        fb_blank = *(int *)evdata->data;
        if (fb_blank == FB_BLANK_UNBLANK && !bd->fb_bl_on[node]) {
-- 
2.43.0

Reply via email to