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 725dffad5640..6dfdb145f3bb 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 | ||
