The tilcdc crtc reset hook performs both atomic state initialization
using drm_atomic_helper_crtc_reset() and hardware-level register
writes to disable the raster and clear IRQ status.

The hardware reset is not related to atomic state initialization, and
the reset hook is being converted to atomic_create_state which only
deals with state allocation. Move the hardware reset to the CRTC
creation path instead.

Signed-off-by: Maxime Ripard <[email protected]>
---
Cc: Jyri Sarha <[email protected]>
Cc: Tomi Valkeinen <[email protected]>
---
 drivers/gpu/drm/tilcdc/tilcdc_crtc.c | 7 +++----
 drivers/gpu/drm/tilcdc/tilcdc_drv.c  | 2 ++
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c 
b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
index e07ecb36a27a..b299d73ce385 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
@@ -683,18 +683,16 @@ static void tilcdc_crtc_disable_vblank(struct drm_crtc 
*crtc)
                             LCDC_V2_END_OF_FRAME0_INT_ENA);
 
        spin_unlock_irqrestore(&tilcdc_crtc->irq_lock, flags);
 }
 
-static void tilcdc_crtc_reset(struct drm_crtc *crtc)
+static void tilcdc_crtc_hw_reset(struct drm_crtc *crtc)
 {
        struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
        struct drm_device *dev = crtc->dev;
        int ret;
 
-       drm_atomic_helper_crtc_reset(crtc);
-
        /* Turn the raster off if it for some reason is on. */
        pm_runtime_get_sync(dev->dev);
        if (tilcdc_read(dev, LCDC_RASTER_CTRL_REG) & LCDC_RASTER_ENABLE) {
                /* Enable DMA Frame Done Interrupt */
                tilcdc_write(dev, LCDC_INT_ENABLE_SET_REG, LCDC_FRAME_DONE);
@@ -714,11 +712,11 @@ static void tilcdc_crtc_reset(struct drm_crtc *crtc)
 }
 
 static const struct drm_crtc_funcs tilcdc_crtc_funcs = {
        .set_config     = drm_atomic_helper_set_config,
        .page_flip      = drm_atomic_helper_page_flip,
-       .reset          = tilcdc_crtc_reset,
+       .reset          = drm_atomic_helper_crtc_reset,
        .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
        .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
        .enable_vblank  = tilcdc_crtc_enable_vblank,
        .disable_vblank = tilcdc_crtc_disable_vblank,
 };
@@ -818,10 +816,11 @@ static const struct drm_crtc_helper_funcs 
tilcdc_crtc_helper_funcs = {
        .mode_fixup     = tilcdc_crtc_mode_fixup,
        .atomic_check   = tilcdc_crtc_atomic_check,
        .atomic_enable  = tilcdc_crtc_atomic_enable,
        .atomic_disable = tilcdc_crtc_atomic_disable,
        .atomic_flush   = tilcdc_crtc_atomic_flush,
+       .hw_reset       = tilcdc_crtc_hw_reset,
 };
 
 void tilcdc_crtc_update_clk(struct drm_crtc *crtc)
 {
        struct drm_device *dev = crtc->dev;
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c 
b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
index 1d6c9a423a41..827f15d14fad 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
@@ -247,13 +247,15 @@ static int tilcdc_pm_suspend(struct device *dev)
 }
 
 static int tilcdc_pm_resume(struct device *dev)
 {
        struct drm_device *ddev = dev_get_drvdata(dev);
+       struct tilcdc_drm_private *priv = ddev_to_tilcdc_priv(ddev);
 
        /* Select default pin state */
        pinctrl_pm_select_default_state(dev);
+
        return  drm_mode_config_helper_resume(ddev);
 }
 
 static DEFINE_SIMPLE_DEV_PM_OPS(tilcdc_pm_ops,
                                tilcdc_pm_suspend, tilcdc_pm_resume);

-- 
2.55.0

Reply via email to