It's better to leave power handling and controller init to the
modesetting machinery using the simple pipe .enable and .disable
callbacks.

Signed-off-by: Noralf Trønnes <[email protected]>
---
 drivers/gpu/drm/tinydrm/mi0283qt.c | 55 +++++++++-----------------------------
 drivers/gpu/drm/tinydrm/mipi-dbi.c | 10 ++++---
 2 files changed, 19 insertions(+), 46 deletions(-)

diff --git a/drivers/gpu/drm/tinydrm/mi0283qt.c 
b/drivers/gpu/drm/tinydrm/mi0283qt.c
index d61f987..9495c9a 100644
--- a/drivers/gpu/drm/tinydrm/mi0283qt.c
+++ b/drivers/gpu/drm/tinydrm/mi0283qt.c
@@ -20,9 +20,11 @@
 #include <linux/spi/spi.h>
 #include <video/mipi_display.h>
 
-static int mi0283qt_init(struct mipi_dbi *mipi)
+static void mi0283qt_enable(struct drm_simple_display_pipe *pipe,
+                           struct drm_crtc_state *crtc_state)
 {
-       struct tinydrm_device *tdev = &mipi->tinydrm;
+       struct tinydrm_device *tdev = pipe_to_tinydrm(pipe);
+       struct mipi_dbi *mipi = mipi_dbi_from_tinydrm(tdev);
        struct device *dev = tdev->drm.dev;
        u8 addr_mode;
        int ret;
@@ -31,20 +33,19 @@ static int mi0283qt_init(struct mipi_dbi *mipi)
 
        ret = regulator_enable(mipi->regulator);
        if (ret) {
-               dev_err(dev, "Failed to enable regulator %d\n", ret);
-               return ret;
+               dev_err(dev, "Failed to enable regulator (%d)\n", ret);
+               return;
        }
 
-       /* Avoid flicker by skipping setup if the bootloader has done it */
        if (mipi_dbi_display_is_on(mipi))
-               return 0;
+               goto out_enable;
 
        mipi_dbi_hw_reset(mipi);
        ret = mipi_dbi_command(mipi, MIPI_DCS_SOFT_RESET);
        if (ret) {
-               dev_err(dev, "Error sending command %d\n", ret);
+               dev_err(dev, "Error sending command (%d)\n", ret);
                regulator_disable(mipi->regulator);
-               return ret;
+               return;
        }
 
        msleep(20);
@@ -110,19 +111,12 @@ static int mi0283qt_init(struct mipi_dbi *mipi)
        mipi_dbi_command(mipi, MIPI_DCS_SET_DISPLAY_ON);
        msleep(100);
 
-       return 0;
-}
-
-static void mi0283qt_fini(void *data)
-{
-       struct mipi_dbi *mipi = data;
-
-       DRM_DEBUG_KMS("\n");
-       regulator_disable(mipi->regulator);
+out_enable:
+       mipi_dbi_pipe_enable(pipe, crtc_state);
 }
 
 static const struct drm_simple_display_pipe_funcs mi0283qt_pipe_funcs = {
-       .enable = mipi_dbi_pipe_enable,
+       .enable = mi0283qt_enable,
        .disable = mipi_dbi_pipe_disable,
        .update = tinydrm_display_pipe_update,
        .prepare_fb = tinydrm_display_pipe_prepare_fb,
@@ -206,17 +200,6 @@ static int mi0283qt_probe(struct spi_device *spi)
                return ret;
        }
 
-       ret = mi0283qt_init(mipi);
-       if (ret)
-               return ret;
-
-       /* use devres to fini after drm unregister (drv->remove is before) */
-       ret = devm_add_action(dev, mi0283qt_fini, mipi);
-       if (ret) {
-               mi0283qt_fini(mipi);
-               return ret;
-       }
-
        spi_set_drvdata(spi, mipi);
 
        return devm_tinydrm_register(&mipi->tinydrm);
@@ -232,25 +215,13 @@ static void mi0283qt_shutdown(struct spi_device *spi)
 static int __maybe_unused mi0283qt_pm_suspend(struct device *dev)
 {
        struct mipi_dbi *mipi = dev_get_drvdata(dev);
-       int ret;
-
-       ret = tinydrm_suspend(&mipi->tinydrm);
-       if (ret)
-               return ret;
 
-       mi0283qt_fini(mipi);
-
-       return 0;
+       return tinydrm_suspend(&mipi->tinydrm);
 }
 
 static int __maybe_unused mi0283qt_pm_resume(struct device *dev)
 {
        struct mipi_dbi *mipi = dev_get_drvdata(dev);
-       int ret;
-
-       ret = mi0283qt_init(mipi);
-       if (ret)
-               return ret;
 
        return tinydrm_resume(&mipi->tinydrm);
 }
diff --git a/drivers/gpu/drm/tinydrm/mipi-dbi.c 
b/drivers/gpu/drm/tinydrm/mipi-dbi.c
index ec8f001..8498b49 100644
--- a/drivers/gpu/drm/tinydrm/mipi-dbi.c
+++ b/drivers/gpu/drm/tinydrm/mipi-dbi.c
@@ -263,8 +263,9 @@ static const struct drm_framebuffer_funcs mipi_dbi_fb_funcs 
= {
  * @pipe: Display pipe
  * @crtc_state: CRTC state
  *
- * This function enables backlight. Drivers can use this as their
- * &drm_simple_display_pipe_funcs->enable callback.
+ * This function flushes the whole framebuffer and enables the backlight.
+ * Drivers can use this in their &drm_simple_display_pipe_funcs->enable
+ * callback.
  */
 void mipi_dbi_pipe_enable(struct drm_simple_display_pipe *pipe,
                          struct drm_crtc_state *crtc_state)
@@ -273,8 +274,6 @@ void mipi_dbi_pipe_enable(struct drm_simple_display_pipe 
*pipe,
        struct mipi_dbi *mipi = mipi_dbi_from_tinydrm(tdev);
        struct drm_framebuffer *fb = pipe->plane.fb;
 
-       DRM_DEBUG_KMS("\n");
-
        mipi->enabled = true;
        if (fb)
                fb->funcs->dirty(fb, NULL, 0, 0, NULL, 0);
@@ -321,6 +320,9 @@ void mipi_dbi_pipe_disable(struct drm_simple_display_pipe 
*pipe)
                tinydrm_disable_backlight(mipi->backlight);
        else
                mipi_dbi_blank(mipi);
+
+       if (mipi->regulator)
+               regulator_disable(mipi->regulator);
 }
 EXPORT_SYMBOL(mipi_dbi_pipe_disable);
 
-- 
2.7.4

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to