Merge branch 'android-4.4' of https://android.googlesource.com/kernel/common
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / lcdc / rk_vop_lite.h
1 #ifndef RK_VOPLITE_H_
2 #define RK_VOPLITE_H_
3
4 #include <linux/rk_fb.h>
5 #include <linux/io.h>
6 #include <linux/clk.h>
7 #include <linux/regmap.h>
8 #include <linux/mfd/syscon.h>
9
10 #define VOP_INPUT_MAX_WIDTH 2048
11
12 /*
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
78  */
79
80 static inline u64 val_mask(int val, u64 msk, int shift)
81 {
82         return (msk << (shift + 32)) | ((msk & val) << shift);
83 }
84
85 #define VAL_MASK(x, width, shift) val_mask(x, (1 << width) - 1, shift)
86
87 #define MASK(x) (V_##x(0) >> 32)
88
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
407
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)
419
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)
423
424 /* GRF register for VOP source select */
425 #define GRF_WEN_SHIFT(x)        (BIT(x) << 16)
426
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))
431
432 #define GRF_SOC_CON5            0x0414
433 #define V_RGB_VOP_SEL(x)                (((x) << 4) | GRF_WEN_SHIFT(4))
434
435 #define GRF_IO_VSEL             0x0900
436 #define V_VOP_IOVOL_SEL(x)              (((x) << 0) | GRF_WEN_SHIFT(0))
437
438 struct vop_sync_obj_s {
439         struct completion stdbyfin;     /* standby finish */
440         int stdbyfin_to;
441         struct completion frmst;        /* frame start */
442         int frmst_to;
443 };
444
445 struct vop_device {
446         int id;
447         struct rk_lcdc_driver driver;
448         struct device *dev;
449         struct rk_screen *screen;
450
451         void __iomem *regs;
452         void *regsbak;
453         u32 reg_phy_base;
454         u32 len;
455         void __iomem *hwc_lut_addr_base;
456         void __iomem *dsp_lut_addr_base;
457         struct regmap *grf_base;
458
459         /* one time only one process allowed to config the register */
460         spinlock_t reg_lock;
461
462         int prop;       /* used for primary or extended display device */
463         bool pre_init;
464         bool pwr18;     /* if lcdc use 1.8v power supply */
465         /* if aclk or hclk is closed, access to register is not allowed */
466         bool clk_on;
467         /* active layer counter,when atv_layer_cnt = 0,disable lcdc */
468         u8 atv_layer_cnt;
469
470         unsigned int            irq;
471
472         struct clk              *hclk;  /* lcdc AHP clk */
473         struct clk              *dclk;  /* lcdc dclk */
474         struct clk              *aclk;  /* lcdc share memory frequency */
475         u32 pixclock;
476
477         u32 standby;            /* 1:standby,0:wrok */
478         u32 iommu_status;
479         struct backlight_device *backlight;
480
481         /* lock vop irq reg */
482         spinlock_t irq_lock;
483         struct vop_sync_obj_s sync;
484 };
485
486 static inline int vop_completion_timeout_ms(struct completion *comp, int to)
487 {
488         long jiffies = msecs_to_jiffies(to);
489
490         return wait_for_completion_timeout(comp, jiffies);
491 }
492
493 static inline void vop_writel(struct vop_device *vop_dev, u32 offset, u32 v)
494 {
495         u32 *_pv = (u32 *)vop_dev->regsbak;
496
497         _pv += (offset >> 2);
498         *_pv = v;
499         writel_relaxed(v, vop_dev->regs + offset);
500 }
501
502 static inline u32 vop_readl(struct vop_device *vop_dev, u32 offset)
503 {
504         u32 v;
505
506         v = readl_relaxed(vop_dev->regs + offset);
507         return v;
508 }
509
510 static inline u32 vop_readl_backup(struct vop_device *vop_dev, u32 offset)
511 {
512         u32 v;
513         u32 *_pv = (u32 *)vop_dev->regsbak;
514
515         _pv += (offset >> 2);
516         v = readl_relaxed(vop_dev->regs + offset);
517         *_pv = v;
518         return v;
519 }
520
521 static inline u32 vop_read_bit(struct vop_device *vop_dev, u32 offset, u64 v)
522 {
523         u32 _v = readl_relaxed(vop_dev->regs + offset);
524
525         _v &= v >> 32;
526         v = (_v ? 1 : 0);
527         return v;
528 }
529
530 static inline void vop_set_bit(struct vop_device *vop_dev, u32 offset, u64 v)
531 {
532         u32 *_pv = (u32 *)vop_dev->regsbak;
533
534         _pv += (offset >> 2);
535         (*_pv) |= v >> 32;
536         writel_relaxed(*_pv, vop_dev->regs + offset);
537 }
538
539 static inline void vop_clr_bit(struct vop_device *vop_dev, u32 offset, u64 v)
540 {
541         u32 *_pv = (u32 *)vop_dev->regsbak;
542
543         _pv += (offset >> 2);
544         (*_pv) &= (~(v >> 32));
545         writel_relaxed(*_pv, vop_dev->regs + offset);
546 }
547
548 static inline void vop_msk_reg(struct vop_device *vop_dev, u32 offset, u64 v)
549 {
550         u32 *_pv = (u32 *)vop_dev->regsbak;
551
552         _pv += (offset >> 2);
553         (*_pv) &= (~(v >> 32));
554         (*_pv) |= (u32)v;
555         writel_relaxed(*_pv, vop_dev->regs + offset);
556 }
557
558 static inline void vop_mask_writel(struct vop_device *vop_dev, u32 offset,
559                                    u32 mask, u32 v)
560 {
561         v = mask << 16 | v;
562         writel_relaxed(v, vop_dev->regs + offset);
563 }
564
565 static inline void vop_cfg_done(struct vop_device *vop_dev)
566 {
567         writel_relaxed(0x001f001f, vop_dev->regs + REG_CFG_DONE);
568         dsb(sy);
569 }
570
571 static inline int vop_grf_writel(struct regmap *base, u32 offset, u32 val)
572 {
573         if (base)
574                 regmap_write(base, offset, val);
575         dsb(sy);
576
577         return 0;
578 }
579
580 static inline int vop_cru_writel(struct regmap *base, u32 offset, u32 val)
581 {
582         if (base)
583                 regmap_write(base, offset, val);
584         dsb(sy);
585
586         return 0;
587 }
588
589 static inline int vop_cru_readl(struct regmap *base, u32 offset)
590 {
591         u32 v;
592
593         if (base)
594                 regmap_read(base, offset, &v);
595
596         return v;
597 }
598
599 enum dither_down_mode {
600         DITHER_888_565 = 0x0,
601         DITHER_888_666 = 0x1,
602 };
603
604 enum dither_down_sel {
605         DITHER_SEL_ALLEGRO = 0x0,
606         DITHER_SEL_FRC = 0x1,
607 };
608
609 enum _vop_r2y_csc_mode {
610         VOP_R2Y_CSC_BT601 = 0,
611         VOP_R2Y_CSC_BT709
612 };
613
614 enum _vop_y2r_csc_mode {
615         VOP_Y2R_CSC_MPEG = 0,
616         VOP_Y2R_CSC_HD,
617         VOP_Y2R_CSC_JPEG,
618         VOP_Y2R_CSC_BYPASS
619 };
620
621 enum _vop_format {
622         VOP_FORMAT_ARGB888 = 0,
623         VOP_FORMAT_RGB888,
624         VOP_FORMAT_RGB565,
625         VOP_FORMAT_YCBCR420 = 4,
626         VOP_FORMAT_YCBCR422,
627         VOP_FORMAT_YCBCR444
628 };
629
630 enum _bcsh_video_mode {
631         BCSH_MODE_BLACK = 0,
632         BCSH_MODE_BLUE,
633         BCSH_MODE_COLORBAR,
634         BCSH_MODE_VIDEO,
635 };
636
637 #define IS_YUV(x) ((x) >= VOP_FORMAT_YCBCR420)
638
639 enum _vop_overlay_mode {
640         VOP_RGB_DOMAIN,
641         VOP_YUV_DOMAIN
642 };
643
644 /*************************************************************/
645 #define CALSCALE(x, y)  \
646         (1 == (y) ? 0x1000 : ((((u32)((x) - 1)) * 0x1000) / ((y) - 1)))
647
648 #endif