Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'fixes-for-v4.9-rc5' of http://git.agner.ch/git/linux-drm-fsl-dcu into drm-fixes

Yet another small batch of fixes. Two of the patches I had prepared
since quite some time, but they did not seem to affect operation in
a visible manner so far. Until recently, when I discovered the third
issue (disable planes before disabling CRTC), which made the two
previous fixes necessary.

* 'fixes-for-v4.9-rc5' of http://git.agner.ch/git/linux-drm-fsl-dcu:
drm/fsl-dcu: disable planes before disabling CRTC
drm/fsl-dcu: update all registers on flush
drm/fsl-dcu: do not update when modifying irq registers

+11 -11
+11 -2
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c
··· 25 25 static void fsl_dcu_drm_crtc_atomic_flush(struct drm_crtc *crtc, 26 26 struct drm_crtc_state *old_crtc_state) 27 27 { 28 + struct drm_device *dev = crtc->dev; 29 + struct fsl_dcu_drm_device *fsl_dev = dev->dev_private; 28 30 struct drm_pending_vblank_event *event = crtc->state->event; 31 + 32 + regmap_write(fsl_dev->regmap, 33 + DCU_UPDATE_MODE, DCU_UPDATE_MODE_READREG); 29 34 30 35 if (event) { 31 36 crtc->state->event = NULL; ··· 44 39 } 45 40 } 46 41 47 - static void fsl_dcu_drm_disable_crtc(struct drm_crtc *crtc) 42 + static void fsl_dcu_drm_crtc_atomic_disable(struct drm_crtc *crtc, 43 + struct drm_crtc_state *old_crtc_state) 48 44 { 49 45 struct drm_device *dev = crtc->dev; 50 46 struct fsl_dcu_drm_device *fsl_dev = dev->dev_private; 47 + 48 + /* always disable planes on the CRTC */ 49 + drm_atomic_helper_disable_planes_on_crtc(old_crtc_state, true); 51 50 52 51 drm_crtc_vblank_off(crtc); 53 52 ··· 131 122 } 132 123 133 124 static const struct drm_crtc_helper_funcs fsl_dcu_drm_crtc_helper_funcs = { 125 + .atomic_disable = fsl_dcu_drm_crtc_atomic_disable, 134 126 .atomic_flush = fsl_dcu_drm_crtc_atomic_flush, 135 - .disable = fsl_dcu_drm_disable_crtc, 136 127 .enable = fsl_dcu_drm_crtc_enable, 137 128 .mode_set_nofb = fsl_dcu_drm_crtc_mode_set_nofb, 138 129 };
-4
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
··· 59 59 60 60 regmap_write(fsl_dev->regmap, DCU_INT_STATUS, 0); 61 61 regmap_write(fsl_dev->regmap, DCU_INT_MASK, ~0); 62 - regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE, 63 - DCU_UPDATE_MODE_READREG); 64 62 65 63 return ret; 66 64 } ··· 137 139 drm_handle_vblank(dev, 0); 138 140 139 141 regmap_write(fsl_dev->regmap, DCU_INT_STATUS, int_status); 140 - regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE, 141 - DCU_UPDATE_MODE_READREG); 142 142 143 143 return IRQ_HANDLED; 144 144 }
-5
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.c
··· 160 160 DCU_LAYER_POST_SKIP(0) | 161 161 DCU_LAYER_PRE_SKIP(0)); 162 162 } 163 - regmap_update_bits(fsl_dev->regmap, DCU_DCU_MODE, 164 - DCU_MODE_DCU_MODE_MASK, 165 - DCU_MODE_DCU_MODE(DCU_MODE_NORMAL)); 166 - regmap_write(fsl_dev->regmap, 167 - DCU_UPDATE_MODE, DCU_UPDATE_MODE_READREG); 168 163 169 164 return; 170 165 }