From 7330eff9722772008a7876827a6b2f3545a70b7a Mon Sep 17 00:00:00 2001 From: Mark Yao Date: Mon, 5 Jun 2017 18:05:42 +0800 Subject: [PATCH] drm: support loader protect for panel Change-Id: Ie9330e3380a4925a4b7603e7206f1e0d186d2156 Signed-off-by: Mark Yao --- .../drm/bridge/analogix/analogix_dp_core.c | 2 ++ drivers/gpu/drm/panel/panel-simple.c | 20 +++++++++++++++++++ drivers/gpu/drm/rockchip/dw-mipi-dsi.c | 2 ++ include/drm/drm_panel.h | 10 ++++++++++ 4 files changed, 34 insertions(+) diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c index ff2b881581c5..f8495cdeb8da 100644 --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c @@ -966,6 +966,8 @@ static int analogix_dp_loader_protect(struct drm_connector *connector, bool on) { struct analogix_dp_device *dp = to_dp(connector); + if (dp->plat_data->panel) + drm_panel_loader_protect(dp->plat_data->panel, on); if (on) pm_runtime_get_sync(dp->dev); else diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c index 20a4bb6b548c..301e2bf41384 100644 --- a/drivers/gpu/drm/panel/panel-simple.c +++ b/drivers/gpu/drm/panel/panel-simple.c @@ -330,6 +330,25 @@ static int panel_simple_of_get_native_mode(struct panel_simple *panel) return 1; } +static int panel_simple_loader_protect(struct drm_panel *panel, bool on) +{ + struct panel_simple *p = to_panel_simple(panel); + int err; + + if (on) { + err = regulator_enable(p->supply); + if (err < 0) { + dev_err(panel->dev, "failed to enable supply: %d\n", + err); + return err; + } + } else { + regulator_disable(p->supply); + } + + return 0; +} + static int panel_simple_disable(struct drm_panel *panel) { struct panel_simple *p = to_panel_simple(panel); @@ -486,6 +505,7 @@ static int panel_simple_get_timings(struct drm_panel *panel, } static const struct drm_panel_funcs panel_simple_funcs = { + .loader_protect = panel_simple_loader_protect, .disable = panel_simple_disable, .unprepare = panel_simple_unprepare, .prepare = panel_simple_prepare, diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c index 38e4811be728..0d29890235a0 100644 --- a/drivers/gpu/drm/rockchip/dw-mipi-dsi.c +++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi.c @@ -1057,6 +1057,8 @@ static int dw_mipi_loader_protect(struct drm_connector *connector, bool on) { struct dw_mipi_dsi *dsi = con_to_dsi(connector); + if (dsi->panel) + drm_panel_loader_protect(dsi->panel, on); if (on) pm_runtime_get_sync(dsi->dev); else diff --git a/include/drm/drm_panel.h b/include/drm/drm_panel.h index 13ff44b28893..083dedde7a03 100644 --- a/include/drm/drm_panel.h +++ b/include/drm/drm_panel.h @@ -33,6 +33,7 @@ struct display_timing; /** * struct drm_panel_funcs - perform operations on a given panel + * @loader_protect: protect loader logo panel's power * @disable: disable panel (turn off back light, etc.) * @unprepare: turn off panel * @prepare: turn on panel and perform set up @@ -66,6 +67,7 @@ struct display_timing; * the panel. This is the job of the .unprepare() function. */ struct drm_panel_funcs { + int (*loader_protect)(struct drm_panel *panel, bool on); int (*disable)(struct drm_panel *panel); int (*unprepare)(struct drm_panel *panel); int (*prepare)(struct drm_panel *panel); @@ -101,6 +103,14 @@ static inline int drm_panel_disable(struct drm_panel *panel) return panel ? -ENOSYS : -EINVAL; } +static inline int drm_panel_loader_protect(struct drm_panel *panel, bool on) +{ + if (panel && panel->funcs && panel->funcs->loader_protect) + return panel->funcs->loader_protect(panel, on); + + return panel ? -ENOSYS : -EINVAL; +} + static inline int drm_panel_prepare(struct drm_panel *panel) { if (panel && panel->funcs && panel->funcs->prepare) -- 2.34.1