42
42
#include "rockchip_drm_psr.h"
43
43
#include "rockchip_drm_vop.h"
44
44
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
-
52
45
#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 )
54
47
#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 )
56
49
#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)
66
52
67
53
#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)
69
58
70
59
#define VOP_INTR_SET_TYPE (vop , name , type , v ) \
71
60
do { \
82
71
vop_get_intr_type(vop, &vop->data->intr->name, type)
83
72
84
73
#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)
86
75
87
76
#define VOP_WIN_GET_YRGBADDR (vop , win ) \
88
77
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,
164
153
return (vop_readl (vop , base + reg -> offset ) >> reg -> shift ) & reg -> mask ;
165
154
}
166
155
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 )
170
159
{
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 );
172
164
return ;
165
+ }
166
+
167
+ offset = reg -> offset + _offset ;
168
+ mask = reg -> mask & _mask ;
169
+ shift = reg -> shift ;
173
170
174
- if (write_mask ) {
171
+ if (reg -> write_mask ) {
175
172
v = ((v << shift ) & 0xffff ) | (mask << (shift + 16 ));
176
173
} else {
177
174
uint32_t cached_val = vop -> regsbak [offset >> 2 ];
@@ -180,7 +177,7 @@ static inline void vop_mask_write(struct vop *vop, uint32_t offset,
180
177
vop -> regsbak [offset >> 2 ] = v ;
181
178
}
182
179
183
- if (relaxed )
180
+ if (reg -> relaxed )
184
181
writel_relaxed (v , vop -> regs + offset );
185
182
else
186
183
writel (v , vop -> regs + offset );
@@ -202,7 +199,7 @@ static inline uint32_t vop_get_intr_type(struct vop *vop,
202
199
203
200
static inline void vop_cfg_done (struct vop * vop )
204
201
{
205
- VOP_CTRL_SET (vop , cfg_done , 1 );
202
+ VOP_REG_SET (vop , common , cfg_done , 1 );
206
203
}
207
204
208
205
static bool has_rb_swapped (uint32_t format )
@@ -540,7 +537,7 @@ static int vop_enable(struct drm_crtc *crtc)
540
537
541
538
spin_lock (& vop -> reg_lock );
542
539
543
- VOP_CTRL_SET (vop , standby , 0 );
540
+ VOP_REG_SET (vop , common , standby , 1 );
544
541
545
542
spin_unlock (& vop -> reg_lock );
546
543
@@ -601,7 +598,7 @@ static void vop_crtc_atomic_disable(struct drm_crtc *crtc,
601
598
602
599
spin_lock (& vop -> reg_lock );
603
600
604
- VOP_CTRL_SET (vop , standby , 1 );
601
+ VOP_REG_SET (vop , common , standby , 1 );
605
602
606
603
spin_unlock (& vop -> reg_lock );
607
604
@@ -925,7 +922,7 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc,
925
922
926
923
spin_lock (& vop -> reg_lock );
927
924
928
- VOP_CTRL_SET (vop , standby , 1 );
925
+ VOP_REG_SET (vop , common , standby , 1 );
929
926
930
927
spin_unlock (& vop -> reg_lock );
931
928
@@ -939,29 +936,29 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc,
939
936
BIT (HSYNC_POSITIVE ) : 0 ;
940
937
pin_pol |= (adjusted_mode -> flags & DRM_MODE_FLAG_PVSYNC ) ?
941
938
BIT (VSYNC_POSITIVE ) : 0 ;
942
- VOP_CTRL_SET (vop , pin_pol , pin_pol );
939
+ VOP_REG_SET (vop , output , pin_pol , pin_pol );
943
940
944
941
switch (s -> output_type ) {
945
942
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 );
948
945
break ;
949
946
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 );
952
949
break ;
953
950
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 );
956
953
break ;
957
954
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 );
960
957
break ;
961
958
case DRM_MODE_CONNECTOR_DisplayPort :
962
959
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 );
965
962
break ;
966
963
default :
967
964
DRM_DEV_ERROR (vop -> dev , "unsupported connector_type [%d]\n" ,
@@ -974,25 +971,25 @@ static void vop_crtc_atomic_enable(struct drm_crtc *crtc,
974
971
if (s -> output_mode == ROCKCHIP_OUT_MODE_AAAA &&
975
972
!(vop_data -> feature & VOP_FEATURE_OUTPUT_RGB10 ))
976
973
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 );
978
975
979
- VOP_CTRL_SET (vop , htotal_pw , (htotal << 16 ) | hsync_len );
976
+ VOP_REG_SET (vop , modeset , htotal_pw , (htotal << 16 ) | hsync_len );
980
977
val = hact_st << 16 ;
981
978
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 );
984
981
985
- VOP_CTRL_SET (vop , vtotal_pw , (vtotal << 16 ) | vsync_len );
982
+ VOP_REG_SET (vop , modeset , vtotal_pw , (vtotal << 16 ) | vsync_len );
986
983
val = vact_st << 16 ;
987
984
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 );
990
987
991
- VOP_INTR_SET (vop , line_flag_num [0 ], vact_end );
988
+ VOP_REG_SET (vop , intr , line_flag_num [0 ], vact_end );
992
989
993
990
clk_set_rate (vop -> dclk , adjusted_mode -> clock * 1000 );
994
991
995
- VOP_CTRL_SET (vop , standby , 0 );
992
+ VOP_REG_SET (vop , common , standby , 0 );
996
993
997
994
rockchip_drm_psr_activate (& vop -> crtc );
998
995
}
@@ -1455,8 +1452,8 @@ static int vop_initial(struct vop *vop)
1455
1452
1456
1453
memcpy (vop -> regsbak , vop -> regs , vop -> len );
1457
1454
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 );
1460
1457
1461
1458
for (i = 0 ; i < vop_data -> win_size ; i ++ ) {
1462
1459
const struct vop_win_data * win = & vop_data -> win [i ];
0 commit comments