"pwms" property (see PWM binding[0])
- enable-gpios: contains a single GPIO specifier for the GPIO which enables
and disables the backlight (see GPIO binding[1])
+ - turn-on-delay-ms: delay in milliseconds between configuring the PWM
+ and switching PWM on. This may be required to eliminate
+ flicker when switching the PWM on after it has been
+ disabled.
[0]: Documentation/devicetree/bindings/pwm/pwm.txt
[1]: Documentation/devicetree/bindings/gpio/gpio.txt
#include <linux/pwm_backlight.h>
#include <linux/regulator/consumer.h>
#include <linux/slab.h>
+#include <linux/delay.h>
struct pwm_bl_data {
struct pwm_device *pwm;
struct gpio_desc *enable_gpio;
unsigned int scale;
bool legacy;
+ int turn_on_delay_ms;
int (*notify)(struct device *,
int brightness);
void (*notify_after)(struct device *,
pwm_enable(pb->pwm);
+ if (pb->turn_on_delay_ms > 0) {
+ dev_dbg(pb->dev, "Sleeping %u..%uµs\n",
+ pb->turn_on_delay_ms * 1000,
+ pb->turn_on_delay_ms * 1100);
+ if (pb->turn_on_delay_ms > 20)
+ msleep(pb->turn_on_delay_ms);
+ else
+ usleep_range(pb->turn_on_delay_ms * 1000,
+ pb->turn_on_delay_ms * 1100);
+ }
+
err = regulator_enable(pb->power_supply);
if (err < 0)
dev_err(pb->dev, "failed to enable power supply\n");
duty_cycle = compute_duty_cycle(pb, brightness);
pwm_config(pb->pwm, duty_cycle, pb->period);
pwm_backlight_power_on(pb, brightness);
- } else
+ } else {
pwm_backlight_power_off(pb);
+ }
if (pb->notify_after)
pb->notify_after(pb->dev, brightness);
pb->scale = data->levels[i];
pb->levels = data->levels;
- } else
+ } else {
pb->scale = data->max_brightness;
-
+ }
pb->notify = data->notify;
pb->notify_after = data->notify_after;
pb->check_fb = data->check_fb;
goto err_alloc;
}
+ of_property_read_u32(node, "turn-on-delay-ms", &pb->turn_on_delay_ms);
+
dev_dbg(&pdev->dev, "got pwm for backlight\n");
/*