aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm27xx/patches-5.4/950-0930-backlight-gpio-Explicitly-set-the-direction-of-the-G.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/bcm27xx/patches-5.4/950-0930-backlight-gpio-Explicitly-set-the-direction-of-the-G.patch')
-rw-r--r--target/linux/bcm27xx/patches-5.4/950-0930-backlight-gpio-Explicitly-set-the-direction-of-the-G.patch88
1 files changed, 88 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.4/950-0930-backlight-gpio-Explicitly-set-the-direction-of-the-G.patch b/target/linux/bcm27xx/patches-5.4/950-0930-backlight-gpio-Explicitly-set-the-direction-of-the-G.patch
new file mode 100644
index 0000000000..d016cdaa43
--- /dev/null
+++ b/target/linux/bcm27xx/patches-5.4/950-0930-backlight-gpio-Explicitly-set-the-direction-of-the-G.patch
@@ -0,0 +1,88 @@
+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;