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 | 49 +++++++++++++++---------------------
 1 file changed, 20 insertions(+), 29 deletions(-)

diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c 
b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
index e07ecb36a27a..910580c4dada 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
@@ -683,42 +683,14 @@ 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)
-{
-       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);
-               tilcdc_clear_irqstatus(dev, 0xffffffff);
-
-               tilcdc_crtc->frame_done = false;
-               tilcdc_clear(dev, LCDC_RASTER_CTRL_REG, LCDC_RASTER_ENABLE);
-
-               ret = wait_event_timeout(tilcdc_crtc->frame_done_wq,
-                                        tilcdc_crtc->frame_done,
-                                        msecs_to_jiffies(500));
-               if (ret == 0)
-                       drm_err(dev, "%s: timeout waiting for framedone\n",
-                               __func__);
-       }
-       pm_runtime_put_sync(dev->dev);
-}
-
 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,
 };
@@ -1003,7 +975,26 @@ int tilcdc_crtc_create(struct drm_device *dev)
        spin_lock_init(&tilcdc_crtc->irq_lock);
        INIT_WORK(&tilcdc_crtc->recover_work, tilcdc_crtc_recover_work);
 
        drm_crtc_helper_add(crtc, &tilcdc_crtc_helper_funcs);
 
+       /* 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);
+               tilcdc_clear_irqstatus(dev, 0xffffffff);
+
+               tilcdc_crtc->frame_done = false;
+               tilcdc_clear(dev, LCDC_RASTER_CTRL_REG, LCDC_RASTER_ENABLE);
+
+               ret = wait_event_timeout(tilcdc_crtc->frame_done_wq,
+                                        tilcdc_crtc->frame_done,
+                                        msecs_to_jiffies(500));
+               if (ret == 0)
+                       drm_err(dev, "%s: timeout waiting for framedone\n",
+                               __func__);
+       }
+       pm_runtime_put_sync(dev->dev);
+
        return 0;
 }

-- 
2.55.0

Reply via email to