4 #include <linux/rk_fb.h>
7 #include <linux/regmap.h>
8 #include <linux/mfd/syscon.h>
10 #define VOP_INPUT_MAX_WIDTH 2048
13 * Registers in this file
14 * REG_CFG_DONE: Register config done flag
15 * VERSION_INFO: Version for vop
16 * DSP_BG: Background color
17 * MCU_RESERVED: Reversed
18 * SYS_CTRL0: System control register0
19 * SYS_CTRL1: Axi Bus interface control register
20 * SYS_CTRL2: System control register for immediate reg
21 * DSP_CTRL0: Display control register0
22 * DSP_CTRL2: Display control register2
23 * VOP_STATUS: Some vop module status
24 * LINE_FLAG: Line flag config register
25 * INTR_EN: Interrupt enable register
26 * INTR_CLEAR: Interrupt clear register
27 * INTR_STATUS: Interrupt raw status and interrupt status
28 * WIN0_CTRL0: Win0 ctrl register0
29 * WIN0_CTRL1: Win0 ctrl register1
30 * WIN0_COLOR_KEY: Win0 color key register
31 * WIN0_VIR: Win0 virtual stride
32 * WIN0_YRGB_MST: Win0 YRGB memory start address
33 * WIN0_CBR_MST: Win0 Cbr memory start address
34 * WIN0_ACT_INFO: Win0 active window width/height
35 * WIN0_DSP_INFO: Win0 display width/height on panel
36 * WIN0_DSP_ST: Win0 display start point on panel
37 * WIN0_SCL_FACTOR_YRGB: Win0 YRGB scaling factor
38 * WIN0_SCL_FACTOR_CBR: Win0 Cbr scaling factor
39 * WIN0_SCL_OFFSET: Win0 scaling start point offset
40 * WIN0_ALPHA_CTRL: Win0 Blending control register
41 * WIN1_CTRL0: Win1 ctrl register0
42 * WIN1_CTRL1: Win1 ctrl register1
43 * WIN1_VIR: win1 virtual stride
44 * WIN1_YRGB_MST: Win1 frame buffer memory start address
45 * WIN1_DSP_INFO: Win1 display width/height on panel
46 * WIN1_DSP_ST: Win1 display start point on panel
47 * WIN1_COLOR_KEY: Win1 color key register
48 * WIN1_ALPHA_CTRL: Win1 Blending control register
49 * HWC_CTRL0: Hwc ctrl register0
50 * HWC_CTRL1: Hwc ctrl register1
51 * HWC_MST: Hwc memory start address
52 * HWC_DSP_ST: Hwc display start point on panel
53 * HWC_ALPHA_CTRL: Hwc blending control register
54 * DSP_HTOTAL_HS_END: Panel scanning horizontal width and hsync pulse end point
55 * DSP_HACT_ST_END: Panel active horizontal scanning start point and end point
56 * DSP_VTOTAL_VS_END: Panel scanning vertical height and vsync pulse end point
57 * DSP_VACT_ST_END: Panel active vertical scanning start point and end point
58 * DSP_VS_ST_END_F1: Vertical scanning start point and vsync pulse end point
59 * of even filed in interlace mode
60 * DSP_VACT_ST_END_F1: Vertical scanning active start point and end point of
61 * even filed in interlace mode
62 * BCSH_CTRL: BCSH contrl register
63 * BCSH_COLOR_BAR: Color bar config register
64 * BCSH_BCS: Brightness contrast saturation*contrast config register
65 * BCSH_H: Sin hue and cos hue config register
66 * FRC_LOWER01_0: FRC lookup table config register010
67 * FRC_LOWER01_1: FRC lookup table config register011
68 * FRC_LOWER10_0: FRC lookup table config register100
69 * FRC_LOWER10_1: FRC lookup table config register101
70 * FRC_LOWER11_0: FRC lookup table config register110
71 * FRC_LOWER11_1: FRC lookup table config register111
72 * DBG_REG_00: Current line number of dsp timing
73 * BLANKING_VALUE: The value of vsync blanking
74 * FLAG_REG_FRM_VALID: Flag reg value after frame valid
75 * FLAG_REG: Flag reg value before frame valid
76 * HWC_LUT_ADDR: Hwc lut base address
77 * GAMMA_LUT_ADDR: GAMMA lut base address
80 static inline u64 val_mask(int val, u64 msk, int shift)
82 return (msk << (shift + 32)) | ((msk & val) << shift);
85 #define VAL_MASK(x, width, shift) val_mask(x, (1 << width) - 1, shift)
87 #define MASK(x) (V_##x(0) >> 32)
89 #define REG_CFG_DONE 0x00000000
90 #define V_REG_LOAD_GLOBAL_EN(x) VAL_MASK(x, 1, 0)
91 #define V_REG_LOAD_WIN0_EN(x) VAL_MASK(x, 1, 1)
92 #define V_REG_LOAD_WIN1_EN(x) VAL_MASK(x, 1, 2)
93 #define V_REG_LOAD_HWC_EN(x) VAL_MASK(x, 1, 3)
94 #define V_REG_LOAD_IEP_EN(x) VAL_MASK(x, 1, 4)
95 #define V_REG_LOAD_SYS_EN(x) VAL_MASK(x, 1, 5)
96 #define VERSION 0x00000004
97 #define V_BUILD(x) VAL_MASK(x, 16, 0)
98 #define V_MINOR(x) VAL_MASK(x, 8, 16)
99 #define V_MAJOR(x) VAL_MASK(x, 8, 24)
100 #define DSP_BG 0x00000008
101 #define V_DSP_BG_BLUE(x) VAL_MASK(x, 8, 0)
102 #define V_DSP_BG_GREEN(x) VAL_MASK(x, 8, 8)
103 #define V_DSP_BG_RED(x) VAL_MASK(x, 8, 16)
104 #define MCU_RESERVED 0x0000000c
105 #define SYS_CTRL0 0x00000010
106 #define V_DIRECT_PATH_EN(x) VAL_MASK(x, 1, 0)
107 #define V_DIRECT_PATH_LAYER_SEL(x) VAL_MASK(x, 1, 1)
108 #define SYS_CTRL1 0x00000014
109 #define V_SW_NOC_QOS_EN(x) VAL_MASK(x, 1, 0)
110 #define V_SW_NOC_QOS_VALUE(x) VAL_MASK(x, 2, 1)
111 #define V_SW_NOC_HURRY_EN(x) VAL_MASK(x, 1, 4)
112 #define V_SW_NOC_HURRY_VALUE(x) VAL_MASK(x, 2, 5)
113 #define V_SW_NOC_HURRY_THRESHOLD(x) VAL_MASK(x, 4, 8)
114 #define V_SW_AXI_MAX_OUTSTAND_EN(x) VAL_MASK(x, 1, 12)
115 #define V_SW_AXI_MAX_OUTSTAND_NUM(x) VAL_MASK(x, 5, 16)
116 #define SYS_CTRL2 0x00000018
117 #define V_IMD_AUTO_GATING_EN(x) VAL_MASK(x, 1, 0)
118 #define V_IMD_VOP_STANDBY_EN(x) VAL_MASK(x, 1, 1)
119 #define V_IMD_VOP_DMA_STOP(x) VAL_MASK(x, 1, 2)
120 #define V_IMD_DSP_OUT_ZERO(x) VAL_MASK(x, 1, 3)
121 #define V_IMD_YUV_CLIP(x) VAL_MASK(x, 1, 4)
122 #define V_IMD_DSP_DATA_OUT_MODE(x) VAL_MASK(x, 1, 6)
123 #define V_SW_IO_PAD_CLK_SEL(x) VAL_MASK(x, 1, 7)
124 #define V_IMD_DSP_TIMING_IMD(x) VAL_MASK(x, 1, 12)
125 #define V_IMD_GLOBAL_REGDONE_EN(x) VAL_MASK(x, 1, 13)
126 #define V_FS_ADDR_MASK_EN(x) VAL_MASK(x, 1, 14)
127 #define DSP_CTRL0 0x00000020
128 #define V_RGB_DCLK_EN(x) VAL_MASK(x, 1, 0)
129 #define V_RGB_DCLK_POL(x) VAL_MASK(x, 1, 1)
130 #define V_RGB_HSYNC_POL(x) VAL_MASK(x, 1, 2)
131 #define V_RGB_VSYNC_POL(x) VAL_MASK(x, 1, 3)
132 #define V_RGB_DEN_POL(x) VAL_MASK(x, 1, 4)
133 #define V_HDMI_DCLK_EN(x) VAL_MASK(x, 1, 8)
134 #define V_HDMI_DCLK_POL(x) VAL_MASK(x, 1, 9)
135 #define V_HDMI_HSYNC_POL(x) VAL_MASK(x, 1, 10)
136 #define V_HDMI_VSYNC_POL(x) VAL_MASK(x, 1, 11)
137 #define V_HDMI_DEN_POL(x) VAL_MASK(x, 1, 12)
138 #define V_SW_CORE_CLK_SEL(x) VAL_MASK(x, 1, 13)
139 #define V_SW_HDMI_CLK_I_SEL(x) VAL_MASK(x, 1, 14)
140 #define V_LVDS_DCLK_EN(x) VAL_MASK(x, 1, 16)
141 #define V_LVDS_DCLK_POL(x) VAL_MASK(x, 1, 17)
142 #define V_LVDS_HSYNC_POL(x) VAL_MASK(x, 1, 18)
143 #define V_LVDS_VSYNC_POL(x) VAL_MASK(x, 1, 19)
144 #define V_LVDS_DEN_POL(x) VAL_MASK(x, 1, 20)
145 #define V_MIPI_DCLK_EN(x) VAL_MASK(x, 1, 24)
146 #define V_MIPI_DCLK_POL(x) VAL_MASK(x, 1, 25)
147 #define V_MIPI_HSYNC_POL(x) VAL_MASK(x, 1, 26)
148 #define V_MIPI_VSYNC_POL(x) VAL_MASK(x, 1, 27)
149 #define V_MIPI_DEN_POL(x) VAL_MASK(x, 1, 28)
150 #define DSP_CTRL2 0x00000028
151 #define V_DSP_INTERLACE(x) VAL_MASK(x, 1, 0)
152 #define V_INTERLACE_FIELD_POL(x) VAL_MASK(x, 1, 1)
153 #define V_DITHER_UP(x) VAL_MASK(x, 1, 2)
154 #define V_DSP_WIN0_TOP(x) VAL_MASK(x, 1, 3)
155 #define V_SW_OVERLAY_MODE(x) VAL_MASK(x, 1, 4)
156 #define V_DSP_LUT_EN(x) VAL_MASK(x, 1, 5)
157 #define V_DITHER_DOWN_MODE(x) VAL_MASK(x, 1, 6)
158 #define V_DITHER_DOWN_SEL(x) VAL_MASK(x, 1, 7)
159 #define V_DITHER_DOWN(x) VAL_MASK(x, 1, 8)
160 #define V_DSP_BG_SWAP(x) VAL_MASK(x, 1, 9)
161 #define V_DSP_DELTA_SWAP(x) VAL_MASK(x, 1, 10)
162 #define V_DSP_RB_SWAP(x) VAL_MASK(x, 1, 11)
163 #define V_DSP_RG_SWAP(x) VAL_MASK(x, 1, 12)
164 #define V_DSP_DUMMY_SWAP(x) VAL_MASK(x, 1, 13)
165 #define V_DSP_BLANK_EN(x) VAL_MASK(x, 1, 14)
166 #define V_DSP_BLACK_EN(x) VAL_MASK(x, 1, 15)
167 #define V_DSP_OUT_MODE(x) VAL_MASK(x, 4, 16)
168 #define VOP_STATUS 0x0000002c
169 #define V_DSP_BLANKING_EN_ASYNC_AFF2(x) VAL_MASK(x, 1, 0)
170 #define V_IDLE_MMU_FF1(x) VAL_MASK(x, 1, 1)
171 #define V_INT_RAW_DMA_FINISH(x) VAL_MASK(x, 1, 2)
172 #define V_DMA_STOP_VALID(x) VAL_MASK(x, 1, 4)
173 #define LINE_FLAG 0x00000030
174 #define V_DSP_LINE_FLAG0_NUM(x) VAL_MASK(x, 12, 0)
175 #define V_DSP_LINE_FLAG1_NUM(x) VAL_MASK(x, 12, 16)
176 #define INTR_EN 0x00000034
177 #define V_FS0_INTR_EN(x) VAL_MASK(x, 1, 0)
178 #define V_FS1_INTR_EN(x) VAL_MASK(x, 1, 1)
179 #define V_ADDR_SAME_INTR_EN(x) VAL_MASK(x, 1, 2)
180 #define V_LINE_FLAG0_INTR_EN(x) VAL_MASK(x, 1, 3)
181 #define V_LINE_FLAG1_INTR_EN(x) VAL_MASK(x, 1, 4)
182 #define V_BUS_ERROR_INTR_EN(x) VAL_MASK(x, 1, 5)
183 #define V_WIN0_EMPTY_INTR_EN(x) VAL_MASK(x, 1, 6)
184 #define V_WIN1_EMPTY_INTR_EN(x) VAL_MASK(x, 1, 7)
185 #define V_DSP_HOLD_VALID_INTR_EN(x) VAL_MASK(x, 1, 8)
186 #define V_DMA_FRM_FSH_INTR_EN(x) VAL_MASK(x, 1, 9)
187 #define INTR_CLEAR 0x00000038
188 #define V_FS0_INTR_CLR(x) VAL_MASK(x, 1, 0)
189 #define V_FS1_INTR_CLR(x) VAL_MASK(x, 1, 1)
190 #define V_ADDR_SAME_INTR_CLR(x) VAL_MASK(x, 1, 2)
191 #define V_LINE_FLAG0_INTR_CLR(x) VAL_MASK(x, 1, 3)
192 #define V_LINE_FLAG1_INTR_CLR(x) VAL_MASK(x, 1, 4)
193 #define V_BUS_ERROR_INTR_CLR(x) VAL_MASK(x, 1, 5)
194 #define V_WIN0_EMPTY_INTR_CLR(x) VAL_MASK(x, 1, 6)
195 #define V_WIN1_EMPTY_INTR_CLR(x) VAL_MASK(x, 1, 7)
196 #define V_DSP_HOLD_VALID_INTR_CLR(x) VAL_MASK(x, 1, 8)
197 #define V_DMA_FRM_FSH_INTR_CLR(x) VAL_MASK(x, 1, 9)
198 #define INTR_STATUS 0x0000003c
199 #define V_FS0_INTR_STS(x) VAL_MASK(x, 1, 0)
200 #define V_FS1_INTR_STS(x) VAL_MASK(x, 1, 1)
201 #define V_ADDR_SAME_INTR_STS(x) VAL_MASK(x, 1, 2)
202 #define V_LINE_FLAG0_INTR_STS(x) VAL_MASK(x, 1, 3)
203 #define V_LINE_FLAG1_INTR_STS(x) VAL_MASK(x, 1, 4)
204 #define V_BUS_ERROR_INTR_STS(x) VAL_MASK(x, 1, 5)
205 #define V_WIN0_EMPTY_INTR_STS(x) VAL_MASK(x, 1, 6)
206 #define V_WIN1_EMPTY_INTR_STS(x) VAL_MASK(x, 1, 7)
207 #define V_DSP_HOLD_VALID_INTR_STS(x) VAL_MASK(x, 1, 8)
208 #define V_DMA_FRM_FSH_INTR_STS(x) VAL_MASK(x, 1, 9)
209 #define V_MMU_INTR_STATUS(x) VAL_MASK(x, 1, 15)
210 #define V_FS0_INTR_RAW_STS(x) VAL_MASK(x, 1, 16)
211 #define V_FS1_INTR_RAW_STS(x) VAL_MASK(x, 1, 17)
212 #define V_ADDR_SAME_INTR_RAW_STS(x) VAL_MASK(x, 1, 18)
213 #define V_LINE_FLAG0_INTR_RAW_STS(x) VAL_MASK(x, 1, 19)
214 #define V_LINE_FLAG1_INTR_RAW_STS(x) VAL_MASK(x, 1, 20)
215 #define V_BUS_ERROR_INTR_RAW_STS(x) VAL_MASK(x, 1, 21)
216 #define V_WIN0_EMPTY_INTR_RAW_STS(x) VAL_MASK(x, 1, 22)
217 #define V_WIN1_EMPTY_INTR_RAW_STS(x) VAL_MASK(x, 1, 23)
218 #define V_DSP_HOLD_VALID_INTR_RAW_STS(x) VAL_MASK(x, 1, 24)
219 #define V_DMA_FRM_FSH_INTR_RAW_STS(x) VAL_MASK(x, 1, 25)
220 #define WIN0_CTRL0 0x00000050
221 #define V_WIN0_EN(x) VAL_MASK(x, 1, 0)
222 #define V_WIN0_DATA_FMT(x) VAL_MASK(x, 3, 1)
223 #define V_WIN0_INTERLACE_READ(x) VAL_MASK(x, 1, 8)
224 #define V_WIN0_NO_OUTSTANDING(x) VAL_MASK(x, 1, 9)
225 #define V_WIN0_CSC_MODE(x) VAL_MASK(x, 2, 10)
226 #define V_WIN0_RB_SWAP(x) VAL_MASK(x, 1, 12)
227 #define V_WIN0_ALPHA_SWAP(x) VAL_MASK(x, 1, 13)
228 #define V_WIN0_MID_SWAP(x) VAL_MASK(x, 1, 14)
229 #define V_WIN0_UV_SWAP(x) VAL_MASK(x, 1, 15)
230 #define V_WIN0_YRGB_DEFLICK(x) VAL_MASK(x, 1, 18)
231 #define V_WIN0_CBR_DEFLICK(x) VAL_MASK(x, 1, 19)
232 #define WIN0_CTRL1 0x00000054
233 #define V_WIN0_YRGB_AXI_GATHER_EN(x) VAL_MASK(x, 1, 0)
234 #define V_WIN0_CBR_AXI_GATHER_EN(x) VAL_MASK(x, 1, 1)
235 #define V_WIN0_DMA_BURST_LENGTH(x) VAL_MASK(x, 2, 2)
236 #define V_WIN0_YRGB_AXI_GATHER_NUM(x) VAL_MASK(x, 4, 4)
237 #define V_WIN0_CBR_AXI_GATHER_NUM(x) VAL_MASK(x, 3, 8)
238 #define V_SW_WIN0_YRGB0_RID(x) VAL_MASK(x, 4, 12)
239 #define V_SW_WIN0_CBR0_RID(x) VAL_MASK(x, 4, 16)
240 #define WIN0_COLOR_KEY 0x00000058
241 #define V_WIN0_KEY_COLOR(x) VAL_MASK(x, 24, 0)
242 #define V_WIN0_KEY_EN(x) VAL_MASK(x, 1, 24)
243 #define WIN0_VIR 0x0000005c
244 #define V_WIN0_YRGB_VIR_STRIDE(x) VAL_MASK(x, 13, 0)
245 #define V_WIN0_CBR_VIR_STRIDE(x) VAL_MASK(x, 13, 16)
246 #define WIN0_YRGB_MST 0x00000060
247 #define WIN0_CBR_MST 0x00000064
248 #define WIN0_ACT_INFO 0x00000068
249 #define V_WIN0_ACT_WIDTH(x) VAL_MASK(x, 13, 0)
250 #define V_WIN0_ACT_HEIGHT(x) VAL_MASK(x, 13, 16)
251 #define WIN0_DSP_INFO 0x0000006c
252 #define V_WIN0_DSP_WIDTH(x) VAL_MASK(x, 11, 0)
253 #define V_WIN0_DSP_HEIGHT(x) VAL_MASK(x, 11, 16)
254 #define WIN0_DSP_ST 0x00000070
255 #define V_WIN0_DSP_XST(x) VAL_MASK(x, 12, 0)
256 #define V_WIN0_DSP_YST(x) VAL_MASK(x, 12, 16)
257 #define WIN0_SCL_FACTOR_YRGB 0x00000074
258 #define V_WIN0_HS_FACTOR_YRGB(x) VAL_MASK(x, 16, 0)
259 #define V_WIN0_VS_FACTOR_YRGB(x) VAL_MASK(x, 16, 16)
260 #define WIN0_SCL_FACTOR_CBR 0x00000078
261 #define V_WIN0_HS_FACTOR_CBR(x) VAL_MASK(x, 16, 0)
262 #define V_WIN0_VS_FACTOR_CBR(x) VAL_MASK(x, 16, 16)
263 #define WIN0_SCL_OFFSET 0x0000007c
264 #define V_WIN0_HS_OFFSET_YRGB(x) VAL_MASK(x, 8, 0)
265 #define V_WIN0_HS_OFFSET_CBR(x) VAL_MASK(x, 8, 8)
266 #define V_WIN0_VS_OFFSET_YRGB(x) VAL_MASK(x, 8, 16)
267 #define V_WIN0_VS_OFFSET_CBR(x) VAL_MASK(x, 8, 24)
268 #define WIN0_ALPHA_CTRL 0x00000080
269 #define V_WIN0_ALPHA_EN(x) VAL_MASK(x, 1, 0)
270 #define V_WIN0_ALPHA_MODE(x) VAL_MASK(x, 1, 1)
271 #define V_WIN0_ALPHA_PRE_MUL(x) VAL_MASK(x, 1, 2)
272 #define V_WIN0_ALPHA_SAT_MODE(x) VAL_MASK(x, 1, 3)
273 #define V_WIN0_ALPHA_VALUE(x) VAL_MASK(x, 8, 4)
274 #define WIN1_CTRL0 0x00000090
275 #define V_WIN1_EN(x) VAL_MASK(x, 1, 0)
276 #define V_WIN1_CSC_MODE(x) VAL_MASK(x, 1, 2)
277 #define V_WIN1_DATA_FMT(x) VAL_MASK(x, 3, 4)
278 #define V_WIN1_INTERLACE_READ(x) VAL_MASK(x, 1, 8)
279 #define V_WIN1_NO_OUTSTANDING(x) VAL_MASK(x, 1, 9)
280 #define V_WIN1_RB_SWAP(x) VAL_MASK(x, 1, 12)
281 #define V_WIN1_ALPHA_SWAP(x) VAL_MASK(x, 1, 13)
282 #define V_WIN1_ENDIAN_SWAP(x) VAL_MASK(x, 1, 14)
283 #define WIN1_CTRL1 0x00000094
284 #define V_WIN1_AXI_GATHER_EN(x) VAL_MASK(x, 1, 0)
285 #define V_WIN1_DMA_BURST_LENGTH(x) VAL_MASK(x, 2, 2)
286 #define V_WIN1_AXI_GATHER_NUM(x) VAL_MASK(x, 4, 4)
287 #define V_SW_WIN1_RID(x) VAL_MASK(x, 4, 8)
288 #define WIN1_VIR 0x00000098
289 #define V_WIN1_VIR_STRIDE(x) VAL_MASK(x, 13, 0)
290 #define WIN1_YRGB_MST 0x000000a0
291 #define WIN1_DSP_INFO 0x000000a4
292 #define V_WIN1_DSP_WIDTH(x) VAL_MASK(x, 11, 0)
293 #define V_WIN1_DSP_HEIGHT(x) VAL_MASK(x, 11, 16)
294 #define WIN1_DSP_ST 0x000000a8
295 #define V_WIN1_DSP_XST(x) VAL_MASK(x, 12, 0)
296 #define V_WIN1_DSP_YST(x) VAL_MASK(x, 12, 16)
297 #define WIN1_COLOR_KEY 0x000000ac
298 #define V_WIN1_KEY_COLOR(x) VAL_MASK(x, 24, 0)
299 #define V_WIN1_KEY_EN(x) VAL_MASK(x, 1, 24)
300 #define WIN1_ALPHA_CTRL 0x000000bc
301 #define V_WIN1_ALPHA_EN(x) VAL_MASK(x, 1, 0)
302 #define V_WIN1_ALPHA_MODE(x) VAL_MASK(x, 1, 1)
303 #define V_WIN1_ALPHA_PRE_MUL(x) VAL_MASK(x, 1, 2)
304 #define V_WIN1_ALPHA_SAT_MODE(x) VAL_MASK(x, 1, 3)
305 #define V_WIN1_ALPHA_VALUE(x) VAL_MASK(x, 8, 4)
306 #define HWC_CTRL0 0x000000e0
307 #define V_HWC_EN(x) VAL_MASK(x, 1, 0)
308 #define V_HWC_SIZE(x) VAL_MASK(x, 1, 1)
309 #define V_HWC_LOAD_EN(x) VAL_MASK(x, 1, 2)
310 #define V_HWC_LUT_EN(x) VAL_MASK(x, 1, 3)
311 #define V_SW_HWC_RID(x) VAL_MASK(x, 4, 4)
312 #define HWC_CTRL1 0x000000e4
313 #define HWC_MST 0x000000e8
314 #define HWC_DSP_ST 0x000000ec
315 #define V_HWC_DSP_XST(x) VAL_MASK(x, 12, 0)
316 #define V_HWC_DSP_YST(x) VAL_MASK(x, 12, 16)
317 #define HWC_ALPHA_CTRL 0x000000f0
318 #define V_HWC_ALPHA_EN(x) VAL_MASK(x, 1, 0)
319 #define V_HWC_ALPHA_MODE(x) VAL_MASK(x, 1, 1)
320 #define V_HWC_ALPHA_PRE_MUL(x) VAL_MASK(x, 1, 2)
321 #define V_HWC_ALPHA_SAT_MODE(x) VAL_MASK(x, 1, 3)
322 #define V_HWC_ALPHA_VALUE(x) VAL_MASK(x, 8, 4)
323 #define DSP_HTOTAL_HS_END 0x00000100
324 #define V_DSP_HS_END(x) VAL_MASK(x, 12, 0)
325 #define V_DSP_HTOTAL(x) VAL_MASK(x, 12, 16)
326 #define DSP_HACT_ST_END 0x00000104
327 #define V_DSP_HACT_END(x) VAL_MASK(x, 12, 0)
328 #define V_DSP_HACT_ST(x) VAL_MASK(x, 12, 16)
329 #define DSP_VTOTAL_VS_END 0x00000108
330 #define V_DSP_VS_END(x) VAL_MASK(x, 12, 0)
331 #define V_DSP_VTOTAL(x) VAL_MASK(x, 12, 16)
332 #define DSP_VACT_ST_END 0x0000010c
333 #define V_DSP_VACT_END(x) VAL_MASK(x, 12, 0)
334 #define V_DSP_VACT_ST(x) VAL_MASK(x, 12, 16)
335 #define DSP_VS_ST_END_F1 0x00000110
336 #define V_DSP_VS_END_F1(x) VAL_MASK(x, 12, 0)
337 #define V_DSP_VS_ST_F1(x) VAL_MASK(x, 12, 16)
338 #define DSP_VACT_ST_END_F1 0x00000114
339 #define V_DSP_VACT_END_F1(x) VAL_MASK(x, 12, 0)
340 #define V_DSP_VACT_ST_F1(x) VAL_MASK(x, 12, 16)
341 #define BCSH_CTRL 0x00000160
342 #define V_BCSH_EN(x) VAL_MASK(x, 1, 0)
343 #define V_SW_BCSH_R2Y_CSC_MODE(x) VAL_MASK(x, 1, 1)
344 #define V_VIDEO_MODE(x) VAL_MASK(x, 2, 2)
345 #define V_SW_BCSH_Y2R_CSC_MODE(x) VAL_MASK(x, 2, 4)
346 #define V_SW_BCSH_Y2R_EN(x) VAL_MASK(x, 1, 6)
347 #define V_SW_BCSH_R2Y_EN(x) VAL_MASK(x, 1, 7)
348 #define BCSH_COL_BAR 0x00000164
349 #define V_COLOR_BAR_Y(x) VAL_MASK(x, 8, 0)
350 #define V_COLOR_BAR_U(x) VAL_MASK(x, 8, 8)
351 #define V_COLOR_BAR_V(x) VAL_MASK(x, 8, 16)
352 #define BCSH_BCS 0x00000168
353 #define V_BRIGHTNESS(x) VAL_MASK(x, 6, 0)
354 #define V_CONTRAST(x) VAL_MASK(x, 8, 8)
355 #define V_SAT_CON(x) VAL_MASK(x, 9, 16)
356 #define BCSH_H 0x0000016c
357 #define V_SIN_HUE(x) VAL_MASK(x, 8, 0)
358 #define V_COS_HUE(x) VAL_MASK(x, 8, 8)
359 #define FRC_LOWER01_0 0x00000170
360 #define V_LOWER01_FRM0(x) VAL_MASK(x, 16, 0)
361 #define V_LOWER01_FRM1(x) VAL_MASK(x, 16, 16)
362 #define FRC_LOWER01_1 0x00000174
363 #define V_LOWER01_FRM2(x) VAL_MASK(x, 16, 0)
364 #define V_LOWER01_FRM3(x) VAL_MASK(x, 16, 16)
365 #define FRC_LOWER10_0 0x00000178
366 #define V_LOWER10_FRM0(x) VAL_MASK(x, 16, 0)
367 #define V_LOWER10_FRM1(x) VAL_MASK(x, 16, 16)
368 #define FRC_LOWER10_1 0x0000017c
369 #define V_LOWER10_FRM2(x) VAL_MASK(x, 16, 0)
370 #define V_LOWER10_FRM3(x) VAL_MASK(x, 16, 16)
371 #define FRC_LOWER11_0 0x00000180
372 #define V_LOWER11_FRM0(x) VAL_MASK(x, 16, 0)
373 #define V_LOWER11_FRM1(x) VAL_MASK(x, 16, 16)
374 #define FRC_LOWER11_1 0x00000184
375 #define V_LOWER11_FRM2(x) VAL_MASK(x, 16, 0)
376 #define V_LOWER11_FRM3(x) VAL_MASK(x, 16, 16)
377 #define DBG_REG_000 0x00000190
378 #define BLANKING_VALUE 0x000001f4
379 #define V_SW_BLANKING_VALUE(x) VAL_MASK(x, 24, 0)
380 #define V_BLANKING_VALUE_CONFIG_EN(x) VAL_MASK(x, 1, 24)
381 #define FLAG_REG_FRM_VALID 0x000001f8
382 #define FLAG_REG 0x000001fc
383 #define HWC_LUT_ADDR 0x00000600
384 #define GAMMA_LUT_ADDR 0x00000a00
385 #define MMU_DTE_ADDR 0x00000f00
386 #define MMU_STATUS 0x00000f04
387 #define V_PAGING_ENABLED(x) VAL_MASK(x, 1, 0)
388 #define V_PAGE_FAULT_ACTIVE(x) VAL_MASK(x, 1, 1)
389 #define V_STAIL_ACTIVE(x) VAL_MASK(x, 1, 2)
390 #define V_MMU_IDLE(x) VAL_MASK(x, 1, 3)
391 #define V_REPLAY_BUFFER_EMPTY(x) VAL_MASK(x, 1, 4)
392 #define V_PAGE_FAULT_IS_WRITE(x) VAL_MASK(x, 1, 5)
393 #define MMU_COMMAND 0x00000f08
394 #define MMU_PAGE_FAULT_ADDR 0x00000f0c
395 #define MMU_ZAP_ONE_LINE 0x00000f10
396 #define MMU_INT_RAWSTAT 0x00000f14
397 #define V_PAGE_FAULT(x) VAL_MASK(x, 1, 0)
398 #define MMU_INT_CLEAR 0x00000f18
399 #define V_PAGE_FAULT(x) VAL_MASK(x, 1, 0)
400 #define MMU_INT_MASK 0x00000f1c
401 #define V_PAGE_FAULT(x) VAL_MASK(x, 1, 0)
402 #define MMU_INT_STATUS 0x00000f20
403 #define V_PAGE_FAULT(x) VAL_MASK(x, 1, 0)
404 #define MMU_AUTO_GATING 0x00000f24
405 #define V_MMU_AUTO_GATING(x) VAL_MASK(x, 1, 0)
406 #define MMU_CFG_DONE 0x00000f28
408 #define INTR_FS0 BIT(0)
409 #define INTR_FS1 BIT(1)
410 #define INTR_ADDR_SAME BIT(2)
411 #define INTR_LINE_FLAG0 BIT(3)
412 #define INTR_LINE_FLAG1 BIT(4)
413 #define INTR_BUS_ERROR BIT(5)
414 #define INTR_WIN0_EMPTY BIT(6)
415 #define INTR_WIN1_EMPTY BIT(7)
416 #define INTR_DSP_HOLD_VALID BIT(8)
417 #define INTR_DMA_FINISH BIT(9)
418 #define INTR_MMU_STATUS BIT(15)
420 #define INTR_MASK (INTR_FS0 | INTR_FS1 | INTR_ADDR_SAME | INTR_LINE_FLAG0 | \
421 INTR_LINE_FLAG1 | INTR_BUS_ERROR | INTR_WIN0_EMPTY | \
422 INTR_WIN1_EMPTY | INTR_DSP_HOLD_VALID | INTR_DMA_FINISH)
424 /* GRF register for VOP source select */
425 #define GRF_WEN_SHIFT(x) (BIT(x) << 16)
427 #define GRF_SOC_CON0 0x0400
428 #define V_LVDS_VOP_SEL(x) (((x) << 0) | GRF_WEN_SHIFT(0))
429 #define V_HDMI_VOP_SEL(x) (((x) << 1) | GRF_WEN_SHIFT(1))
430 #define V_DSI0_VOP_SEL(x) (((x) << 2) | GRF_WEN_SHIFT(2))
432 #define GRF_SOC_CON5 0x0414
433 #define V_RGB_VOP_SEL(x) (((x) << 4) | GRF_WEN_SHIFT(4))
435 #define GRF_IO_VSEL 0x0900
436 #define V_VOP_IOVOL_SEL(x) (((x) << 0) | GRF_WEN_SHIFT(0))
438 struct vop_sync_obj_s {
439 struct completion stdbyfin; /* standby finish */
441 struct completion frmst; /* frame start */
447 struct rk_lcdc_driver driver;
449 struct rk_screen *screen;
455 void __iomem *hwc_lut_addr_base;
456 void __iomem *dsp_lut_addr_base;
457 struct regmap *grf_base;
459 /* one time only one process allowed to config the register */
462 int prop; /* used for primary or extended display device */
464 bool pwr18; /* if lcdc use 1.8v power supply */
465 /* if aclk or hclk is closed, access to register is not allowed */
467 /* active layer counter,when atv_layer_cnt = 0,disable lcdc */
472 struct clk *hclk; /* lcdc AHP clk */
473 struct clk *dclk; /* lcdc dclk */
474 struct clk *aclk; /* lcdc share memory frequency */
477 u32 standby; /* 1:standby,0:wrok */
479 struct backlight_device *backlight;
481 /* lock vop irq reg */
483 struct vop_sync_obj_s sync;
486 static inline int vop_completion_timeout_ms(struct completion *comp, int to)
488 long jiffies = msecs_to_jiffies(to);
490 return wait_for_completion_timeout(comp, jiffies);
493 static inline void vop_writel(struct vop_device *vop_dev, u32 offset, u32 v)
495 u32 *_pv = (u32 *)vop_dev->regsbak;
497 _pv += (offset >> 2);
499 writel_relaxed(v, vop_dev->regs + offset);
502 static inline u32 vop_readl(struct vop_device *vop_dev, u32 offset)
506 v = readl_relaxed(vop_dev->regs + offset);
510 static inline u32 vop_readl_backup(struct vop_device *vop_dev, u32 offset)
513 u32 *_pv = (u32 *)vop_dev->regsbak;
515 _pv += (offset >> 2);
516 v = readl_relaxed(vop_dev->regs + offset);
521 static inline u32 vop_read_bit(struct vop_device *vop_dev, u32 offset, u64 v)
523 u32 _v = readl_relaxed(vop_dev->regs + offset);
530 static inline void vop_set_bit(struct vop_device *vop_dev, u32 offset, u64 v)
532 u32 *_pv = (u32 *)vop_dev->regsbak;
534 _pv += (offset >> 2);
536 writel_relaxed(*_pv, vop_dev->regs + offset);
539 static inline void vop_clr_bit(struct vop_device *vop_dev, u32 offset, u64 v)
541 u32 *_pv = (u32 *)vop_dev->regsbak;
543 _pv += (offset >> 2);
544 (*_pv) &= (~(v >> 32));
545 writel_relaxed(*_pv, vop_dev->regs + offset);
548 static inline void vop_msk_reg(struct vop_device *vop_dev, u32 offset, u64 v)
550 u32 *_pv = (u32 *)vop_dev->regsbak;
552 _pv += (offset >> 2);
553 (*_pv) &= (~(v >> 32));
555 writel_relaxed(*_pv, vop_dev->regs + offset);
558 static inline void vop_mask_writel(struct vop_device *vop_dev, u32 offset,
562 writel_relaxed(v, vop_dev->regs + offset);
565 static inline void vop_cfg_done(struct vop_device *vop_dev)
567 writel_relaxed(0x001f001f, vop_dev->regs + REG_CFG_DONE);
571 static inline int vop_grf_writel(struct regmap *base, u32 offset, u32 val)
574 regmap_write(base, offset, val);
580 static inline int vop_cru_writel(struct regmap *base, u32 offset, u32 val)
583 regmap_write(base, offset, val);
589 static inline int vop_cru_readl(struct regmap *base, u32 offset)
594 regmap_read(base, offset, &v);
599 enum dither_down_mode {
600 DITHER_888_565 = 0x0,
601 DITHER_888_666 = 0x1,
604 enum dither_down_sel {
605 DITHER_SEL_ALLEGRO = 0x0,
606 DITHER_SEL_FRC = 0x1,
609 enum _vop_r2y_csc_mode {
610 VOP_R2Y_CSC_BT601 = 0,
614 enum _vop_y2r_csc_mode {
615 VOP_Y2R_CSC_MPEG = 0,
622 VOP_FORMAT_ARGB888 = 0,
625 VOP_FORMAT_YCBCR420 = 4,
630 enum _bcsh_video_mode {
637 #define IS_YUV(x) ((x) >= VOP_FORMAT_YCBCR420)
639 enum _vop_overlay_mode {
644 /*************************************************************/
645 #define CALSCALE(x, y) \
646 (1 == (y) ? 0x1000 : ((((u32)((x) - 1)) * 0x1000) / ((y) - 1)))