xref: /linux/drivers/gpu/drm/rockchip/rockchip_vop_reg.c (revision de848da12f752170c2ebe114804a985314fd5a6a)
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,
493fa50896SChen-Yu Tsai 	DRM_FORMAT_NV21,
50a67719d1SMark Yao 	DRM_FORMAT_NV16,
513fa50896SChen-Yu Tsai 	DRM_FORMAT_NV61,
52a67719d1SMark Yao 	DRM_FORMAT_NV24,
533fa50896SChen-Yu Tsai 	DRM_FORMAT_NV42,
54a67719d1SMark Yao };
55a67719d1SMark Yao 
56d4b38422SJonas Karlman static const uint32_t formats_win_full_10[] = {
57d4b38422SJonas Karlman 	DRM_FORMAT_XRGB8888,
58d4b38422SJonas Karlman 	DRM_FORMAT_ARGB8888,
59d4b38422SJonas Karlman 	DRM_FORMAT_XBGR8888,
60d4b38422SJonas Karlman 	DRM_FORMAT_ABGR8888,
61d4b38422SJonas Karlman 	DRM_FORMAT_RGB888,
62d4b38422SJonas Karlman 	DRM_FORMAT_BGR888,
63d4b38422SJonas Karlman 	DRM_FORMAT_RGB565,
64d4b38422SJonas Karlman 	DRM_FORMAT_BGR565,
65d4b38422SJonas Karlman 	DRM_FORMAT_NV12,
66d4b38422SJonas Karlman 	DRM_FORMAT_NV21,
67d4b38422SJonas Karlman 	DRM_FORMAT_NV16,
68d4b38422SJonas Karlman 	DRM_FORMAT_NV61,
69d4b38422SJonas Karlman 	DRM_FORMAT_NV24,
70d4b38422SJonas Karlman 	DRM_FORMAT_NV42,
71d4b38422SJonas Karlman 	DRM_FORMAT_NV15,
72d4b38422SJonas Karlman 	DRM_FORMAT_NV20,
73d4b38422SJonas Karlman 	DRM_FORMAT_NV30,
74d4b38422SJonas Karlman };
75d4b38422SJonas Karlman 
767707f722SAndrzej Pietrasiewicz static const uint64_t format_modifiers_win_full[] = {
777707f722SAndrzej Pietrasiewicz 	DRM_FORMAT_MOD_LINEAR,
787707f722SAndrzej Pietrasiewicz 	DRM_FORMAT_MOD_INVALID,
797707f722SAndrzej Pietrasiewicz };
807707f722SAndrzej Pietrasiewicz 
817707f722SAndrzej Pietrasiewicz static const uint64_t format_modifiers_win_full_afbc[] = {
827707f722SAndrzej Pietrasiewicz 	ROCKCHIP_AFBC_MOD,
837707f722SAndrzej Pietrasiewicz 	DRM_FORMAT_MOD_LINEAR,
847707f722SAndrzej Pietrasiewicz 	DRM_FORMAT_MOD_INVALID,
857707f722SAndrzej Pietrasiewicz };
867707f722SAndrzej Pietrasiewicz 
87f7673453SMark Yao static const uint32_t formats_win_lite[] = {
88a67719d1SMark Yao 	DRM_FORMAT_XRGB8888,
89a67719d1SMark Yao 	DRM_FORMAT_ARGB8888,
90a67719d1SMark Yao 	DRM_FORMAT_XBGR8888,
91a67719d1SMark Yao 	DRM_FORMAT_ABGR8888,
92a67719d1SMark Yao 	DRM_FORMAT_RGB888,
93a67719d1SMark Yao 	DRM_FORMAT_BGR888,
94a67719d1SMark Yao 	DRM_FORMAT_RGB565,
95a67719d1SMark Yao 	DRM_FORMAT_BGR565,
96a67719d1SMark Yao };
97a67719d1SMark Yao 
987707f722SAndrzej Pietrasiewicz static const uint64_t format_modifiers_win_lite[] = {
997707f722SAndrzej Pietrasiewicz 	DRM_FORMAT_MOD_LINEAR,
1007707f722SAndrzej Pietrasiewicz 	DRM_FORMAT_MOD_INVALID,
1017707f722SAndrzej Pietrasiewicz };
1027707f722SAndrzej Pietrasiewicz 
10353c2710cSAlex Bee static const struct vop_scl_regs rk3036_win0_scl = {
104b51502adSMark Yao 	.scale_yrgb_x = VOP_REG(RK3036_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0),
105b51502adSMark Yao 	.scale_yrgb_y = VOP_REG(RK3036_WIN0_SCL_FACTOR_YRGB, 0xffff, 16),
106b51502adSMark Yao 	.scale_cbcr_x = VOP_REG(RK3036_WIN0_SCL_FACTOR_CBR, 0xffff, 0x0),
107b51502adSMark Yao 	.scale_cbcr_y = VOP_REG(RK3036_WIN0_SCL_FACTOR_CBR, 0xffff, 16),
108b51502adSMark Yao };
109b51502adSMark Yao 
11053c2710cSAlex Bee static const struct vop_scl_regs rk3036_win1_scl = {
11153c2710cSAlex Bee 	.scale_yrgb_x = VOP_REG(RK3036_WIN1_SCL_FACTOR_YRGB, 0xffff, 0x0),
11253c2710cSAlex Bee 	.scale_yrgb_y = VOP_REG(RK3036_WIN1_SCL_FACTOR_YRGB, 0xffff, 16),
11353c2710cSAlex Bee };
11453c2710cSAlex Bee 
115b51502adSMark Yao static const struct vop_win_phy rk3036_win0_data = {
11653c2710cSAlex Bee 	.scl = &rk3036_win0_scl,
117b51502adSMark Yao 	.data_formats = formats_win_full,
118b51502adSMark Yao 	.nformats = ARRAY_SIZE(formats_win_full),
1197707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full,
120b51502adSMark Yao 	.enable = VOP_REG(RK3036_SYS_CTRL, 0x1, 0),
121b51502adSMark Yao 	.format = VOP_REG(RK3036_SYS_CTRL, 0x7, 3),
122b51502adSMark Yao 	.rb_swap = VOP_REG(RK3036_SYS_CTRL, 0x1, 15),
123b51502adSMark Yao 	.act_info = VOP_REG(RK3036_WIN0_ACT_INFO, 0x1fff1fff, 0),
124b51502adSMark Yao 	.dsp_info = VOP_REG(RK3036_WIN0_DSP_INFO, 0x0fff0fff, 0),
125b51502adSMark Yao 	.dsp_st = VOP_REG(RK3036_WIN0_DSP_ST, 0x1fff1fff, 0),
126b51502adSMark Yao 	.yrgb_mst = VOP_REG(RK3036_WIN0_YRGB_MST, 0xffffffff, 0),
127b51502adSMark Yao 	.uv_mst = VOP_REG(RK3036_WIN0_CBR_MST, 0xffffffff, 0),
128b51502adSMark Yao 	.yrgb_vir = VOP_REG(RK3036_WIN0_VIR, 0xffff, 0),
129b51502adSMark Yao 	.uv_vir = VOP_REG(RK3036_WIN0_VIR, 0x1fff, 16),
130d099fa67SAlex Bee 	.alpha_mode = VOP_REG(RK3036_DSP_CTRL0, 0x1, 18),
131d099fa67SAlex Bee 	.alpha_en = VOP_REG(RK3036_ALPHA_CTRL, 0x1, 0),
132d099fa67SAlex Bee 	.alpha_pre_mul = VOP_REG(RK3036_DSP_CTRL0, 0x1, 29),
133b51502adSMark Yao };
134b51502adSMark Yao 
135b51502adSMark Yao static const struct vop_win_phy rk3036_win1_data = {
13653c2710cSAlex Bee 	.scl = &rk3036_win1_scl,
137b51502adSMark Yao 	.data_formats = formats_win_lite,
138b51502adSMark Yao 	.nformats = ARRAY_SIZE(formats_win_lite),
1397707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
140b51502adSMark Yao 	.enable = VOP_REG(RK3036_SYS_CTRL, 0x1, 1),
141b51502adSMark Yao 	.format = VOP_REG(RK3036_SYS_CTRL, 0x7, 6),
142b51502adSMark Yao 	.rb_swap = VOP_REG(RK3036_SYS_CTRL, 0x1, 19),
143b51502adSMark Yao 	.act_info = VOP_REG(RK3036_WIN1_ACT_INFO, 0x1fff1fff, 0),
144b51502adSMark Yao 	.dsp_info = VOP_REG(RK3036_WIN1_DSP_INFO, 0x0fff0fff, 0),
145b51502adSMark Yao 	.dsp_st = VOP_REG(RK3036_WIN1_DSP_ST, 0x1fff1fff, 0),
146b51502adSMark Yao 	.yrgb_mst = VOP_REG(RK3036_WIN1_MST, 0xffffffff, 0),
147b51502adSMark Yao 	.yrgb_vir = VOP_REG(RK3036_WIN1_VIR, 0xffff, 0),
148d099fa67SAlex Bee 	.alpha_mode = VOP_REG(RK3036_DSP_CTRL0, 0x1, 19),
149d099fa67SAlex Bee 	.alpha_en = VOP_REG(RK3036_ALPHA_CTRL, 0x1, 1),
150d099fa67SAlex Bee 	.alpha_pre_mul = VOP_REG(RK3036_DSP_CTRL0, 0x1, 29),
151b51502adSMark Yao };
152b51502adSMark Yao 
153b51502adSMark Yao static const struct vop_win_data rk3036_vop_win_data[] = {
154b51502adSMark Yao 	{ .base = 0x00, .phy = &rk3036_win0_data,
155b51502adSMark Yao 	  .type = DRM_PLANE_TYPE_PRIMARY },
156b51502adSMark Yao 	{ .base = 0x00, .phy = &rk3036_win1_data,
157b51502adSMark Yao 	  .type = DRM_PLANE_TYPE_CURSOR },
158b51502adSMark Yao };
159b51502adSMark Yao 
160b51502adSMark Yao static const int rk3036_vop_intrs[] = {
161b51502adSMark Yao 	DSP_HOLD_VALID_INTR,
162b51502adSMark Yao 	FS_INTR,
163b51502adSMark Yao 	LINE_FLAG_INTR,
164b51502adSMark Yao 	BUS_ERROR_INTR,
165b51502adSMark Yao };
166b51502adSMark Yao 
167b51502adSMark Yao static const struct vop_intr rk3036_intr = {
168b51502adSMark Yao 	.intrs = rk3036_vop_intrs,
169b51502adSMark Yao 	.nintrs = ARRAY_SIZE(rk3036_vop_intrs),
170ac6560dfSMark yao 	.line_flag_num[0] = VOP_REG(RK3036_INT_STATUS, 0xfff, 12),
1719a61c54bSMark yao 	.status = VOP_REG_SYNC(RK3036_INT_STATUS, 0xf, 0),
1729a61c54bSMark yao 	.enable = VOP_REG_SYNC(RK3036_INT_STATUS, 0xf, 4),
1739a61c54bSMark yao 	.clear = VOP_REG_SYNC(RK3036_INT_STATUS, 0xf, 8),
174b51502adSMark Yao };
175b51502adSMark Yao 
1769a61c54bSMark yao static const struct vop_modeset rk3036_modeset = {
177b51502adSMark Yao 	.htotal_pw = VOP_REG(RK3036_DSP_HTOTAL_HS_END, 0x1fff1fff, 0),
178b51502adSMark Yao 	.hact_st_end = VOP_REG(RK3036_DSP_HACT_ST_END, 0x1fff1fff, 0),
179b51502adSMark Yao 	.vtotal_pw = VOP_REG(RK3036_DSP_VTOTAL_VS_END, 0x1fff1fff, 0),
180b51502adSMark Yao 	.vact_st_end = VOP_REG(RK3036_DSP_VACT_ST_END, 0x1fff1fff, 0),
1819a61c54bSMark yao };
1829a61c54bSMark yao 
1839a61c54bSMark yao static const struct vop_output rk3036_output = {
1849a61c54bSMark yao 	.pin_pol = VOP_REG(RK3036_DSP_CTRL0, 0xf, 4),
1859a61c54bSMark yao };
1869a61c54bSMark yao 
1879a61c54bSMark yao static const struct vop_common rk3036_common = {
1889a61c54bSMark yao 	.standby = VOP_REG_SYNC(RK3036_SYS_CTRL, 0x1, 30),
1899a61c54bSMark yao 	.out_mode = VOP_REG(RK3036_DSP_CTRL0, 0xf, 0),
1909a61c54bSMark yao 	.dsp_blank = VOP_REG(RK3036_DSP_CTRL1, 0x1, 24),
191a5c0fa44SUrja Rannikko 	.dither_down_sel = VOP_REG(RK3036_DSP_CTRL0, 0x1, 27),
192a5c0fa44SUrja Rannikko 	.dither_down_en = VOP_REG(RK3036_DSP_CTRL0, 0x1, 11),
193a5c0fa44SUrja Rannikko 	.dither_down_mode = VOP_REG(RK3036_DSP_CTRL0, 0x1, 10),
1949548e1b4SMark yao 	.cfg_done = VOP_REG_SYNC(RK3036_REG_CFG_DONE, 0x1, 0),
195b51502adSMark Yao };
196b51502adSMark Yao 
197b51502adSMark Yao static const struct vop_data rk3036_vop = {
198b51502adSMark Yao 	.intr = &rk3036_intr,
1999a61c54bSMark yao 	.common = &rk3036_common,
2009a61c54bSMark yao 	.modeset = &rk3036_modeset,
2019a61c54bSMark yao 	.output = &rk3036_output,
202b51502adSMark Yao 	.win = rk3036_vop_win_data,
203b51502adSMark Yao 	.win_size = ARRAY_SIZE(rk3036_vop_win_data),
2048e140cb6SSascha Hauer 	.max_output = { 1920, 1080 },
205b51502adSMark Yao };
206b51502adSMark Yao 
207460c3b00SSandy Huang static const struct vop_win_phy rk3126_win1_data = {
208460c3b00SSandy Huang 	.data_formats = formats_win_lite,
209460c3b00SSandy Huang 	.nformats = ARRAY_SIZE(formats_win_lite),
2107707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
211460c3b00SSandy Huang 	.enable = VOP_REG(RK3036_SYS_CTRL, 0x1, 1),
212460c3b00SSandy Huang 	.format = VOP_REG(RK3036_SYS_CTRL, 0x7, 6),
213460c3b00SSandy Huang 	.rb_swap = VOP_REG(RK3036_SYS_CTRL, 0x1, 19),
214460c3b00SSandy Huang 	.dsp_info = VOP_REG(RK3126_WIN1_DSP_INFO, 0x0fff0fff, 0),
215460c3b00SSandy Huang 	.dsp_st = VOP_REG(RK3126_WIN1_DSP_ST, 0x1fff1fff, 0),
216460c3b00SSandy Huang 	.yrgb_mst = VOP_REG(RK3126_WIN1_MST, 0xffffffff, 0),
217460c3b00SSandy Huang 	.yrgb_vir = VOP_REG(RK3036_WIN1_VIR, 0xffff, 0),
218d099fa67SAlex Bee 	.alpha_mode = VOP_REG(RK3036_DSP_CTRL0, 0x1, 19),
219d099fa67SAlex Bee 	.alpha_en = VOP_REG(RK3036_ALPHA_CTRL, 0x1, 1),
220d099fa67SAlex Bee 	.alpha_pre_mul = VOP_REG(RK3036_DSP_CTRL0, 0x1, 29),
221460c3b00SSandy Huang };
222460c3b00SSandy Huang 
223460c3b00SSandy Huang static const struct vop_win_data rk3126_vop_win_data[] = {
224460c3b00SSandy Huang 	{ .base = 0x00, .phy = &rk3036_win0_data,
225460c3b00SSandy Huang 	  .type = DRM_PLANE_TYPE_PRIMARY },
226460c3b00SSandy Huang 	{ .base = 0x00, .phy = &rk3126_win1_data,
227460c3b00SSandy Huang 	  .type = DRM_PLANE_TYPE_CURSOR },
228460c3b00SSandy Huang };
229460c3b00SSandy Huang 
230407eaa4aSAlex Bee static const struct vop_output rk3126_output = {
231407eaa4aSAlex Bee 	.pin_pol = VOP_REG(RK3036_DSP_CTRL0, 0xf, 4),
232407eaa4aSAlex Bee 	.hdmi_pin_pol = VOP_REG(RK3126_INT_SCALER, 0x7, 4),
233407eaa4aSAlex Bee 	.hdmi_en = VOP_REG(RK3036_AXI_BUS_CTRL, 0x1, 22),
234407eaa4aSAlex Bee 	.hdmi_dclk_pol = VOP_REG(RK3036_AXI_BUS_CTRL, 0x1, 23),
235407eaa4aSAlex Bee 	.rgb_en = VOP_REG(RK3036_AXI_BUS_CTRL, 0x1, 24),
236407eaa4aSAlex Bee 	.rgb_dclk_pol = VOP_REG(RK3036_AXI_BUS_CTRL, 0x1, 25),
237407eaa4aSAlex Bee 	.mipi_en = VOP_REG(RK3036_AXI_BUS_CTRL, 0x1, 28),
238407eaa4aSAlex Bee 	.mipi_dclk_pol = VOP_REG(RK3036_AXI_BUS_CTRL, 0x1, 29),
239407eaa4aSAlex Bee };
240407eaa4aSAlex Bee 
241460c3b00SSandy Huang static const struct vop_data rk3126_vop = {
242460c3b00SSandy Huang 	.intr = &rk3036_intr,
243460c3b00SSandy Huang 	.common = &rk3036_common,
244460c3b00SSandy Huang 	.modeset = &rk3036_modeset,
245407eaa4aSAlex Bee 	.output = &rk3126_output,
246460c3b00SSandy Huang 	.win = rk3126_vop_win_data,
247460c3b00SSandy Huang 	.win_size = ARRAY_SIZE(rk3126_vop_win_data),
2488e140cb6SSascha Hauer 	.max_output = { 1920, 1080 },
249460c3b00SSandy Huang };
250460c3b00SSandy Huang 
251570913e0SSandy Huang static const int px30_vop_intrs[] = {
252570913e0SSandy Huang 	FS_INTR,
253570913e0SSandy Huang 	0, 0,
254570913e0SSandy Huang 	LINE_FLAG_INTR,
255570913e0SSandy Huang 	0,
256570913e0SSandy Huang 	BUS_ERROR_INTR,
257570913e0SSandy Huang 	0, 0,
258570913e0SSandy Huang 	DSP_HOLD_VALID_INTR,
259570913e0SSandy Huang };
260570913e0SSandy Huang 
261570913e0SSandy Huang static const struct vop_intr px30_intr = {
262570913e0SSandy Huang 	.intrs = px30_vop_intrs,
263570913e0SSandy Huang 	.nintrs = ARRAY_SIZE(px30_vop_intrs),
264a6edf839SSandy Huang 	.line_flag_num[0] = VOP_REG(PX30_LINE_FLAG, 0xfff, 0),
265a6edf839SSandy Huang 	.status = VOP_REG_MASK_SYNC(PX30_INTR_STATUS, 0xffff, 0),
266a6edf839SSandy Huang 	.enable = VOP_REG_MASK_SYNC(PX30_INTR_EN, 0xffff, 0),
267a6edf839SSandy Huang 	.clear = VOP_REG_MASK_SYNC(PX30_INTR_CLEAR, 0xffff, 0),
268570913e0SSandy Huang };
269570913e0SSandy Huang 
270570913e0SSandy Huang static const struct vop_common px30_common = {
271570913e0SSandy Huang 	.standby = VOP_REG_SYNC(PX30_SYS_CTRL2, 0x1, 1),
272570913e0SSandy Huang 	.out_mode = VOP_REG(PX30_DSP_CTRL2, 0xf, 16),
273570913e0SSandy Huang 	.dsp_blank = VOP_REG(PX30_DSP_CTRL2, 0x1, 14),
274a5c0fa44SUrja Rannikko 	.dither_down_en = VOP_REG(PX30_DSP_CTRL2, 0x1, 8),
275a5c0fa44SUrja Rannikko 	.dither_down_sel = VOP_REG(PX30_DSP_CTRL2, 0x1, 7),
276a5c0fa44SUrja Rannikko 	.dither_down_mode = VOP_REG(PX30_DSP_CTRL2, 0x1, 6),
277570913e0SSandy Huang 	.cfg_done = VOP_REG_SYNC(PX30_REG_CFG_DONE, 0x1, 0),
278570913e0SSandy Huang };
279570913e0SSandy Huang 
280570913e0SSandy Huang static const struct vop_modeset px30_modeset = {
281570913e0SSandy Huang 	.htotal_pw = VOP_REG(PX30_DSP_HTOTAL_HS_END, 0x0fff0fff, 0),
282570913e0SSandy Huang 	.hact_st_end = VOP_REG(PX30_DSP_HACT_ST_END, 0x0fff0fff, 0),
283570913e0SSandy Huang 	.vtotal_pw = VOP_REG(PX30_DSP_VTOTAL_VS_END, 0x0fff0fff, 0),
284570913e0SSandy Huang 	.vact_st_end = VOP_REG(PX30_DSP_VACT_ST_END, 0x0fff0fff, 0),
285570913e0SSandy Huang };
286570913e0SSandy Huang 
287570913e0SSandy Huang static const struct vop_output px30_output = {
2881f6c62caSNickey Yang 	.rgb_dclk_pol = VOP_REG(PX30_DSP_CTRL0, 0x1, 1),
2891f6c62caSNickey Yang 	.rgb_pin_pol = VOP_REG(PX30_DSP_CTRL0, 0x7, 2),
290570913e0SSandy Huang 	.rgb_en = VOP_REG(PX30_DSP_CTRL0, 0x1, 0),
2911f6c62caSNickey Yang 	.mipi_dclk_pol = VOP_REG(PX30_DSP_CTRL0, 0x1, 25),
2921f6c62caSNickey Yang 	.mipi_pin_pol = VOP_REG(PX30_DSP_CTRL0, 0x7, 26),
293570913e0SSandy Huang 	.mipi_en = VOP_REG(PX30_DSP_CTRL0, 0x1, 24),
294570913e0SSandy Huang };
295570913e0SSandy Huang 
296570913e0SSandy Huang static const struct vop_scl_regs px30_win_scl = {
297570913e0SSandy Huang 	.scale_yrgb_x = VOP_REG(PX30_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0),
298570913e0SSandy Huang 	.scale_yrgb_y = VOP_REG(PX30_WIN0_SCL_FACTOR_YRGB, 0xffff, 16),
299570913e0SSandy Huang 	.scale_cbcr_x = VOP_REG(PX30_WIN0_SCL_FACTOR_CBR, 0xffff, 0x0),
300570913e0SSandy Huang 	.scale_cbcr_y = VOP_REG(PX30_WIN0_SCL_FACTOR_CBR, 0xffff, 16),
301570913e0SSandy Huang };
302570913e0SSandy Huang 
303570913e0SSandy Huang static const struct vop_win_phy px30_win0_data = {
304570913e0SSandy Huang 	.scl = &px30_win_scl,
305570913e0SSandy Huang 	.data_formats = formats_win_full,
306570913e0SSandy Huang 	.nformats = ARRAY_SIZE(formats_win_full),
3077707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full,
308570913e0SSandy Huang 	.enable = VOP_REG(PX30_WIN0_CTRL0, 0x1, 0),
309570913e0SSandy Huang 	.format = VOP_REG(PX30_WIN0_CTRL0, 0x7, 1),
310570913e0SSandy Huang 	.rb_swap = VOP_REG(PX30_WIN0_CTRL0, 0x1, 12),
3113fa50896SChen-Yu Tsai 	.uv_swap = VOP_REG(PX30_WIN0_CTRL0, 0x1, 15),
312570913e0SSandy Huang 	.act_info = VOP_REG(PX30_WIN0_ACT_INFO, 0xffffffff, 0),
313570913e0SSandy Huang 	.dsp_info = VOP_REG(PX30_WIN0_DSP_INFO, 0xffffffff, 0),
314570913e0SSandy Huang 	.dsp_st = VOP_REG(PX30_WIN0_DSP_ST, 0xffffffff, 0),
315570913e0SSandy Huang 	.yrgb_mst = VOP_REG(PX30_WIN0_YRGB_MST0, 0xffffffff, 0),
316570913e0SSandy Huang 	.uv_mst = VOP_REG(PX30_WIN0_CBR_MST0, 0xffffffff, 0),
317570913e0SSandy Huang 	.yrgb_vir = VOP_REG(PX30_WIN0_VIR, 0x1fff, 0),
318570913e0SSandy Huang 	.uv_vir = VOP_REG(PX30_WIN0_VIR, 0x1fff, 16),
3192aae8ed1SPaul Kocialkowski 	.alpha_pre_mul = VOP_REG(PX30_WIN0_ALPHA_CTRL, 0x1, 2),
3202aae8ed1SPaul Kocialkowski 	.alpha_mode = VOP_REG(PX30_WIN0_ALPHA_CTRL, 0x1, 1),
3212aae8ed1SPaul Kocialkowski 	.alpha_en = VOP_REG(PX30_WIN0_ALPHA_CTRL, 0x1, 0),
322570913e0SSandy Huang };
323570913e0SSandy Huang 
324570913e0SSandy Huang static const struct vop_win_phy px30_win1_data = {
325570913e0SSandy Huang 	.data_formats = formats_win_lite,
326570913e0SSandy Huang 	.nformats = ARRAY_SIZE(formats_win_lite),
3277707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
328570913e0SSandy Huang 	.enable = VOP_REG(PX30_WIN1_CTRL0, 0x1, 0),
329570913e0SSandy Huang 	.format = VOP_REG(PX30_WIN1_CTRL0, 0x7, 4),
330570913e0SSandy Huang 	.rb_swap = VOP_REG(PX30_WIN1_CTRL0, 0x1, 12),
3313fa50896SChen-Yu Tsai 	.uv_swap = VOP_REG(PX30_WIN1_CTRL0, 0x1, 15),
332570913e0SSandy Huang 	.dsp_info = VOP_REG(PX30_WIN1_DSP_INFO, 0xffffffff, 0),
333570913e0SSandy Huang 	.dsp_st = VOP_REG(PX30_WIN1_DSP_ST, 0xffffffff, 0),
334570913e0SSandy Huang 	.yrgb_mst = VOP_REG(PX30_WIN1_MST, 0xffffffff, 0),
335570913e0SSandy Huang 	.yrgb_vir = VOP_REG(PX30_WIN1_VIR, 0x1fff, 0),
3362aae8ed1SPaul Kocialkowski 	.alpha_pre_mul = VOP_REG(PX30_WIN1_ALPHA_CTRL, 0x1, 2),
3372aae8ed1SPaul Kocialkowski 	.alpha_mode = VOP_REG(PX30_WIN1_ALPHA_CTRL, 0x1, 1),
3382aae8ed1SPaul Kocialkowski 	.alpha_en = VOP_REG(PX30_WIN1_ALPHA_CTRL, 0x1, 0),
339570913e0SSandy Huang };
340570913e0SSandy Huang 
341570913e0SSandy Huang static const struct vop_win_phy px30_win2_data = {
342570913e0SSandy Huang 	.data_formats = formats_win_lite,
343570913e0SSandy Huang 	.nformats = ARRAY_SIZE(formats_win_lite),
3447707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
345a6edf839SSandy Huang 	.gate = VOP_REG(PX30_WIN2_CTRL0, 0x1, 4),
346a6edf839SSandy Huang 	.enable = VOP_REG(PX30_WIN2_CTRL0, 0x1, 0),
347570913e0SSandy Huang 	.format = VOP_REG(PX30_WIN2_CTRL0, 0x3, 5),
348570913e0SSandy Huang 	.rb_swap = VOP_REG(PX30_WIN2_CTRL0, 0x1, 20),
349570913e0SSandy Huang 	.dsp_info = VOP_REG(PX30_WIN2_DSP_INFO0, 0x0fff0fff, 0),
350570913e0SSandy Huang 	.dsp_st = VOP_REG(PX30_WIN2_DSP_ST0, 0x1fff1fff, 0),
351570913e0SSandy Huang 	.yrgb_mst = VOP_REG(PX30_WIN2_MST0, 0xffffffff, 0),
352570913e0SSandy Huang 	.yrgb_vir = VOP_REG(PX30_WIN2_VIR0_1, 0x1fff, 0),
3532aae8ed1SPaul Kocialkowski 	.alpha_pre_mul = VOP_REG(PX30_WIN2_ALPHA_CTRL, 0x1, 2),
3542aae8ed1SPaul Kocialkowski 	.alpha_mode = VOP_REG(PX30_WIN2_ALPHA_CTRL, 0x1, 1),
3552aae8ed1SPaul Kocialkowski 	.alpha_en = VOP_REG(PX30_WIN2_ALPHA_CTRL, 0x1, 0),
356570913e0SSandy Huang };
357570913e0SSandy Huang 
358570913e0SSandy Huang static const struct vop_win_data px30_vop_big_win_data[] = {
359570913e0SSandy Huang 	{ .base = 0x00, .phy = &px30_win0_data,
360570913e0SSandy Huang 	  .type = DRM_PLANE_TYPE_PRIMARY },
361570913e0SSandy Huang 	{ .base = 0x00, .phy = &px30_win1_data,
362570913e0SSandy Huang 	  .type = DRM_PLANE_TYPE_OVERLAY },
363570913e0SSandy Huang 	{ .base = 0x00, .phy = &px30_win2_data,
364570913e0SSandy Huang 	  .type = DRM_PLANE_TYPE_CURSOR },
365570913e0SSandy Huang };
366570913e0SSandy Huang 
367570913e0SSandy Huang static const struct vop_data px30_vop_big = {
368872b68e9SJohan Jonker 	.version = VOP_VERSION(2, 6),
369570913e0SSandy Huang 	.intr = &px30_intr,
3708d544233SSandy Huang 	.feature = VOP_FEATURE_INTERNAL_RGB,
371570913e0SSandy Huang 	.common = &px30_common,
372570913e0SSandy Huang 	.modeset = &px30_modeset,
373570913e0SSandy Huang 	.output = &px30_output,
374570913e0SSandy Huang 	.win = px30_vop_big_win_data,
375570913e0SSandy Huang 	.win_size = ARRAY_SIZE(px30_vop_big_win_data),
3768e140cb6SSascha Hauer 	.max_output = { 1920, 1080 },
377570913e0SSandy Huang };
378570913e0SSandy Huang 
379570913e0SSandy Huang static const struct vop_win_data px30_vop_lit_win_data[] = {
380570913e0SSandy Huang 	{ .base = 0x00, .phy = &px30_win1_data,
381570913e0SSandy Huang 	  .type = DRM_PLANE_TYPE_PRIMARY },
382570913e0SSandy Huang };
383570913e0SSandy Huang 
384570913e0SSandy Huang static const struct vop_data px30_vop_lit = {
385872b68e9SJohan Jonker 	.version = VOP_VERSION(2, 5),
386570913e0SSandy Huang 	.intr = &px30_intr,
3878d544233SSandy Huang 	.feature = VOP_FEATURE_INTERNAL_RGB,
388570913e0SSandy Huang 	.common = &px30_common,
389570913e0SSandy Huang 	.modeset = &px30_modeset,
390570913e0SSandy Huang 	.output = &px30_output,
391570913e0SSandy Huang 	.win = px30_vop_lit_win_data,
392570913e0SSandy Huang 	.win_size = ARRAY_SIZE(px30_vop_lit_win_data),
3938e140cb6SSascha Hauer 	.max_output = { 1920, 1080 },
394570913e0SSandy Huang };
395570913e0SSandy Huang 
396f4a6de85SMark Yao static const struct vop_scl_regs rk3066_win_scl = {
397f4a6de85SMark Yao 	.scale_yrgb_x = VOP_REG(RK3066_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0),
398f4a6de85SMark Yao 	.scale_yrgb_y = VOP_REG(RK3066_WIN0_SCL_FACTOR_YRGB, 0xffff, 16),
399f4a6de85SMark Yao 	.scale_cbcr_x = VOP_REG(RK3066_WIN0_SCL_FACTOR_CBR, 0xffff, 0x0),
400f4a6de85SMark Yao 	.scale_cbcr_y = VOP_REG(RK3066_WIN0_SCL_FACTOR_CBR, 0xffff, 16),
401f4a6de85SMark Yao };
402f4a6de85SMark Yao 
403f4a6de85SMark Yao static const struct vop_win_phy rk3066_win0_data = {
404f4a6de85SMark Yao 	.scl = &rk3066_win_scl,
405f4a6de85SMark Yao 	.data_formats = formats_win_full,
406f4a6de85SMark Yao 	.nformats = ARRAY_SIZE(formats_win_full),
4077707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full,
408f4a6de85SMark Yao 	.enable = VOP_REG(RK3066_SYS_CTRL1, 0x1, 0),
409742203cdSAlex Bee 	.format = VOP_REG(RK3066_SYS_CTRL1, 0x7, 4),
410742203cdSAlex Bee 	.rb_swap = VOP_REG(RK3066_SYS_CTRL1, 0x1, 19),
4113fa50896SChen-Yu Tsai 	.uv_swap = VOP_REG(RK3066_SYS_CTRL1, 0x1, 22),
412f4a6de85SMark Yao 	.act_info = VOP_REG(RK3066_WIN0_ACT_INFO, 0x1fff1fff, 0),
413f4a6de85SMark Yao 	.dsp_info = VOP_REG(RK3066_WIN0_DSP_INFO, 0x0fff0fff, 0),
414f4a6de85SMark Yao 	.dsp_st = VOP_REG(RK3066_WIN0_DSP_ST, 0x1fff1fff, 0),
415f4a6de85SMark Yao 	.yrgb_mst = VOP_REG(RK3066_WIN0_YRGB_MST0, 0xffffffff, 0),
416f4a6de85SMark Yao 	.uv_mst = VOP_REG(RK3066_WIN0_CBR_MST0, 0xffffffff, 0),
417f4a6de85SMark Yao 	.yrgb_vir = VOP_REG(RK3066_WIN0_VIR, 0xffff, 0),
418f4a6de85SMark Yao 	.uv_vir = VOP_REG(RK3066_WIN0_VIR, 0x1fff, 16),
419d099fa67SAlex Bee 	.alpha_mode = VOP_REG(RK3066_DSP_CTRL0, 0x1, 21),
420d099fa67SAlex Bee 	.alpha_en = VOP_REG(RK3066_BLEND_CTRL, 0x1, 0),
421f4a6de85SMark Yao };
422f4a6de85SMark Yao 
423f4a6de85SMark Yao static const struct vop_win_phy rk3066_win1_data = {
424f4a6de85SMark Yao 	.data_formats = formats_win_full,
425f4a6de85SMark Yao 	.nformats = ARRAY_SIZE(formats_win_full),
4267707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full,
427f4a6de85SMark Yao 	.enable = VOP_REG(RK3066_SYS_CTRL1, 0x1, 1),
428742203cdSAlex Bee 	.format = VOP_REG(RK3066_SYS_CTRL1, 0x7, 7),
429742203cdSAlex Bee 	.rb_swap = VOP_REG(RK3066_SYS_CTRL1, 0x1, 23),
4303fa50896SChen-Yu Tsai 	.uv_swap = VOP_REG(RK3066_SYS_CTRL1, 0x1, 26),
431f4a6de85SMark Yao 	.act_info = VOP_REG(RK3066_WIN1_ACT_INFO, 0x1fff1fff, 0),
432f4a6de85SMark Yao 	.dsp_info = VOP_REG(RK3066_WIN1_DSP_INFO, 0x0fff0fff, 0),
433f4a6de85SMark Yao 	.dsp_st = VOP_REG(RK3066_WIN1_DSP_ST, 0x1fff1fff, 0),
434f4a6de85SMark Yao 	.yrgb_mst = VOP_REG(RK3066_WIN1_YRGB_MST, 0xffffffff, 0),
435f4a6de85SMark Yao 	.uv_mst = VOP_REG(RK3066_WIN1_CBR_MST, 0xffffffff, 0),
436f4a6de85SMark Yao 	.yrgb_vir = VOP_REG(RK3066_WIN1_VIR, 0xffff, 0),
437f4a6de85SMark Yao 	.uv_vir = VOP_REG(RK3066_WIN1_VIR, 0x1fff, 16),
438d099fa67SAlex Bee 	.alpha_mode = VOP_REG(RK3066_DSP_CTRL0, 0x1, 22),
439d099fa67SAlex Bee 	.alpha_en = VOP_REG(RK3066_BLEND_CTRL, 0x1, 1),
440f4a6de85SMark Yao };
441f4a6de85SMark Yao 
442f4a6de85SMark Yao static const struct vop_win_phy rk3066_win2_data = {
443f4a6de85SMark Yao 	.data_formats = formats_win_lite,
444f4a6de85SMark Yao 	.nformats = ARRAY_SIZE(formats_win_lite),
4457707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
446f4a6de85SMark Yao 	.enable = VOP_REG(RK3066_SYS_CTRL1, 0x1, 2),
447742203cdSAlex Bee 	.format = VOP_REG(RK3066_SYS_CTRL1, 0x7, 10),
448742203cdSAlex Bee 	.rb_swap = VOP_REG(RK3066_SYS_CTRL1, 0x1, 27),
449f4a6de85SMark Yao 	.dsp_info = VOP_REG(RK3066_WIN2_DSP_INFO, 0x0fff0fff, 0),
450f4a6de85SMark Yao 	.dsp_st = VOP_REG(RK3066_WIN2_DSP_ST, 0x1fff1fff, 0),
451f4a6de85SMark Yao 	.yrgb_mst = VOP_REG(RK3066_WIN2_MST, 0xffffffff, 0),
452f4a6de85SMark Yao 	.yrgb_vir = VOP_REG(RK3066_WIN2_VIR, 0xffff, 0),
453d099fa67SAlex Bee 	.alpha_mode = VOP_REG(RK3066_DSP_CTRL0, 0x1, 23),
454d099fa67SAlex Bee 	.alpha_en = VOP_REG(RK3066_BLEND_CTRL, 0x1, 2),
455f4a6de85SMark Yao };
456f4a6de85SMark Yao 
457f4a6de85SMark Yao static const struct vop_modeset rk3066_modeset = {
458f4a6de85SMark Yao 	.htotal_pw = VOP_REG(RK3066_DSP_HTOTAL_HS_END, 0x1fff1fff, 0),
459f4a6de85SMark Yao 	.hact_st_end = VOP_REG(RK3066_DSP_HACT_ST_END, 0x1fff1fff, 0),
460f4a6de85SMark Yao 	.vtotal_pw = VOP_REG(RK3066_DSP_VTOTAL_VS_END, 0x1fff1fff, 0),
461f4a6de85SMark Yao 	.vact_st_end = VOP_REG(RK3066_DSP_VACT_ST_END, 0x1fff1fff, 0),
462f4a6de85SMark Yao };
463f4a6de85SMark Yao 
464f4a6de85SMark Yao static const struct vop_output rk3066_output = {
465f4a6de85SMark Yao 	.pin_pol = VOP_REG(RK3066_DSP_CTRL0, 0x7, 4),
466f4a6de85SMark Yao };
467f4a6de85SMark Yao 
468f4a6de85SMark Yao static const struct vop_common rk3066_common = {
4696b44aa55SVal Packett 	.dma_stop = VOP_REG(RK3066_SYS_CTRL0, 0x1, 0),
470f4a6de85SMark Yao 	.standby = VOP_REG(RK3066_SYS_CTRL0, 0x1, 1),
471f4a6de85SMark Yao 	.out_mode = VOP_REG(RK3066_DSP_CTRL0, 0xf, 0),
472f4a6de85SMark Yao 	.cfg_done = VOP_REG(RK3066_REG_CFG_DONE, 0x1, 0),
473a5c0fa44SUrja Rannikko 	.dither_down_en = VOP_REG(RK3066_DSP_CTRL0, 0x1, 11),
474a5c0fa44SUrja Rannikko 	.dither_down_mode = VOP_REG(RK3066_DSP_CTRL0, 0x1, 10),
475f4a6de85SMark Yao 	.dsp_blank = VOP_REG(RK3066_DSP_CTRL1, 0x1, 24),
476742203cdSAlex Bee 	.dither_up = VOP_REG(RK3066_DSP_CTRL0, 0x1, 9),
477742203cdSAlex Bee 	.dsp_lut_en = VOP_REG(RK3066_SYS_CTRL1, 0x1, 31),
478742203cdSAlex Bee 	.data_blank = VOP_REG(RK3066_DSP_CTRL1, 0x1, 25),
479f4a6de85SMark Yao };
480f4a6de85SMark Yao 
481f4a6de85SMark Yao static const struct vop_win_data rk3066_vop_win_data[] = {
482f4a6de85SMark Yao 	{ .base = 0x00, .phy = &rk3066_win0_data,
483f4a6de85SMark Yao 	  .type = DRM_PLANE_TYPE_PRIMARY },
484f4a6de85SMark Yao 	{ .base = 0x00, .phy = &rk3066_win1_data,
485f4a6de85SMark Yao 	  .type = DRM_PLANE_TYPE_OVERLAY },
486f4a6de85SMark Yao 	{ .base = 0x00, .phy = &rk3066_win2_data,
487f4a6de85SMark Yao 	  .type = DRM_PLANE_TYPE_CURSOR },
488f4a6de85SMark Yao };
489f4a6de85SMark Yao 
490f4a6de85SMark Yao static const int rk3066_vop_intrs[] = {
491f4a6de85SMark Yao 	/*
492f4a6de85SMark Yao 	 * hs_start interrupt fires at frame-start, so serves
493f4a6de85SMark Yao 	 * the same purpose as dsp_hold in the driver.
494f4a6de85SMark Yao 	 */
495f4a6de85SMark Yao 	DSP_HOLD_VALID_INTR,
496f4a6de85SMark Yao 	FS_INTR,
497f4a6de85SMark Yao 	LINE_FLAG_INTR,
498f4a6de85SMark Yao 	BUS_ERROR_INTR,
499f4a6de85SMark Yao };
500f4a6de85SMark Yao 
501f4a6de85SMark Yao static const struct vop_intr rk3066_intr = {
502f4a6de85SMark Yao 	.intrs = rk3066_vop_intrs,
503f4a6de85SMark Yao 	.nintrs = ARRAY_SIZE(rk3066_vop_intrs),
504f4a6de85SMark Yao 	.line_flag_num[0] = VOP_REG(RK3066_INT_STATUS, 0xfff, 12),
505f4a6de85SMark Yao 	.status = VOP_REG(RK3066_INT_STATUS, 0xf, 0),
506f4a6de85SMark Yao 	.enable = VOP_REG(RK3066_INT_STATUS, 0xf, 4),
507f4a6de85SMark Yao 	.clear = VOP_REG(RK3066_INT_STATUS, 0xf, 8),
508f4a6de85SMark Yao };
509f4a6de85SMark Yao 
510f4a6de85SMark Yao static const struct vop_data rk3066_vop = {
511f4a6de85SMark Yao 	.version = VOP_VERSION(2, 1),
512f4a6de85SMark Yao 	.intr = &rk3066_intr,
513f4a6de85SMark Yao 	.common = &rk3066_common,
514f4a6de85SMark Yao 	.modeset = &rk3066_modeset,
515f4a6de85SMark Yao 	.output = &rk3066_output,
516f4a6de85SMark Yao 	.win = rk3066_vop_win_data,
517f4a6de85SMark Yao 	.win_size = ARRAY_SIZE(rk3066_vop_win_data),
518*6ed51ba9SVal Packett 	.feature = VOP_FEATURE_INTERNAL_RGB,
5198e140cb6SSascha Hauer 	.max_output = { 1920, 1080 },
520f4a6de85SMark Yao };
521f4a6de85SMark Yao 
522428e15ccSHeiko Stuebner static const struct vop_scl_regs rk3188_win_scl = {
523428e15ccSHeiko Stuebner 	.scale_yrgb_x = VOP_REG(RK3188_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0),
524428e15ccSHeiko Stuebner 	.scale_yrgb_y = VOP_REG(RK3188_WIN0_SCL_FACTOR_YRGB, 0xffff, 16),
525428e15ccSHeiko Stuebner 	.scale_cbcr_x = VOP_REG(RK3188_WIN0_SCL_FACTOR_CBR, 0xffff, 0x0),
526428e15ccSHeiko Stuebner 	.scale_cbcr_y = VOP_REG(RK3188_WIN0_SCL_FACTOR_CBR, 0xffff, 16),
527428e15ccSHeiko Stuebner };
528428e15ccSHeiko Stuebner 
529428e15ccSHeiko Stuebner static const struct vop_win_phy rk3188_win0_data = {
530428e15ccSHeiko Stuebner 	.scl = &rk3188_win_scl,
531428e15ccSHeiko Stuebner 	.data_formats = formats_win_full,
532428e15ccSHeiko Stuebner 	.nformats = ARRAY_SIZE(formats_win_full),
5337707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full,
534428e15ccSHeiko Stuebner 	.enable = VOP_REG(RK3188_SYS_CTRL, 0x1, 0),
535428e15ccSHeiko Stuebner 	.format = VOP_REG(RK3188_SYS_CTRL, 0x7, 3),
536428e15ccSHeiko Stuebner 	.rb_swap = VOP_REG(RK3188_SYS_CTRL, 0x1, 15),
5373fa50896SChen-Yu Tsai 	.uv_swap = VOP_REG(RK3188_SYS_CTRL, 0x1, 18),
538428e15ccSHeiko Stuebner 	.act_info = VOP_REG(RK3188_WIN0_ACT_INFO, 0x1fff1fff, 0),
539428e15ccSHeiko Stuebner 	.dsp_info = VOP_REG(RK3188_WIN0_DSP_INFO, 0x0fff0fff, 0),
540428e15ccSHeiko Stuebner 	.dsp_st = VOP_REG(RK3188_WIN0_DSP_ST, 0x1fff1fff, 0),
541428e15ccSHeiko Stuebner 	.yrgb_mst = VOP_REG(RK3188_WIN0_YRGB_MST0, 0xffffffff, 0),
542428e15ccSHeiko Stuebner 	.uv_mst = VOP_REG(RK3188_WIN0_CBR_MST0, 0xffffffff, 0),
543428e15ccSHeiko Stuebner 	.yrgb_vir = VOP_REG(RK3188_WIN_VIR, 0x1fff, 0),
544d099fa67SAlex Bee 	.alpha_mode = VOP_REG(RK3188_DSP_CTRL0, 0x1, 18),
545d099fa67SAlex Bee 	.alpha_en = VOP_REG(RK3188_ALPHA_CTRL, 0x1, 0),
546d099fa67SAlex Bee 	.alpha_pre_mul = VOP_REG(RK3188_DSP_CTRL0, 0x1, 29),
547428e15ccSHeiko Stuebner };
548428e15ccSHeiko Stuebner 
549428e15ccSHeiko Stuebner static const struct vop_win_phy rk3188_win1_data = {
550428e15ccSHeiko Stuebner 	.data_formats = formats_win_lite,
551428e15ccSHeiko Stuebner 	.nformats = ARRAY_SIZE(formats_win_lite),
5527707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
553428e15ccSHeiko Stuebner 	.enable = VOP_REG(RK3188_SYS_CTRL, 0x1, 1),
554428e15ccSHeiko Stuebner 	.format = VOP_REG(RK3188_SYS_CTRL, 0x7, 6),
555428e15ccSHeiko Stuebner 	.rb_swap = VOP_REG(RK3188_SYS_CTRL, 0x1, 19),
556428e15ccSHeiko Stuebner 	/* no act_info on window1 */
557428e15ccSHeiko Stuebner 	.dsp_info = VOP_REG(RK3188_WIN1_DSP_INFO, 0x07ff07ff, 0),
558428e15ccSHeiko Stuebner 	.dsp_st = VOP_REG(RK3188_WIN1_DSP_ST, 0x0fff0fff, 0),
559428e15ccSHeiko Stuebner 	.yrgb_mst = VOP_REG(RK3188_WIN1_MST, 0xffffffff, 0),
560428e15ccSHeiko Stuebner 	.yrgb_vir = VOP_REG(RK3188_WIN_VIR, 0x1fff, 16),
561d099fa67SAlex Bee 	.alpha_mode = VOP_REG(RK3188_DSP_CTRL0, 0x1, 19),
562d099fa67SAlex Bee 	.alpha_en = VOP_REG(RK3188_ALPHA_CTRL, 0x1, 1),
563d099fa67SAlex Bee 	.alpha_pre_mul = VOP_REG(RK3188_DSP_CTRL0, 0x1, 29),
564428e15ccSHeiko Stuebner };
565428e15ccSHeiko Stuebner 
566428e15ccSHeiko Stuebner static const struct vop_modeset rk3188_modeset = {
567428e15ccSHeiko Stuebner 	.htotal_pw = VOP_REG(RK3188_DSP_HTOTAL_HS_END, 0x0fff0fff, 0),
568428e15ccSHeiko Stuebner 	.hact_st_end = VOP_REG(RK3188_DSP_HACT_ST_END, 0x0fff0fff, 0),
569428e15ccSHeiko Stuebner 	.vtotal_pw = VOP_REG(RK3188_DSP_VTOTAL_VS_END, 0x0fff0fff, 0),
570428e15ccSHeiko Stuebner 	.vact_st_end = VOP_REG(RK3188_DSP_VACT_ST_END, 0x0fff0fff, 0),
571428e15ccSHeiko Stuebner };
572428e15ccSHeiko Stuebner 
573428e15ccSHeiko Stuebner static const struct vop_output rk3188_output = {
574428e15ccSHeiko Stuebner 	.pin_pol = VOP_REG(RK3188_DSP_CTRL0, 0xf, 4),
575428e15ccSHeiko Stuebner };
576428e15ccSHeiko Stuebner 
577428e15ccSHeiko Stuebner static const struct vop_common rk3188_common = {
578428e15ccSHeiko Stuebner 	.gate_en = VOP_REG(RK3188_SYS_CTRL, 0x1, 31),
579428e15ccSHeiko Stuebner 	.standby = VOP_REG(RK3188_SYS_CTRL, 0x1, 30),
580428e15ccSHeiko Stuebner 	.out_mode = VOP_REG(RK3188_DSP_CTRL0, 0xf, 0),
581428e15ccSHeiko Stuebner 	.cfg_done = VOP_REG(RK3188_REG_CFG_DONE, 0x1, 0),
582a5c0fa44SUrja Rannikko 	.dither_down_sel = VOP_REG(RK3188_DSP_CTRL0, 0x1, 27),
583a5c0fa44SUrja Rannikko 	.dither_down_en = VOP_REG(RK3188_DSP_CTRL0, 0x1, 11),
584a5c0fa44SUrja Rannikko 	.dither_down_mode = VOP_REG(RK3188_DSP_CTRL0, 0x1, 10),
585ab64b448SAlex Bee 	.dsp_blank = VOP_REG(RK3188_DSP_CTRL1, 0x1, 24),
586ab64b448SAlex Bee 	.dither_up = VOP_REG(RK3188_DSP_CTRL0, 0x1, 9),
587ab64b448SAlex Bee 	.dsp_lut_en = VOP_REG(RK3188_SYS_CTRL, 0x1, 28),
588ab64b448SAlex Bee 	.data_blank = VOP_REG(RK3188_DSP_CTRL1, 0x1, 25),
589428e15ccSHeiko Stuebner };
590428e15ccSHeiko Stuebner 
591428e15ccSHeiko Stuebner static const struct vop_win_data rk3188_vop_win_data[] = {
592428e15ccSHeiko Stuebner 	{ .base = 0x00, .phy = &rk3188_win0_data,
593428e15ccSHeiko Stuebner 	  .type = DRM_PLANE_TYPE_PRIMARY },
594428e15ccSHeiko Stuebner 	{ .base = 0x00, .phy = &rk3188_win1_data,
595428e15ccSHeiko Stuebner 	  .type = DRM_PLANE_TYPE_CURSOR },
596428e15ccSHeiko Stuebner };
597428e15ccSHeiko Stuebner 
598428e15ccSHeiko Stuebner static const int rk3188_vop_intrs[] = {
5994f297df8SHeiko Stuebner 	/*
6004f297df8SHeiko Stuebner 	 * hs_start interrupt fires at frame-start, so serves
6014f297df8SHeiko Stuebner 	 * the same purpose as dsp_hold in the driver.
6024f297df8SHeiko Stuebner 	 */
6034f297df8SHeiko Stuebner 	DSP_HOLD_VALID_INTR,
604428e15ccSHeiko Stuebner 	FS_INTR,
605428e15ccSHeiko Stuebner 	LINE_FLAG_INTR,
606428e15ccSHeiko Stuebner 	BUS_ERROR_INTR,
607428e15ccSHeiko Stuebner };
608428e15ccSHeiko Stuebner 
609428e15ccSHeiko Stuebner static const struct vop_intr rk3188_vop_intr = {
610428e15ccSHeiko Stuebner 	.intrs = rk3188_vop_intrs,
611428e15ccSHeiko Stuebner 	.nintrs = ARRAY_SIZE(rk3188_vop_intrs),
612428e15ccSHeiko Stuebner 	.line_flag_num[0] = VOP_REG(RK3188_INT_STATUS, 0xfff, 12),
613428e15ccSHeiko Stuebner 	.status = VOP_REG(RK3188_INT_STATUS, 0xf, 0),
614428e15ccSHeiko Stuebner 	.enable = VOP_REG(RK3188_INT_STATUS, 0xf, 4),
615428e15ccSHeiko Stuebner 	.clear = VOP_REG(RK3188_INT_STATUS, 0xf, 8),
616428e15ccSHeiko Stuebner };
617428e15ccSHeiko Stuebner 
618428e15ccSHeiko Stuebner static const struct vop_data rk3188_vop = {
619428e15ccSHeiko Stuebner 	.intr = &rk3188_vop_intr,
620428e15ccSHeiko Stuebner 	.common = &rk3188_common,
621428e15ccSHeiko Stuebner 	.modeset = &rk3188_modeset,
622428e15ccSHeiko Stuebner 	.output = &rk3188_output,
623428e15ccSHeiko Stuebner 	.win = rk3188_vop_win_data,
624428e15ccSHeiko Stuebner 	.win_size = ARRAY_SIZE(rk3188_vop_win_data),
625428e15ccSHeiko Stuebner 	.feature = VOP_FEATURE_INTERNAL_RGB,
6268e140cb6SSascha Hauer 	.max_output = { 2048, 1536 },
627428e15ccSHeiko Stuebner };
628428e15ccSHeiko Stuebner 
629f7673453SMark Yao static const struct vop_scl_extension rk3288_win_full_scl_ext = {
630f7673453SMark Yao 	.cbcr_vsd_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 31),
631f7673453SMark Yao 	.cbcr_vsu_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 30),
632f7673453SMark Yao 	.cbcr_hsd_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 28),
633f7673453SMark Yao 	.cbcr_ver_scl_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 26),
634f7673453SMark Yao 	.cbcr_hor_scl_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 24),
635f7673453SMark Yao 	.yrgb_vsd_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 23),
636f7673453SMark Yao 	.yrgb_vsu_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 22),
637f7673453SMark Yao 	.yrgb_hsd_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 20),
638f7673453SMark Yao 	.yrgb_ver_scl_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 18),
639f7673453SMark Yao 	.yrgb_hor_scl_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 16),
640f7673453SMark Yao 	.line_load_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 15),
641f7673453SMark Yao 	.cbcr_axi_gather_num = VOP_REG(RK3288_WIN0_CTRL1, 0x7, 12),
642f7673453SMark Yao 	.yrgb_axi_gather_num = VOP_REG(RK3288_WIN0_CTRL1, 0xf, 8),
643f7673453SMark Yao 	.vsd_cbcr_gt2 = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 7),
644f7673453SMark Yao 	.vsd_cbcr_gt4 = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 6),
645f7673453SMark Yao 	.vsd_yrgb_gt2 = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 5),
646f7673453SMark Yao 	.vsd_yrgb_gt4 = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 4),
647f7673453SMark Yao 	.bic_coe_sel = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 2),
648f7673453SMark Yao 	.cbcr_axi_gather_en = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 1),
649f7673453SMark Yao 	.yrgb_axi_gather_en = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 0),
650f7673453SMark Yao 	.lb_mode = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 5),
6511194fffbSMark Yao };
6521194fffbSMark Yao 
653f7673453SMark Yao static const struct vop_scl_regs rk3288_win_full_scl = {
654f7673453SMark Yao 	.ext = &rk3288_win_full_scl_ext,
655f7673453SMark Yao 	.scale_yrgb_x = VOP_REG(RK3288_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0),
656f7673453SMark Yao 	.scale_yrgb_y = VOP_REG(RK3288_WIN0_SCL_FACTOR_YRGB, 0xffff, 16),
657f7673453SMark Yao 	.scale_cbcr_x = VOP_REG(RK3288_WIN0_SCL_FACTOR_CBR, 0xffff, 0x0),
658f7673453SMark Yao 	.scale_cbcr_y = VOP_REG(RK3288_WIN0_SCL_FACTOR_CBR, 0xffff, 16),
659a67719d1SMark Yao };
660a67719d1SMark Yao 
661f7673453SMark Yao static const struct vop_win_phy rk3288_win01_data = {
662f7673453SMark Yao 	.scl = &rk3288_win_full_scl,
663d4b38422SJonas Karlman 	.data_formats = formats_win_full_10,
664d4b38422SJonas Karlman 	.nformats = ARRAY_SIZE(formats_win_full_10),
6657707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full,
666f7673453SMark Yao 	.enable = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 0),
667f7673453SMark Yao 	.format = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 1),
668d4b38422SJonas Karlman 	.fmt_10 = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 4),
669f7673453SMark Yao 	.rb_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 12),
6703fa50896SChen-Yu Tsai 	.uv_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 15),
671f7673453SMark Yao 	.act_info = VOP_REG(RK3288_WIN0_ACT_INFO, 0x1fff1fff, 0),
672f7673453SMark Yao 	.dsp_info = VOP_REG(RK3288_WIN0_DSP_INFO, 0x0fff0fff, 0),
673f7673453SMark Yao 	.dsp_st = VOP_REG(RK3288_WIN0_DSP_ST, 0x1fff1fff, 0),
674f7673453SMark Yao 	.yrgb_mst = VOP_REG(RK3288_WIN0_YRGB_MST, 0xffffffff, 0),
675f7673453SMark Yao 	.uv_mst = VOP_REG(RK3288_WIN0_CBR_MST, 0xffffffff, 0),
676f7673453SMark Yao 	.yrgb_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 0),
677f7673453SMark Yao 	.uv_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 16),
678f7673453SMark Yao 	.src_alpha_ctl = VOP_REG(RK3288_WIN0_SRC_ALPHA_CTRL, 0xff, 0),
679f7673453SMark Yao 	.dst_alpha_ctl = VOP_REG(RK3288_WIN0_DST_ALPHA_CTRL, 0xff, 0),
6809dd2aca4SMark yao 	.channel = VOP_REG(RK3288_WIN0_CTRL2, 0xff, 0),
681a67719d1SMark Yao };
682a67719d1SMark Yao 
683f7673453SMark Yao static const struct vop_win_phy rk3288_win23_data = {
684f7673453SMark Yao 	.data_formats = formats_win_lite,
685f7673453SMark Yao 	.nformats = ARRAY_SIZE(formats_win_lite),
6867707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
68760b7ae7fSMark yao 	.enable = VOP_REG(RK3288_WIN2_CTRL0, 0x1, 4),
68860b7ae7fSMark yao 	.gate = VOP_REG(RK3288_WIN2_CTRL0, 0x1, 0),
689f7673453SMark Yao 	.format = VOP_REG(RK3288_WIN2_CTRL0, 0x7, 1),
690f7673453SMark Yao 	.rb_swap = VOP_REG(RK3288_WIN2_CTRL0, 0x1, 12),
691f7673453SMark Yao 	.dsp_info = VOP_REG(RK3288_WIN2_DSP_INFO0, 0x0fff0fff, 0),
692f7673453SMark Yao 	.dsp_st = VOP_REG(RK3288_WIN2_DSP_ST0, 0x1fff1fff, 0),
693f7673453SMark Yao 	.yrgb_mst = VOP_REG(RK3288_WIN2_MST0, 0xffffffff, 0),
694f7673453SMark Yao 	.yrgb_vir = VOP_REG(RK3288_WIN2_VIR0_1, 0x1fff, 0),
695f7673453SMark Yao 	.src_alpha_ctl = VOP_REG(RK3288_WIN2_SRC_ALPHA_CTRL, 0xff, 0),
696f7673453SMark Yao 	.dst_alpha_ctl = VOP_REG(RK3288_WIN2_DST_ALPHA_CTRL, 0xff, 0),
697a67719d1SMark Yao };
698a67719d1SMark Yao 
6999a61c54bSMark yao static const struct vop_modeset rk3288_modeset = {
700f7673453SMark Yao 	.htotal_pw = VOP_REG(RK3288_DSP_HTOTAL_HS_END, 0x1fff1fff, 0),
701f7673453SMark Yao 	.hact_st_end = VOP_REG(RK3288_DSP_HACT_ST_END, 0x1fff1fff, 0),
702f7673453SMark Yao 	.vtotal_pw = VOP_REG(RK3288_DSP_VTOTAL_VS_END, 0x1fff1fff, 0),
703f7673453SMark Yao 	.vact_st_end = VOP_REG(RK3288_DSP_VACT_ST_END, 0x1fff1fff, 0),
704f7673453SMark Yao 	.hpost_st_end = VOP_REG(RK3288_POST_DSP_HACT_INFO, 0x1fff1fff, 0),
705f7673453SMark Yao 	.vpost_st_end = VOP_REG(RK3288_POST_DSP_VACT_INFO, 0x1fff1fff, 0),
7069a61c54bSMark yao };
7079a61c54bSMark yao 
7089a61c54bSMark yao static const struct vop_output rk3288_output = {
7099a61c54bSMark yao 	.pin_pol = VOP_REG(RK3288_DSP_CTRL0, 0xf, 4),
7109a61c54bSMark yao 	.rgb_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 12),
7119a61c54bSMark yao 	.hdmi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 13),
7129a61c54bSMark yao 	.edp_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 14),
7139a61c54bSMark yao 	.mipi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 15),
7149a61c54bSMark yao };
7159a61c54bSMark yao 
7169a61c54bSMark yao static const struct vop_common rk3288_common = {
7179a61c54bSMark yao 	.standby = VOP_REG_SYNC(RK3288_SYS_CTRL, 0x1, 22),
7189a61c54bSMark yao 	.gate_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 23),
7199a61c54bSMark yao 	.mmu_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 20),
720a5c0fa44SUrja Rannikko 	.dither_down_sel = VOP_REG(RK3288_DSP_CTRL1, 0x1, 4),
721a5c0fa44SUrja Rannikko 	.dither_down_mode = VOP_REG(RK3288_DSP_CTRL1, 0x1, 3),
722a5c0fa44SUrja Rannikko 	.dither_down_en = VOP_REG(RK3288_DSP_CTRL1, 0x1, 2),
7236bda8112SMark Yao 	.pre_dither_down = VOP_REG(RK3288_DSP_CTRL1, 0x1, 1),
7249a61c54bSMark yao 	.dither_up = VOP_REG(RK3288_DSP_CTRL1, 0x1, 6),
725b23ab6acSEzequiel Garcia 	.dsp_lut_en = VOP_REG(RK3288_DSP_CTRL1, 0x1, 0),
7269a61c54bSMark yao 	.data_blank = VOP_REG(RK3288_DSP_CTRL0, 0x1, 19),
7279a61c54bSMark yao 	.dsp_blank = VOP_REG(RK3288_DSP_CTRL0, 0x3, 18),
7289a61c54bSMark yao 	.out_mode = VOP_REG(RK3288_DSP_CTRL0, 0xf, 0),
7299548e1b4SMark yao 	.cfg_done = VOP_REG_SYNC(RK3288_REG_CFG_DONE, 0x1, 0),
730a67719d1SMark Yao };
731a67719d1SMark Yao 
732a67719d1SMark Yao /*
733a67719d1SMark Yao  * Note: rk3288 has a dedicated 'cursor' window, however, that window requires
734a67719d1SMark Yao  * special support to get alpha blending working.  For now, just use overlay
735a67719d1SMark Yao  * window 3 for the drm cursor.
736a67719d1SMark Yao  *
737a67719d1SMark Yao  */
738a67719d1SMark Yao static const struct vop_win_data rk3288_vop_win_data[] = {
739f7673453SMark Yao 	{ .base = 0x00, .phy = &rk3288_win01_data,
740f7673453SMark Yao 	  .type = DRM_PLANE_TYPE_PRIMARY },
741f7673453SMark Yao 	{ .base = 0x40, .phy = &rk3288_win01_data,
742f7673453SMark Yao 	  .type = DRM_PLANE_TYPE_OVERLAY },
743f7673453SMark Yao 	{ .base = 0x00, .phy = &rk3288_win23_data,
744f7673453SMark Yao 	  .type = DRM_PLANE_TYPE_OVERLAY },
745f7673453SMark Yao 	{ .base = 0x50, .phy = &rk3288_win23_data,
746f7673453SMark Yao 	  .type = DRM_PLANE_TYPE_CURSOR },
747a67719d1SMark Yao };
748a67719d1SMark Yao 
749a67719d1SMark Yao static const int rk3288_vop_intrs[] = {
750a67719d1SMark Yao 	DSP_HOLD_VALID_INTR,
751a67719d1SMark Yao 	FS_INTR,
752a67719d1SMark Yao 	LINE_FLAG_INTR,
753a67719d1SMark Yao 	BUS_ERROR_INTR,
754a67719d1SMark Yao };
755a67719d1SMark Yao 
756a67719d1SMark Yao static const struct vop_intr rk3288_vop_intr = {
757a67719d1SMark Yao 	.intrs = rk3288_vop_intrs,
758a67719d1SMark Yao 	.nintrs = ARRAY_SIZE(rk3288_vop_intrs),
759ac6560dfSMark yao 	.line_flag_num[0] = VOP_REG(RK3288_INTR_CTRL0, 0x1fff, 12),
760f7673453SMark Yao 	.status = VOP_REG(RK3288_INTR_CTRL0, 0xf, 0),
761f7673453SMark Yao 	.enable = VOP_REG(RK3288_INTR_CTRL0, 0xf, 4),
762f7673453SMark Yao 	.clear = VOP_REG(RK3288_INTR_CTRL0, 0xf, 8),
763a67719d1SMark Yao };
764a67719d1SMark Yao 
765a67719d1SMark Yao static const struct vop_data rk3288_vop = {
766eb5cb6aaSMark yao 	.version = VOP_VERSION(3, 1),
767efd11cc8SMark yao 	.feature = VOP_FEATURE_OUTPUT_RGB10,
768a67719d1SMark Yao 	.intr = &rk3288_vop_intr,
7699a61c54bSMark yao 	.common = &rk3288_common,
7709a61c54bSMark yao 	.modeset = &rk3288_modeset,
7719a61c54bSMark yao 	.output = &rk3288_output,
772a67719d1SMark Yao 	.win = rk3288_vop_win_data,
773a67719d1SMark Yao 	.win_size = ARRAY_SIZE(rk3288_vop_win_data),
774b23ab6acSEzequiel Garcia 	.lut_size = 1024,
7758e140cb6SSascha Hauer 	/*
7768e140cb6SSascha Hauer 	 * This is the maximum resolution for the VOPB, the VOPL can only do
7778e140cb6SSascha Hauer 	 * 2560x1600, but we can't distinguish them as they have the same
7788e140cb6SSascha Hauer 	 * compatible.
7798e140cb6SSascha Hauer 	 */
7808e140cb6SSascha Hauer 	.max_output = { 3840, 2160 },
781a67719d1SMark Yao };
782a67719d1SMark Yao 
783eb5cb6aaSMark yao static const int rk3368_vop_intrs[] = {
7840a63bfd0SMark Yao 	FS_INTR,
7850a63bfd0SMark Yao 	0, 0,
7860a63bfd0SMark Yao 	LINE_FLAG_INTR,
7870a63bfd0SMark Yao 	0,
7880a63bfd0SMark Yao 	BUS_ERROR_INTR,
7890a63bfd0SMark Yao 	0, 0, 0, 0, 0, 0, 0,
7900a63bfd0SMark Yao 	DSP_HOLD_VALID_INTR,
791f7673453SMark Yao };
792f7673453SMark Yao 
793eb5cb6aaSMark yao static const struct vop_intr rk3368_vop_intr = {
794eb5cb6aaSMark yao 	.intrs = rk3368_vop_intrs,
795eb5cb6aaSMark yao 	.nintrs = ARRAY_SIZE(rk3368_vop_intrs),
796eb5cb6aaSMark yao 	.line_flag_num[0] = VOP_REG(RK3368_LINE_FLAG, 0xffff, 0),
797eb5cb6aaSMark yao 	.line_flag_num[1] = VOP_REG(RK3368_LINE_FLAG, 0xffff, 16),
798eb5cb6aaSMark yao 	.status = VOP_REG_MASK_SYNC(RK3368_INTR_STATUS, 0x3fff, 0),
799eb5cb6aaSMark yao 	.enable = VOP_REG_MASK_SYNC(RK3368_INTR_EN, 0x3fff, 0),
800eb5cb6aaSMark yao 	.clear = VOP_REG_MASK_SYNC(RK3368_INTR_CLEAR, 0x3fff, 0),
801eb5cb6aaSMark yao };
802eb5cb6aaSMark yao 
803fbb1c738SEzequiel Garcia static const struct vop_win_phy rk3368_win01_data = {
804fbb1c738SEzequiel Garcia 	.scl = &rk3288_win_full_scl,
805fbb1c738SEzequiel Garcia 	.data_formats = formats_win_full,
806fbb1c738SEzequiel Garcia 	.nformats = ARRAY_SIZE(formats_win_full),
8077707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full,
808fbb1c738SEzequiel Garcia 	.enable = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 0),
809fbb1c738SEzequiel Garcia 	.format = VOP_REG(RK3368_WIN0_CTRL0, 0x7, 1),
810fbb1c738SEzequiel Garcia 	.rb_swap = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 12),
8113fa50896SChen-Yu Tsai 	.uv_swap = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 15),
812677e8bbcSDaniele Castagna 	.x_mir_en = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 21),
813677e8bbcSDaniele Castagna 	.y_mir_en = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 22),
814fbb1c738SEzequiel Garcia 	.act_info = VOP_REG(RK3368_WIN0_ACT_INFO, 0x1fff1fff, 0),
815fbb1c738SEzequiel Garcia 	.dsp_info = VOP_REG(RK3368_WIN0_DSP_INFO, 0x0fff0fff, 0),
816fbb1c738SEzequiel Garcia 	.dsp_st = VOP_REG(RK3368_WIN0_DSP_ST, 0x1fff1fff, 0),
817fbb1c738SEzequiel Garcia 	.yrgb_mst = VOP_REG(RK3368_WIN0_YRGB_MST, 0xffffffff, 0),
818fbb1c738SEzequiel Garcia 	.uv_mst = VOP_REG(RK3368_WIN0_CBR_MST, 0xffffffff, 0),
819fbb1c738SEzequiel Garcia 	.yrgb_vir = VOP_REG(RK3368_WIN0_VIR, 0x3fff, 0),
820fbb1c738SEzequiel Garcia 	.uv_vir = VOP_REG(RK3368_WIN0_VIR, 0x3fff, 16),
821fbb1c738SEzequiel Garcia 	.src_alpha_ctl = VOP_REG(RK3368_WIN0_SRC_ALPHA_CTRL, 0xff, 0),
822fbb1c738SEzequiel Garcia 	.dst_alpha_ctl = VOP_REG(RK3368_WIN0_DST_ALPHA_CTRL, 0xff, 0),
823fbb1c738SEzequiel Garcia 	.channel = VOP_REG(RK3368_WIN0_CTRL2, 0xff, 0),
824fbb1c738SEzequiel Garcia };
825fbb1c738SEzequiel Garcia 
826eb5cb6aaSMark yao static const struct vop_win_phy rk3368_win23_data = {
827eb5cb6aaSMark yao 	.data_formats = formats_win_lite,
828eb5cb6aaSMark yao 	.nformats = ARRAY_SIZE(formats_win_lite),
8297707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_lite,
830eb5cb6aaSMark yao 	.gate = VOP_REG(RK3368_WIN2_CTRL0, 0x1, 0),
831eb5cb6aaSMark yao 	.enable = VOP_REG(RK3368_WIN2_CTRL0, 0x1, 4),
832eb5cb6aaSMark yao 	.format = VOP_REG(RK3368_WIN2_CTRL0, 0x3, 5),
833eb5cb6aaSMark yao 	.rb_swap = VOP_REG(RK3368_WIN2_CTRL0, 0x1, 20),
834677e8bbcSDaniele Castagna 	.y_mir_en = VOP_REG(RK3368_WIN2_CTRL1, 0x1, 15),
835eb5cb6aaSMark yao 	.dsp_info = VOP_REG(RK3368_WIN2_DSP_INFO0, 0x0fff0fff, 0),
836eb5cb6aaSMark yao 	.dsp_st = VOP_REG(RK3368_WIN2_DSP_ST0, 0x1fff1fff, 0),
837eb5cb6aaSMark yao 	.yrgb_mst = VOP_REG(RK3368_WIN2_MST0, 0xffffffff, 0),
838eb5cb6aaSMark yao 	.yrgb_vir = VOP_REG(RK3368_WIN2_VIR0_1, 0x1fff, 0),
839eb5cb6aaSMark yao 	.src_alpha_ctl = VOP_REG(RK3368_WIN2_SRC_ALPHA_CTRL, 0xff, 0),
840eb5cb6aaSMark yao 	.dst_alpha_ctl = VOP_REG(RK3368_WIN2_DST_ALPHA_CTRL, 0xff, 0),
841eb5cb6aaSMark yao };
842eb5cb6aaSMark yao 
843eb5cb6aaSMark yao static const struct vop_win_data rk3368_vop_win_data[] = {
844fbb1c738SEzequiel Garcia 	{ .base = 0x00, .phy = &rk3368_win01_data,
845eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_PRIMARY },
846fbb1c738SEzequiel Garcia 	{ .base = 0x40, .phy = &rk3368_win01_data,
847eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_OVERLAY },
848eb5cb6aaSMark yao 	{ .base = 0x00, .phy = &rk3368_win23_data,
849eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_OVERLAY },
850eb5cb6aaSMark yao 	{ .base = 0x50, .phy = &rk3368_win23_data,
851eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_CURSOR },
852eb5cb6aaSMark yao };
853eb5cb6aaSMark yao 
854eb5cb6aaSMark yao static const struct vop_output rk3368_output = {
8551f6c62caSNickey Yang 	.rgb_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 19),
8561f6c62caSNickey Yang 	.hdmi_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 23),
8571f6c62caSNickey Yang 	.edp_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 27),
8581f6c62caSNickey Yang 	.mipi_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 31),
8591f6c62caSNickey Yang 	.rgb_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 16),
8601f6c62caSNickey Yang 	.hdmi_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 20),
8611f6c62caSNickey Yang 	.edp_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 24),
8621f6c62caSNickey Yang 	.mipi_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 28),
863eb5cb6aaSMark yao 	.rgb_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 12),
864eb5cb6aaSMark yao 	.hdmi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 13),
865eb5cb6aaSMark yao 	.edp_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 14),
866eb5cb6aaSMark yao 	.mipi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 15),
867eb5cb6aaSMark yao };
868eb5cb6aaSMark yao 
869eb5cb6aaSMark yao static const struct vop_misc rk3368_misc = {
870eb5cb6aaSMark yao 	.global_regdone_en = VOP_REG(RK3368_SYS_CTRL, 0x1, 11),
871eb5cb6aaSMark yao };
872eb5cb6aaSMark yao 
873eb5cb6aaSMark yao static const struct vop_data rk3368_vop = {
874eb5cb6aaSMark yao 	.version = VOP_VERSION(3, 2),
875eb5cb6aaSMark yao 	.intr = &rk3368_vop_intr,
876eb5cb6aaSMark yao 	.common = &rk3288_common,
877eb5cb6aaSMark yao 	.modeset = &rk3288_modeset,
878eb5cb6aaSMark yao 	.output = &rk3368_output,
879eb5cb6aaSMark yao 	.misc = &rk3368_misc,
880eb5cb6aaSMark yao 	.win = rk3368_vop_win_data,
881eb5cb6aaSMark yao 	.win_size = ARRAY_SIZE(rk3368_vop_win_data),
8828e140cb6SSascha Hauer 	.max_output = { 4096, 2160 },
883eb5cb6aaSMark yao };
884eb5cb6aaSMark yao 
885eb5cb6aaSMark yao static const struct vop_intr rk3366_vop_intr = {
886eb5cb6aaSMark yao 	.intrs = rk3368_vop_intrs,
887eb5cb6aaSMark yao 	.nintrs = ARRAY_SIZE(rk3368_vop_intrs),
888eb5cb6aaSMark yao 	.line_flag_num[0] = VOP_REG(RK3366_LINE_FLAG, 0xffff, 0),
889eb5cb6aaSMark yao 	.line_flag_num[1] = VOP_REG(RK3366_LINE_FLAG, 0xffff, 16),
890eb5cb6aaSMark yao 	.status = VOP_REG_MASK_SYNC(RK3366_INTR_STATUS0, 0xffff, 0),
891eb5cb6aaSMark yao 	.enable = VOP_REG_MASK_SYNC(RK3366_INTR_EN0, 0xffff, 0),
892eb5cb6aaSMark yao 	.clear = VOP_REG_MASK_SYNC(RK3366_INTR_CLEAR0, 0xffff, 0),
893eb5cb6aaSMark yao };
894eb5cb6aaSMark yao 
895eb5cb6aaSMark yao static const struct vop_data rk3366_vop = {
896eb5cb6aaSMark yao 	.version = VOP_VERSION(3, 4),
897eb5cb6aaSMark yao 	.intr = &rk3366_vop_intr,
898eb5cb6aaSMark yao 	.common = &rk3288_common,
899eb5cb6aaSMark yao 	.modeset = &rk3288_modeset,
900eb5cb6aaSMark yao 	.output = &rk3368_output,
901eb5cb6aaSMark yao 	.misc = &rk3368_misc,
902eb5cb6aaSMark yao 	.win = rk3368_vop_win_data,
903eb5cb6aaSMark yao 	.win_size = ARRAY_SIZE(rk3368_vop_win_data),
9048e140cb6SSascha Hauer 	.max_output = { 4096, 2160 },
905f7673453SMark Yao };
906f7673453SMark Yao 
9079a61c54bSMark yao static const struct vop_output rk3399_output = {
9081f6c62caSNickey Yang 	.dp_dclk_pol = VOP_REG(RK3399_DSP_CTRL1, 0x1, 19),
9091f6c62caSNickey Yang 	.rgb_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 19),
9101f6c62caSNickey Yang 	.hdmi_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 23),
9111f6c62caSNickey Yang 	.edp_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 27),
9121f6c62caSNickey Yang 	.mipi_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 31),
9131f6c62caSNickey Yang 	.dp_pin_pol = VOP_REG(RK3399_DSP_CTRL1, 0x7, 16),
9141f6c62caSNickey Yang 	.rgb_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 16),
9151f6c62caSNickey Yang 	.hdmi_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 20),
9161f6c62caSNickey Yang 	.edp_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 24),
9171f6c62caSNickey Yang 	.mipi_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 28),
9189a61c54bSMark yao 	.dp_en = VOP_REG(RK3399_SYS_CTRL, 0x1, 11),
9199a61c54bSMark yao 	.rgb_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 12),
9209a61c54bSMark yao 	.hdmi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 13),
9219a61c54bSMark yao 	.edp_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 14),
9229a61c54bSMark yao 	.mipi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 15),
923cf6d100dSHeiko Stuebner 	.mipi_dual_channel_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 3),
9249a61c54bSMark yao };
9259a61c54bSMark yao 
9263ba000d6SHugh Cole-Baker static const struct vop_common rk3399_common = {
9273ba000d6SHugh Cole-Baker 	.standby = VOP_REG_SYNC(RK3399_SYS_CTRL, 0x1, 22),
9283ba000d6SHugh Cole-Baker 	.gate_en = VOP_REG(RK3399_SYS_CTRL, 0x1, 23),
9293ba000d6SHugh Cole-Baker 	.mmu_en = VOP_REG(RK3399_SYS_CTRL, 0x1, 20),
9303ba000d6SHugh Cole-Baker 	.dither_down_sel = VOP_REG(RK3399_DSP_CTRL1, 0x1, 4),
9313ba000d6SHugh Cole-Baker 	.dither_down_mode = VOP_REG(RK3399_DSP_CTRL1, 0x1, 3),
9323ba000d6SHugh Cole-Baker 	.dither_down_en = VOP_REG(RK3399_DSP_CTRL1, 0x1, 2),
9333ba000d6SHugh Cole-Baker 	.pre_dither_down = VOP_REG(RK3399_DSP_CTRL1, 0x1, 1),
9343ba000d6SHugh Cole-Baker 	.dither_up = VOP_REG(RK3399_DSP_CTRL1, 0x1, 6),
9353ba000d6SHugh Cole-Baker 	.dsp_lut_en = VOP_REG(RK3399_DSP_CTRL1, 0x1, 0),
9363ba000d6SHugh Cole-Baker 	.update_gamma_lut = VOP_REG(RK3399_DSP_CTRL1, 0x1, 7),
9373ba000d6SHugh Cole-Baker 	.lut_buffer_index = VOP_REG(RK3399_DBG_POST_REG1, 0x1, 1),
9383ba000d6SHugh Cole-Baker 	.data_blank = VOP_REG(RK3399_DSP_CTRL0, 0x1, 19),
9393ba000d6SHugh Cole-Baker 	.dsp_blank = VOP_REG(RK3399_DSP_CTRL0, 0x3, 18),
9403ba000d6SHugh Cole-Baker 	.out_mode = VOP_REG(RK3399_DSP_CTRL0, 0xf, 0),
9413ba000d6SHugh Cole-Baker 	.cfg_done = VOP_REG_SYNC(RK3399_REG_CFG_DONE, 0x1, 0),
9423ba000d6SHugh Cole-Baker };
9433ba000d6SHugh Cole-Baker 
9441c21aa8fSDaniele Castagna static const struct vop_yuv2yuv_phy rk3399_yuv2yuv_win01_data = {
9451c21aa8fSDaniele Castagna 	.y2r_coefficients = {
9461c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 0, 0xffff, 0),
9471c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 0, 0xffff, 16),
9481c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 4, 0xffff, 0),
9491c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 4, 0xffff, 16),
9501c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 8, 0xffff, 0),
9511c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 8, 0xffff, 16),
9521c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 12, 0xffff, 0),
9531c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 12, 0xffff, 16),
9541c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 16, 0xffff, 0),
9551c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 20, 0xffffffff, 0),
9561c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 24, 0xffffffff, 0),
9571c21aa8fSDaniele Castagna 		VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 28, 0xffffffff, 0),
9581c21aa8fSDaniele Castagna 	},
9591c21aa8fSDaniele Castagna };
9601c21aa8fSDaniele Castagna 
9611c21aa8fSDaniele Castagna static const struct vop_yuv2yuv_phy rk3399_yuv2yuv_win23_data = { };
9621c21aa8fSDaniele Castagna 
9631c21aa8fSDaniele Castagna static const struct vop_win_yuv2yuv_data rk3399_vop_big_win_yuv2yuv_data[] = {
9641c21aa8fSDaniele Castagna 	{ .base = 0x00, .phy = &rk3399_yuv2yuv_win01_data,
9651c21aa8fSDaniele Castagna 	  .y2r_en = VOP_REG(RK3399_YUV2YUV_WIN, 0x1, 1) },
9661c21aa8fSDaniele Castagna 	{ .base = 0x60, .phy = &rk3399_yuv2yuv_win01_data,
9671c21aa8fSDaniele Castagna 	  .y2r_en = VOP_REG(RK3399_YUV2YUV_WIN, 0x1, 9) },
9681c21aa8fSDaniele Castagna 	{ .base = 0xC0, .phy = &rk3399_yuv2yuv_win23_data },
9691c21aa8fSDaniele Castagna 	{ .base = 0x120, .phy = &rk3399_yuv2yuv_win23_data },
9707707f722SAndrzej Pietrasiewicz 
9717707f722SAndrzej Pietrasiewicz };
9727707f722SAndrzej Pietrasiewicz 
973d4b38422SJonas Karlman static const struct vop_win_phy rk3399_win0_data = {
9747707f722SAndrzej Pietrasiewicz 	.scl = &rk3288_win_full_scl,
975d4b38422SJonas Karlman 	.data_formats = formats_win_full_10,
976d4b38422SJonas Karlman 	.nformats = ARRAY_SIZE(formats_win_full_10),
9777707f722SAndrzej Pietrasiewicz 	.format_modifiers = format_modifiers_win_full_afbc,
9787707f722SAndrzej Pietrasiewicz 	.enable = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 0),
9797707f722SAndrzej Pietrasiewicz 	.format = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 1),
980d4b38422SJonas Karlman 	.fmt_10 = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 4),
981d4b38422SJonas Karlman 	.rb_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 12),
982d4b38422SJonas Karlman 	.uv_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 15),
983d4b38422SJonas Karlman 	.x_mir_en = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 21),
984d4b38422SJonas Karlman 	.y_mir_en = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 22),
985d4b38422SJonas Karlman 	.act_info = VOP_REG(RK3288_WIN0_ACT_INFO, 0x1fff1fff, 0),
986d4b38422SJonas Karlman 	.dsp_info = VOP_REG(RK3288_WIN0_DSP_INFO, 0x0fff0fff, 0),
987d4b38422SJonas Karlman 	.dsp_st = VOP_REG(RK3288_WIN0_DSP_ST, 0x1fff1fff, 0),
988d4b38422SJonas Karlman 	.yrgb_mst = VOP_REG(RK3288_WIN0_YRGB_MST, 0xffffffff, 0),
989d4b38422SJonas Karlman 	.uv_mst = VOP_REG(RK3288_WIN0_CBR_MST, 0xffffffff, 0),
990d4b38422SJonas Karlman 	.yrgb_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 0),
991d4b38422SJonas Karlman 	.uv_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 16),
992d4b38422SJonas Karlman 	.src_alpha_ctl = VOP_REG(RK3288_WIN0_SRC_ALPHA_CTRL, 0xff, 0),
993d4b38422SJonas Karlman 	.dst_alpha_ctl = VOP_REG(RK3288_WIN0_DST_ALPHA_CTRL, 0xff, 0),
994d4b38422SJonas Karlman 	.channel = VOP_REG(RK3288_WIN0_CTRL2, 0xff, 0),
995d4b38422SJonas Karlman };
996d4b38422SJonas Karlman 
997d4b38422SJonas Karlman static const struct vop_win_phy rk3399_win1_data = {
998d4b38422SJonas Karlman 	.scl = &rk3288_win_full_scl,
999d4b38422SJonas Karlman 	.data_formats = formats_win_full_10,
1000d4b38422SJonas Karlman 	.nformats = ARRAY_SIZE(formats_win_full_10),
1001d4b38422SJonas Karlman 	.format_modifiers = format_modifiers_win_full,
1002d4b38422SJonas Karlman 	.enable = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 0),
1003d4b38422SJonas Karlman 	.format = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 1),
1004d4b38422SJonas Karlman 	.fmt_10 = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 4),
10057707f722SAndrzej Pietrasiewicz 	.rb_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 12),
10063fa50896SChen-Yu Tsai 	.uv_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 15),
10079da1e9abSBrian Norris 	.x_mir_en = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 21),
10087707f722SAndrzej Pietrasiewicz 	.y_mir_en = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 22),
10097707f722SAndrzej Pietrasiewicz 	.act_info = VOP_REG(RK3288_WIN0_ACT_INFO, 0x1fff1fff, 0),
10107707f722SAndrzej Pietrasiewicz 	.dsp_info = VOP_REG(RK3288_WIN0_DSP_INFO, 0x0fff0fff, 0),
10117707f722SAndrzej Pietrasiewicz 	.dsp_st = VOP_REG(RK3288_WIN0_DSP_ST, 0x1fff1fff, 0),
10127707f722SAndrzej Pietrasiewicz 	.yrgb_mst = VOP_REG(RK3288_WIN0_YRGB_MST, 0xffffffff, 0),
10137707f722SAndrzej Pietrasiewicz 	.uv_mst = VOP_REG(RK3288_WIN0_CBR_MST, 0xffffffff, 0),
10147707f722SAndrzej Pietrasiewicz 	.yrgb_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 0),
10157707f722SAndrzej Pietrasiewicz 	.uv_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 16),
10167707f722SAndrzej Pietrasiewicz 	.src_alpha_ctl = VOP_REG(RK3288_WIN0_SRC_ALPHA_CTRL, 0xff, 0),
10177707f722SAndrzej Pietrasiewicz 	.dst_alpha_ctl = VOP_REG(RK3288_WIN0_DST_ALPHA_CTRL, 0xff, 0),
10189da1e9abSBrian Norris 	.channel = VOP_REG(RK3288_WIN0_CTRL2, 0xff, 0),
10197707f722SAndrzej Pietrasiewicz };
10207707f722SAndrzej Pietrasiewicz 
10217707f722SAndrzej Pietrasiewicz /*
10227707f722SAndrzej Pietrasiewicz  * rk3399 vop big windows register layout is same as rk3288, but we
10237707f722SAndrzej Pietrasiewicz  * have a separate rk3399 win data array here so that we can advertise
10247707f722SAndrzej Pietrasiewicz  * AFBC on the primary plane.
10257707f722SAndrzej Pietrasiewicz  */
10267707f722SAndrzej Pietrasiewicz static const struct vop_win_data rk3399_vop_win_data[] = {
1027d4b38422SJonas Karlman 	{ .base = 0x00, .phy = &rk3399_win0_data,
10287707f722SAndrzej Pietrasiewicz 	  .type = DRM_PLANE_TYPE_PRIMARY },
1029d4b38422SJonas Karlman 	{ .base = 0x40, .phy = &rk3399_win1_data,
10307707f722SAndrzej Pietrasiewicz 	  .type = DRM_PLANE_TYPE_OVERLAY },
10319da1e9abSBrian Norris 	{ .base = 0x00, .phy = &rk3368_win23_data,
10327707f722SAndrzej Pietrasiewicz 	  .type = DRM_PLANE_TYPE_OVERLAY },
10339da1e9abSBrian Norris 	{ .base = 0x50, .phy = &rk3368_win23_data,
10347707f722SAndrzej Pietrasiewicz 	  .type = DRM_PLANE_TYPE_CURSOR },
10357707f722SAndrzej Pietrasiewicz };
10367707f722SAndrzej Pietrasiewicz 
10377707f722SAndrzej Pietrasiewicz static const struct vop_afbc rk3399_vop_afbc = {
10387707f722SAndrzej Pietrasiewicz 	.rstn = VOP_REG(RK3399_AFBCD0_CTRL, 0x1, 3),
10397707f722SAndrzej Pietrasiewicz 	.enable = VOP_REG(RK3399_AFBCD0_CTRL, 0x1, 0),
10407707f722SAndrzej Pietrasiewicz 	.win_sel = VOP_REG(RK3399_AFBCD0_CTRL, 0x3, 1),
10417707f722SAndrzej Pietrasiewicz 	.format = VOP_REG(RK3399_AFBCD0_CTRL, 0x1f, 16),
10427707f722SAndrzej Pietrasiewicz 	.hreg_block_split = VOP_REG(RK3399_AFBCD0_CTRL, 0x1, 21),
10437707f722SAndrzej Pietrasiewicz 	.hdr_ptr = VOP_REG(RK3399_AFBCD0_HDR_PTR, 0xffffffff, 0),
10447707f722SAndrzej Pietrasiewicz 	.pic_size = VOP_REG(RK3399_AFBCD0_PIC_SIZE, 0xffffffff, 0),
10451c21aa8fSDaniele Castagna };
10461c21aa8fSDaniele Castagna 
10470a63bfd0SMark Yao static const struct vop_data rk3399_vop_big = {
1048eb5cb6aaSMark yao 	.version = VOP_VERSION(3, 5),
1049efd11cc8SMark yao 	.feature = VOP_FEATURE_OUTPUT_RGB10,
1050eb5cb6aaSMark yao 	.intr = &rk3366_vop_intr,
10513ba000d6SHugh Cole-Baker 	.common = &rk3399_common,
10529a61c54bSMark yao 	.modeset = &rk3288_modeset,
10539a61c54bSMark yao 	.output = &rk3399_output,
10547707f722SAndrzej Pietrasiewicz 	.afbc = &rk3399_vop_afbc,
1055eb5cb6aaSMark yao 	.misc = &rk3368_misc,
10567707f722SAndrzej Pietrasiewicz 	.win = rk3399_vop_win_data,
10577707f722SAndrzej Pietrasiewicz 	.win_size = ARRAY_SIZE(rk3399_vop_win_data),
10581c21aa8fSDaniele Castagna 	.win_yuv2yuv = rk3399_vop_big_win_yuv2yuv_data,
10593ba000d6SHugh Cole-Baker 	.lut_size = 1024,
10608e140cb6SSascha Hauer 	.max_output = { 4096, 2160 },
10610a63bfd0SMark Yao };
10620a63bfd0SMark Yao 
10630a63bfd0SMark Yao static const struct vop_win_data rk3399_vop_lit_win_data[] = {
1064fbb1c738SEzequiel Garcia 	{ .base = 0x00, .phy = &rk3368_win01_data,
1065f7673453SMark Yao 	  .type = DRM_PLANE_TYPE_PRIMARY },
1066eb5cb6aaSMark yao 	{ .base = 0x00, .phy = &rk3368_win23_data,
1067f7673453SMark Yao 	  .type = DRM_PLANE_TYPE_CURSOR},
1068f7673453SMark Yao };
1069f7673453SMark Yao 
10701c21aa8fSDaniele Castagna static const struct vop_win_yuv2yuv_data rk3399_vop_lit_win_yuv2yuv_data[] = {
10711c21aa8fSDaniele Castagna 	{ .base = 0x00, .phy = &rk3399_yuv2yuv_win01_data,
10721c21aa8fSDaniele Castagna 	  .y2r_en = VOP_REG(RK3399_YUV2YUV_WIN, 0x1, 1)},
10731c21aa8fSDaniele Castagna 	{ .base = 0x60, .phy = &rk3399_yuv2yuv_win23_data },
10741c21aa8fSDaniele Castagna };
10751c21aa8fSDaniele Castagna 
10760a63bfd0SMark Yao static const struct vop_data rk3399_vop_lit = {
1077eb5cb6aaSMark yao 	.version = VOP_VERSION(3, 6),
1078eb5cb6aaSMark yao 	.intr = &rk3366_vop_intr,
10793ba000d6SHugh Cole-Baker 	.common = &rk3399_common,
10809a61c54bSMark yao 	.modeset = &rk3288_modeset,
10819a61c54bSMark yao 	.output = &rk3399_output,
1082eb5cb6aaSMark yao 	.misc = &rk3368_misc,
10830a63bfd0SMark Yao 	.win = rk3399_vop_lit_win_data,
10840a63bfd0SMark Yao 	.win_size = ARRAY_SIZE(rk3399_vop_lit_win_data),
10851c21aa8fSDaniele Castagna 	.win_yuv2yuv = rk3399_vop_lit_win_yuv2yuv_data,
10863ba000d6SHugh Cole-Baker 	.lut_size = 256,
10878e140cb6SSascha Hauer 	.max_output = { 2560, 1600 },
1088f7673453SMark Yao };
1089f7673453SMark Yao 
1090eb5cb6aaSMark yao static const struct vop_win_data rk3228_vop_win_data[] = {
1091eb5cb6aaSMark yao 	{ .base = 0x00, .phy = &rk3288_win01_data,
1092eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_PRIMARY },
1093eb5cb6aaSMark yao 	{ .base = 0x40, .phy = &rk3288_win01_data,
1094eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_CURSOR },
1095eb5cb6aaSMark yao };
1096eb5cb6aaSMark yao 
1097eb5cb6aaSMark yao static const struct vop_data rk3228_vop = {
1098eb5cb6aaSMark yao 	.version = VOP_VERSION(3, 7),
1099eb5cb6aaSMark yao 	.feature = VOP_FEATURE_OUTPUT_RGB10,
1100eb5cb6aaSMark yao 	.intr = &rk3366_vop_intr,
1101eb5cb6aaSMark yao 	.common = &rk3288_common,
1102eb5cb6aaSMark yao 	.modeset = &rk3288_modeset,
1103eb5cb6aaSMark yao 	.output = &rk3399_output,
1104eb5cb6aaSMark yao 	.misc = &rk3368_misc,
1105eb5cb6aaSMark yao 	.win = rk3228_vop_win_data,
1106eb5cb6aaSMark yao 	.win_size = ARRAY_SIZE(rk3228_vop_win_data),
11078e140cb6SSascha Hauer 	.max_output = { 4096, 2160 },
1108eb5cb6aaSMark yao };
1109eb5cb6aaSMark yao 
1110eb5cb6aaSMark yao static const struct vop_modeset rk3328_modeset = {
1111eb5cb6aaSMark yao 	.htotal_pw = VOP_REG(RK3328_DSP_HTOTAL_HS_END, 0x1fff1fff, 0),
1112eb5cb6aaSMark yao 	.hact_st_end = VOP_REG(RK3328_DSP_HACT_ST_END, 0x1fff1fff, 0),
1113eb5cb6aaSMark yao 	.vtotal_pw = VOP_REG(RK3328_DSP_VTOTAL_VS_END, 0x1fff1fff, 0),
1114eb5cb6aaSMark yao 	.vact_st_end = VOP_REG(RK3328_DSP_VACT_ST_END, 0x1fff1fff, 0),
1115eb5cb6aaSMark yao 	.hpost_st_end = VOP_REG(RK3328_POST_DSP_HACT_INFO, 0x1fff1fff, 0),
1116eb5cb6aaSMark yao 	.vpost_st_end = VOP_REG(RK3328_POST_DSP_VACT_INFO, 0x1fff1fff, 0),
1117eb5cb6aaSMark yao };
1118eb5cb6aaSMark yao 
1119eb5cb6aaSMark yao static const struct vop_output rk3328_output = {
11201f6c62caSNickey Yang 	.rgb_dclk_pol = VOP_REG(RK3328_DSP_CTRL1, 0x1, 19),
11211f6c62caSNickey Yang 	.hdmi_dclk_pol = VOP_REG(RK3328_DSP_CTRL1, 0x1, 23),
11221f6c62caSNickey Yang 	.edp_dclk_pol = VOP_REG(RK3328_DSP_CTRL1, 0x1, 27),
11231f6c62caSNickey Yang 	.mipi_dclk_pol = VOP_REG(RK3328_DSP_CTRL1, 0x1, 31),
1124eb5cb6aaSMark yao 	.rgb_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 12),
1125eb5cb6aaSMark yao 	.hdmi_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 13),
1126eb5cb6aaSMark yao 	.edp_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 14),
1127eb5cb6aaSMark yao 	.mipi_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 15),
11281f6c62caSNickey Yang 	.rgb_pin_pol = VOP_REG(RK3328_DSP_CTRL1, 0x7, 16),
11291f6c62caSNickey Yang 	.hdmi_pin_pol = VOP_REG(RK3328_DSP_CTRL1, 0x7, 20),
11301f6c62caSNickey Yang 	.edp_pin_pol = VOP_REG(RK3328_DSP_CTRL1, 0x7, 24),
11311f6c62caSNickey Yang 	.mipi_pin_pol = VOP_REG(RK3328_DSP_CTRL1, 0x7, 28),
1132eb5cb6aaSMark yao };
1133eb5cb6aaSMark yao 
1134eb5cb6aaSMark yao static const struct vop_misc rk3328_misc = {
1135eb5cb6aaSMark yao 	.global_regdone_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 11),
1136eb5cb6aaSMark yao };
1137eb5cb6aaSMark yao 
1138eb5cb6aaSMark yao static const struct vop_common rk3328_common = {
1139eb5cb6aaSMark yao 	.standby = VOP_REG_SYNC(RK3328_SYS_CTRL, 0x1, 22),
1140a5c0fa44SUrja Rannikko 	.dither_down_sel = VOP_REG(RK3328_DSP_CTRL1, 0x1, 4),
1141a5c0fa44SUrja Rannikko 	.dither_down_mode = VOP_REG(RK3328_DSP_CTRL1, 0x1, 3),
1142a5c0fa44SUrja Rannikko 	.dither_down_en = VOP_REG(RK3328_DSP_CTRL1, 0x1, 2),
1143a5c0fa44SUrja Rannikko 	.pre_dither_down = VOP_REG(RK3328_DSP_CTRL1, 0x1, 1),
1144eb5cb6aaSMark yao 	.dither_up = VOP_REG(RK3328_DSP_CTRL1, 0x1, 6),
1145eb5cb6aaSMark yao 	.dsp_blank = VOP_REG(RK3328_DSP_CTRL0, 0x3, 18),
1146eb5cb6aaSMark yao 	.out_mode = VOP_REG(RK3328_DSP_CTRL0, 0xf, 0),
1147eb5cb6aaSMark yao 	.cfg_done = VOP_REG_SYNC(RK3328_REG_CFG_DONE, 0x1, 0),
1148eb5cb6aaSMark yao };
1149eb5cb6aaSMark yao 
1150eb5cb6aaSMark yao static const struct vop_intr rk3328_vop_intr = {
1151eb5cb6aaSMark yao 	.intrs = rk3368_vop_intrs,
1152eb5cb6aaSMark yao 	.nintrs = ARRAY_SIZE(rk3368_vop_intrs),
1153eb5cb6aaSMark yao 	.line_flag_num[0] = VOP_REG(RK3328_LINE_FLAG, 0xffff, 0),
1154eb5cb6aaSMark yao 	.line_flag_num[1] = VOP_REG(RK3328_LINE_FLAG, 0xffff, 16),
1155eb5cb6aaSMark yao 	.status = VOP_REG_MASK_SYNC(RK3328_INTR_STATUS0, 0xffff, 0),
1156eb5cb6aaSMark yao 	.enable = VOP_REG_MASK_SYNC(RK3328_INTR_EN0, 0xffff, 0),
1157eb5cb6aaSMark yao 	.clear = VOP_REG_MASK_SYNC(RK3328_INTR_CLEAR0, 0xffff, 0),
1158eb5cb6aaSMark yao };
1159eb5cb6aaSMark yao 
1160eb5cb6aaSMark yao static const struct vop_win_data rk3328_vop_win_data[] = {
1161d4b38422SJonas Karlman 	{ .base = 0xd0, .phy = &rk3399_win1_data,
1162eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_PRIMARY },
1163d4b38422SJonas Karlman 	{ .base = 0x1d0, .phy = &rk3399_win1_data,
1164eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_OVERLAY },
1165d4b38422SJonas Karlman 	{ .base = 0x2d0, .phy = &rk3399_win1_data,
1166eb5cb6aaSMark yao 	  .type = DRM_PLANE_TYPE_CURSOR },
1167eb5cb6aaSMark yao };
1168eb5cb6aaSMark yao 
1169eb5cb6aaSMark yao static const struct vop_data rk3328_vop = {
1170eb5cb6aaSMark yao 	.version = VOP_VERSION(3, 8),
1171eb5cb6aaSMark yao 	.feature = VOP_FEATURE_OUTPUT_RGB10,
1172eb5cb6aaSMark yao 	.intr = &rk3328_vop_intr,
1173eb5cb6aaSMark yao 	.common = &rk3328_common,
1174eb5cb6aaSMark yao 	.modeset = &rk3328_modeset,
1175eb5cb6aaSMark yao 	.output = &rk3328_output,
1176eb5cb6aaSMark yao 	.misc = &rk3328_misc,
1177eb5cb6aaSMark yao 	.win = rk3328_vop_win_data,
1178eb5cb6aaSMark yao 	.win_size = ARRAY_SIZE(rk3328_vop_win_data),
11798e140cb6SSascha Hauer 	.max_output = { 4096, 2160 },
1180eb5cb6aaSMark yao };
1181eb5cb6aaSMark yao 
11823c3cfcb9SJagan Teki static const struct vop_common rv1126_common = {
11833c3cfcb9SJagan Teki 	.standby = VOP_REG_SYNC(PX30_SYS_CTRL2, 0x1, 1),
11843c3cfcb9SJagan Teki 	.out_mode = VOP_REG(PX30_DSP_CTRL2, 0xf, 16),
11853c3cfcb9SJagan Teki 	.dsp_blank = VOP_REG(PX30_DSP_CTRL2, 0x1, 14),
11863c3cfcb9SJagan Teki 	.dither_down_en = VOP_REG(PX30_DSP_CTRL2, 0x1, 8),
11873c3cfcb9SJagan Teki 	.dither_down_sel = VOP_REG(PX30_DSP_CTRL2, 0x1, 7),
11883c3cfcb9SJagan Teki 	.dither_down_mode = VOP_REG(PX30_DSP_CTRL2, 0x1, 6),
11893c3cfcb9SJagan Teki 	.cfg_done = VOP_REG_SYNC(PX30_REG_CFG_DONE, 0x1, 0),
11903c3cfcb9SJagan Teki 	.dither_up = VOP_REG(PX30_DSP_CTRL2, 0x1, 2),
11913c3cfcb9SJagan Teki 	.dsp_lut_en = VOP_REG(PX30_DSP_CTRL2, 0x1, 5),
11923c3cfcb9SJagan Teki 	.gate_en = VOP_REG(PX30_DSP_CTRL2, 0x1, 0),
11933c3cfcb9SJagan Teki };
11943c3cfcb9SJagan Teki 
11953c3cfcb9SJagan Teki static const struct vop_modeset rv1126_modeset = {
11963c3cfcb9SJagan Teki 	.htotal_pw = VOP_REG(PX30_DSP_HTOTAL_HS_END, 0x0fff0fff, 0),
11973c3cfcb9SJagan Teki 	.hact_st_end = VOP_REG(PX30_DSP_HACT_ST_END, 0x0fff0fff, 0),
11983c3cfcb9SJagan Teki 	.vtotal_pw = VOP_REG(PX30_DSP_VTOTAL_VS_END, 0x0fff0fff, 0),
11993c3cfcb9SJagan Teki 	.vact_st_end = VOP_REG(PX30_DSP_VACT_ST_END, 0x0fff0fff, 0),
12003c3cfcb9SJagan Teki };
12013c3cfcb9SJagan Teki 
12023c3cfcb9SJagan Teki static const struct vop_output rv1126_output = {
12033c3cfcb9SJagan Teki 	.rgb_dclk_pol = VOP_REG(PX30_DSP_CTRL0, 0x1, 1),
12043c3cfcb9SJagan Teki 	.rgb_pin_pol = VOP_REG(PX30_DSP_CTRL0, 0x7, 2),
12053c3cfcb9SJagan Teki 	.rgb_en = VOP_REG(PX30_DSP_CTRL0, 0x1, 0),
12063c3cfcb9SJagan Teki 	.mipi_dclk_pol = VOP_REG(PX30_DSP_CTRL0, 0x1, 25),
12073c3cfcb9SJagan Teki 	.mipi_pin_pol = VOP_REG(PX30_DSP_CTRL0, 0x7, 26),
12083c3cfcb9SJagan Teki 	.mipi_en = VOP_REG(PX30_DSP_CTRL0, 0x1, 24),
12093c3cfcb9SJagan Teki };
12103c3cfcb9SJagan Teki 
12113c3cfcb9SJagan Teki static const struct vop_misc rv1126_misc = {
12123c3cfcb9SJagan Teki 	.global_regdone_en = VOP_REG(PX30_SYS_CTRL2, 0x1, 13),
12133c3cfcb9SJagan Teki };
12143c3cfcb9SJagan Teki 
12153c3cfcb9SJagan Teki static const struct vop_win_data rv1126_vop_win_data[] = {
12163c3cfcb9SJagan Teki 	{ .base = 0x00, .phy = &px30_win0_data,
12173c3cfcb9SJagan Teki 	  .type = DRM_PLANE_TYPE_OVERLAY },
12183c3cfcb9SJagan Teki 	{ .base = 0x00, .phy = &px30_win2_data,
12193c3cfcb9SJagan Teki 	  .type = DRM_PLANE_TYPE_PRIMARY },
12203c3cfcb9SJagan Teki };
12213c3cfcb9SJagan Teki 
12223c3cfcb9SJagan Teki static const struct vop_data rv1126_vop = {
12233c3cfcb9SJagan Teki 	.version = VOP_VERSION(2, 0xb),
12243c3cfcb9SJagan Teki 	.intr = &px30_intr,
12253c3cfcb9SJagan Teki 	.common = &rv1126_common,
12263c3cfcb9SJagan Teki 	.modeset = &rv1126_modeset,
12273c3cfcb9SJagan Teki 	.output = &rv1126_output,
12283c3cfcb9SJagan Teki 	.misc = &rv1126_misc,
12293c3cfcb9SJagan Teki 	.win = rv1126_vop_win_data,
12303c3cfcb9SJagan Teki 	.win_size = ARRAY_SIZE(rv1126_vop_win_data),
12313c3cfcb9SJagan Teki 	.max_output = { 1920, 1080 },
12323c3cfcb9SJagan Teki 	.lut_size = 1024,
12333c3cfcb9SJagan Teki };
12343c3cfcb9SJagan Teki 
1235a67719d1SMark Yao static const struct of_device_id vop_driver_dt_match[] = {
1236f7673453SMark Yao 	{ .compatible = "rockchip,rk3036-vop",
1237f7673453SMark Yao 	  .data = &rk3036_vop },
1238460c3b00SSandy Huang 	{ .compatible = "rockchip,rk3126-vop",
1239460c3b00SSandy Huang 	  .data = &rk3126_vop },
1240570913e0SSandy Huang 	{ .compatible = "rockchip,px30-vop-big",
1241570913e0SSandy Huang 	  .data = &px30_vop_big },
1242570913e0SSandy Huang 	{ .compatible = "rockchip,px30-vop-lit",
1243570913e0SSandy Huang 	  .data = &px30_vop_lit },
1244f4a6de85SMark Yao 	{ .compatible = "rockchip,rk3066-vop",
1245f4a6de85SMark Yao 	  .data = &rk3066_vop },
1246428e15ccSHeiko Stuebner 	{ .compatible = "rockchip,rk3188-vop",
1247428e15ccSHeiko Stuebner 	  .data = &rk3188_vop },
1248b51502adSMark Yao 	{ .compatible = "rockchip,rk3288-vop",
1249b51502adSMark Yao 	  .data = &rk3288_vop },
1250eb5cb6aaSMark yao 	{ .compatible = "rockchip,rk3368-vop",
1251eb5cb6aaSMark yao 	  .data = &rk3368_vop },
1252eb5cb6aaSMark yao 	{ .compatible = "rockchip,rk3366-vop",
1253eb5cb6aaSMark yao 	  .data = &rk3366_vop },
12540a63bfd0SMark Yao 	{ .compatible = "rockchip,rk3399-vop-big",
12550a63bfd0SMark Yao 	  .data = &rk3399_vop_big },
12560a63bfd0SMark Yao 	{ .compatible = "rockchip,rk3399-vop-lit",
12570a63bfd0SMark Yao 	  .data = &rk3399_vop_lit },
1258eb5cb6aaSMark yao 	{ .compatible = "rockchip,rk3228-vop",
1259eb5cb6aaSMark yao 	  .data = &rk3228_vop },
1260eb5cb6aaSMark yao 	{ .compatible = "rockchip,rk3328-vop",
1261eb5cb6aaSMark yao 	  .data = &rk3328_vop },
12623c3cfcb9SJagan Teki 	{ .compatible = "rockchip,rv1126-vop",
12633c3cfcb9SJagan Teki 	  .data = &rv1126_vop },
1264a67719d1SMark Yao 	{},
1265a67719d1SMark Yao };
1266a67719d1SMark Yao MODULE_DEVICE_TABLE(of, vop_driver_dt_match);
1267a67719d1SMark Yao 
1268a67719d1SMark Yao static int vop_probe(struct platform_device *pdev)
1269a67719d1SMark Yao {
1270a67719d1SMark Yao 	struct device *dev = &pdev->dev;
1271a67719d1SMark Yao 
1272a67719d1SMark Yao 	if (!dev->of_node) {
1273d8dd6804SHaneen Mohammed 		DRM_DEV_ERROR(dev, "can't find vop devices\n");
1274a67719d1SMark Yao 		return -ENODEV;
1275a67719d1SMark Yao 	}
1276a67719d1SMark Yao 
1277a67719d1SMark Yao 	return component_add(dev, &vop_component_ops);
1278a67719d1SMark Yao }
1279a67719d1SMark Yao 
12803c855610SUwe Kleine-König static void vop_remove(struct platform_device *pdev)
1281a67719d1SMark Yao {
1282a67719d1SMark Yao 	component_del(&pdev->dev, &vop_component_ops);
1283a67719d1SMark Yao }
1284a67719d1SMark Yao 
12858820b68bSJeffy Chen struct platform_driver vop_platform_driver = {
1286a67719d1SMark Yao 	.probe = vop_probe,
12873c855610SUwe Kleine-König 	.remove_new = vop_remove,
1288a67719d1SMark Yao 	.driver = {
1289a67719d1SMark Yao 		.name = "rockchip-vop",
129087185cc8SSouptick Joarder 		.of_match_table = vop_driver_dt_match,
1291a67719d1SMark Yao 	},
1292a67719d1SMark Yao };
1293