diff options
| -rw-r--r-- | drivers/video/backlight/gpio_backlight.c | 24 | 
1 files changed, 20 insertions, 4 deletions
diff --git a/drivers/video/backlight/gpio_backlight.c b/drivers/video/backlight/gpio_backlight.c index e84f3087e29f..18e053e4716c 100644 --- a/drivers/video/backlight/gpio_backlight.c +++ b/drivers/video/backlight/gpio_backlight.c @@ -59,13 +59,11 @@ static int gpio_backlight_probe_dt(struct platform_device *pdev,  				   struct gpio_backlight *gbl)  {  	struct device *dev = &pdev->dev; -	enum gpiod_flags flags;  	int ret;  	gbl->def_value = device_property_read_bool(dev, "default-on"); -	flags = gbl->def_value ? GPIOD_OUT_HIGH : GPIOD_OUT_LOW; -	gbl->gpiod = devm_gpiod_get(dev, NULL, flags); +	gbl->gpiod = devm_gpiod_get(dev, NULL, GPIOD_ASIS);  	if (IS_ERR(gbl->gpiod)) {  		ret = PTR_ERR(gbl->gpiod); @@ -79,6 +77,22 @@ static int gpio_backlight_probe_dt(struct platform_device *pdev,  	return 0;  } +static int gpio_backlight_initial_power_state(struct gpio_backlight *gbl) +{ +	struct device_node *node = gbl->dev->of_node; + +	/* Not booted with device tree or no phandle link to the node */ +	if (!node || !node->phandle) +		return gbl->def_value ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; + +	/* if the enable GPIO is disabled, do not enable the backlight */ +	if (gpiod_get_value_cansleep(gbl->gpiod) == 0) +		return FB_BLANK_POWERDOWN; + +	return FB_BLANK_UNBLANK; +} + +  static int gpio_backlight_probe(struct platform_device *pdev)  {  	struct gpio_backlight_platform_data *pdata = @@ -136,7 +150,9 @@ static int gpio_backlight_probe(struct platform_device *pdev)  		return PTR_ERR(bl);  	} -	bl->props.brightness = gbl->def_value; +	bl->props.power = gpio_backlight_initial_power_state(gbl); +	bl->props.brightness = 1; +  	backlight_update_status(bl);  	platform_set_drvdata(pdev, bl);  | 
