Skip to content

Commit 9a61c54

Browse files
author
Mark yao
committed
drm/rockchip: vop: group vop registers
Grouping the vop registers facilitates make register definition clearer, and also is useful for different vop reuse the same group register. Signed-off-by: Mark Yao <[email protected]> Reviewed-by: Jeffy Chen <[email protected]> Tested-by: Heiko Stuebner <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent ac6560d commit 9a61c54

File tree

3 files changed

+146
-127
lines changed

3 files changed

+146
-127
lines changed

drivers/gpu/drm/rockchip/rockchip_drm_vop.c

Lines changed: 49 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -42,30 +42,19 @@
4242
#include "rockchip_drm_psr.h"
4343
#include "rockchip_drm_vop.h"
4444

45-
#define REG_SET(x, base, reg, v) \
46-
vop_mask_write(x, base + reg.offset, reg.mask, reg.shift, \
47-
v, reg.write_mask, reg.relaxed)
48-
#define REG_SET_MASK(x, base, reg, mask, v) \
49-
vop_mask_write(x, base + reg.offset, \
50-
mask, reg.shift, v, reg.write_mask, reg.relaxed)
51-
5245
#define VOP_WIN_SET(x, win, name, v) \
53-
REG_SET(x, win->base, win->phy->name, v)
46+
vop_reg_set(vop, &win->phy->name, win->base, ~0, v, #name)
5447
#define VOP_SCL_SET(x, win, name, v) \
55-
REG_SET(x, win->base, win->phy->scl->name, v)
48+
vop_reg_set(vop, &win->phy->scl->name, win->base, ~0, v, #name)
5649
#define VOP_SCL_SET_EXT(x, win, name, v) \
57-
REG_SET(x, win->base, win->phy->scl->ext->name, v)
58-
#define VOP_CTRL_SET(x, name, v) \
59-
REG_SET(x, 0, (x)->data->ctrl->name, v)
60-
61-
#define VOP_INTR_GET(vop, name) \
62-
vop_read_reg(vop, 0, &vop->data->ctrl->name)
63-
64-
#define VOP_INTR_SET(vop, name, v) \
65-
REG_SET(vop, 0, vop->data->intr->name, v)
50+
vop_reg_set(vop, &win->phy->scl->ext->name, \
51+
win->base, ~0, v, #name)
6652

6753
#define VOP_INTR_SET_MASK(vop, name, mask, v) \
68-
REG_SET_MASK(vop, 0, vop->data->intr->name, mask, v)
54+
vop_reg_set(vop, &vop->data->intr->name, 0, mask, v, #name)
55+
56+
#define VOP_REG_SET(vop, group, name, v) \
57+
vop_reg_set(vop, &vop->data->group->name, 0, ~0, v, #name)
6958

7059
#define VOP_INTR_SET_TYPE(vop, name, type, v) \
7160
do { \
@@ -82,7 +71,7 @@
8271
vop_get_intr_type(vop, &vop->data->intr->name, type)
8372

8473
#define VOP_WIN_GET(x, win, name) \
85-
vop_read_reg(x, win->base, &win->phy->name)
74+
vop_read_reg(x, win->offset, win->phy->name)
8675

8776
#define VOP_WIN_GET_YRGBADDR(vop, win) \
8877
vop_readl(vop, win->base + win->phy->yrgb_mst.offset)
@@ -164,14 +153,22 @@ static inline uint32_t vop_read_reg(struct vop *vop, uint32_t base,
164153
return (vop_readl(vop, base + reg->offset) >> reg->shift) & reg->mask;
165154
}
166155

167-
static inline void vop_mask_write(struct vop *vop, uint32_t offset,
168-
uint32_t mask, uint32_t shift, uint32_t v,
169-
bool write_mask, bool relaxed)
156+
static void vop_reg_set(struct vop *vop, const struct vop_reg *reg,
157+
uint32_t _offset, uint32_t _mask, uint32_t v,
158+
const char *reg_name)
170159
{
171-
if (!mask)
160+
int offset, mask, shift;
161+
162+
if (!reg || !reg->mask) {
163+
dev_dbg(vop->dev, "Warning: not support %s\n", reg_name);
172164
return;
165+
}
166+
167+
offset = reg->offset + _offset;
168+
mask = reg->mask & _mask;
169+
shift = reg->shift;
173170

174-
if (write_mask) {
171+
if (reg->write_mask) {
175172
v = ((v << shift) & 0xffff) | (mask << (shift + 16));
176173
} else {
177174
uint32_t cached_val = vop->regsbak[offset >> 2];
@@ -180,7 +177,7 @@ static inline void vop_mask_write(struct vop *vop, uint32_t offset,
180177
vop->regsbak[offset >> 2] = v;
181178
}
182179

183-
if (relaxed)
180+
if (reg->relaxed)
184181
writel_relaxed(v, vop->regs + offset);
185182
else
186183
writel(v, vop->regs + offset);
@@ -202,7 +199,7 @@ static inline uint32_t vop_get_intr_type(struct vop *vop,
202199

203200
static inline void vop_cfg_done(struct vop *vop)
204201
{
205-
VOP_CTRL_SET(vop, cfg_done, 1);
202+
VOP_REG_SET(vop, common, cfg_done, 1);
206203
}
207204

208205
static bool has_rb_swapped(uint32_t format)
@@ -540,7 +537,7 @@ static int vop_enable(struct drm_crtc *crtc)
540537

541538
spin_lock(&vop->reg_lock);
542539

543-
VOP_CTRL_SET(vop, standby, 0);
540+
VOP_REG_SET(vop, common, standby, 1);
544541

545542
spin_unlock(&vop->reg_lock);
546543

@@ -601,7 +598,7 @@ static void vop_crtc_atomic_disable(struct drm_crtc *crtc,
601598

602599
spin_lock(&vop->reg_lock);
603600

604-
VOP_CTRL_SET(vop, standby, 1);
601+
VOP_REG_SET(vop, common, standby, 1);
605602

606603
spin_unlock(&vop->reg_lock);
607604

@@ -925,7 +922,7 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc,
925922

926923
spin_lock(&vop->reg_lock);
927924

928-
VOP_CTRL_SET(vop, standby, 1);
925+
VOP_REG_SET(vop, common, standby, 1);
929926

930927
spin_unlock(&vop->reg_lock);
931928

@@ -939,29 +936,29 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc,
939936
BIT(HSYNC_POSITIVE) : 0;
940937
pin_pol |= (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) ?
941938
BIT(VSYNC_POSITIVE) : 0;
942-
VOP_CTRL_SET(vop, pin_pol, pin_pol);
939+
VOP_REG_SET(vop, output, pin_pol, pin_pol);
943940

944941
switch (s->output_type) {
945942
case DRM_MODE_CONNECTOR_LVDS:
946-
VOP_CTRL_SET(vop, rgb_en, 1);
947-
VOP_CTRL_SET(vop, rgb_pin_pol, pin_pol);
943+
VOP_REG_SET(vop, output, rgb_en, 1);
944+
VOP_REG_SET(vop, output, rgb_pin_pol, pin_pol);
948945
break;
949946
case DRM_MODE_CONNECTOR_eDP:
950-
VOP_CTRL_SET(vop, edp_pin_pol, pin_pol);
951-
VOP_CTRL_SET(vop, edp_en, 1);
947+
VOP_REG_SET(vop, output, edp_pin_pol, pin_pol);
948+
VOP_REG_SET(vop, output, edp_en, 1);
952949
break;
953950
case DRM_MODE_CONNECTOR_HDMIA:
954-
VOP_CTRL_SET(vop, hdmi_pin_pol, pin_pol);
955-
VOP_CTRL_SET(vop, hdmi_en, 1);
951+
VOP_REG_SET(vop, output, hdmi_pin_pol, pin_pol);
952+
VOP_REG_SET(vop, output, hdmi_en, 1);
956953
break;
957954
case DRM_MODE_CONNECTOR_DSI:
958-
VOP_CTRL_SET(vop, mipi_pin_pol, pin_pol);
959-
VOP_CTRL_SET(vop, mipi_en, 1);
955+
VOP_REG_SET(vop, output, mipi_pin_pol, pin_pol);
956+
VOP_REG_SET(vop, output, mipi_en, 1);
960957
break;
961958
case DRM_MODE_CONNECTOR_DisplayPort:
962959
pin_pol &= ~BIT(DCLK_INVERT);
963-
VOP_CTRL_SET(vop, dp_pin_pol, pin_pol);
964-
VOP_CTRL_SET(vop, dp_en, 1);
960+
VOP_REG_SET(vop, output, dp_pin_pol, pin_pol);
961+
VOP_REG_SET(vop, output, dp_en, 1);
965962
break;
966963
default:
967964
DRM_DEV_ERROR(vop->dev, "unsupported connector_type [%d]\n",
@@ -974,25 +971,25 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc,
974971
if (s->output_mode == ROCKCHIP_OUT_MODE_AAAA &&
975972
!(vop_data->feature & VOP_FEATURE_OUTPUT_RGB10))
976973
s->output_mode = ROCKCHIP_OUT_MODE_P888;
977-
VOP_CTRL_SET(vop, out_mode, s->output_mode);
974+
VOP_REG_SET(vop, common, out_mode, s->output_mode);
978975

979-
VOP_CTRL_SET(vop, htotal_pw, (htotal << 16) | hsync_len);
976+
VOP_REG_SET(vop, modeset, htotal_pw, (htotal << 16) | hsync_len);
980977
val = hact_st << 16;
981978
val |= hact_end;
982-
VOP_CTRL_SET(vop, hact_st_end, val);
983-
VOP_CTRL_SET(vop, hpost_st_end, val);
979+
VOP_REG_SET(vop, modeset, hact_st_end, val);
980+
VOP_REG_SET(vop, modeset, hpost_st_end, val);
984981

985-
VOP_CTRL_SET(vop, vtotal_pw, (vtotal << 16) | vsync_len);
982+
VOP_REG_SET(vop, modeset, vtotal_pw, (vtotal << 16) | vsync_len);
986983
val = vact_st << 16;
987984
val |= vact_end;
988-
VOP_CTRL_SET(vop, vact_st_end, val);
989-
VOP_CTRL_SET(vop, vpost_st_end, val);
985+
VOP_REG_SET(vop, modeset, vact_st_end, val);
986+
VOP_REG_SET(vop, modeset, vpost_st_end, val);
990987

991-
VOP_INTR_SET(vop, line_flag_num[0], vact_end);
988+
VOP_REG_SET(vop, intr, line_flag_num[0], vact_end);
992989

993990
clk_set_rate(vop->dclk, adjusted_mode->clock * 1000);
994991

995-
VOP_CTRL_SET(vop, standby, 0);
992+
VOP_REG_SET(vop, common, standby, 0);
996993

997994
rockchip_drm_psr_activate(&vop->crtc);
998995
}
@@ -1455,8 +1452,8 @@ static int vop_initial(struct vop *vop)
14551452

14561453
memcpy(vop->regsbak, vop->regs, vop->len);
14571454

1458-
VOP_CTRL_SET(vop, global_regdone_en, 1);
1459-
VOP_CTRL_SET(vop, dsp_blank, 0);
1455+
VOP_REG_SET(vop, misc, global_regdone_en, 1);
1456+
VOP_REG_SET(vop, common, dsp_blank, 0);
14601457

14611458
for (i = 0; i < vop_data->win_size; i++) {
14621459
const struct vop_win_data *win = &vop_data->win[i];

drivers/gpu/drm/rockchip/rockchip_drm_vop.h

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,43 +25,50 @@ enum vop_data_format {
2525
};
2626

2727
struct vop_reg {
28-
uint32_t offset;
29-
uint32_t shift;
3028
uint32_t mask;
29+
uint16_t offset;
30+
uint8_t shift;
3131
bool write_mask;
3232
bool relaxed;
3333
};
3434

35-
struct vop_ctrl {
36-
struct vop_reg standby;
37-
struct vop_reg data_blank;
38-
struct vop_reg gate_en;
39-
struct vop_reg mmu_en;
40-
struct vop_reg rgb_en;
35+
struct vop_modeset {
36+
struct vop_reg htotal_pw;
37+
struct vop_reg hact_st_end;
38+
struct vop_reg hpost_st_end;
39+
struct vop_reg vtotal_pw;
40+
struct vop_reg vact_st_end;
41+
struct vop_reg vpost_st_end;
42+
};
43+
44+
struct vop_output {
45+
struct vop_reg pin_pol;
46+
struct vop_reg dp_pin_pol;
47+
struct vop_reg edp_pin_pol;
48+
struct vop_reg hdmi_pin_pol;
49+
struct vop_reg mipi_pin_pol;
50+
struct vop_reg rgb_pin_pol;
51+
struct vop_reg dp_en;
4152
struct vop_reg edp_en;
4253
struct vop_reg hdmi_en;
4354
struct vop_reg mipi_en;
44-
struct vop_reg dp_en;
55+
struct vop_reg rgb_en;
56+
};
57+
58+
struct vop_common {
59+
struct vop_reg cfg_done;
4560
struct vop_reg dsp_blank;
46-
struct vop_reg out_mode;
61+
struct vop_reg data_blank;
4762
struct vop_reg dither_down;
4863
struct vop_reg dither_up;
49-
struct vop_reg pin_pol;
50-
struct vop_reg rgb_pin_pol;
51-
struct vop_reg hdmi_pin_pol;
52-
struct vop_reg edp_pin_pol;
53-
struct vop_reg mipi_pin_pol;
54-
struct vop_reg dp_pin_pol;
55-
56-
struct vop_reg htotal_pw;
57-
struct vop_reg hact_st_end;
58-
struct vop_reg vtotal_pw;
59-
struct vop_reg vact_st_end;
60-
struct vop_reg hpost_st_end;
61-
struct vop_reg vpost_st_end;
64+
struct vop_reg gate_en;
65+
struct vop_reg mmu_en;
66+
struct vop_reg out_mode;
67+
struct vop_reg standby;
68+
};
6269

70+
struct vop_misc {
6371
struct vop_reg global_regdone_en;
64-
struct vop_reg cfg_done;
6572
};
6673

6774
struct vop_intr {
@@ -135,8 +142,11 @@ struct vop_win_data {
135142
};
136143

137144
struct vop_data {
138-
const struct vop_ctrl *ctrl;
139145
const struct vop_intr *intr;
146+
const struct vop_common *common;
147+
const struct vop_misc *misc;
148+
const struct vop_modeset *modeset;
149+
const struct vop_output *output;
140150
const struct vop_win_data *win;
141151
unsigned int win_size;
142152

0 commit comments

Comments
 (0)