Seperate the panel power control from prepare/unprepare.

Signed-off-by: Jitao Shi <jitao....@mediatek.com>
---
 .../gpu/drm/panel/panel-boe-tv101wum-nl6.c    | 72 +++++++++++++------
 1 file changed, 50 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c 
b/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
index db9d0b86d542..dc49079a74d1 100644
--- a/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
+++ b/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
@@ -50,6 +50,7 @@ struct boe_panel {
        struct regulator *avdd;
        struct gpio_desc *enable_gpio;
 
+       bool prepared_power;
        bool prepared;
 };
 
@@ -488,22 +489,13 @@ static int boe_panel_enter_sleep_mode(struct boe_panel 
*boe)
        return 0;
 }
 
-static int boe_panel_unprepare(struct drm_panel *panel)
+static int boe_panel_unprepare_power(struct drm_panel *panel)
 {
        struct boe_panel *boe = to_boe_panel(panel);
-       int ret;
 
-       if (!boe->prepared)
+       if (!boe->prepared_power)
                return 0;
 
-       ret = boe_panel_enter_sleep_mode(boe);
-       if (ret < 0) {
-               dev_err(panel->dev, "failed to set panel off: %d\n", ret);
-               return ret;
-       }
-
-       msleep(150);
-
        if (boe->desc->discharge_on_disable) {
                regulator_disable(boe->avee);
                regulator_disable(boe->avdd);
@@ -512,6 +504,7 @@ static int boe_panel_unprepare(struct drm_panel *panel)
                usleep_range(5000, 7000);
                regulator_disable(boe->pp1800);
        } else {
+               msleep(150);
                gpiod_set_value(boe->enable_gpio, 0);
                usleep_range(500, 1000);
                regulator_disable(boe->avee);
@@ -520,17 +513,39 @@ static int boe_panel_unprepare(struct drm_panel *panel)
                regulator_disable(boe->pp1800);
        }
 
+       boe->prepared_power = false;
+
+       return 0;
+}
+
+static int boe_panel_unprepare(struct drm_panel *panel)
+{
+       struct boe_panel *boe = to_boe_panel(panel);
+       int ret;
+
+       if (!boe->prepared)
+               return 0;
+
+       if (!boe->desc->discharge_on_disable) {
+               ret = boe_panel_enter_sleep_mode(boe);
+               if (ret < 0) {
+                       dev_err(panel->dev, "failed to set panel off: %d\n",
+                               ret);
+                       return ret;
+               }
+       }
+
        boe->prepared = false;
 
        return 0;
 }
 
-static int boe_panel_prepare(struct drm_panel *panel)
+static int boe_panel_prepare_power(struct drm_panel *panel)
 {
        struct boe_panel *boe = to_boe_panel(panel);
        int ret;
 
-       if (boe->prepared)
+       if (boe->prepared_power)
                return 0;
 
        gpiod_set_value(boe->enable_gpio, 0);
@@ -558,18 +573,10 @@ static int boe_panel_prepare(struct drm_panel *panel)
        gpiod_set_value(boe->enable_gpio, 1);
        usleep_range(6000, 10000);
 
-       ret = boe_panel_init_dcs_cmd(boe);
-       if (ret < 0) {
-               dev_err(panel->dev, "failed to init panel: %d\n", ret);
-               goto poweroff;
-       }
-
-       boe->prepared = true;
+       boe->prepared_power = true;
 
        return 0;
 
-poweroff:
-       regulator_disable(boe->avee);
 poweroffavdd:
        regulator_disable(boe->avdd);
 poweroff1v8:
@@ -580,6 +587,25 @@ static int boe_panel_prepare(struct drm_panel *panel)
        return ret;
 }
 
+static int boe_panel_prepare(struct drm_panel *panel)
+{
+       struct boe_panel *boe = to_boe_panel(panel);
+       int ret;
+
+       if (boe->prepared)
+               return 0;
+
+       ret = boe_panel_init_dcs_cmd(boe);
+       if (ret < 0) {
+               dev_err(panel->dev, "failed to init panel: %d\n", ret);
+               return ret;
+       }
+
+       boe->prepared = true;
+
+       return 0;
+}
+
 static int boe_panel_enable(struct drm_panel *panel)
 {
        msleep(130);
@@ -749,7 +775,9 @@ static int boe_panel_get_modes(struct drm_panel *panel,
 
 static const struct drm_panel_funcs boe_panel_funcs = {
        .unprepare = boe_panel_unprepare,
+       .unprepare_power = boe_panel_unprepare_power,
        .prepare = boe_panel_prepare,
+       .prepare_power = boe_panel_prepare_power,
        .enable = boe_panel_enable,
        .get_modes = boe_panel_get_modes,
 };
-- 
2.25.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to