|
@@ -728,11 +728,39 @@ static void tilcdc_crtc_disable_vblank(struct drm_crtc *crtc)
|
|
{
|
|
{
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+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)
|
|
|
|
+ dev_err(dev->dev, "%s: timeout waiting for framedone\n",
|
|
|
|
+ __func__);
|
|
|
|
+ }
|
|
|
|
+ pm_runtime_put_sync(dev->dev);
|
|
|
|
+}
|
|
|
|
+
|
|
static const struct drm_crtc_funcs tilcdc_crtc_funcs = {
|
|
static const struct drm_crtc_funcs tilcdc_crtc_funcs = {
|
|
.destroy = tilcdc_crtc_destroy,
|
|
.destroy = tilcdc_crtc_destroy,
|
|
.set_config = drm_atomic_helper_set_config,
|
|
.set_config = drm_atomic_helper_set_config,
|
|
.page_flip = drm_atomic_helper_page_flip,
|
|
.page_flip = drm_atomic_helper_page_flip,
|
|
- .reset = drm_atomic_helper_crtc_reset,
|
|
|
|
|
|
+ .reset = tilcdc_crtc_reset,
|
|
.atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
|
|
.atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,
|
|
.atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
|
|
.atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
|
|
.enable_vblank = tilcdc_crtc_enable_vblank,
|
|
.enable_vblank = tilcdc_crtc_enable_vblank,
|