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