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
