diff options
Diffstat (limited to 'freed-ora/current/f20/backlight-Add-backlight-device-un-registration-notif.patch')
-rw-r--r-- | freed-ora/current/f20/backlight-Add-backlight-device-un-registration-notif.patch | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/freed-ora/current/f20/backlight-Add-backlight-device-un-registration-notif.patch b/freed-ora/current/f20/backlight-Add-backlight-device-un-registration-notif.patch new file mode 100644 index 000000000..a411bb9cb --- /dev/null +++ b/freed-ora/current/f20/backlight-Add-backlight-device-un-registration-notif.patch @@ -0,0 +1,132 @@ +Bugzilla: 1093171 +Upstream-status: Queued for 3.16 + +From ee515e61a002b4d571407173ac8bbadadc114cf0 Mon Sep 17 00:00:00 2001 +From: Hans de Goede <hdegoede@redhat.com> +Date: Mon, 2 Jun 2014 17:41:08 +0200 +Subject: [PATCH 11/14] backlight: Add backlight device (un)registration + notification + +Some firmware drivers, ie acpi-video want to get themselves out of the +way (in some cases) when their also is a raw backlight device available. + +Due to module loading ordering being unknown, acpi-video cannot be certain +that the backlight_device_registered(BACKLIGHT_RAW) it does for this is +the final verdict wrt there being a BACKLIGHT_RAW device. + +By adding notification acpi-video can listen for backlight devices showing +up after it has loaded, and unregister its backlight device if desired. + +Signed-off-by: Hans de Goede <hdegoede@redhat.com> +--- + drivers/video/backlight/backlight.c | 40 +++++++++++++++++++++++++++++++++++++ + include/linux/backlight.h | 7 +++++++ + 2 files changed, 47 insertions(+) + +diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c +index bd2172c2d650..428089009cd5 100644 +--- a/drivers/video/backlight/backlight.c ++++ b/drivers/video/backlight/backlight.c +@@ -23,6 +23,7 @@ + + static struct list_head backlight_dev_list; + static struct mutex backlight_dev_list_mutex; ++static struct blocking_notifier_head backlight_notifier; + + static const char *const backlight_types[] = { + [BACKLIGHT_RAW] = "raw", +@@ -370,6 +371,9 @@ struct backlight_device *backlight_device_register(const char *name, + list_add(&new_bd->entry, &backlight_dev_list); + mutex_unlock(&backlight_dev_list_mutex); + ++ blocking_notifier_call_chain(&backlight_notifier, ++ BACKLIGHT_REGISTERED, new_bd); ++ + return new_bd; + } + EXPORT_SYMBOL(backlight_device_register); +@@ -413,6 +417,10 @@ void backlight_device_unregister(struct backlight_device *bd) + pmac_backlight = NULL; + mutex_unlock(&pmac_backlight_mutex); + #endif ++ ++ blocking_notifier_call_chain(&backlight_notifier, ++ BACKLIGHT_UNREGISTERED, bd); ++ + mutex_lock(&bd->ops_lock); + bd->ops = NULL; + mutex_unlock(&bd->ops_lock); +@@ -438,6 +446,36 @@ static int devm_backlight_device_match(struct device *dev, void *res, + } + + /** ++ * backlight_register_notifier - get notified of backlight (un)registration ++ * @nb: notifier block with the notifier to call on backlight (un)registration ++ * ++ * @return 0 on success, otherwise a negative error code ++ * ++ * Register a notifier to get notified when backlight devices get registered ++ * or unregistered. ++ */ ++int backlight_register_notifier(struct notifier_block *nb) ++{ ++ return blocking_notifier_chain_register(&backlight_notifier, nb); ++} ++EXPORT_SYMBOL(backlight_register_notifier); ++ ++/** ++ * backlight_unregister_notifier - unregister a backlight notifier ++ * @nb: notifier block to unregister ++ * ++ * @return 0 on success, otherwise a negative error code ++ * ++ * Register a notifier to get notified when backlight devices get registered ++ * or unregistered. ++ */ ++int backlight_unregister_notifier(struct notifier_block *nb) ++{ ++ return blocking_notifier_chain_unregister(&backlight_notifier, nb); ++} ++EXPORT_SYMBOL(backlight_unregister_notifier); ++ ++/** + * devm_backlight_device_register - resource managed backlight_device_register() + * @dev: the device to register + * @name: the name of the device +@@ -544,6 +582,8 @@ static int __init backlight_class_init(void) + backlight_class->pm = &backlight_class_dev_pm_ops; + INIT_LIST_HEAD(&backlight_dev_list); + mutex_init(&backlight_dev_list_mutex); ++ BLOCKING_INIT_NOTIFIER_HEAD(&backlight_notifier); ++ + return 0; + } + +diff --git a/include/linux/backlight.h b/include/linux/backlight.h +index 72647429adf6..adb14a8616df 100644 +--- a/include/linux/backlight.h ++++ b/include/linux/backlight.h +@@ -40,6 +40,11 @@ enum backlight_type { + BACKLIGHT_TYPE_MAX, + }; + ++enum backlight_notification { ++ BACKLIGHT_REGISTERED, ++ BACKLIGHT_UNREGISTERED, ++}; ++ + struct backlight_device; + struct fb_info; + +@@ -133,6 +138,8 @@ extern void devm_backlight_device_unregister(struct device *dev, + extern void backlight_force_update(struct backlight_device *bd, + enum backlight_update_reason reason); + extern bool backlight_device_registered(enum backlight_type type); ++extern int backlight_register_notifier(struct notifier_block *nb); ++extern int backlight_unregister_notifier(struct notifier_block *nb); + + #define to_backlight_device(obj) container_of(obj, struct backlight_device, dev) + +-- +1.9.0 + |