Skip to content

Commit

Permalink
[PATCH] backlight: lcd: Remove dependenct from the framebuffer layer
Browse files Browse the repository at this point in the history
The backlight layer should be independent from the framebuffer layer.  It
can use the services offered by the framebuffer, but its absence should not
prevent the backlight/lcd layer from functioning.

[akpm@osdl.org: cleanups]
Signed-off-by: James Simmons <jsimmons@infradead.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
James Simmons authored and Linus Torvalds committed Dec 8, 2006
1 parent b5bd1ce commit 3d5eead
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 61 deletions.
87 changes: 55 additions & 32 deletions drivers/video/backlight/backlight.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,59 @@
#include <linux/err.h>
#include <linux/fb.h>


#if defined(CONFIG_FB) || (defined(CONFIG_FB_MODULE) && \
defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE))
/* This callback gets called when something important happens inside a
* framebuffer driver. We're looking if that important event is blanking,
* and if it is, we're switching backlight power as well ...
*/
static int fb_notifier_callback(struct notifier_block *self,
unsigned long event, void *data)
{
struct backlight_device *bd;
struct fb_event *evdata = data;

/* If we aren't interested in this event, skip it immediately ... */
if (event != FB_EVENT_BLANK)
return 0;

bd = container_of(self, struct backlight_device, fb_notif);
down(&bd->sem);
if (bd->props)
if (!bd->props->check_fb ||
bd->props->check_fb(evdata->info)) {
bd->props->fb_blank = *(int *)evdata->data;
if (likely(bd->props && bd->props->update_status))
bd->props->update_status(bd);
}
up(&bd->sem);
return 0;
}

static int backlight_register_fb(struct backlight_device *bd)
{
memset(&bd->fb_notif, 0, sizeof(bd->fb_notif));
bd->fb_notif.notifier_call = fb_notifier_callback;

return fb_register_client(&bd->fb_notif);
}

static void backlight_unregister_fb(struct backlight_device *bd)
{
fb_unregister_client(&bd->fb_notif);
}
#else
static inline int backlight_register_fb(struct backlight_device *bd)
{
return 0;
}

static inline void backlight_unregister_fb(struct backlight_device *bd)
{
}
#endif /* CONFIG_FB */

static ssize_t backlight_show_power(struct class_device *cdev, char *buf)
{
int rc = -ENXIO;
Expand Down Expand Up @@ -151,33 +204,6 @@ static const struct class_device_attribute bl_class_device_attributes[] = {
DECLARE_ATTR(max_brightness, 0444, backlight_show_max_brightness, NULL),
};

/* This callback gets called when something important happens inside a
* framebuffer driver. We're looking if that important event is blanking,
* and if it is, we're switching backlight power as well ...
*/
static int fb_notifier_callback(struct notifier_block *self,
unsigned long event, void *data)
{
struct backlight_device *bd;
struct fb_event *evdata =(struct fb_event *)data;

/* If we aren't interested in this event, skip it immediately ... */
if (event != FB_EVENT_BLANK)
return 0;

bd = container_of(self, struct backlight_device, fb_notif);
down(&bd->sem);
if (bd->props)
if (!bd->props->check_fb ||
bd->props->check_fb(evdata->info)) {
bd->props->fb_blank = *(int *)evdata->data;
if (likely(bd->props && bd->props->update_status))
bd->props->update_status(bd);
}
up(&bd->sem);
return 0;
}

/**
* backlight_device_register - create and register a new object of
* backlight_device class.
Expand Down Expand Up @@ -215,10 +241,7 @@ error: kfree(new_bd);
return ERR_PTR(rc);
}

memset(&new_bd->fb_notif, 0, sizeof(new_bd->fb_notif));
new_bd->fb_notif.notifier_call = fb_notifier_callback;

rc = fb_register_client(&new_bd->fb_notif);
rc = backlight_register_fb(new_bd);
if (unlikely(rc))
goto error;

Expand Down Expand Up @@ -268,7 +291,7 @@ void backlight_device_unregister(struct backlight_device *bd)
bd->props = NULL;
up(&bd->sem);

fb_unregister_client(&bd->fb_notif);
backlight_unregister_fb(bd);

class_device_unregister(&bd->class_dev);
}
Expand Down
78 changes: 49 additions & 29 deletions drivers/video/backlight/lcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,53 @@
#include <linux/err.h>
#include <linux/fb.h>

#if defined(CONFIG_FB) || (defined(CONFIG_FB_MODULE) && \
defined(CONFIG_LCD_CLASS_DEVICE_MODULE))
/* This callback gets called when something important happens inside a
* framebuffer driver. We're looking if that important event is blanking,
* and if it is, we're switching lcd power as well ...
*/
static int fb_notifier_callback(struct notifier_block *self,
unsigned long event, void *data)
{
struct lcd_device *ld;
struct fb_event *evdata = data;

/* If we aren't interested in this event, skip it immediately ... */
if (event != FB_EVENT_BLANK)
return 0;

ld = container_of(self, struct lcd_device, fb_notif);
down(&ld->sem);
if (ld->props)
if (!ld->props->check_fb || ld->props->check_fb(evdata->info))
ld->props->set_power(ld, *(int *)evdata->data);
up(&ld->sem);
return 0;
}

static int lcd_register_fb(struct lcd_device *ld)
{
memset(&ld->fb_notif, 0, sizeof(&ld->fb_notif));
ld->fb_notif.notifier_call = fb_notifier_callback;
return fb_register_client(&ld->fb_notif);
}

static void lcd_unregister_fb(struct lcd_device *ld)
{
fb_unregister_client(&ld->fb_notif);
}
#else
static int lcd_register_fb(struct lcd_device *ld)
{
return 0;
}

static inline void lcd_unregister_fb(struct lcd_device *ld)
{
}
#endif /* CONFIG_FB */

static ssize_t lcd_show_power(struct class_device *cdev, char *buf)
{
int rc;
Expand Down Expand Up @@ -127,29 +174,6 @@ static const struct class_device_attribute lcd_class_device_attributes[] = {
DECLARE_ATTR(max_contrast, 0444, lcd_show_max_contrast, NULL),
};

/* This callback gets called when something important happens inside a
* framebuffer driver. We're looking if that important event is blanking,
* and if it is, we're switching lcd power as well ...
*/
static int fb_notifier_callback(struct notifier_block *self,
unsigned long event, void *data)
{
struct lcd_device *ld;
struct fb_event *evdata =(struct fb_event *)data;

/* If we aren't interested in this event, skip it immediately ... */
if (event != FB_EVENT_BLANK)
return 0;

ld = container_of(self, struct lcd_device, fb_notif);
down(&ld->sem);
if (ld->props)
if (!ld->props->check_fb || ld->props->check_fb(evdata->info))
ld->props->set_power(ld, *(int *)evdata->data);
up(&ld->sem);
return 0;
}

/**
* lcd_device_register - register a new object of lcd_device class.
* @name: the name of the new object(must be the same as the name of the
Expand Down Expand Up @@ -186,10 +210,8 @@ error: kfree(new_ld);
return ERR_PTR(rc);
}

memset(&new_ld->fb_notif, 0, sizeof(new_ld->fb_notif));
new_ld->fb_notif.notifier_call = fb_notifier_callback;
rc = lcd_register_fb(new_ld);

rc = fb_register_client(&new_ld->fb_notif);
if (unlikely(rc))
goto error;

Expand Down Expand Up @@ -232,9 +254,7 @@ void lcd_device_unregister(struct lcd_device *ld)
down(&ld->sem);
ld->props = NULL;
up(&ld->sem);

fb_unregister_client(&ld->fb_notif);

lcd_unregister_fb(ld);
class_device_unregister(&ld->class_dev);
}
EXPORT_SYMBOL(lcd_device_unregister);
Expand Down

0 comments on commit 3d5eead

Please sign in to comment.