Skip to content

Commit

Permalink
backlight: pwm_bl: Re-add driver internal enabled tracking
Browse files Browse the repository at this point in the history
Commit e6bcca0 ("backlight: pwm_bl: Switch to using "atomic" PWM API")
removed the driver internal enabled tracking in favor of simply checking
the pwm state.

This can lead to issues as all of gpio-, regulator- and pwm-state are used
to determine the initial state and the bootloader or kernel can leave them
in an inconsistent state at boot.

In my case on rk3399-kevin, the pwm backlight is build as module and the
kernel disables the supply regulator as unused while keeping the pwm running
thus pwm_bl calling pwm_backlight_power_off() during probe and creating an
unmatched regulator-disable call, as it never got enabled from the pwm-bl
before.

To prevent these consistency issues, reintroduce the driver-internal
tracking of the enabled state.

Fixes: e6bcca0 ("backlight: pwm_bl: Switch to using "atomic" PWM API")
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Acked-by: Thierry Reding <thierry.reding@gmail.com>
Acked-by: Daniel Thompson <daniel.thompson@linaro.org>

Signed-off-by: Lee Jones <lee.jones@linaro.org>
  • Loading branch information
Heiko Stuebner authored and Lee Jones committed Nov 27, 2018
1 parent 6510223 commit e4c8ae3
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions drivers/video/backlight/pwm_bl.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ struct pwm_bl_data {
struct device *dev;
unsigned int lth_brightness;
unsigned int *levels;
bool enabled;
struct regulator *power_supply;
struct gpio_desc *enable_gpio;
unsigned int scale;
Expand All @@ -50,7 +51,7 @@ static void pwm_backlight_power_on(struct pwm_bl_data *pb)
int err;

pwm_get_state(pb->pwm, &state);
if (state.enabled)
if (pb->enabled)
return;

err = regulator_enable(pb->power_supply);
Expand All @@ -65,14 +66,16 @@ static void pwm_backlight_power_on(struct pwm_bl_data *pb)

if (pb->enable_gpio)
gpiod_set_value_cansleep(pb->enable_gpio, 1);

pb->enabled = true;
}

static void pwm_backlight_power_off(struct pwm_bl_data *pb)
{
struct pwm_state state;

pwm_get_state(pb->pwm, &state);
if (!state.enabled)
if (!pb->enabled)
return;

if (pb->enable_gpio)
Expand All @@ -86,6 +89,7 @@ static void pwm_backlight_power_off(struct pwm_bl_data *pb)
pwm_apply_state(pb->pwm, &state);

regulator_disable(pb->power_supply);
pb->enabled = false;
}

static int compute_duty_cycle(struct pwm_bl_data *pb, int brightness)
Expand Down Expand Up @@ -483,6 +487,7 @@ static int pwm_backlight_probe(struct platform_device *pdev)
pb->check_fb = data->check_fb;
pb->exit = data->exit;
pb->dev = &pdev->dev;
pb->enabled = false;
pb->post_pwm_on_delay = data->post_pwm_on_delay;
pb->pwm_off_delay = data->pwm_off_delay;

Expand Down

0 comments on commit e4c8ae3

Please sign in to comment.