mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-29 01:59:02 +00:00
89 lines
3.1 KiB
Diff
89 lines
3.1 KiB
Diff
|
From aa455fdc2495cb05b65cc03cc472de43df632c5c Mon Sep 17 00:00:00 2001
|
||
|
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
|
||
|
Date: Tue, 22 Oct 2019 10:36:24 +0200
|
||
|
Subject: [PATCH] backlight: gpio: Explicitly set the direction of
|
||
|
the GPIO
|
||
|
|
||
|
commit 706dc68102bc7421a9e6573d149ab6d769d71cc7 upstream.
|
||
|
|
||
|
The GPIO backlight driver currently requests the line 'as is', without
|
||
|
acively setting its direction. This can lead to problems: if the line
|
||
|
is in input mode by default, we won't be able to drive it later when
|
||
|
updating the status and also reading its initial value doesn't make
|
||
|
sense for backlight setting.
|
||
|
|
||
|
Request the line 'as is' initially, so that we can read its value
|
||
|
without affecting it but then change the direction to output explicitly
|
||
|
when setting the initial brightness.
|
||
|
|
||
|
Also: check the current direction and only read the value if it's output.
|
||
|
|
||
|
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
|
||
|
Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org>
|
||
|
Signed-off-by: Lee Jones <lee.jones@linaro.org>
|
||
|
---
|
||
|
drivers/video/backlight/gpio_backlight.c | 23 ++++++++++++++++++-----
|
||
|
1 file changed, 18 insertions(+), 5 deletions(-)
|
||
|
|
||
|
--- a/drivers/video/backlight/gpio_backlight.c
|
||
|
+++ b/drivers/video/backlight/gpio_backlight.c
|
||
|
@@ -26,9 +26,8 @@ struct gpio_backlight {
|
||
|
int def_value;
|
||
|
};
|
||
|
|
||
|
-static int gpio_backlight_update_status(struct backlight_device *bl)
|
||
|
+static int gpio_backlight_get_next_brightness(struct backlight_device *bl)
|
||
|
{
|
||
|
- struct gpio_backlight *gbl = bl_get_data(bl);
|
||
|
int brightness = bl->props.brightness;
|
||
|
|
||
|
if (bl->props.power != FB_BLANK_UNBLANK ||
|
||
|
@@ -36,6 +35,14 @@ static int gpio_backlight_update_status(
|
||
|
bl->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK))
|
||
|
brightness = 0;
|
||
|
|
||
|
+ return brightness;
|
||
|
+}
|
||
|
+
|
||
|
+static int gpio_backlight_update_status(struct backlight_device *bl)
|
||
|
+{
|
||
|
+ struct gpio_backlight *gbl = bl_get_data(bl);
|
||
|
+ int brightness = gpio_backlight_get_next_brightness(bl);
|
||
|
+
|
||
|
gpiod_set_value_cansleep(gbl->gpiod, brightness);
|
||
|
|
||
|
return 0;
|
||
|
@@ -86,7 +93,8 @@ static int gpio_backlight_initial_power_
|
||
|
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)
|
||
|
+ if (gpiod_get_direction(gbl->gpiod) == 0 &&
|
||
|
+ gpiod_get_value_cansleep(gbl->gpiod) == 0)
|
||
|
return FB_BLANK_POWERDOWN;
|
||
|
|
||
|
return FB_BLANK_UNBLANK;
|
||
|
@@ -100,7 +108,7 @@ static int gpio_backlight_probe(struct p
|
||
|
struct backlight_properties props;
|
||
|
struct backlight_device *bl;
|
||
|
struct gpio_backlight *gbl;
|
||
|
- int ret;
|
||
|
+ int ret, init_brightness;
|
||
|
|
||
|
gbl = devm_kzalloc(&pdev->dev, sizeof(*gbl), GFP_KERNEL);
|
||
|
if (gbl == NULL)
|
||
|
@@ -153,7 +161,12 @@ static int gpio_backlight_probe(struct p
|
||
|
bl->props.power = gpio_backlight_initial_power_state(gbl);
|
||
|
bl->props.brightness = 1;
|
||
|
|
||
|
- backlight_update_status(bl);
|
||
|
+ init_brightness = gpio_backlight_get_next_brightness(bl);
|
||
|
+ ret = gpiod_direction_output(gbl->gpiod, init_brightness);
|
||
|
+ if (ret) {
|
||
|
+ dev_err(&pdev->dev, "failed to set initial brightness\n");
|
||
|
+ return ret;
|
||
|
+ }
|
||
|
|
||
|
platform_set_drvdata(pdev, bl);
|
||
|
return 0;
|