drm/fsl-dcu: specify volatile registers
authorStefan Agner <stefan@agner.ch>
Wed, 18 Nov 2015 02:05:25 +0000 (18:05 -0800)
committerStefan Agner <stefan@agner.ch>
Wed, 3 Feb 2016 00:31:25 +0000 (16:31 -0800)
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>
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c

index 1930234ba5f13596f3b998d737c88e987b3370e7..d6e27afcb24498ea459e3cc3eefdd2f90bfc7c71 100644 (file)
 #include "fsl_dcu_drm_crtc.h"
 #include "fsl_dcu_drm_drv.h"
 
+static bool fsl_dcu_drm_is_volatile_reg(struct device *dev, unsigned int reg)
+{
+       if (reg == DCU_INT_STATUS || reg == DCU_UPDATE_MODE)
+               return true;
+
+       return false;
+}
+
 static const struct regmap_config fsl_dcu_regmap_config = {
        .reg_bits = 32,
        .reg_stride = 4,
        .val_bits = 32,
        .cache_type = REGCACHE_RBTREE,
+
+       .volatile_reg = fsl_dcu_drm_is_volatile_reg,
 };
 
 static int fsl_dcu_drm_irq_init(struct drm_device *dev)
@@ -129,7 +139,7 @@ static irqreturn_t fsl_dcu_drm_irq(int irq, void *arg)
        if (int_status & DCU_INT_STATUS_VBLANK)
                drm_handle_vblank(dev, 0);
 
-       ret = regmap_write(fsl_dev->regmap, DCU_INT_STATUS, 0xffffffff);
+       ret = regmap_write(fsl_dev->regmap, DCU_INT_STATUS, int_status);
        if (ret)
                dev_err(dev->dev, "set DCU_INT_STATUS failed\n");
        ret = regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE,