drm: support loader protect for panel
authorMark Yao <mark.yao@rock-chips.com>
Mon, 5 Jun 2017 10:05:42 +0000 (18:05 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 7 Jun 2017 06:13:35 +0000 (14:13 +0800)
Change-Id: Ie9330e3380a4925a4b7603e7206f1e0d186d2156
Signed-off-by: Mark Yao <mark.yao@rock-chips.com>
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
drivers/gpu/drm/panel/panel-simple.c
drivers/gpu/drm/rockchip/dw-mipi-dsi.c
include/drm/drm_panel.h

index ff2b881581c5c8cd3fb46c6cb2cf8226a9249e13..f8495cdeb8da9ef5e14ad10259c4351f7c4fc730 100644 (file)
@@ -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
index 20a4bb6b548c2486f8d85c10d83745145f515ac0..301e2bf41384b74a38aeadd7b0f597c226d69996 100644 (file)
@@ -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,
index 38e4811be728ed1a954020c17bcec59db704d1e0..0d29890235a0c270deef109eac9f699cfa44a876 100644 (file)
@@ -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
index 13ff44b28893f5904aa43cfd2b3fbc4d417f24bc..083dedde7a034e49a312a00eef36c8d26741fd57 100644 (file)
@@ -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)