diff options
author | Ezequiel Garcia <ezequiel@vanguardiasur.com.ar> | 2014-09-02 12:51:22 (GMT) |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2014-09-17 00:55:27 (GMT) |
commit | d898ce03675fc061f89a347a22d41271ed75c436 (patch) | |
tree | 80613f595ddcfe9dc6dd46c5178878c32b3095dd /drivers | |
parent | 12778fc14301cf24d79cd89b0129874c319d0a38 (diff) | |
download | linux-d898ce03675fc061f89a347a22d41271ed75c436.tar.xz |
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: Darren Etheridge <detheridge@ti.com>
Tested-by: Johannes Pointner <johannes.pointner@br-automation.com>
Signed-off-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/tilcdc/tilcdc_panel.c | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_panel.c b/drivers/gpu/drm/tilcdc/tilcdc_panel.c index f2a5b23..7a03158 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_panel.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_panel.c @@ -18,6 +18,7 @@ #include <linux/pinctrl/pinmux.h> #include <linux/pinctrl/consumer.h> #include <linux/backlight.h> +#include <linux/gpio/consumer.h> #include <video/display_timing.h> #include <video/of_display_timing.h> #include <video/videomode.h> @@ -29,6 +30,7 @@ struct panel_module { struct tilcdc_panel_info *info; struct display_timings *timings; struct backlight_device *backlight; + struct gpio_desc *enable_gpio; }; #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) { struct panel_encoder *panel_encoder = to_panel_encoder(encoder); struct backlight_device *backlight = panel_encoder->mod->backlight; + struct gpio_desc *gpio = panel_encoder->mod->enable_gpio; - if (!backlight) - return; + if (backlight) { + backlight->props.power = mode == DRM_MODE_DPMS_ON ? + FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; + backlight_update_status(backlight); + } - backlight->props.power = mode == DRM_MODE_DPMS_ON - ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; - 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, @@ -369,6 +375,25 @@ static int panel_probe(struct platform_device *pdev) 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; pdev->dev.platform_data = mod; @@ -401,6 +426,8 @@ fail_timings: fail_free: tilcdc_module_cleanup(mod); + +fail_backlight: if (panel_mod->backlight) put_device(&panel_mod->backlight->dev); return ret; |