aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2017-01-08 18:13:06 -0500
committerDave Airlie <airlied@redhat.com>2017-01-08 18:13:06 -0500
commit13fe46b589c216f3a0c8e142282125c782a175f5 (patch)
tree0a49d0098217898f1df7018f8247fcfa3f84b59e
parente1ef6f71e347655f3ffbcc40d7ced8ea754114b7 (diff)
parentf97fd383d9a10fd125bcdafba03240685aed5608 (diff)
Merge tag 'tilcdc-4.10-fixes' of https://github.com/jsarha/linux into drm-fixes
tilcdc fixes for v4.10. * tag 'tilcdc-4.10-fixes' of https://github.com/jsarha/linux: drm: tilcdc: simplify the recovery from sync lost error on rev1
-rw-r--r--drivers/gpu/drm/tilcdc/tilcdc_crtc.c27
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