On Tuesday, October 08, 2013 02:39:58 PM Aaron Lu wrote: > Introduce a new API for modules to query if a specific type of backlight > device has been registered. This is useful for some backlight device > provider module(e.g. ACPI video) to know if a native control > interface(e.g. the interface created by i915) is available and then do > things accordingly(e.g. avoid register its own on Win8 systems). > > Signed-off-by: Aaron Lu <aaron.lu@xxxxxxxxx> > Tested-by: Igor Gnatenko <i.gnatenko.brain@xxxxxxxxx> > Tested-by: Yves-Alexis Perez <corsac@xxxxxxxxxx> > Tested-by: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx> > --- > drivers/video/backlight/backlight.c | 31 +++++++++++++++++++++++++++++++ > include/linux/backlight.h | 4 ++++ > 2 files changed, 35 insertions(+) > > diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c > index 94a403a..bf2d71d 100644 > --- a/drivers/video/backlight/backlight.c > +++ b/drivers/video/backlight/backlight.c > @@ -21,6 +21,9 @@ > #include <asm/backlight.h> > #endif > > +static struct list_head bd_list_head; > +static struct mutex bd_list_mutex; I'd prefer these two things to be called backlight_dev_list and backlight_dev_list_mutex, respectively. > + > static const char *const backlight_types[] = { > [BACKLIGHT_RAW] = "raw", > [BACKLIGHT_PLATFORM] = "platform", > @@ -349,10 +352,32 @@ struct backlight_device *backlight_device_register(const char *name, > mutex_unlock(&pmac_backlight_mutex); > #endif > > + mutex_lock(&bd_list_mutex); > + list_add(&new_bd->entry, &bd_list_head); > + mutex_unlock(&bd_list_mutex); > + > return new_bd; > } > EXPORT_SYMBOL(backlight_device_register); > > +bool backlight_device_registered(enum backlight_type type) > +{ > + bool found = false; > + struct backlight_device *bd; > + > + mutex_lock(&bd_list_mutex); > + list_for_each_entry(bd, &bd_list_head, entry) { > + if (bd->props.type == type) { > + found = true; > + break; > + } > + } Isn't it useful to be able to register more than one backlight device of the same type sometimes? > + mutex_unlock(&bd_list_mutex); > + > + return found; > +} > +EXPORT_SYMBOL(backlight_device_registered); > + > /** > * backlight_device_unregister - unregisters a backlight device object. > * @bd: the backlight device object to be unregistered and freed. > @@ -364,6 +389,10 @@ void backlight_device_unregister(struct backlight_device *bd) > if (!bd) > return; > > + mutex_lock(&bd_list_mutex); > + list_del(&bd->entry); > + mutex_unlock(&bd_list_mutex); > + > #ifdef CONFIG_PMAC_BACKLIGHT > mutex_lock(&pmac_backlight_mutex); > if (pmac_backlight == bd) > @@ -499,6 +528,8 @@ static int __init backlight_class_init(void) > > backlight_class->dev_groups = bl_device_groups; > backlight_class->pm = &backlight_class_dev_pm_ops; > + INIT_LIST_HEAD(&bd_list_head); > + mutex_init(&bd_list_mutex); > return 0; > } > > diff --git a/include/linux/backlight.h b/include/linux/backlight.h > index 53b7794..5f9cd96 100644 > --- a/include/linux/backlight.h > +++ b/include/linux/backlight.h > @@ -100,6 +100,9 @@ struct backlight_device { > /* The framebuffer notifier block */ > struct notifier_block fb_notif; > > + /* list entry of all registered backlight devices */ > + struct list_head entry; > + > struct device dev; > }; > > @@ -123,6 +126,7 @@ extern void devm_backlight_device_unregister(struct device *dev, > struct backlight_device *bd); > extern void backlight_force_update(struct backlight_device *bd, > enum backlight_update_reason reason); > +extern bool backlight_device_registered(enum backlight_type type); > > #define to_backlight_device(obj) container_of(obj, struct backlight_device, dev) Thanks! -- I speak only for myself. Rafael J. Wysocki, Intel Open Source Technology Center. -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html