Commit ef0a5e80 authored by Robert Morell's avatar Robert Morell Committed by Linus Torvalds

pwm_backlight: add check_fb() hook

In systems with multiple framebuffer devices, one of the devices might be
blanked while another is unblanked.  In order for the backlight blanking
logic to know whether to turn off the backlight for a particular
framebuffer's blanking notification, it needs to be able to check if a
given framebuffer device corresponds to the backlight.

This plumbs the check_fb hook from core backlight through the
pwm_backlight helper to allow platform code to plug in a check_fb hook.
Signed-off-by: default avatarRobert Morell <rmorell@nvidia.com>
Cc: Richard Purdie <rpurdie@rpsys.net>
Cc: Arun Murthy <arun.murthy@stericsson.com>
Cc: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 0508e04e
...@@ -28,6 +28,7 @@ struct pwm_bl_data { ...@@ -28,6 +28,7 @@ struct pwm_bl_data {
unsigned int lth_brightness; unsigned int lth_brightness;
int (*notify)(struct device *, int (*notify)(struct device *,
int brightness); int brightness);
int (*check_fb)(struct device *, struct fb_info *);
}; };
static int pwm_backlight_update_status(struct backlight_device *bl) static int pwm_backlight_update_status(struct backlight_device *bl)
...@@ -62,9 +63,18 @@ static int pwm_backlight_get_brightness(struct backlight_device *bl) ...@@ -62,9 +63,18 @@ static int pwm_backlight_get_brightness(struct backlight_device *bl)
return bl->props.brightness; return bl->props.brightness;
} }
static int pwm_backlight_check_fb(struct backlight_device *bl,
struct fb_info *info)
{
struct pwm_bl_data *pb = dev_get_drvdata(&bl->dev);
return !pb->check_fb || pb->check_fb(pb->dev, info);
}
static const struct backlight_ops pwm_backlight_ops = { static const struct backlight_ops pwm_backlight_ops = {
.update_status = pwm_backlight_update_status, .update_status = pwm_backlight_update_status,
.get_brightness = pwm_backlight_get_brightness, .get_brightness = pwm_backlight_get_brightness,
.check_fb = pwm_backlight_check_fb,
}; };
static int pwm_backlight_probe(struct platform_device *pdev) static int pwm_backlight_probe(struct platform_device *pdev)
...@@ -95,6 +105,7 @@ static int pwm_backlight_probe(struct platform_device *pdev) ...@@ -95,6 +105,7 @@ static int pwm_backlight_probe(struct platform_device *pdev)
pb->period = data->pwm_period_ns; pb->period = data->pwm_period_ns;
pb->notify = data->notify; pb->notify = data->notify;
pb->check_fb = data->check_fb;
pb->lth_brightness = data->lth_brightness * pb->lth_brightness = data->lth_brightness *
(data->pwm_period_ns / data->max_brightness); (data->pwm_period_ns / data->max_brightness);
pb->dev = &pdev->dev; pb->dev = &pdev->dev;
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#ifndef __LINUX_PWM_BACKLIGHT_H #ifndef __LINUX_PWM_BACKLIGHT_H
#define __LINUX_PWM_BACKLIGHT_H #define __LINUX_PWM_BACKLIGHT_H
#include <linux/backlight.h>
struct platform_pwm_backlight_data { struct platform_pwm_backlight_data {
int pwm_id; int pwm_id;
unsigned int max_brightness; unsigned int max_brightness;
...@@ -13,6 +15,7 @@ struct platform_pwm_backlight_data { ...@@ -13,6 +15,7 @@ struct platform_pwm_backlight_data {
int (*init)(struct device *dev); int (*init)(struct device *dev);
int (*notify)(struct device *dev, int brightness); int (*notify)(struct device *dev, int brightness);
void (*exit)(struct device *dev); void (*exit)(struct device *dev);
int (*check_fb)(struct device *dev, struct fb_info *info);
}; };
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment