19c92ab61SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2a67719d1SMark Yao /*
3a67719d1SMark Yao  * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
4a67719d1SMark Yao  * Author:Mark Yao <mark.yao@rock-chips.com>
5a67719d1SMark Yao  */
6a67719d1SMark Yao 
7a67719d1SMark Yao #include <linux/component.h>
8c2156ccdSSam Ravnborg #include <linux/mod_devicetable.h>
9c2156ccdSSam Ravnborg #include <linux/module.h>
10c2156ccdSSam Ravnborg #include <linux/of.h>
11c2156ccdSSam Ravnborg #include <linux/platform_device.h>
12c2156ccdSSam Ravnborg 
13c2156ccdSSam Ravnborg #include <drm/drm_fourcc.h>
14c2156ccdSSam Ravnborg #include <drm/drm_plane.h>
15c2156ccdSSam Ravnborg #include <drm/drm_print.h>
16a67719d1SMark Yao 
17a67719d1SMark Yao #include "rockchip_drm_vop.h"
18a67719d1SMark Yao #include "rockchip_vop_reg.h"
19b02516b6SBen Dooks #include "rockchip_drm_drv.h"
20a67719d1SMark Yao 
219548e1b4SMark yao #define _VOP_REG(off, _mask, _shift, _write_mask, _relaxed) \
229548e1b4SMark yao 		{ \
239548e1b4SMark yao 		 .offset = off, \
24a67719d1SMark Yao 		 .mask = _mask, \
259548e1b4SMark yao 		 .shift = _shift, \
269548e1b4SMark yao 		 .write_mask = _write_mask, \
279548e1b4SMark yao 		 .relaxed = _relaxed, \
289548e1b4SMark yao 		}
29d49463ecSMark Yao 
309548e1b4SMark yao #define VOP_REG(off, _mask, _shift) \
319548e1b4SMark yao 		_VOP_REG(off, _mask, _shift, false, true)
329548e1b4SMark yao 
339548e1b4SMark yao #define VOP_REG_SYNC(off, _mask, _shift) \
349548e1b4SMark yao 		_VOP_REG(off, _mask, _shift, false, false)
359548e1b4SMark yao 
369548e1b4SMark yao #define VOP_REG_MASK_SYNC(off, _mask, _shift) \
379548e1b4SMark yao 		_VOP_REG(off, _mask, _shift, true, false)
38a67719d1SMark Yao 
39f7673453SMark Yao static const uint32_t formats_win_full[] = {
40a67719d1SMark Yao 	DRM_FORMAT_XRGB8888,
41a67719d1SMark Yao 	DRM_FORMAT_ARGB8888,
42a67719d1SMark Yao 	DRM_FORMAT_XBGR8888,
43a67719d1SMark Yao 	DRM_FORMAT_ABGR8888,
44a67719d1SMark Yao 	DRM_FORMAT_RGB888,
45a67719d1SMark Yao 	DRM_FORMAT_BGR888,
46a67719d1SMark Yao 	DRM_FORMAT_RGB565,
47a67719d1SMark Yao 	DRM_FORMAT_BGR565,
48a67719d1SMark Yao 	DRM_FORMAT_NV12,
49a67719d1SMark Yao 	DRM_FORMAT_NV16,
50a67719d1SMark Yao 	DRM_FORMAT_NV24,
51a67719d1SMark Yao };
52a67719d1SMark Yao 
537707f722SAndrzej Pietrasiewicz static const uint64_t format_modifiers_win_full[] = {
547707f722SAndrzej Pietrasiewicz 	DRM_FORMAT_MOD_LINEAR,
557707f722SAndrzej Pietrasiewicz 	DRM_FORMAT_MOD_INVALID,
567707f722SAndrzej Pietrasiewicz };
577707f722SAndrzej Pietrasiewicz 
587707f722SAndrzej Pietrasiewicz static const uint64_t format_modifiers_win_full_afbc[] = {
597707f722SAndrzej Pietrasiewicz 	ROCKCHIP_AFBC_MOD,
607707f722SAndrzej Pietrasiewicz 	DRM_FORMAT_MOD_LINEAR,
617707f722SAndrzej Pietrasiewicz 	DRM_FORMAT_MOD_INVALID,
627707f722SAndrzej Pietrasiewicz };
637707f722SAndrzej Pietrasiewicz 
64f7673453SMark Yao static const uint32_t formats_win_lite[] = {
65a67719d1SMark Yao 	DRM_FORMAT_XRGB8888,
66a67719d1SMark Yao 	DRM_FORMAT_ARGB8888,
67a67719d1SMark Yao 	DRM_FORMAT_XBGR8888,
68a67719d1SMark Yao 	DRM_FORMAT_ABGR8888,
69a67719d1SMark Yao 	DRM_FORMAT_RGB888,
70a67719d1SMark Yao 	DRM_FORMAT_BGR888,
71a67719d1SMark Yao 	DRM_FORMAT_RGB565,
72a67719d1SMark Yao 	DRM_FORMAT_BGR565,
73a67719d1SMark Yao };
74a67719d1SMark Yao 
757707f722SAndrzej Pietrasiewicz static const uint64_t format_modifiers_win_lite[] = {
767707f722SAndrzej Pietrasiewicz 	DRM_FORMAT_MOD_LINEAR,
777707f722SAndrzej Pietrasiewicz 	DRM_FORMAT_MOD_INVALID,
787707f722SAndrzej Pietrasiewicz };
797707f722SAndrzej Pietrasiewicz 
80b51502adSMark Yao static const struct vop_scl_regs rk3036_win_scl = {
81b51502adSMark Yao 	.scale_yrgb_x = VOP_REG(RK3036_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0),
82b51502adSMark Yao 	.scale_yrgb_y = VOP_REG(RK3036_WIN0_SCL_FACTOR_YRGB, 0xffff, 16),
83b51502adSMark Yao 	.scale_cbcr_x = VOP_REG(RK3036_WIN0_SCL_FACTOR_CBR, 0xffff, 0x0),
84b51502adSMark Yao 	.scale_cbcr_y = VOP_REG(RK3036_WIN0_SCL_FACTOR_CBR, 0xffff, 16),
85b51502adSMark Yao };
86b51502adSMark Yao 
87b51502adSMark Yao static const struct vop_win_phy rk3036_win0_data = {
88b51502adSMark Yao 	.scl = &rk3036_win_scl,
89b51502adSMark Yao 	.data_formats = formats_win_full,
90b51502adSMark Yao 	.nformats = ARRAY_SIZE(formats_win_full),
917707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full,
92b51502adSMark Yao 	.enable = VOP_REG(RK3036_SYS_CTRL, 0x1, 0),
93b51502adSMark Yao 	.format = VOP_REG(RK3036_SYS_CTRL, 0x7, 3),
94b51502adSMark Yao 	.rb_swap = VOP_REG(RK3036_SYS_CTRL, 0x1, 15),
95b51502adSMark Yao 	.act_info = VOP_REG(RK3036_WIN0_ACT_INFO, 0x1fff1fff, 0),
96b51502adSMark Yao 	.dsp_info = VOP_REG(RK3036_WIN0_DSP_INFO, 0x0fff0fff, 0),
97b51502adSMark Yao 	.dsp_st = VOP_REG(RK3036_WIN0_DSP_ST, 0x1fff1fff, 0),
98b51502adSMark Yao 	.yrgb_mst = VOP_REG(RK3036_WIN0_YRGB_MST, 0xffffffff, 0),
99b51502adSMark Yao 	.uv_mst = VOP_REG(RK3036_WIN0_CBR_MST, 0xffffffff, 0),
100b51502adSMark Yao 	.yrgb_vir = VOP_REG(RK3036_WIN0_VIR, 0xffff, 0),
101b51502adSMark Yao 	.uv_vir = VOP_REG(RK3036_WIN0_VIR, 0x1fff, 16),
102b51502adSMark Yao };
103b51502adSMark Yao 
104b51502adSMark Yao static const struct vop_win_phy rk3036_win1_data = {
105b51502adSMark Yao 	.data_formats = formats_win_lite,
106b51502adSMark Yao 	.nformats = ARRAY_SIZE(formats_win_lite),
1077707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
108b51502adSMark Yao 	.enable = VOP_REG(RK3036_SYS_CTRL, 0x1, 1),
109b51502adSMark Yao 	.format = VOP_REG(RK3036_SYS_CTRL, 0x7, 6),
110b51502adSMark Yao 	.rb_swap = VOP_REG(RK3036_SYS_CTRL, 0x1, 19),
111b51502adSMark Yao 	.act_info = VOP_REG(RK3036_WIN1_ACT_INFO, 0x1fff1fff, 0),
112b51502adSMark Yao 	.dsp_info = VOP_REG(RK3036_WIN1_DSP_INFO, 0x0fff0fff, 0),
113b51502adSMark Yao 	.dsp_st = VOP_REG(RK3036_WIN1_DSP_ST, 0x1fff1fff, 0),
114b51502adSMark Yao 	.yrgb_mst = VOP_REG(RK3036_WIN1_MST, 0xffffffff, 0),
115b51502adSMark Yao 	.yrgb_vir = VOP_REG(RK3036_WIN1_VIR, 0xffff, 0),
116b51502adSMark Yao };
117b51502adSMark Yao 
118b51502adSMark Yao static const struct vop_win_data rk3036_vop_win_data[] = {
119b51502adSMark Yao 	{ .base = 0x00, .phy = &rk3036_win0_data,
120b51502adSMark Yao 	  .type = DRM_PLANE_TYPE_PRIMARY },
121b51502adSMark Yao 	{ .base = 0x00, .phy = &rk3036_win1_data,
122b51502adSMark Yao 	  .type = DRM_PLANE_TYPE_CURSOR },
123b51502adSMark Yao };
124b51502adSMark Yao 
125b51502adSMark Yao static const int rk3036_vop_intrs[] = {
126b51502adSMark Yao 	DSP_HOLD_VALID_INTR,
127b51502adSMark Yao 	FS_INTR,
128b51502adSMark Yao 	LINE_FLAG_INTR,
129b51502adSMark Yao 	BUS_ERROR_INTR,
130b51502adSMark Yao };
131b51502adSMark Yao 
132b51502adSMark Yao static const struct vop_intr rk3036_intr = {
133b51502adSMark Yao 	.intrs = rk3036_vop_intrs,
134b51502adSMark Yao 	.nintrs = ARRAY_SIZE(rk3036_vop_intrs),
135ac6560dfSMark yao 	.line_flag_num[0] = VOP_REG(RK3036_INT_STATUS, 0xfff, 12),
1369a61c54bSMark yao 	.status = VOP_REG_SYNC(RK3036_INT_STATUS, 0xf, 0),
1379a61c54bSMark yao 	.enable = VOP_REG_SYNC(RK3036_INT_STATUS, 0xf, 4),
1389a61c54bSMark yao 	.clear = VOP_REG_SYNC(RK3036_INT_STATUS, 0xf, 8),
139b51502adSMark Yao };
140b51502adSMark Yao 
1419a61c54bSMark yao static const struct vop_modeset rk3036_modeset = {
142b51502adSMark Yao 	.htotal_pw = VOP_REG(RK3036_DSP_HTOTAL_HS_END, 0x1fff1fff, 0),
143b51502adSMark Yao 	.hact_st_end = VOP_REG(RK3036_DSP_HACT_ST_END, 0x1fff1fff, 0),
144b51502adSMark Yao 	.vtotal_pw = VOP_REG(RK3036_DSP_VTOTAL_VS_END, 0x1fff1fff, 0),
145b51502adSMark Yao 	.vact_st_end = VOP_REG(RK3036_DSP_VACT_ST_END, 0x1fff1fff, 0),
1469a61c54bSMark yao };
1479a61c54bSMark yao 
1489a61c54bSMark yao static const struct vop_output rk3036_output = {
1499a61c54bSMark yao 	.pin_pol = VOP_REG(RK3036_DSP_CTRL0, 0xf, 4),
1509a61c54bSMark yao };
1519a61c54bSMark yao 
1529a61c54bSMark yao static const struct vop_common rk3036_common = {
1539a61c54bSMark yao 	.standby = VOP_REG_SYNC(RK3036_SYS_CTRL, 0x1, 30),
1549a61c54bSMark yao 	.out_mode = VOP_REG(RK3036_DSP_CTRL0, 0xf, 0),
1559a61c54bSMark yao 	.dsp_blank = VOP_REG(RK3036_DSP_CTRL1, 0x1, 24),
156a5c0fa44SUrja Rannikko 	.dither_down_sel = VOP_REG(RK3036_DSP_CTRL0, 0x1, 27),
157a5c0fa44SUrja Rannikko 	.dither_down_en = VOP_REG(RK3036_DSP_CTRL0, 0x1, 11),
158a5c0fa44SUrja Rannikko 	.dither_down_mode = VOP_REG(RK3036_DSP_CTRL0, 0x1, 10),
1599548e1b4SMark yao 	.cfg_done = VOP_REG_SYNC(RK3036_REG_CFG_DONE, 0x1, 0),
160b51502adSMark Yao };
161b51502adSMark Yao 
162b51502adSMark Yao static const struct vop_data rk3036_vop = {
163b51502adSMark Yao 	.intr = &rk3036_intr,
1649a61c54bSMark yao 	.common = &rk3036_common,
1659a61c54bSMark yao 	.modeset = &rk3036_modeset,
1669a61c54bSMark yao 	.output = &rk3036_output,
167b51502adSMark Yao 	.win = rk3036_vop_win_data,
168b51502adSMark Yao 	.win_size = ARRAY_SIZE(rk3036_vop_win_data),
169b51502adSMark Yao };
170b51502adSMark Yao 
171460c3b00SSandy Huang static const struct vop_win_phy rk3126_win1_data = {
172460c3b00SSandy Huang 	.data_formats = formats_win_lite,
173460c3b00SSandy Huang 	.nformats = ARRAY_SIZE(formats_win_lite),
1747707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
175460c3b00SSandy Huang 	.enable = VOP_REG(RK3036_SYS_CTRL, 0x1, 1),
176460c3b00SSandy Huang 	.format = VOP_REG(RK3036_SYS_CTRL, 0x7, 6),
177460c3b00SSandy Huang 	.rb_swap = VOP_REG(RK3036_SYS_CTRL, 0x1, 19),
178460c3b00SSandy Huang 	.dsp_info = VOP_REG(RK3126_WIN1_DSP_INFO, 0x0fff0fff, 0),
179460c3b00SSandy Huang 	.dsp_st = VOP_REG(RK3126_WIN1_DSP_ST, 0x1fff1fff, 0),
180460c3b00SSandy Huang 	.yrgb_mst = VOP_REG(RK3126_WIN1_MST, 0xffffffff, 0),
181460c3b00SSandy Huang 	.yrgb_vir = VOP_REG(RK3036_WIN1_VIR, 0xffff, 0),
182460c3b00SSandy Huang };
183460c3b00SSandy Huang 
184460c3b00SSandy Huang static const struct vop_win_data rk3126_vop_win_data[] = {
185460c3b00SSandy Huang 	{ .base = 0x00, .phy = &rk3036_win0_data,
186460c3b00SSandy Huang 	  .type = DRM_PLANE_TYPE_PRIMARY },
187460c3b00SSandy Huang 	{ .base = 0x00, .phy = &rk3126_win1_data,
188460c3b00SSandy Huang 	  .type = DRM_PLANE_TYPE_CURSOR },
189460c3b00SSandy Huang };
190460c3b00SSandy Huang 
191460c3b00SSandy Huang static const struct vop_data rk3126_vop = {
192460c3b00SSandy Huang 	.intr = &rk3036_intr,
193460c3b00SSandy Huang 	.common = &rk3036_common,
194460c3b00SSandy Huang 	.modeset = &rk3036_modeset,
195460c3b00SSandy Huang 	.output = &rk3036_output,
196460c3b00SSandy Huang 	.win = rk3126_vop_win_data,
197460c3b00SSandy Huang 	.win_size = ARRAY_SIZE(rk3126_vop_win_data),
198460c3b00SSandy Huang };
199460c3b00SSandy Huang 
200570913e0SSandy Huang static const int px30_vop_intrs[] = {
201570913e0SSandy Huang 	FS_INTR,
202570913e0SSandy Huang 	0, 0,
203570913e0SSandy Huang 	LINE_FLAG_INTR,
204570913e0SSandy Huang 	0,
205570913e0SSandy Huang 	BUS_ERROR_INTR,
206570913e0SSandy Huang 	0, 0,
207570913e0SSandy Huang 	DSP_HOLD_VALID_INTR,
208570913e0SSandy Huang };
209570913e0SSandy Huang 
210570913e0SSandy Huang static const struct vop_intr px30_intr = {
211570913e0SSandy Huang 	.intrs = px30_vop_intrs,
212570913e0SSandy Huang 	.nintrs = ARRAY_SIZE(px30_vop_intrs),
213a6edf839SSandy Huang 	.line_flag_num[0] = VOP_REG(PX30_LINE_FLAG, 0xfff, 0),
214a6edf839SSandy Huang 	.status = VOP_REG_MASK_SYNC(PX30_INTR_STATUS, 0xffff, 0),
215a6edf839SSandy Huang 	.enable = VOP_REG_MASK_SYNC(PX30_INTR_EN, 0xffff, 0),
216a6edf839SSandy Huang 	.clear = VOP_REG_MASK_SYNC(PX30_INTR_CLEAR, 0xffff, 0),
217570913e0SSandy Huang };
218570913e0SSandy Huang 
219570913e0SSandy Huang static const struct vop_common px30_common = {
220570913e0SSandy Huang 	.standby = VOP_REG_SYNC(PX30_SYS_CTRL2, 0x1, 1),
221570913e0SSandy Huang 	.out_mode = VOP_REG(PX30_DSP_CTRL2, 0xf, 16),
222570913e0SSandy Huang 	.dsp_blank = VOP_REG(PX30_DSP_CTRL2, 0x1, 14),
223a5c0fa44SUrja Rannikko 	.dither_down_en = VOP_REG(PX30_DSP_CTRL2, 0x1, 8),
224a5c0fa44SUrja Rannikko 	.dither_down_sel = VOP_REG(PX30_DSP_CTRL2, 0x1, 7),
225a5c0fa44SUrja Rannikko 	.dither_down_mode = VOP_REG(PX30_DSP_CTRL2, 0x1, 6),
226570913e0SSandy Huang 	.cfg_done = VOP_REG_SYNC(PX30_REG_CFG_DONE, 0x1, 0),
227570913e0SSandy Huang };
228570913e0SSandy Huang 
229570913e0SSandy Huang static const struct vop_modeset px30_modeset = {
230570913e0SSandy Huang 	.htotal_pw = VOP_REG(PX30_DSP_HTOTAL_HS_END, 0x0fff0fff, 0),
231570913e0SSandy Huang 	.hact_st_end = VOP_REG(PX30_DSP_HACT_ST_END, 0x0fff0fff, 0),
232570913e0SSandy Huang 	.vtotal_pw = VOP_REG(PX30_DSP_VTOTAL_VS_END, 0x0fff0fff, 0),
233570913e0SSandy Huang 	.vact_st_end = VOP_REG(PX30_DSP_VACT_ST_END, 0x0fff0fff, 0),
234570913e0SSandy Huang };
235570913e0SSandy Huang 
236570913e0SSandy Huang static const struct vop_output px30_output = {
2371f6c62caSNickey Yang 	.rgb_dclk_pol = VOP_REG(PX30_DSP_CTRL0, 0x1, 1),
2381f6c62caSNickey Yang 	.rgb_pin_pol = VOP_REG(PX30_DSP_CTRL0, 0x7, 2),
239570913e0SSandy Huang 	.rgb_en = VOP_REG(PX30_DSP_CTRL0, 0x1, 0),
2401f6c62caSNickey Yang 	.mipi_dclk_pol = VOP_REG(PX30_DSP_CTRL0, 0x1, 25),
2411f6c62caSNickey Yang 	.mipi_pin_pol = VOP_REG(PX30_DSP_CTRL0, 0x7, 26),
242570913e0SSandy Huang 	.mipi_en = VOP_REG(PX30_DSP_CTRL0, 0x1, 24),
243570913e0SSandy Huang };
244570913e0SSandy Huang 
245570913e0SSandy Huang static const struct vop_scl_regs px30_win_scl = {
246570913e0SSandy Huang 	.scale_yrgb_x = VOP_REG(PX30_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0),
247570913e0SSandy Huang 	.scale_yrgb_y = VOP_REG(PX30_WIN0_SCL_FACTOR_YRGB, 0xffff, 16),
248570913e0SSandy Huang 	.scale_cbcr_x = VOP_REG(PX30_WIN0_SCL_FACTOR_CBR, 0xffff, 0x0),
249570913e0SSandy Huang 	.scale_cbcr_y = VOP_REG(PX30_WIN0_SCL_FACTOR_CBR, 0xffff, 16),
250570913e0SSandy Huang };
251570913e0SSandy Huang 
252570913e0SSandy Huang static const struct vop_win_phy px30_win0_data = {
253570913e0SSandy Huang 	.scl = &px30_win_scl,
254570913e0SSandy Huang 	.data_formats = formats_win_full,
255570913e0SSandy Huang 	.nformats = ARRAY_SIZE(formats_win_full),
2567707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full,
257570913e0SSandy Huang 	.enable = VOP_REG(PX30_WIN0_CTRL0, 0x1, 0),
258570913e0SSandy Huang 	.format = VOP_REG(PX30_WIN0_CTRL0, 0x7, 1),
259570913e0SSandy Huang 	.rb_swap = VOP_REG(PX30_WIN0_CTRL0, 0x1, 12),
260570913e0SSandy Huang 	.act_info = VOP_REG(PX30_WIN0_ACT_INFO, 0xffffffff, 0),
261570913e0SSandy Huang 	.dsp_info = VOP_REG(PX30_WIN0_DSP_INFO, 0xffffffff, 0),
262570913e0SSandy Huang 	.dsp_st = VOP_REG(PX30_WIN0_DSP_ST, 0xffffffff, 0),
263570913e0SSandy Huang 	.yrgb_mst = VOP_REG(PX30_WIN0_YRGB_MST0, 0xffffffff, 0),
264570913e0SSandy Huang 	.uv_mst = VOP_REG(PX30_WIN0_CBR_MST0, 0xffffffff, 0),
265570913e0SSandy Huang 	.yrgb_vir = VOP_REG(PX30_WIN0_VIR, 0x1fff, 0),
266570913e0SSandy Huang 	.uv_vir = VOP_REG(PX30_WIN0_VIR, 0x1fff, 16),
2672aae8ed1SPaul Kocialkowski 	.alpha_pre_mul = VOP_REG(PX30_WIN0_ALPHA_CTRL, 0x1, 2),
2682aae8ed1SPaul Kocialkowski 	.alpha_mode = VOP_REG(PX30_WIN0_ALPHA_CTRL, 0x1, 1),
2692aae8ed1SPaul Kocialkowski 	.alpha_en = VOP_REG(PX30_WIN0_ALPHA_CTRL, 0x1, 0),
270570913e0SSandy Huang };
271570913e0SSandy Huang 
272570913e0SSandy Huang static const struct vop_win_phy px30_win1_data = {
273570913e0SSandy Huang 	.data_formats = formats_win_lite,
274570913e0SSandy Huang 	.nformats = ARRAY_SIZE(formats_win_lite),
2757707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
276570913e0SSandy Huang 	.enable = VOP_REG(PX30_WIN1_CTRL0, 0x1, 0),
277570913e0SSandy Huang 	.format = VOP_REG(PX30_WIN1_CTRL0, 0x7, 4),
278570913e0SSandy Huang 	.rb_swap = VOP_REG(PX30_WIN1_CTRL0, 0x1, 12),
279570913e0SSandy Huang 	.dsp_info = VOP_REG(PX30_WIN1_DSP_INFO, 0xffffffff, 0),
280570913e0SSandy Huang 	.dsp_st = VOP_REG(PX30_WIN1_DSP_ST, 0xffffffff, 0),
281570913e0SSandy Huang 	.yrgb_mst = VOP_REG(PX30_WIN1_MST, 0xffffffff, 0),
282570913e0SSandy Huang 	.yrgb_vir = VOP_REG(PX30_WIN1_VIR, 0x1fff, 0),
2832aae8ed1SPaul Kocialkowski 	.alpha_pre_mul = VOP_REG(PX30_WIN1_ALPHA_CTRL, 0x1, 2),
2842aae8ed1SPaul Kocialkowski 	.alpha_mode = VOP_REG(PX30_WIN1_ALPHA_CTRL, 0x1, 1),
2852aae8ed1SPaul Kocialkowski 	.alpha_en = VOP_REG(PX30_WIN1_ALPHA_CTRL, 0x1, 0),
286570913e0SSandy Huang };
287570913e0SSandy Huang 
288570913e0SSandy Huang static const struct vop_win_phy px30_win2_data = {
289570913e0SSandy Huang 	.data_formats = formats_win_lite,
290570913e0SSandy Huang 	.nformats = ARRAY_SIZE(formats_win_lite),
2917707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
292a6edf839SSandy Huang 	.gate = VOP_REG(PX30_WIN2_CTRL0, 0x1, 4),
293a6edf839SSandy Huang 	.enable = VOP_REG(PX30_WIN2_CTRL0, 0x1, 0),
294570913e0SSandy Huang 	.format = VOP_REG(PX30_WIN2_CTRL0, 0x3, 5),
295570913e0SSandy Huang 	.rb_swap = VOP_REG(PX30_WIN2_CTRL0, 0x1, 20),
296570913e0SSandy Huang 	.dsp_info = VOP_REG(PX30_WIN2_DSP_INFO0, 0x0fff0fff, 0),
297570913e0SSandy Huang 	.dsp_st = VOP_REG(PX30_WIN2_DSP_ST0, 0x1fff1fff, 0),
298570913e0SSandy Huang 	.yrgb_mst = VOP_REG(PX30_WIN2_MST0, 0xffffffff, 0),
299570913e0SSandy Huang 	.yrgb_vir = VOP_REG(PX30_WIN2_VIR0_1, 0x1fff, 0),
3002aae8ed1SPaul Kocialkowski 	.alpha_pre_mul = VOP_REG(PX30_WIN2_ALPHA_CTRL, 0x1, 2),
3012aae8ed1SPaul Kocialkowski 	.alpha_mode = VOP_REG(PX30_WIN2_ALPHA_CTRL, 0x1, 1),
3022aae8ed1SPaul Kocialkowski 	.alpha_en = VOP_REG(PX30_WIN2_ALPHA_CTRL, 0x1, 0),
303570913e0SSandy Huang };
304570913e0SSandy Huang 
305570913e0SSandy Huang static const struct vop_win_data px30_vop_big_win_data[] = {
306570913e0SSandy Huang 	{ .base = 0x00, .phy = &px30_win0_data,
307570913e0SSandy Huang 	  .type = DRM_PLANE_TYPE_PRIMARY },
308570913e0SSandy Huang 	{ .base = 0x00, .phy = &px30_win1_data,
309570913e0SSandy Huang 	  .type = DRM_PLANE_TYPE_OVERLAY },
310570913e0SSandy Huang 	{ .base = 0x00, .phy = &px30_win2_data,
311570913e0SSandy Huang 	  .type = DRM_PLANE_TYPE_CURSOR },
312570913e0SSandy Huang };
313570913e0SSandy Huang 
314570913e0SSandy Huang static const struct vop_data px30_vop_big = {
315570913e0SSandy Huang 	.intr = &px30_intr,
3168d544233SSandy Huang 	.feature = VOP_FEATURE_INTERNAL_RGB,
317570913e0SSandy Huang 	.common = &px30_common,
318570913e0SSandy Huang 	.modeset = &px30_modeset,
319570913e0SSandy Huang 	.output = &px30_output,
320570913e0SSandy Huang 	.win = px30_vop_big_win_data,
321570913e0SSandy Huang 	.win_size = ARRAY_SIZE(px30_vop_big_win_data),
322570913e0SSandy Huang };
323570913e0SSandy Huang 
324570913e0SSandy Huang static const struct vop_win_data px30_vop_lit_win_data[] = {
325570913e0SSandy Huang 	{ .base = 0x00, .phy = &px30_win1_data,
326570913e0SSandy Huang 	  .type = DRM_PLANE_TYPE_PRIMARY },
327570913e0SSandy Huang };
328570913e0SSandy Huang 
329570913e0SSandy Huang static const struct vop_data px30_vop_lit = {
330570913e0SSandy Huang 	.intr = &px30_intr,
3318d544233SSandy Huang 	.feature = VOP_FEATURE_INTERNAL_RGB,
332570913e0SSandy Huang 	.common = &px30_common,
333570913e0SSandy Huang 	.modeset = &px30_modeset,
334570913e0SSandy Huang 	.output = &px30_output,
335570913e0SSandy Huang 	.win = px30_vop_lit_win_data,
336570913e0SSandy Huang 	.win_size = ARRAY_SIZE(px30_vop_lit_win_data),
337570913e0SSandy Huang };
338570913e0SSandy Huang 
339f4a6de85SMark Yao static const struct vop_scl_regs rk3066_win_scl = {
340f4a6de85SMark Yao 	.scale_yrgb_x = VOP_REG(RK3066_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0),
341f4a6de85SMark Yao 	.scale_yrgb_y = VOP_REG(RK3066_WIN0_SCL_FACTOR_YRGB, 0xffff, 16),
342f4a6de85SMark Yao 	.scale_cbcr_x = VOP_REG(RK3066_WIN0_SCL_FACTOR_CBR, 0xffff, 0x0),
343f4a6de85SMark Yao 	.scale_cbcr_y = VOP_REG(RK3066_WIN0_SCL_FACTOR_CBR, 0xffff, 16),
344f4a6de85SMark Yao };
345f4a6de85SMark Yao 
346f4a6de85SMark Yao static const struct vop_win_phy rk3066_win0_data = {
347f4a6de85SMark Yao 	.scl = &rk3066_win_scl,
348f4a6de85SMark Yao 	.data_formats = formats_win_full,
349f4a6de85SMark Yao 	.nformats = ARRAY_SIZE(formats_win_full),
3507707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full,
351f4a6de85SMark Yao 	.enable = VOP_REG(RK3066_SYS_CTRL1, 0x1, 0),
352f4a6de85SMark Yao 	.format = VOP_REG(RK3066_SYS_CTRL0, 0x7, 4),
353f4a6de85SMark Yao 	.rb_swap = VOP_REG(RK3066_SYS_CTRL0, 0x1, 19),
354f4a6de85SMark Yao 	.act_info = VOP_REG(RK3066_WIN0_ACT_INFO, 0x1fff1fff, 0),
355f4a6de85SMark Yao 	.dsp_info = VOP_REG(RK3066_WIN0_DSP_INFO, 0x0fff0fff, 0),
356f4a6de85SMark Yao 	.dsp_st = VOP_REG(RK3066_WIN0_DSP_ST, 0x1fff1fff, 0),
357f4a6de85SMark Yao 	.yrgb_mst = VOP_REG(RK3066_WIN0_YRGB_MST0, 0xffffffff, 0),
358f4a6de85SMark Yao 	.uv_mst = VOP_REG(RK3066_WIN0_CBR_MST0, 0xffffffff, 0),
359f4a6de85SMark Yao 	.yrgb_vir = VOP_REG(RK3066_WIN0_VIR, 0xffff, 0),
360f4a6de85SMark Yao 	.uv_vir = VOP_REG(RK3066_WIN0_VIR, 0x1fff, 16),
361f4a6de85SMark Yao };
362f4a6de85SMark Yao 
363f4a6de85SMark Yao static const struct vop_win_phy rk3066_win1_data = {
364f4a6de85SMark Yao 	.scl = &rk3066_win_scl,
365f4a6de85SMark Yao 	.data_formats = formats_win_full,
366f4a6de85SMark Yao 	.nformats = ARRAY_SIZE(formats_win_full),
3677707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full,
368f4a6de85SMark Yao 	.enable = VOP_REG(RK3066_SYS_CTRL1, 0x1, 1),
369f4a6de85SMark Yao 	.format = VOP_REG(RK3066_SYS_CTRL0, 0x7, 7),
370f4a6de85SMark Yao 	.rb_swap = VOP_REG(RK3066_SYS_CTRL0, 0x1, 23),
371f4a6de85SMark Yao 	.act_info = VOP_REG(RK3066_WIN1_ACT_INFO, 0x1fff1fff, 0),
372f4a6de85SMark Yao 	.dsp_info = VOP_REG(RK3066_WIN1_DSP_INFO, 0x0fff0fff, 0),
373f4a6de85SMark Yao 	.dsp_st = VOP_REG(RK3066_WIN1_DSP_ST, 0x1fff1fff, 0),
374f4a6de85SMark Yao 	.yrgb_mst = VOP_REG(RK3066_WIN1_YRGB_MST, 0xffffffff, 0),
375f4a6de85SMark Yao 	.uv_mst = VOP_REG(RK3066_WIN1_CBR_MST, 0xffffffff, 0),
376f4a6de85SMark Yao 	.yrgb_vir = VOP_REG(RK3066_WIN1_VIR, 0xffff, 0),
377f4a6de85SMark Yao 	.uv_vir = VOP_REG(RK3066_WIN1_VIR, 0x1fff, 16),
378f4a6de85SMark Yao };
379f4a6de85SMark Yao 
380f4a6de85SMark Yao static const struct vop_win_phy rk3066_win2_data = {
381f4a6de85SMark Yao 	.data_formats = formats_win_lite,
382f4a6de85SMark Yao 	.nformats = ARRAY_SIZE(formats_win_lite),
3837707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
384f4a6de85SMark Yao 	.enable = VOP_REG(RK3066_SYS_CTRL1, 0x1, 2),
385f4a6de85SMark Yao 	.format = VOP_REG(RK3066_SYS_CTRL0, 0x7, 10),
386f4a6de85SMark Yao 	.rb_swap = VOP_REG(RK3066_SYS_CTRL0, 0x1, 27),
387f4a6de85SMark Yao 	.dsp_info = VOP_REG(RK3066_WIN2_DSP_INFO, 0x0fff0fff, 0),
388f4a6de85SMark Yao 	.dsp_st = VOP_REG(RK3066_WIN2_DSP_ST, 0x1fff1fff, 0),
389f4a6de85SMark Yao 	.yrgb_mst = VOP_REG(RK3066_WIN2_MST, 0xffffffff, 0),
390f4a6de85SMark Yao 	.yrgb_vir = VOP_REG(RK3066_WIN2_VIR, 0xffff, 0),
391f4a6de85SMark Yao };
392f4a6de85SMark Yao 
393f4a6de85SMark Yao static const struct vop_modeset rk3066_modeset = {
394f4a6de85SMark Yao 	.htotal_pw = VOP_REG(RK3066_DSP_HTOTAL_HS_END, 0x1fff1fff, 0),
395f4a6de85SMark Yao 	.hact_st_end = VOP_REG(RK3066_DSP_HACT_ST_END, 0x1fff1fff, 0),
396f4a6de85SMark Yao 	.vtotal_pw = VOP_REG(RK3066_DSP_VTOTAL_VS_END, 0x1fff1fff, 0),
397f4a6de85SMark Yao 	.vact_st_end = VOP_REG(RK3066_DSP_VACT_ST_END, 0x1fff1fff, 0),
398f4a6de85SMark Yao };
399f4a6de85SMark Yao 
400f4a6de85SMark Yao static const struct vop_output rk3066_output = {
401f4a6de85SMark Yao 	.pin_pol = VOP_REG(RK3066_DSP_CTRL0, 0x7, 4),
402f4a6de85SMark Yao };
403f4a6de85SMark Yao 
404f4a6de85SMark Yao static const struct vop_common rk3066_common = {
405f4a6de85SMark Yao 	.standby = VOP_REG(RK3066_SYS_CTRL0, 0x1, 1),
406f4a6de85SMark Yao 	.out_mode = VOP_REG(RK3066_DSP_CTRL0, 0xf, 0),
407f4a6de85SMark Yao 	.cfg_done = VOP_REG(RK3066_REG_CFG_DONE, 0x1, 0),
408a5c0fa44SUrja Rannikko 	.dither_down_en = VOP_REG(RK3066_DSP_CTRL0, 0x1, 11),
409a5c0fa44SUrja Rannikko 	.dither_down_mode = VOP_REG(RK3066_DSP_CTRL0, 0x1, 10),
410f4a6de85SMark Yao 	.dsp_blank = VOP_REG(RK3066_DSP_CTRL1, 0x1, 24),
411f4a6de85SMark Yao };
412f4a6de85SMark Yao 
413f4a6de85SMark Yao static const struct vop_win_data rk3066_vop_win_data[] = {
414f4a6de85SMark Yao 	{ .base = 0x00, .phy = &rk3066_win0_data,
415f4a6de85SMark Yao 	  .type = DRM_PLANE_TYPE_PRIMARY },
416f4a6de85SMark Yao 	{ .base = 0x00, .phy = &rk3066_win1_data,
417f4a6de85SMark Yao 	  .type = DRM_PLANE_TYPE_OVERLAY },
418f4a6de85SMark Yao 	{ .base = 0x00, .phy = &rk3066_win2_data,
419f4a6de85SMark Yao 	  .type = DRM_PLANE_TYPE_CURSOR },
420f4a6de85SMark Yao };
421f4a6de85SMark Yao 
422f4a6de85SMark Yao static const int rk3066_vop_intrs[] = {
423f4a6de85SMark Yao 	/*
424f4a6de85SMark Yao 	 * hs_start interrupt fires at frame-start, so serves
425f4a6de85SMark Yao 	 * the same purpose as dsp_hold in the driver.
426f4a6de85SMark Yao 	 */
427f4a6de85SMark Yao 	DSP_HOLD_VALID_INTR,
428f4a6de85SMark Yao 	FS_INTR,
429f4a6de85SMark Yao 	LINE_FLAG_INTR,
430f4a6de85SMark Yao 	BUS_ERROR_INTR,
431f4a6de85SMark Yao };
432f4a6de85SMark Yao 
433f4a6de85SMark Yao static const struct vop_intr rk3066_intr = {
434f4a6de85SMark Yao 	.intrs = rk3066_vop_intrs,
435f4a6de85SMark Yao 	.nintrs = ARRAY_SIZE(rk3066_vop_intrs),
436f4a6de85SMark Yao 	.line_flag_num[0] = VOP_REG(RK3066_INT_STATUS, 0xfff, 12),
437f4a6de85SMark Yao 	.status = VOP_REG(RK3066_INT_STATUS, 0xf, 0),
438f4a6de85SMark Yao 	.enable = VOP_REG(RK3066_INT_STATUS, 0xf, 4),
439f4a6de85SMark Yao 	.clear = VOP_REG(RK3066_INT_STATUS, 0xf, 8),
440f4a6de85SMark Yao };
441f4a6de85SMark Yao 
442f4a6de85SMark Yao static const struct vop_data rk3066_vop = {
443f4a6de85SMark Yao 	.version = VOP_VERSION(2, 1),
444f4a6de85SMark Yao 	.intr = &rk3066_intr,
445f4a6de85SMark Yao 	.common = &rk3066_common,
446f4a6de85SMark Yao 	.modeset = &rk3066_modeset,
447f4a6de85SMark Yao 	.output = &rk3066_output,
448f4a6de85SMark Yao 	.win = rk3066_vop_win_data,
449f4a6de85SMark Yao 	.win_size = ARRAY_SIZE(rk3066_vop_win_data),
450f4a6de85SMark Yao };
451f4a6de85SMark Yao 
452428e15ccSHeiko Stuebner static const struct vop_scl_regs rk3188_win_scl = {
453428e15ccSHeiko Stuebner 	.scale_yrgb_x = VOP_REG(RK3188_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0),
454428e15ccSHeiko Stuebner 	.scale_yrgb_y = VOP_REG(RK3188_WIN0_SCL_FACTOR_YRGB, 0xffff, 16),
455428e15ccSHeiko Stuebner 	.scale_cbcr_x = VOP_REG(RK3188_WIN0_SCL_FACTOR_CBR, 0xffff, 0x0),
456428e15ccSHeiko Stuebner 	.scale_cbcr_y = VOP_REG(RK3188_WIN0_SCL_FACTOR_CBR, 0xffff, 16),
457428e15ccSHeiko Stuebner };
458428e15ccSHeiko Stuebner 
459428e15ccSHeiko Stuebner static const struct vop_win_phy rk3188_win0_data = {
460428e15ccSHeiko Stuebner 	.scl = &rk3188_win_scl,
461428e15ccSHeiko Stuebner 	.data_formats = formats_win_full,
462428e15ccSHeiko Stuebner 	.nformats = ARRAY_SIZE(formats_win_full),
4637707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full,
464428e15ccSHeiko Stuebner 	.enable = VOP_REG(RK3188_SYS_CTRL, 0x1, 0),
465428e15ccSHeiko Stuebner 	.format = VOP_REG(RK3188_SYS_CTRL, 0x7, 3),
466428e15ccSHeiko Stuebner 	.rb_swap = VOP_REG(RK3188_SYS_CTRL, 0x1, 15),
467428e15ccSHeiko Stuebner 	.act_info = VOP_REG(RK3188_WIN0_ACT_INFO, 0x1fff1fff, 0),
468428e15ccSHeiko Stuebner 	.dsp_info = VOP_REG(RK3188_WIN0_DSP_INFO, 0x0fff0fff, 0),
469428e15ccSHeiko Stuebner 	.dsp_st = VOP_REG(RK3188_WIN0_DSP_ST, 0x1fff1fff, 0),
470428e15ccSHeiko Stuebner 	.yrgb_mst = VOP_REG(RK3188_WIN0_YRGB_MST0, 0xffffffff, 0),
471428e15ccSHeiko Stuebner 	.uv_mst = VOP_REG(RK3188_WIN0_CBR_MST0, 0xffffffff, 0),
472428e15ccSHeiko Stuebner 	.yrgb_vir = VOP_REG(RK3188_WIN_VIR, 0x1fff, 0),
473428e15ccSHeiko Stuebner };
474428e15ccSHeiko Stuebner 
475428e15ccSHeiko Stuebner static const struct vop_win_phy rk3188_win1_data = {
476428e15ccSHeiko Stuebner 	.data_formats = formats_win_lite,
477428e15ccSHeiko Stuebner 	.nformats = ARRAY_SIZE(formats_win_lite),
4787707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
479428e15ccSHeiko Stuebner 	.enable = VOP_REG(RK3188_SYS_CTRL, 0x1, 1),
480428e15ccSHeiko Stuebner 	.format = VOP_REG(RK3188_SYS_CTRL, 0x7, 6),
481428e15ccSHeiko Stuebner 	.rb_swap = VOP_REG(RK3188_SYS_CTRL, 0x1, 19),
482428e15ccSHeiko Stuebner 	/* no act_info on window1 */
483428e15ccSHeiko Stuebner 	.dsp_info = VOP_REG(RK3188_WIN1_DSP_INFO, 0x07ff07ff, 0),
484428e15ccSHeiko Stuebner 	.dsp_st = VOP_REG(RK3188_WIN1_DSP_ST, 0x0fff0fff, 0),
485428e15ccSHeiko Stuebner 	.yrgb_mst = VOP_REG(RK3188_WIN1_MST, 0xffffffff, 0),
486428e15ccSHeiko Stuebner 	.yrgb_vir = VOP_REG(RK3188_WIN_VIR, 0x1fff, 16),
487428e15ccSHeiko Stuebner };
488428e15ccSHeiko Stuebner 
489428e15ccSHeiko Stuebner static const struct vop_modeset rk3188_modeset = {
490428e15ccSHeiko Stuebner 	.htotal_pw = VOP_REG(RK3188_DSP_HTOTAL_HS_END, 0x0fff0fff, 0),
491428e15ccSHeiko Stuebner 	.hact_st_end = VOP_REG(RK3188_DSP_HACT_ST_END, 0x0fff0fff, 0),
492428e15ccSHeiko Stuebner 	.vtotal_pw = VOP_REG(RK3188_DSP_VTOTAL_VS_END, 0x0fff0fff, 0),
493428e15ccSHeiko Stuebner 	.vact_st_end = VOP_REG(RK3188_DSP_VACT_ST_END, 0x0fff0fff, 0),
494428e15ccSHeiko Stuebner };
495428e15ccSHeiko Stuebner 
496428e15ccSHeiko Stuebner static const struct vop_output rk3188_output = {
497428e15ccSHeiko Stuebner 	.pin_pol = VOP_REG(RK3188_DSP_CTRL0, 0xf, 4),
498428e15ccSHeiko Stuebner };
499428e15ccSHeiko Stuebner 
500428e15ccSHeiko Stuebner static const struct vop_common rk3188_common = {
501428e15ccSHeiko Stuebner 	.gate_en = VOP_REG(RK3188_SYS_CTRL, 0x1, 31),
502428e15ccSHeiko Stuebner 	.standby = VOP_REG(RK3188_SYS_CTRL, 0x1, 30),
503428e15ccSHeiko Stuebner 	.out_mode = VOP_REG(RK3188_DSP_CTRL0, 0xf, 0),
504428e15ccSHeiko Stuebner 	.cfg_done = VOP_REG(RK3188_REG_CFG_DONE, 0x1, 0),
505a5c0fa44SUrja Rannikko 	.dither_down_sel = VOP_REG(RK3188_DSP_CTRL0, 0x1, 27),
506a5c0fa44SUrja Rannikko 	.dither_down_en = VOP_REG(RK3188_DSP_CTRL0, 0x1, 11),
507a5c0fa44SUrja Rannikko 	.dither_down_mode = VOP_REG(RK3188_DSP_CTRL0, 0x1, 10),
508428e15ccSHeiko Stuebner 	.dsp_blank = VOP_REG(RK3188_DSP_CTRL1, 0x3, 24),
509428e15ccSHeiko Stuebner };
510428e15ccSHeiko Stuebner 
511428e15ccSHeiko Stuebner static const struct vop_win_data rk3188_vop_win_data[] = {
512428e15ccSHeiko Stuebner 	{ .base = 0x00, .phy = &rk3188_win0_data,
513428e15ccSHeiko Stuebner 	  .type = DRM_PLANE_TYPE_PRIMARY },
514428e15ccSHeiko Stuebner 	{ .base = 0x00, .phy = &rk3188_win1_data,
515428e15ccSHeiko Stuebner 	  .type = DRM_PLANE_TYPE_CURSOR },
516428e15ccSHeiko Stuebner };
517428e15ccSHeiko Stuebner 
518428e15ccSHeiko Stuebner static const int rk3188_vop_intrs[] = {
5194f297df8SHeiko Stuebner 	/*
5204f297df8SHeiko Stuebner 	 * hs_start interrupt fires at frame-start, so serves
5214f297df8SHeiko Stuebner 	 * the same purpose as dsp_hold in the driver.
5224f297df8SHeiko Stuebner 	 */
5234f297df8SHeiko Stuebner 	DSP_HOLD_VALID_INTR,
524428e15ccSHeiko Stuebner 	FS_INTR,
525428e15ccSHeiko Stuebner 	LINE_FLAG_INTR,
526428e15ccSHeiko Stuebner 	BUS_ERROR_INTR,
527428e15ccSHeiko Stuebner };
528428e15ccSHeiko Stuebner 
529428e15ccSHeiko Stuebner static const struct vop_intr rk3188_vop_intr = {
530428e15ccSHeiko Stuebner 	.intrs = rk3188_vop_intrs,
531428e15ccSHeiko Stuebner 	.nintrs = ARRAY_SIZE(rk3188_vop_intrs),
532428e15ccSHeiko Stuebner 	.line_flag_num[0] = VOP_REG(RK3188_INT_STATUS, 0xfff, 12),
533428e15ccSHeiko Stuebner 	.status = VOP_REG(RK3188_INT_STATUS, 0xf, 0),
534428e15ccSHeiko Stuebner 	.enable = VOP_REG(RK3188_INT_STATUS, 0xf, 4),
535428e15ccSHeiko Stuebner 	.clear = VOP_REG(RK3188_INT_STATUS, 0xf, 8),
536428e15ccSHeiko Stuebner };
537428e15ccSHeiko Stuebner 
538428e15ccSHeiko Stuebner static const struct vop_data rk3188_vop = {
539428e15ccSHeiko Stuebner 	.intr = &rk3188_vop_intr,
540428e15ccSHeiko Stuebner 	.common = &rk3188_common,
541428e15ccSHeiko Stuebner 	.modeset = &rk3188_modeset,
542428e15ccSHeiko Stuebner 	.output = &rk3188_output,
543428e15ccSHeiko Stuebner 	.win = rk3188_vop_win_data,
544428e15ccSHeiko Stuebner 	.win_size = ARRAY_SIZE(rk3188_vop_win_data),
545428e15ccSHeiko Stuebner 	.feature = VOP_FEATURE_INTERNAL_RGB,
546428e15ccSHeiko Stuebner };
547428e15ccSHeiko Stuebner 
548f7673453SMark Yao static const struct vop_scl_extension rk3288_win_full_scl_ext = {
549f7673453SMark Yao 	.cbcr_vsd_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 31),
550f7673453SMark Yao 	.cbcr_vsu_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 30),
551f7673453SMark Yao 	.cbcr_hsd_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 28),
552f7673453SMark Yao 	.cbcr_ver_scl_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 26),
553f7673453SMark Yao 	.cbcr_hor_scl_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 24),
554f7673453SMark Yao 	.yrgb_vsd_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 23),
555f7673453SMark Yao 	.yrgb_vsu_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 22),
556f7673453SMark Yao 	.yrgb_hsd_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 20),
557f7673453SMark Yao 	.yrgb_ver_scl_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 18),
558f7673453SMark Yao 	.yrgb_hor_scl_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 16),
559f7673453SMark Yao 	.line_load_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 15),
560f7673453SMark Yao 	.cbcr_axi_gather_num = VOP_REG(RK3288_WIN0_CTRL1, 0x7, 12),
561f7673453SMark Yao 	.yrgb_axi_gather_num = VOP_REG(RK3288_WIN0_CTRL1, 0xf, 8),
562f7673453SMark Yao 	.vsd_cbcr_gt2 = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 7),
563f7673453SMark Yao 	.vsd_cbcr_gt4 = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 6),
564f7673453SMark Yao 	.vsd_yrgb_gt2 = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 5),
565f7673453SMark Yao 	.vsd_yrgb_gt4 = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 4),
566f7673453SMark Yao 	.bic_coe_sel = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 2),
567f7673453SMark Yao 	.cbcr_axi_gather_en = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 1),
568f7673453SMark Yao 	.yrgb_axi_gather_en = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 0),
569f7673453SMark Yao 	.lb_mode = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 5),
5701194fffbSMark Yao };
5711194fffbSMark Yao 
572f7673453SMark Yao static const struct vop_scl_regs rk3288_win_full_scl = {
573f7673453SMark Yao 	.ext = &rk3288_win_full_scl_ext,
574f7673453SMark Yao 	.scale_yrgb_x = VOP_REG(RK3288_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0),
575f7673453SMark Yao 	.scale_yrgb_y = VOP_REG(RK3288_WIN0_SCL_FACTOR_YRGB, 0xffff, 16),
576f7673453SMark Yao 	.scale_cbcr_x = VOP_REG(RK3288_WIN0_SCL_FACTOR_CBR, 0xffff, 0x0),
577f7673453SMark Yao 	.scale_cbcr_y = VOP_REG(RK3288_WIN0_SCL_FACTOR_CBR, 0xffff, 16),
578a67719d1SMark Yao };
579a67719d1SMark Yao 
580f7673453SMark Yao static const struct vop_win_phy rk3288_win01_data = {
581f7673453SMark Yao 	.scl = &rk3288_win_full_scl,
582f7673453SMark Yao 	.data_formats = formats_win_full,
583f7673453SMark Yao 	.nformats = ARRAY_SIZE(formats_win_full),
5847707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full,
585f7673453SMark Yao 	.enable = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 0),
586f7673453SMark Yao 	.format = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 1),
587f7673453SMark Yao 	.rb_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 12),
588f7673453SMark Yao 	.act_info = VOP_REG(RK3288_WIN0_ACT_INFO, 0x1fff1fff, 0),
589f7673453SMark Yao 	.dsp_info = VOP_REG(RK3288_WIN0_DSP_INFO, 0x0fff0fff, 0),
590f7673453SMark Yao 	.dsp_st = VOP_REG(RK3288_WIN0_DSP_ST, 0x1fff1fff, 0),
591f7673453SMark Yao 	.yrgb_mst = VOP_REG(RK3288_WIN0_YRGB_MST, 0xffffffff, 0),
592f7673453SMark Yao 	.uv_mst = VOP_REG(RK3288_WIN0_CBR_MST, 0xffffffff, 0),
593f7673453SMark Yao 	.yrgb_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 0),
594f7673453SMark Yao 	.uv_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 16),
595f7673453SMark Yao 	.src_alpha_ctl = VOP_REG(RK3288_WIN0_SRC_ALPHA_CTRL, 0xff, 0),
596f7673453SMark Yao 	.dst_alpha_ctl = VOP_REG(RK3288_WIN0_DST_ALPHA_CTRL, 0xff, 0),
5979dd2aca4SMark yao 	.channel = VOP_REG(RK3288_WIN0_CTRL2, 0xff, 0),
598a67719d1SMark Yao };
599a67719d1SMark Yao 
600f7673453SMark Yao static const struct vop_win_phy rk3288_win23_data = {
601f7673453SMark Yao 	.data_formats = formats_win_lite,
602f7673453SMark Yao 	.nformats = ARRAY_SIZE(formats_win_lite),
6037707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
60460b7ae7fSMark yao 	.enable = VOP_REG(RK3288_WIN2_CTRL0, 0x1, 4),
60560b7ae7fSMark yao 	.gate = VOP_REG(RK3288_WIN2_CTRL0, 0x1, 0),
606f7673453SMark Yao 	.format = VOP_REG(RK3288_WIN2_CTRL0, 0x7, 1),
607f7673453SMark Yao 	.rb_swap = VOP_REG(RK3288_WIN2_CTRL0, 0x1, 12),
608f7673453SMark Yao 	.dsp_info = VOP_REG(RK3288_WIN2_DSP_INFO0, 0x0fff0fff, 0),
609f7673453SMark Yao 	.dsp_st = VOP_REG(RK3288_WIN2_DSP_ST0, 0x1fff1fff, 0),
610f7673453SMark Yao 	.yrgb_mst = VOP_REG(RK3288_WIN2_MST0, 0xffffffff, 0),
611f7673453SMark Yao 	.yrgb_vir = VOP_REG(RK3288_WIN2_VIR0_1, 0x1fff, 0),
612f7673453SMark Yao 	.src_alpha_ctl = VOP_REG(RK3288_WIN2_SRC_ALPHA_CTRL, 0xff, 0),
613f7673453SMark Yao 	.dst_alpha_ctl = VOP_REG(RK3288_WIN2_DST_ALPHA_CTRL, 0xff, 0),
614a67719d1SMark Yao };
615a67719d1SMark Yao 
6169a61c54bSMark yao static const struct vop_modeset rk3288_modeset = {
617f7673453SMark Yao 	.htotal_pw = VOP_REG(RK3288_DSP_HTOTAL_HS_END, 0x1fff1fff, 0),
618f7673453SMark Yao 	.hact_st_end = VOP_REG(RK3288_DSP_HACT_ST_END, 0x1fff1fff, 0),
619f7673453SMark Yao 	.vtotal_pw = VOP_REG(RK3288_DSP_VTOTAL_VS_END, 0x1fff1fff, 0),
620f7673453SMark Yao 	.vact_st_end = VOP_REG(RK3288_DSP_VACT_ST_END, 0x1fff1fff, 0),
621f7673453SMark Yao 	.hpost_st_end = VOP_REG(RK3288_POST_DSP_HACT_INFO, 0x1fff1fff, 0),
622f7673453SMark Yao 	.vpost_st_end = VOP_REG(RK3288_POST_DSP_VACT_INFO, 0x1fff1fff, 0),
6239a61c54bSMark yao };
6249a61c54bSMark yao 
6259a61c54bSMark yao static const struct vop_output rk3288_output = {
6269a61c54bSMark yao 	.pin_pol = VOP_REG(RK3288_DSP_CTRL0, 0xf, 4),
6279a61c54bSMark yao 	.rgb_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 12),
6289a61c54bSMark yao 	.hdmi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 13),
6299a61c54bSMark yao 	.edp_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 14),
6309a61c54bSMark yao 	.mipi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 15),
6319a61c54bSMark yao };
6329a61c54bSMark yao 
6339a61c54bSMark yao static const struct vop_common rk3288_common = {
6349a61c54bSMark yao 	.standby = VOP_REG_SYNC(RK3288_SYS_CTRL, 0x1, 22),
6359a61c54bSMark yao 	.gate_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 23),
6369a61c54bSMark yao 	.mmu_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 20),
637a5c0fa44SUrja Rannikko 	.dither_down_sel = VOP_REG(RK3288_DSP_CTRL1, 0x1, 4),
638a5c0fa44SUrja Rannikko 	.dither_down_mode = VOP_REG(RK3288_DSP_CTRL1, 0x1, 3),
639a5c0fa44SUrja Rannikko 	.dither_down_en = VOP_REG(RK3288_DSP_CTRL1, 0x1, 2),
6406bda8112SMark Yao 	.pre_dither_down = VOP_REG(RK3288_DSP_CTRL1, 0x1, 1),
6419a61c54bSMark yao 	.dither_up = VOP_REG(RK3288_DSP_CTRL1, 0x1, 6),
642b23ab6acSEzequiel Garcia 	.dsp_lut_en = VOP_REG(RK3288_DSP_CTRL1, 0x1, 0),
6439a61c54bSMark yao 	.data_blank = VOP_REG(RK3288_DSP_CTRL0, 0x1, 19),
6449a61c54bSMark yao 	.dsp_blank = VOP_REG(RK3288_DSP_CTRL0, 0x3, 18),
6459a61c54bSMark yao 	.out_mode = VOP_REG(RK3288_DSP_CTRL0, 0xf, 0),
6469548e1b4SMark yao 	.cfg_done = VOP_REG_SYNC(RK3288_REG_CFG_DONE, 0x1, 0),
647a67719d1SMark Yao };
648a67719d1SMark Yao 
649a67719d1SMark Yao /*
650a67719d1SMark Yao  * Note: rk3288 has a dedicated 'cursor' window, however, that window requires
651a67719d1SMark Yao  * special support to get alpha blending working.  For now, just use overlay
652a67719d1SMark Yao  * window 3 for the drm cursor.
653a67719d1SMark Yao  *
654a67719d1SMark Yao  */
655a67719d1SMark Yao static const struct vop_win_data rk3288_vop_win_data[] = {
656f7673453SMark Yao 	{ .base = 0x00, .phy = &rk3288_win01_data,
657f7673453SMark Yao 	  .type = DRM_PLANE_TYPE_PRIMARY },
658f7673453SMark Yao 	{ .base = 0x40, .phy = &rk3288_win01_data,
659f7673453SMark Yao 	  .type = DRM_PLANE_TYPE_OVERLAY },
660f7673453SMark Yao 	{ .base = 0x00, .phy = &rk3288_win23_data,
661f7673453SMark Yao 	  .type = DRM_PLANE_TYPE_OVERLAY },
662f7673453SMark Yao 	{ .base = 0x50, .phy = &rk3288_win23_data,
663f7673453SMark Yao 	  .type = DRM_PLANE_TYPE_CURSOR },
664a67719d1SMark Yao };
665a67719d1SMark Yao 
666a67719d1SMark Yao static const int rk3288_vop_intrs[] = {
667a67719d1SMark Yao 	DSP_HOLD_VALID_INTR,
668a67719d1SMark Yao 	FS_INTR,
669a67719d1SMark Yao 	LINE_FLAG_INTR,
670a67719d1SMark Yao 	BUS_ERROR_INTR,
671a67719d1SMark Yao };
672a67719d1SMark Yao 
673a67719d1SMark Yao static const struct vop_intr rk3288_vop_intr = {
674a67719d1SMark Yao 	.intrs = rk3288_vop_intrs,
675a67719d1SMark Yao 	.nintrs = ARRAY_SIZE(rk3288_vop_intrs),
676ac6560dfSMark yao 	.line_flag_num[0] = VOP_REG(RK3288_INTR_CTRL0, 0x1fff, 12),
677f7673453SMark Yao 	.status = VOP_REG(RK3288_INTR_CTRL0, 0xf, 0),
678f7673453SMark Yao 	.enable = VOP_REG(RK3288_INTR_CTRL0, 0xf, 4),
679f7673453SMark Yao 	.clear = VOP_REG(RK3288_INTR_CTRL0, 0xf, 8),
680a67719d1SMark Yao };
681a67719d1SMark Yao 
682a67719d1SMark Yao static const struct vop_data rk3288_vop = {
683eb5cb6aaSMark yao 	.version = VOP_VERSION(3, 1),
684efd11cc8SMark yao 	.feature = VOP_FEATURE_OUTPUT_RGB10,
685a67719d1SMark Yao 	.intr = &rk3288_vop_intr,
6869a61c54bSMark yao 	.common = &rk3288_common,
6879a61c54bSMark yao 	.modeset = &rk3288_modeset,
6889a61c54bSMark yao 	.output = &rk3288_output,
689a67719d1SMark Yao 	.win = rk3288_vop_win_data,
690a67719d1SMark Yao 	.win_size = ARRAY_SIZE(rk3288_vop_win_data),
691b23ab6acSEzequiel Garcia 	.lut_size = 1024,
692a67719d1SMark Yao };
693a67719d1SMark Yao 
694eb5cb6aaSMark yao static const int rk3368_vop_intrs[] = {
6950a63bfd0SMark Yao 	FS_INTR,
6960a63bfd0SMark Yao 	0, 0,
6970a63bfd0SMark Yao 	LINE_FLAG_INTR,
6980a63bfd0SMark Yao 	0,
6990a63bfd0SMark Yao 	BUS_ERROR_INTR,
7000a63bfd0SMark Yao 	0, 0, 0, 0, 0, 0, 0,
7010a63bfd0SMark Yao 	DSP_HOLD_VALID_INTR,
702f7673453SMark Yao };
703f7673453SMark Yao 
704eb5cb6aaSMark yao static const struct vop_intr rk3368_vop_intr = {
705eb5cb6aaSMark yao 	.intrs = rk3368_vop_intrs,
706eb5cb6aaSMark yao 	.nintrs = ARRAY_SIZE(rk3368_vop_intrs),
707eb5cb6aaSMark yao 	.line_flag_num[0] = VOP_REG(RK3368_LINE_FLAG, 0xffff, 0),
708eb5cb6aaSMark yao 	.line_flag_num[1] = VOP_REG(RK3368_LINE_FLAG, 0xffff, 16),
709eb5cb6aaSMark yao 	.status = VOP_REG_MASK_SYNC(RK3368_INTR_STATUS, 0x3fff, 0),
710eb5cb6aaSMark yao 	.enable = VOP_REG_MASK_SYNC(RK3368_INTR_EN, 0x3fff, 0),
711eb5cb6aaSMark yao 	.clear = VOP_REG_MASK_SYNC(RK3368_INTR_CLEAR, 0x3fff, 0),
712eb5cb6aaSMark yao };
713eb5cb6aaSMark yao 
714fbb1c738SEzequiel Garcia static const struct vop_win_phy rk3368_win01_data = {
715fbb1c738SEzequiel Garcia 	.scl = &rk3288_win_full_scl,
716fbb1c738SEzequiel Garcia 	.data_formats = formats_win_full,
717fbb1c738SEzequiel Garcia 	.nformats = ARRAY_SIZE(formats_win_full),
7187707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full,
719fbb1c738SEzequiel Garcia 	.enable = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 0),
720fbb1c738SEzequiel Garcia 	.format = VOP_REG(RK3368_WIN0_CTRL0, 0x7, 1),
721fbb1c738SEzequiel Garcia 	.rb_swap = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 12),
722677e8bbcSDaniele Castagna 	.x_mir_en = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 21),
723677e8bbcSDaniele Castagna 	.y_mir_en = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 22),
724fbb1c738SEzequiel Garcia 	.act_info = VOP_REG(RK3368_WIN0_ACT_INFO, 0x1fff1fff, 0),
725fbb1c738SEzequiel Garcia 	.dsp_info = VOP_REG(RK3368_WIN0_DSP_INFO, 0x0fff0fff, 0),
726fbb1c738SEzequiel Garcia 	.dsp_st = VOP_REG(RK3368_WIN0_DSP_ST, 0x1fff1fff, 0),
727fbb1c738SEzequiel Garcia 	.yrgb_mst = VOP_REG(RK3368_WIN0_YRGB_MST, 0xffffffff, 0),
728fbb1c738SEzequiel Garcia 	.uv_mst = VOP_REG(RK3368_WIN0_CBR_MST, 0xffffffff, 0),
729fbb1c738SEzequiel Garcia 	.yrgb_vir = VOP_REG(RK3368_WIN0_VIR, 0x3fff, 0),
730fbb1c738SEzequiel Garcia 	.uv_vir = VOP_REG(RK3368_WIN0_VIR, 0x3fff, 16),
731fbb1c738SEzequiel Garcia 	.src_alpha_ctl = VOP_REG(RK3368_WIN0_SRC_ALPHA_CTRL, 0xff, 0),
732fbb1c738SEzequiel Garcia 	.dst_alpha_ctl = VOP_REG(RK3368_WIN0_DST_ALPHA_CTRL, 0xff, 0),
733fbb1c738SEzequiel Garcia 	.channel = VOP_REG(RK3368_WIN0_CTRL2, 0xff, 0),
734fbb1c738SEzequiel Garcia };
735fbb1c738SEzequiel Garcia 
736eb5cb6aaSMark yao static const struct vop_win_phy rk3368_win23_data = {
737eb5cb6aaSMark yao 	.data_formats = formats_win_lite,
738eb5cb6aaSMark yao 	.nformats = ARRAY_SIZE(formats_win_lite),
7397707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
740eb5cb6aaSMark yao 	.gate = VOP_REG(RK3368_WIN2_CTRL0, 0x1, 0),
741eb5cb6aaSMark yao 	.enable = VOP_REG(RK3368_WIN2_CTRL0, 0x1, 4),
742eb5cb6aaSMark yao 	.format = VOP_REG(RK3368_WIN2_CTRL0, 0x3, 5),
743eb5cb6aaSMark yao 	.rb_swap = VOP_REG(RK3368_WIN2_CTRL0, 0x1, 20),
744677e8bbcSDaniele Castagna 	.y_mir_en = VOP_REG(RK3368_WIN2_CTRL1, 0x1, 15),
745eb5cb6aaSMark yao 	.dsp_info = VOP_REG(RK3368_WIN2_DSP_INFO0, 0x0fff0fff, 0),
746eb5cb6aaSMark yao 	.dsp_st = VOP_REG(RK3368_WIN2_DSP_ST0, 0x1fff1fff, 0),
747eb5cb6aaSMark yao 	.yrgb_mst = VOP_REG(RK3368_WIN2_MST0, 0xffffffff, 0),
748eb5cb6aaSMark yao 	.yrgb_vir = VOP_REG(RK3368_WIN2_VIR0_1, 0x1fff, 0),
749eb5cb6aaSMark yao 	.src_alpha_ctl = VOP_REG(RK3368_WIN2_SRC_ALPHA_CTRL, 0xff, 0),
750eb5cb6aaSMark yao 	.dst_alpha_ctl = VOP_REG(RK3368_WIN2_DST_ALPHA_CTRL, 0xff, 0),
751eb5cb6aaSMark yao };
752eb5cb6aaSMark yao 
753eb5cb6aaSMark yao static const struct vop_win_data rk3368_vop_win_data[] = {
754fbb1c738SEzequiel Garcia 	{ .base = 0x00, .phy = &rk3368_win01_data,
755eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_PRIMARY },
756fbb1c738SEzequiel Garcia 	{ .base = 0x40, .phy = &rk3368_win01_data,
757eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_OVERLAY },
758eb5cb6aaSMark yao 	{ .base = 0x00, .phy = &rk3368_win23_data,
759eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_OVERLAY },
760eb5cb6aaSMark yao 	{ .base = 0x50, .phy = &rk3368_win23_data,
761eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_CURSOR },
762eb5cb6aaSMark yao };
763eb5cb6aaSMark yao 
764eb5cb6aaSMark yao static const struct vop_output rk3368_output = {
7651f6c62caSNickey Yang 	.rgb_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 19),
7661f6c62caSNickey Yang 	.hdmi_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 23),
7671f6c62caSNickey Yang 	.edp_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 27),
7681f6c62caSNickey Yang 	.mipi_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 31),
7691f6c62caSNickey Yang 	.rgb_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 16),
7701f6c62caSNickey Yang 	.hdmi_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 20),
7711f6c62caSNickey Yang 	.edp_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 24),
7721f6c62caSNickey Yang 	.mipi_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 28),
773eb5cb6aaSMark yao 	.rgb_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 12),
774eb5cb6aaSMark yao 	.hdmi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 13),
775eb5cb6aaSMark yao 	.edp_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 14),
776eb5cb6aaSMark yao 	.mipi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 15),
777eb5cb6aaSMark yao };
778eb5cb6aaSMark yao 
779eb5cb6aaSMark yao static const struct vop_misc rk3368_misc = {
780eb5cb6aaSMark yao 	.global_regdone_en = VOP_REG(RK3368_SYS_CTRL, 0x1, 11),
781eb5cb6aaSMark yao };
782eb5cb6aaSMark yao 
783eb5cb6aaSMark yao static const struct vop_data rk3368_vop = {
784eb5cb6aaSMark yao 	.version = VOP_VERSION(3, 2),
785eb5cb6aaSMark yao 	.intr = &rk3368_vop_intr,
786eb5cb6aaSMark yao 	.common = &rk3288_common,
787eb5cb6aaSMark yao 	.modeset = &rk3288_modeset,
788eb5cb6aaSMark yao 	.output = &rk3368_output,
789eb5cb6aaSMark yao 	.misc = &rk3368_misc,
790eb5cb6aaSMark yao 	.win = rk3368_vop_win_data,
791eb5cb6aaSMark yao 	.win_size = ARRAY_SIZE(rk3368_vop_win_data),
792eb5cb6aaSMark yao };
793eb5cb6aaSMark yao 
794eb5cb6aaSMark yao static const struct vop_intr rk3366_vop_intr = {
795eb5cb6aaSMark yao 	.intrs = rk3368_vop_intrs,
796eb5cb6aaSMark yao 	.nintrs = ARRAY_SIZE(rk3368_vop_intrs),
797eb5cb6aaSMark yao 	.line_flag_num[0] = VOP_REG(RK3366_LINE_FLAG, 0xffff, 0),
798eb5cb6aaSMark yao 	.line_flag_num[1] = VOP_REG(RK3366_LINE_FLAG, 0xffff, 16),
799eb5cb6aaSMark yao 	.status = VOP_REG_MASK_SYNC(RK3366_INTR_STATUS0, 0xffff, 0),
800eb5cb6aaSMark yao 	.enable = VOP_REG_MASK_SYNC(RK3366_INTR_EN0, 0xffff, 0),
801eb5cb6aaSMark yao 	.clear = VOP_REG_MASK_SYNC(RK3366_INTR_CLEAR0, 0xffff, 0),
802eb5cb6aaSMark yao };
803eb5cb6aaSMark yao 
804eb5cb6aaSMark yao static const struct vop_data rk3366_vop = {
805eb5cb6aaSMark yao 	.version = VOP_VERSION(3, 4),
806eb5cb6aaSMark yao 	.intr = &rk3366_vop_intr,
807eb5cb6aaSMark yao 	.common = &rk3288_common,
808eb5cb6aaSMark yao 	.modeset = &rk3288_modeset,
809eb5cb6aaSMark yao 	.output = &rk3368_output,
810eb5cb6aaSMark yao 	.misc = &rk3368_misc,
811eb5cb6aaSMark yao 	.win = rk3368_vop_win_data,
812eb5cb6aaSMark yao 	.win_size = ARRAY_SIZE(rk3368_vop_win_data),
813f7673453SMark Yao };
814f7673453SMark Yao 
8159a61c54bSMark yao static const struct vop_output rk3399_output = {
8161f6c62caSNickey Yang 	.dp_dclk_pol = VOP_REG(RK3399_DSP_CTRL1, 0x1, 19),
8171f6c62caSNickey Yang 	.rgb_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 19),
8181f6c62caSNickey Yang 	.hdmi_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 23),
8191f6c62caSNickey Yang 	.edp_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 27),
8201f6c62caSNickey Yang 	.mipi_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 31),
8211f6c62caSNickey Yang 	.dp_pin_pol = VOP_REG(RK3399_DSP_CTRL1, 0x7, 16),
8221f6c62caSNickey Yang 	.rgb_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 16),
8231f6c62caSNickey Yang 	.hdmi_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 20),
8241f6c62caSNickey Yang 	.edp_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 24),
8251f6c62caSNickey Yang 	.mipi_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 28),
8269a61c54bSMark yao 	.dp_en = VOP_REG(RK3399_SYS_CTRL, 0x1, 11),
8279a61c54bSMark yao 	.rgb_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 12),
8289a61c54bSMark yao 	.hdmi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 13),
8299a61c54bSMark yao 	.edp_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 14),
8309a61c54bSMark yao 	.mipi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 15),
831cf6d100dSHeiko Stuebner 	.mipi_dual_channel_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 3),
8329a61c54bSMark yao };
8339a61c54bSMark yao 
8341c21aa8fSDaniele Castagna static const struct vop_yuv2yuv_phy rk3399_yuv2yuv_win01_data = {
8351c21aa8fSDaniele Castagna 	.y2r_coefficients = {
8361c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 0, 0xffff, 0),
8371c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 0, 0xffff, 16),
8381c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 4, 0xffff, 0),
8391c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 4, 0xffff, 16),
8401c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 8, 0xffff, 0),
8411c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 8, 0xffff, 16),
8421c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 12, 0xffff, 0),
8431c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 12, 0xffff, 16),
8441c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 16, 0xffff, 0),
8451c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 20, 0xffffffff, 0),
8461c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 24, 0xffffffff, 0),
8471c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 28, 0xffffffff, 0),
8481c21aa8fSDaniele Castagna 	},
8491c21aa8fSDaniele Castagna };
8501c21aa8fSDaniele Castagna 
8511c21aa8fSDaniele Castagna static const struct vop_yuv2yuv_phy rk3399_yuv2yuv_win23_data = { };
8521c21aa8fSDaniele Castagna 
8531c21aa8fSDaniele Castagna static const struct vop_win_yuv2yuv_data rk3399_vop_big_win_yuv2yuv_data[] = {
8541c21aa8fSDaniele Castagna 	{ .base = 0x00, .phy = &rk3399_yuv2yuv_win01_data,
8551c21aa8fSDaniele Castagna 	  .y2r_en = VOP_REG(RK3399_YUV2YUV_WIN, 0x1, 1) },
8561c21aa8fSDaniele Castagna 	{ .base = 0x60, .phy = &rk3399_yuv2yuv_win01_data,
8571c21aa8fSDaniele Castagna 	  .y2r_en = VOP_REG(RK3399_YUV2YUV_WIN, 0x1, 9) },
8581c21aa8fSDaniele Castagna 	{ .base = 0xC0, .phy = &rk3399_yuv2yuv_win23_data },
8591c21aa8fSDaniele Castagna 	{ .base = 0x120, .phy = &rk3399_yuv2yuv_win23_data },
8607707f722SAndrzej Pietrasiewicz 
8617707f722SAndrzej Pietrasiewicz };
8627707f722SAndrzej Pietrasiewicz 
8637707f722SAndrzej Pietrasiewicz static const struct vop_win_phy rk3399_win01_data = {
8647707f722SAndrzej Pietrasiewicz 	.scl = &rk3288_win_full_scl,
8657707f722SAndrzej Pietrasiewicz 	.data_formats = formats_win_full,
8667707f722SAndrzej Pietrasiewicz 	.nformats = ARRAY_SIZE(formats_win_full),
8677707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full_afbc,
8687707f722SAndrzej Pietrasiewicz 	.enable = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 0),
8697707f722SAndrzej Pietrasiewicz 	.format = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 1),
8707707f722SAndrzej Pietrasiewicz 	.rb_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 12),
8717707f722SAndrzej Pietrasiewicz 	.y_mir_en = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 22),
8727707f722SAndrzej Pietrasiewicz 	.act_info = VOP_REG(RK3288_WIN0_ACT_INFO, 0x1fff1fff, 0),
8737707f722SAndrzej Pietrasiewicz 	.dsp_info = VOP_REG(RK3288_WIN0_DSP_INFO, 0x0fff0fff, 0),
8747707f722SAndrzej Pietrasiewicz 	.dsp_st = VOP_REG(RK3288_WIN0_DSP_ST, 0x1fff1fff, 0),
8757707f722SAndrzej Pietrasiewicz 	.yrgb_mst = VOP_REG(RK3288_WIN0_YRGB_MST, 0xffffffff, 0),
8767707f722SAndrzej Pietrasiewicz 	.uv_mst = VOP_REG(RK3288_WIN0_CBR_MST, 0xffffffff, 0),
8777707f722SAndrzej Pietrasiewicz 	.yrgb_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 0),
8787707f722SAndrzej Pietrasiewicz 	.uv_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 16),
8797707f722SAndrzej Pietrasiewicz 	.src_alpha_ctl = VOP_REG(RK3288_WIN0_SRC_ALPHA_CTRL, 0xff, 0),
8807707f722SAndrzej Pietrasiewicz 	.dst_alpha_ctl = VOP_REG(RK3288_WIN0_DST_ALPHA_CTRL, 0xff, 0),
8817707f722SAndrzej Pietrasiewicz };
8827707f722SAndrzej Pietrasiewicz 
8837707f722SAndrzej Pietrasiewicz /*
8847707f722SAndrzej Pietrasiewicz  * rk3399 vop big windows register layout is same as rk3288, but we
8857707f722SAndrzej Pietrasiewicz  * have a separate rk3399 win data array here so that we can advertise
8867707f722SAndrzej Pietrasiewicz  * AFBC on the primary plane.
8877707f722SAndrzej Pietrasiewicz  */
8887707f722SAndrzej Pietrasiewicz static const struct vop_win_data rk3399_vop_win_data[] = {
8897707f722SAndrzej Pietrasiewicz 	{ .base = 0x00, .phy = &rk3399_win01_data,
8907707f722SAndrzej Pietrasiewicz 	  .type = DRM_PLANE_TYPE_PRIMARY },
8917707f722SAndrzej Pietrasiewicz 	{ .base = 0x40, .phy = &rk3288_win01_data,
8927707f722SAndrzej Pietrasiewicz 	  .type = DRM_PLANE_TYPE_OVERLAY },
8937707f722SAndrzej Pietrasiewicz 	{ .base = 0x00, .phy = &rk3288_win23_data,
8947707f722SAndrzej Pietrasiewicz 	  .type = DRM_PLANE_TYPE_OVERLAY },
8957707f722SAndrzej Pietrasiewicz 	{ .base = 0x50, .phy = &rk3288_win23_data,
8967707f722SAndrzej Pietrasiewicz 	  .type = DRM_PLANE_TYPE_CURSOR },
8977707f722SAndrzej Pietrasiewicz };
8987707f722SAndrzej Pietrasiewicz 
8997707f722SAndrzej Pietrasiewicz static const struct vop_afbc rk3399_vop_afbc = {
9007707f722SAndrzej Pietrasiewicz 	.rstn = VOP_REG(RK3399_AFBCD0_CTRL, 0x1, 3),
9017707f722SAndrzej Pietrasiewicz 	.enable = VOP_REG(RK3399_AFBCD0_CTRL, 0x1, 0),
9027707f722SAndrzej Pietrasiewicz 	.win_sel = VOP_REG(RK3399_AFBCD0_CTRL, 0x3, 1),
9037707f722SAndrzej Pietrasiewicz 	.format = VOP_REG(RK3399_AFBCD0_CTRL, 0x1f, 16),
9047707f722SAndrzej Pietrasiewicz 	.hreg_block_split = VOP_REG(RK3399_AFBCD0_CTRL, 0x1, 21),
9057707f722SAndrzej Pietrasiewicz 	.hdr_ptr = VOP_REG(RK3399_AFBCD0_HDR_PTR, 0xffffffff, 0),
9067707f722SAndrzej Pietrasiewicz 	.pic_size = VOP_REG(RK3399_AFBCD0_PIC_SIZE, 0xffffffff, 0),
9071c21aa8fSDaniele Castagna };
9081c21aa8fSDaniele Castagna 
9090a63bfd0SMark Yao static const struct vop_data rk3399_vop_big = {
910eb5cb6aaSMark yao 	.version = VOP_VERSION(3, 5),
911efd11cc8SMark yao 	.feature = VOP_FEATURE_OUTPUT_RGB10,
912eb5cb6aaSMark yao 	.intr = &rk3366_vop_intr,
9139a61c54bSMark yao 	.common = &rk3288_common,
9149a61c54bSMark yao 	.modeset = &rk3288_modeset,
9159a61c54bSMark yao 	.output = &rk3399_output,
9167707f722SAndrzej Pietrasiewicz 	.afbc = &rk3399_vop_afbc,
917eb5cb6aaSMark yao 	.misc = &rk3368_misc,
9187707f722SAndrzej Pietrasiewicz 	.win = rk3399_vop_win_data,
9197707f722SAndrzej Pietrasiewicz 	.win_size = ARRAY_SIZE(rk3399_vop_win_data),
9201c21aa8fSDaniele Castagna 	.win_yuv2yuv = rk3399_vop_big_win_yuv2yuv_data,
9210a63bfd0SMark Yao };
9220a63bfd0SMark Yao 
9230a63bfd0SMark Yao static const struct vop_win_data rk3399_vop_lit_win_data[] = {
924fbb1c738SEzequiel Garcia 	{ .base = 0x00, .phy = &rk3368_win01_data,
925f7673453SMark Yao 	  .type = DRM_PLANE_TYPE_PRIMARY },
926eb5cb6aaSMark yao 	{ .base = 0x00, .phy = &rk3368_win23_data,
927f7673453SMark Yao 	  .type = DRM_PLANE_TYPE_CURSOR},
928f7673453SMark Yao };
929f7673453SMark Yao 
9301c21aa8fSDaniele Castagna static const struct vop_win_yuv2yuv_data rk3399_vop_lit_win_yuv2yuv_data[] = {
9311c21aa8fSDaniele Castagna 	{ .base = 0x00, .phy = &rk3399_yuv2yuv_win01_data,
9321c21aa8fSDaniele Castagna 	  .y2r_en = VOP_REG(RK3399_YUV2YUV_WIN, 0x1, 1)},
9331c21aa8fSDaniele Castagna 	{ .base = 0x60, .phy = &rk3399_yuv2yuv_win23_data },
9341c21aa8fSDaniele Castagna };
9351c21aa8fSDaniele Castagna 
9360a63bfd0SMark Yao static const struct vop_data rk3399_vop_lit = {
937eb5cb6aaSMark yao 	.version = VOP_VERSION(3, 6),
938eb5cb6aaSMark yao 	.intr = &rk3366_vop_intr,
9399a61c54bSMark yao 	.common = &rk3288_common,
9409a61c54bSMark yao 	.modeset = &rk3288_modeset,
9419a61c54bSMark yao 	.output = &rk3399_output,
942eb5cb6aaSMark yao 	.misc = &rk3368_misc,
9430a63bfd0SMark Yao 	.win = rk3399_vop_lit_win_data,
9440a63bfd0SMark Yao 	.win_size = ARRAY_SIZE(rk3399_vop_lit_win_data),
9451c21aa8fSDaniele Castagna 	.win_yuv2yuv = rk3399_vop_lit_win_yuv2yuv_data,
946f7673453SMark Yao };
947f7673453SMark Yao 
948eb5cb6aaSMark yao static const struct vop_win_data rk3228_vop_win_data[] = {
949eb5cb6aaSMark yao 	{ .base = 0x00, .phy = &rk3288_win01_data,
950eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_PRIMARY },
951eb5cb6aaSMark yao 	{ .base = 0x40, .phy = &rk3288_win01_data,
952eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_CURSOR },
953eb5cb6aaSMark yao };
954eb5cb6aaSMark yao 
955eb5cb6aaSMark yao static const struct vop_data rk3228_vop = {
956eb5cb6aaSMark yao 	.version = VOP_VERSION(3, 7),
957eb5cb6aaSMark yao 	.feature = VOP_FEATURE_OUTPUT_RGB10,
958eb5cb6aaSMark yao 	.intr = &rk3366_vop_intr,
959eb5cb6aaSMark yao 	.common = &rk3288_common,
960eb5cb6aaSMark yao 	.modeset = &rk3288_modeset,
961eb5cb6aaSMark yao 	.output = &rk3399_output,
962eb5cb6aaSMark yao 	.misc = &rk3368_misc,
963eb5cb6aaSMark yao 	.win = rk3228_vop_win_data,
964eb5cb6aaSMark yao 	.win_size = ARRAY_SIZE(rk3228_vop_win_data),
965eb5cb6aaSMark yao };
966eb5cb6aaSMark yao 
967eb5cb6aaSMark yao static const struct vop_modeset rk3328_modeset = {
968eb5cb6aaSMark yao 	.htotal_pw = VOP_REG(RK3328_DSP_HTOTAL_HS_END, 0x1fff1fff, 0),
969eb5cb6aaSMark yao 	.hact_st_end = VOP_REG(RK3328_DSP_HACT_ST_END, 0x1fff1fff, 0),
970eb5cb6aaSMark yao 	.vtotal_pw = VOP_REG(RK3328_DSP_VTOTAL_VS_END, 0x1fff1fff, 0),
971eb5cb6aaSMark yao 	.vact_st_end = VOP_REG(RK3328_DSP_VACT_ST_END, 0x1fff1fff, 0),
972eb5cb6aaSMark yao 	.hpost_st_end = VOP_REG(RK3328_POST_DSP_HACT_INFO, 0x1fff1fff, 0),
973eb5cb6aaSMark yao 	.vpost_st_end = VOP_REG(RK3328_POST_DSP_VACT_INFO, 0x1fff1fff, 0),
974eb5cb6aaSMark yao };
975eb5cb6aaSMark yao 
976eb5cb6aaSMark yao static const struct vop_output rk3328_output = {
9771f6c62caSNickey Yang 	.rgb_dclk_pol = VOP_REG(RK3328_DSP_CTRL1, 0x1, 19),
9781f6c62caSNickey Yang 	.hdmi_dclk_pol = VOP_REG(RK3328_DSP_CTRL1, 0x1, 23),
9791f6c62caSNickey Yang 	.edp_dclk_pol = VOP_REG(RK3328_DSP_CTRL1, 0x1, 27),
9801f6c62caSNickey Yang 	.mipi_dclk_pol = VOP_REG(RK3328_DSP_CTRL1, 0x1, 31),
981eb5cb6aaSMark yao 	.rgb_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 12),
982eb5cb6aaSMark yao 	.hdmi_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 13),
983eb5cb6aaSMark yao 	.edp_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 14),
984eb5cb6aaSMark yao 	.mipi_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 15),
9851f6c62caSNickey Yang 	.rgb_pin_pol = VOP_REG(RK3328_DSP_CTRL1, 0x7, 16),
9861f6c62caSNickey Yang 	.hdmi_pin_pol = VOP_REG(RK3328_DSP_CTRL1, 0x7, 20),
9871f6c62caSNickey Yang 	.edp_pin_pol = VOP_REG(RK3328_DSP_CTRL1, 0x7, 24),
9881f6c62caSNickey Yang 	.mipi_pin_pol = VOP_REG(RK3328_DSP_CTRL1, 0x7, 28),
989eb5cb6aaSMark yao };
990eb5cb6aaSMark yao 
991eb5cb6aaSMark yao static const struct vop_misc rk3328_misc = {
992eb5cb6aaSMark yao 	.global_regdone_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 11),
993eb5cb6aaSMark yao };
994eb5cb6aaSMark yao 
995eb5cb6aaSMark yao static const struct vop_common rk3328_common = {
996eb5cb6aaSMark yao 	.standby = VOP_REG_SYNC(RK3328_SYS_CTRL, 0x1, 22),
997a5c0fa44SUrja Rannikko 	.dither_down_sel = VOP_REG(RK3328_DSP_CTRL1, 0x1, 4),
998a5c0fa44SUrja Rannikko 	.dither_down_mode = VOP_REG(RK3328_DSP_CTRL1, 0x1, 3),
999a5c0fa44SUrja Rannikko 	.dither_down_en = VOP_REG(RK3328_DSP_CTRL1, 0x1, 2),
1000a5c0fa44SUrja Rannikko 	.pre_dither_down = VOP_REG(RK3328_DSP_CTRL1, 0x1, 1),
1001eb5cb6aaSMark yao 	.dither_up = VOP_REG(RK3328_DSP_CTRL1, 0x1, 6),
1002eb5cb6aaSMark yao 	.dsp_blank = VOP_REG(RK3328_DSP_CTRL0, 0x3, 18),
1003eb5cb6aaSMark yao 	.out_mode = VOP_REG(RK3328_DSP_CTRL0, 0xf, 0),
1004eb5cb6aaSMark yao 	.cfg_done = VOP_REG_SYNC(RK3328_REG_CFG_DONE, 0x1, 0),
1005eb5cb6aaSMark yao };
1006eb5cb6aaSMark yao 
1007eb5cb6aaSMark yao static const struct vop_intr rk3328_vop_intr = {
1008eb5cb6aaSMark yao 	.intrs = rk3368_vop_intrs,
1009eb5cb6aaSMark yao 	.nintrs = ARRAY_SIZE(rk3368_vop_intrs),
1010eb5cb6aaSMark yao 	.line_flag_num[0] = VOP_REG(RK3328_LINE_FLAG, 0xffff, 0),
1011eb5cb6aaSMark yao 	.line_flag_num[1] = VOP_REG(RK3328_LINE_FLAG, 0xffff, 16),
1012eb5cb6aaSMark yao 	.status = VOP_REG_MASK_SYNC(RK3328_INTR_STATUS0, 0xffff, 0),
1013eb5cb6aaSMark yao 	.enable = VOP_REG_MASK_SYNC(RK3328_INTR_EN0, 0xffff, 0),
1014eb5cb6aaSMark yao 	.clear = VOP_REG_MASK_SYNC(RK3328_INTR_CLEAR0, 0xffff, 0),
1015eb5cb6aaSMark yao };
1016eb5cb6aaSMark yao 
1017eb5cb6aaSMark yao static const struct vop_win_data rk3328_vop_win_data[] = {
1018fbb1c738SEzequiel Garcia 	{ .base = 0xd0, .phy = &rk3368_win01_data,
1019eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_PRIMARY },
1020fbb1c738SEzequiel Garcia 	{ .base = 0x1d0, .phy = &rk3368_win01_data,
1021eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_OVERLAY },
1022fbb1c738SEzequiel Garcia 	{ .base = 0x2d0, .phy = &rk3368_win01_data,
1023eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_CURSOR },
1024eb5cb6aaSMark yao };
1025eb5cb6aaSMark yao 
1026eb5cb6aaSMark yao static const struct vop_data rk3328_vop = {
1027eb5cb6aaSMark yao 	.version = VOP_VERSION(3, 8),
1028eb5cb6aaSMark yao 	.feature = VOP_FEATURE_OUTPUT_RGB10,
1029eb5cb6aaSMark yao 	.intr = &rk3328_vop_intr,
1030eb5cb6aaSMark yao 	.common = &rk3328_common,
1031eb5cb6aaSMark yao 	.modeset = &rk3328_modeset,
1032eb5cb6aaSMark yao 	.output = &rk3328_output,
1033eb5cb6aaSMark yao 	.misc = &rk3328_misc,
1034eb5cb6aaSMark yao 	.win = rk3328_vop_win_data,
1035eb5cb6aaSMark yao 	.win_size = ARRAY_SIZE(rk3328_vop_win_data),
1036eb5cb6aaSMark yao };
1037eb5cb6aaSMark yao 
1038a67719d1SMark Yao static const struct of_device_id vop_driver_dt_match[] = {
1039f7673453SMark Yao 	{ .compatible = "rockchip,rk3036-vop",
1040f7673453SMark Yao 	  .data = &rk3036_vop },
1041460c3b00SSandy Huang 	{ .compatible = "rockchip,rk3126-vop",
1042460c3b00SSandy Huang 	  .data = &rk3126_vop },
1043570913e0SSandy Huang 	{ .compatible = "rockchip,px30-vop-big",
1044570913e0SSandy Huang 	  .data = &px30_vop_big },
1045570913e0SSandy Huang 	{ .compatible = "rockchip,px30-vop-lit",
1046570913e0SSandy Huang 	  .data = &px30_vop_lit },
1047f4a6de85SMark Yao 	{ .compatible = "rockchip,rk3066-vop",
1048f4a6de85SMark Yao 	  .data = &rk3066_vop },
1049428e15ccSHeiko Stuebner 	{ .compatible = "rockchip,rk3188-vop",
1050428e15ccSHeiko Stuebner 	  .data = &rk3188_vop },
1051b51502adSMark Yao 	{ .compatible = "rockchip,rk3288-vop",
1052b51502adSMark Yao 	  .data = &rk3288_vop },
1053eb5cb6aaSMark yao 	{ .compatible = "rockchip,rk3368-vop",
1054eb5cb6aaSMark yao 	  .data = &rk3368_vop },
1055eb5cb6aaSMark yao 	{ .compatible = "rockchip,rk3366-vop",
1056eb5cb6aaSMark yao 	  .data = &rk3366_vop },
10570a63bfd0SMark Yao 	{ .compatible = "rockchip,rk3399-vop-big",
10580a63bfd0SMark Yao 	  .data = &rk3399_vop_big },
10590a63bfd0SMark Yao 	{ .compatible = "rockchip,rk3399-vop-lit",
10600a63bfd0SMark Yao 	  .data = &rk3399_vop_lit },
1061eb5cb6aaSMark yao 	{ .compatible = "rockchip,rk3228-vop",
1062eb5cb6aaSMark yao 	  .data = &rk3228_vop },
1063eb5cb6aaSMark yao 	{ .compatible = "rockchip,rk3328-vop",
1064eb5cb6aaSMark yao 	  .data = &rk3328_vop },
1065a67719d1SMark Yao 	{},
1066a67719d1SMark Yao };
1067a67719d1SMark Yao MODULE_DEVICE_TABLE(of, vop_driver_dt_match);
1068a67719d1SMark Yao 
1069a67719d1SMark Yao static int vop_probe(struct platform_device *pdev)
1070a67719d1SMark Yao {
1071a67719d1SMark Yao 	struct device *dev = &pdev->dev;
1072a67719d1SMark Yao 
1073a67719d1SMark Yao 	if (!dev->of_node) {
1074d8dd6804SHaneen Mohammed 		DRM_DEV_ERROR(dev, "can't find vop devices\n");
1075a67719d1SMark Yao 		return -ENODEV;
1076a67719d1SMark Yao 	}
1077a67719d1SMark Yao 
1078a67719d1SMark Yao 	return component_add(dev, &vop_component_ops);
1079a67719d1SMark Yao }
1080a67719d1SMark Yao 
1081a67719d1SMark Yao static int vop_remove(struct platform_device *pdev)
1082a67719d1SMark Yao {
1083a67719d1SMark Yao 	component_del(&pdev->dev, &vop_component_ops);
1084a67719d1SMark Yao 
1085a67719d1SMark Yao 	return 0;
1086a67719d1SMark Yao }
1087a67719d1SMark Yao 
10888820b68bSJeffy Chen struct platform_driver vop_platform_driver = {
1089a67719d1SMark Yao 	.probe = vop_probe,
1090a67719d1SMark Yao 	.remove = vop_remove,
1091a67719d1SMark Yao 	.driver = {
1092a67719d1SMark Yao 		.name = "rockchip-vop",
1093a67719d1SMark Yao 		.of_match_table = of_match_ptr(vop_driver_dt_match),
1094a67719d1SMark Yao 	},
1095a67719d1SMark Yao };
1096