diff options
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.patch | 88 |
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; |