diff options
-rw-r--r-- | drivers/gpu/drm/tilcdc/tilcdc_crtc.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c index 9942b0577d6e..20041073e46d 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c | |||
@@ -856,7 +856,7 @@ irqreturn_t tilcdc_crtc_irq(struct drm_crtc *crtc) | |||
856 | struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc); | 856 | struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc); |
857 | struct drm_device *dev = crtc->dev; | 857 | struct drm_device *dev = crtc->dev; |
858 | struct tilcdc_drm_private *priv = dev->dev_private; | 858 | struct tilcdc_drm_private *priv = dev->dev_private; |
859 | uint32_t stat; | 859 | uint32_t stat, reg; |
860 | 860 | ||
861 | stat = tilcdc_read_irqstatus(dev); | 861 | stat = tilcdc_read_irqstatus(dev); |
862 | tilcdc_clear_irqstatus(dev, stat); | 862 | tilcdc_clear_irqstatus(dev, stat); |
@@ -921,17 +921,26 @@ irqreturn_t tilcdc_crtc_irq(struct drm_crtc *crtc) | |||
921 | dev_err_ratelimited(dev->dev, "%s(0x%08x): Sync lost", | 921 | dev_err_ratelimited(dev->dev, "%s(0x%08x): Sync lost", |
922 | __func__, stat); | 922 | __func__, stat); |
923 | tilcdc_crtc->frame_intact = false; | 923 | tilcdc_crtc->frame_intact = false; |
924 | if (tilcdc_crtc->sync_lost_count++ > | 924 | if (priv->rev == 1) { |
925 | SYNC_LOST_COUNT_LIMIT) { | 925 | reg = tilcdc_read(dev, LCDC_RASTER_CTRL_REG); |
926 | dev_err(dev->dev, "%s(0x%08x): Sync lost flood detected, recovering", __func__, stat); | 926 | if (reg & LCDC_RASTER_ENABLE) { |
927 | queue_work(system_wq, &tilcdc_crtc->recover_work); | ||
928 | if (priv->rev == 1) | ||
929 | tilcdc_clear(dev, LCDC_RASTER_CTRL_REG, | 927 | tilcdc_clear(dev, LCDC_RASTER_CTRL_REG, |
930 | LCDC_V1_SYNC_LOST_INT_ENA); | 928 | LCDC_RASTER_ENABLE); |
931 | else | 929 | tilcdc_set(dev, LCDC_RASTER_CTRL_REG, |
930 | LCDC_RASTER_ENABLE); | ||
931 | } | ||
932 | } else { | ||
933 | if (tilcdc_crtc->sync_lost_count++ > | ||
934 | SYNC_LOST_COUNT_LIMIT) { | ||
935 | dev_err(dev->dev, | ||
936 | "%s(0x%08x): Sync lost flood detected, recovering", | ||
937 | __func__, stat); | ||
938 | queue_work(system_wq, | ||
939 | &tilcdc_crtc->recover_work); | ||
932 | tilcdc_write(dev, LCDC_INT_ENABLE_CLR_REG, | 940 | tilcdc_write(dev, LCDC_INT_ENABLE_CLR_REG, |
933 | LCDC_SYNC_LOST); | 941 | LCDC_SYNC_LOST); |
934 | tilcdc_crtc->sync_lost_count = 0; | 942 | tilcdc_crtc->sync_lost_count = 0; |
943 | } | ||
935 | } | 944 | } |
936 | } | 945 | } |
937 | 946 | ||