drm/rockchip: vop: fix mask when updating interrupts

Commit dbb3d94 (drm/rockchip: vop: move interrupt registers into
vop_data) introduced new macros for updating the interrupt control
registers but these always use the mask from the register definition
without refining it for the particular bits that are being changed.

This means that whenever we enable/disable a particular interrupt we end
up disabling all of the others as a side effect.

Signed-off-by: John Keeping <john@metanate.com>
This commit is contained in:
John Keeping 2016-01-12 18:05:18 +00:00 committed by Mark Yao
parent 63087aae5a
commit c7647f8681
1 changed files with 9 additions and 7 deletions

View File

@ -43,8 +43,8 @@
#define REG_SET(x, base, reg, v, mode) \ #define REG_SET(x, base, reg, v, mode) \
__REG_SET_##mode(x, base + reg.offset, reg.mask, reg.shift, v) __REG_SET_##mode(x, base + reg.offset, reg.mask, reg.shift, v)
#define REG_SET_MASK(x, base, reg, v, mode) \ #define REG_SET_MASK(x, base, reg, mask, v, mode) \
__REG_SET_##mode(x, base + reg.offset, reg.mask, reg.shift, v) __REG_SET_##mode(x, base + reg.offset, mask, reg.shift, v)
#define VOP_WIN_SET(x, win, name, v) \ #define VOP_WIN_SET(x, win, name, v) \
REG_SET(x, win->base, win->phy->name, v, RELAXED) REG_SET(x, win->base, win->phy->name, v, RELAXED)
@ -58,16 +58,18 @@
#define VOP_INTR_GET(vop, name) \ #define VOP_INTR_GET(vop, name) \
vop_read_reg(vop, 0, &vop->data->ctrl->name) vop_read_reg(vop, 0, &vop->data->ctrl->name)
#define VOP_INTR_SET(vop, name, v) \ #define VOP_INTR_SET(vop, name, mask, v) \
REG_SET(vop, 0, vop->data->intr->name, v, NORMAL) REG_SET_MASK(vop, 0, vop->data->intr->name, mask, v, NORMAL)
#define VOP_INTR_SET_TYPE(vop, name, type, v) \ #define VOP_INTR_SET_TYPE(vop, name, type, v) \
do { \ do { \
int i, reg = 0; \ int i, reg = 0, mask = 0; \
for (i = 0; i < vop->data->intr->nintrs; i++) { \ for (i = 0; i < vop->data->intr->nintrs; i++) { \
if (vop->data->intr->intrs[i] & type) \ if (vop->data->intr->intrs[i] & type) { \
reg |= (v) << i; \ reg |= (v) << i; \
mask |= 1 << i; \
} \
} \ } \
VOP_INTR_SET(vop, name, reg); \ VOP_INTR_SET(vop, name, mask, reg); \
} while (0) } while (0)
#define VOP_INTR_GET_TYPE(vop, name, type) \ #define VOP_INTR_GET_TYPE(vop, name, type) \
vop_get_intr_type(vop, &vop->data->intr->name, type) vop_get_intr_type(vop, &vop->data->intr->name, type)