pwm-backlight: Fix brightness adjustment
Split adjustment of the brightness (by changing the PWM duty cycle) from the power on sequence. This fixes an issue where the brightness can no longer be updated once the backlight has been enabled. Reported-by: Marc Dietrich <marvin24@gmx.de> Signed-off-by: Thierry Reding <treding@nvidia.com>
This commit is contained in:
parent
a230869817
commit
e4bfeda968
|
@ -45,21 +45,11 @@ struct pwm_bl_data {
|
||||||
|
|
||||||
static void pwm_backlight_power_on(struct pwm_bl_data *pb, int brightness)
|
static void pwm_backlight_power_on(struct pwm_bl_data *pb, int brightness)
|
||||||
{
|
{
|
||||||
unsigned int lth = pb->lth_brightness;
|
|
||||||
int duty_cycle, err;
|
int duty_cycle, err;
|
||||||
|
|
||||||
if (pb->enabled)
|
if (pb->enabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (pb->levels)
|
|
||||||
duty_cycle = pb->levels[brightness];
|
|
||||||
else
|
|
||||||
duty_cycle = brightness;
|
|
||||||
|
|
||||||
duty_cycle = (duty_cycle * (pb->period - lth) / pb->scale) + lth;
|
|
||||||
|
|
||||||
pwm_config(pb->pwm, duty_cycle, pb->period);
|
|
||||||
|
|
||||||
err = regulator_enable(pb->power_supply);
|
err = regulator_enable(pb->power_supply);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
dev_err(pb->dev, "failed to enable power supply\n");
|
dev_err(pb->dev, "failed to enable power supply\n");
|
||||||
|
@ -94,10 +84,24 @@ static void pwm_backlight_power_off(struct pwm_bl_data *pb)
|
||||||
pb->enabled = false;
|
pb->enabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int compute_duty_cycle(struct pwm_bl_data *pb, int brightness)
|
||||||
|
{
|
||||||
|
unsigned int lth = pb->lth_brightness;
|
||||||
|
int duty_cycle;
|
||||||
|
|
||||||
|
if (pb->levels)
|
||||||
|
duty_cycle = pb->levels[brightness];
|
||||||
|
else
|
||||||
|
duty_cycle = brightness;
|
||||||
|
|
||||||
|
return (duty_cycle * (pb->period - lth) / pb->scale) + lth;
|
||||||
|
}
|
||||||
|
|
||||||
static int pwm_backlight_update_status(struct backlight_device *bl)
|
static int pwm_backlight_update_status(struct backlight_device *bl)
|
||||||
{
|
{
|
||||||
struct pwm_bl_data *pb = bl_get_data(bl);
|
struct pwm_bl_data *pb = bl_get_data(bl);
|
||||||
int brightness = bl->props.brightness;
|
int brightness = bl->props.brightness;
|
||||||
|
int duty_cycle;
|
||||||
|
|
||||||
if (bl->props.power != FB_BLANK_UNBLANK ||
|
if (bl->props.power != FB_BLANK_UNBLANK ||
|
||||||
bl->props.fb_blank != FB_BLANK_UNBLANK ||
|
bl->props.fb_blank != FB_BLANK_UNBLANK ||
|
||||||
|
@ -107,9 +111,11 @@ static int pwm_backlight_update_status(struct backlight_device *bl)
|
||||||
if (pb->notify)
|
if (pb->notify)
|
||||||
brightness = pb->notify(pb->dev, brightness);
|
brightness = pb->notify(pb->dev, brightness);
|
||||||
|
|
||||||
if (brightness > 0)
|
if (brightness > 0) {
|
||||||
|
duty_cycle = compute_duty_cycle(pb, brightness);
|
||||||
|
pwm_config(pb->pwm, duty_cycle, pb->period);
|
||||||
pwm_backlight_power_on(pb, brightness);
|
pwm_backlight_power_on(pb, brightness);
|
||||||
else
|
} else
|
||||||
pwm_backlight_power_off(pb);
|
pwm_backlight_power_off(pb);
|
||||||
|
|
||||||
if (pb->notify_after)
|
if (pb->notify_after)
|
||||||
|
|
Loading…
Reference in New Issue