Commit d898ce03 authored by Ezequiel Garcia's avatar Ezequiel Garcia Committed by Dave Airlie

drm/tilcdc: panel: Add support for enable GPIO

In order to support the "enable GPIO" available in many panel devices,
this commit adds a proper devicetree binding.

By providing an enable GPIO in the devicetree, the driver can now turn
off and on the panel device, and/or the backlight device. Both the
backlight and the GPIO are optional properties.
Tested-by: default avatarDarren Etheridge <detheridge@ti.com>
Tested-by: default avatarJohannes Pointner <johannes.pointner@br-automation.com>
Signed-off-by: default avatarEzequiel Garcia <ezequiel@vanguardiasur.com.ar>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 12778fc1
...@@ -20,6 +20,7 @@ Required properties: ...@@ -20,6 +20,7 @@ Required properties:
Optional properties: Optional properties:
- backlight: phandle of the backlight device attached to the panel - backlight: phandle of the backlight device attached to the panel
- enable-gpios: GPIO pin to enable or disable the panel
Recommended properties: Recommended properties:
- pinctrl-names, pinctrl-0: the pincontrol settings to configure - pinctrl-names, pinctrl-0: the pincontrol settings to configure
...@@ -33,6 +34,7 @@ Example: ...@@ -33,6 +34,7 @@ Example:
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&bone_lcd3_cape_lcd_pins>; pinctrl-0 = <&bone_lcd3_cape_lcd_pins>;
backlight = <&backlight>; backlight = <&backlight>;
enable-gpios = <&gpio3 19 0>;
panel-info { panel-info {
ac-bias = <255>; ac-bias = <255>;
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/pinctrl/pinmux.h> #include <linux/pinctrl/pinmux.h>
#include <linux/pinctrl/consumer.h> #include <linux/pinctrl/consumer.h>
#include <linux/backlight.h> #include <linux/backlight.h>
#include <linux/gpio/consumer.h>
#include <video/display_timing.h> #include <video/display_timing.h>
#include <video/of_display_timing.h> #include <video/of_display_timing.h>
#include <video/videomode.h> #include <video/videomode.h>
...@@ -29,6 +30,7 @@ struct panel_module { ...@@ -29,6 +30,7 @@ struct panel_module {
struct tilcdc_panel_info *info; struct tilcdc_panel_info *info;
struct display_timings *timings; struct display_timings *timings;
struct backlight_device *backlight; struct backlight_device *backlight;
struct gpio_desc *enable_gpio;
}; };
#define to_panel_module(x) container_of(x, struct panel_module, base) #define to_panel_module(x) container_of(x, struct panel_module, base)
...@@ -55,13 +57,17 @@ static void panel_encoder_dpms(struct drm_encoder *encoder, int mode) ...@@ -55,13 +57,17 @@ static void panel_encoder_dpms(struct drm_encoder *encoder, int mode)
{ {
struct panel_encoder *panel_encoder = to_panel_encoder(encoder); struct panel_encoder *panel_encoder = to_panel_encoder(encoder);
struct backlight_device *backlight = panel_encoder->mod->backlight; struct backlight_device *backlight = panel_encoder->mod->backlight;
struct gpio_desc *gpio = panel_encoder->mod->enable_gpio;
if (!backlight) if (backlight) {
return; backlight->props.power = mode == DRM_MODE_DPMS_ON ?
FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
backlight->props.power = mode == DRM_MODE_DPMS_ON
? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN;
backlight_update_status(backlight); backlight_update_status(backlight);
}
if (gpio)
gpiod_set_value_cansleep(gpio,
mode == DRM_MODE_DPMS_ON ? 1 : 0);
} }
static bool panel_encoder_mode_fixup(struct drm_encoder *encoder, static bool panel_encoder_mode_fixup(struct drm_encoder *encoder,
...@@ -369,6 +375,25 @@ static int panel_probe(struct platform_device *pdev) ...@@ -369,6 +375,25 @@ static int panel_probe(struct platform_device *pdev)
dev_info(&pdev->dev, "found backlight\n"); dev_info(&pdev->dev, "found backlight\n");
} }
panel_mod->enable_gpio = devm_gpiod_get(&pdev->dev, "enable");
if (IS_ERR(panel_mod->enable_gpio)) {
ret = PTR_ERR(panel_mod->enable_gpio);
if (ret != -ENOENT) {
dev_err(&pdev->dev, "failed to request enable GPIO\n");
goto fail_backlight;
}
/* Optional GPIO is not here, continue silently. */
panel_mod->enable_gpio = NULL;
} else {
ret = gpiod_direction_output(panel_mod->enable_gpio, 0);
if (ret < 0) {
dev_err(&pdev->dev, "failed to setup GPIO\n");
goto fail_backlight;
}
dev_info(&pdev->dev, "found enable GPIO\n");
}
mod = &panel_mod->base; mod = &panel_mod->base;
pdev->dev.platform_data = mod; pdev->dev.platform_data = mod;
...@@ -401,6 +426,8 @@ static int panel_probe(struct platform_device *pdev) ...@@ -401,6 +426,8 @@ static int panel_probe(struct platform_device *pdev)
fail_free: fail_free:
tilcdc_module_cleanup(mod); tilcdc_module_cleanup(mod);
fail_backlight:
if (panel_mod->backlight) if (panel_mod->backlight)
put_device(&panel_mod->backlight->dev); put_device(&panel_mod->backlight->dev);
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment