diff options
author | Dave Airlie <airlied@redhat.com> | 2017-01-08 18:13:06 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2017-01-08 18:13:06 -0500 |
commit | 13fe46b589c216f3a0c8e142282125c782a175f5 (patch) | |
tree | 0a49d0098217898f1df7018f8247fcfa3f84b59e | |
parent | e1ef6f71e347655f3ffbcc40d7ced8ea754114b7 (diff) | |
parent | f97fd383d9a10fd125bcdafba03240685aed5608 (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.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 | ||