aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Agner <stefan@agner.ch>2015-11-17 21:05:25 -0500
committerStefan Agner <stefan@agner.ch>2016-02-25 19:13:16 -0500
commitefb8b49196c0cb0723024182e04072abaec96cdf (patch)
tree279c06460c0b24a8edefc58aa34ac609f5721a66
parenta36c9867d44718487262643cdefd12a386841b41 (diff)
drm/fsl-dcu: specify volatile registers
Since we are using cached registers, we need to specify volatile registers explicitly to avoid reading their value from the cache. This allows to read the correct interrupt status in fsl_dcu_drm_irq and clear the asserted bits only. Signed-off-by: Stefan Agner <stefan@agner.ch>
-rw-r--r--drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
index 9648b7f9a31c..b4e33e3e0250 100644
--- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
@@ -28,11 +28,21 @@
28#include "fsl_dcu_drm_crtc.h" 28#include "fsl_dcu_drm_crtc.h"
29#include "fsl_dcu_drm_drv.h" 29#include "fsl_dcu_drm_drv.h"
30 30
31static bool fsl_dcu_drm_is_volatile_reg(struct device *dev, unsigned int reg)
32{
33 if (reg == DCU_INT_STATUS || reg == DCU_UPDATE_MODE)
34 return true;
35
36 return false;
37}
38
31static const struct regmap_config fsl_dcu_regmap_config = { 39static const struct regmap_config fsl_dcu_regmap_config = {
32 .reg_bits = 32, 40 .reg_bits = 32,
33 .reg_stride = 4, 41 .reg_stride = 4,
34 .val_bits = 32, 42 .val_bits = 32,
35 .cache_type = REGCACHE_RBTREE, 43 .cache_type = REGCACHE_RBTREE,
44
45 .volatile_reg = fsl_dcu_drm_is_volatile_reg,
36}; 46};
37 47
38static int fsl_dcu_drm_irq_init(struct drm_device *dev) 48static int fsl_dcu_drm_irq_init(struct drm_device *dev)
@@ -125,7 +135,7 @@ static irqreturn_t fsl_dcu_drm_irq(int irq, void *arg)
125 if (int_status & DCU_INT_STATUS_VBLANK) 135 if (int_status & DCU_INT_STATUS_VBLANK)
126 drm_handle_vblank(dev, 0); 136 drm_handle_vblank(dev, 0);
127 137
128 ret = regmap_write(fsl_dev->regmap, DCU_INT_STATUS, 0xffffffff); 138 ret = regmap_write(fsl_dev->regmap, DCU_INT_STATUS, int_status);
129 if (ret) 139 if (ret)
130 dev_err(dev->dev, "set DCU_INT_STATUS failed\n"); 140 dev_err(dev->dev, "set DCU_INT_STATUS failed\n");
131 ret = regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE, 141 ret = regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE,