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 80*53c2710cSAlex Bee static const struct vop_scl_regs rk3036_win0_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 87*53c2710cSAlex Bee static const struct vop_scl_regs rk3036_win1_scl = { 88*53c2710cSAlex Bee .scale_yrgb_x = VOP_REG(RK3036_WIN1_SCL_FACTOR_YRGB, 0xffff, 0x0), 89*53c2710cSAlex Bee .scale_yrgb_y = VOP_REG(RK3036_WIN1_SCL_FACTOR_YRGB, 0xffff, 16), 90*53c2710cSAlex Bee }; 91*53c2710cSAlex Bee 92b51502adSMark Yao static const struct vop_win_phy rk3036_win0_data = { 93*53c2710cSAlex Bee .scl = &rk3036_win0_scl, 94b51502adSMark Yao .data_formats = formats_win_full, 95b51502adSMark Yao .nformats = ARRAY_SIZE(formats_win_full), 967707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_full, 97b51502adSMark Yao .enable = VOP_REG(RK3036_SYS_CTRL, 0x1, 0), 98b51502adSMark Yao .format = VOP_REG(RK3036_SYS_CTRL, 0x7, 3), 99b51502adSMark Yao .rb_swap = VOP_REG(RK3036_SYS_CTRL, 0x1, 15), 100b51502adSMark Yao .act_info = VOP_REG(RK3036_WIN0_ACT_INFO, 0x1fff1fff, 0), 101b51502adSMark Yao .dsp_info = VOP_REG(RK3036_WIN0_DSP_INFO, 0x0fff0fff, 0), 102b51502adSMark Yao .dsp_st = VOP_REG(RK3036_WIN0_DSP_ST, 0x1fff1fff, 0), 103b51502adSMark Yao .yrgb_mst = VOP_REG(RK3036_WIN0_YRGB_MST, 0xffffffff, 0), 104b51502adSMark Yao .uv_mst = VOP_REG(RK3036_WIN0_CBR_MST, 0xffffffff, 0), 105b51502adSMark Yao .yrgb_vir = VOP_REG(RK3036_WIN0_VIR, 0xffff, 0), 106b51502adSMark Yao .uv_vir = VOP_REG(RK3036_WIN0_VIR, 0x1fff, 16), 107b51502adSMark Yao }; 108b51502adSMark Yao 109b51502adSMark Yao static const struct vop_win_phy rk3036_win1_data = { 110*53c2710cSAlex Bee .scl = &rk3036_win1_scl, 111b51502adSMark Yao .data_formats = formats_win_lite, 112b51502adSMark Yao .nformats = ARRAY_SIZE(formats_win_lite), 1137707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_lite, 114b51502adSMark Yao .enable = VOP_REG(RK3036_SYS_CTRL, 0x1, 1), 115b51502adSMark Yao .format = VOP_REG(RK3036_SYS_CTRL, 0x7, 6), 116b51502adSMark Yao .rb_swap = VOP_REG(RK3036_SYS_CTRL, 0x1, 19), 117b51502adSMark Yao .act_info = VOP_REG(RK3036_WIN1_ACT_INFO, 0x1fff1fff, 0), 118b51502adSMark Yao .dsp_info = VOP_REG(RK3036_WIN1_DSP_INFO, 0x0fff0fff, 0), 119b51502adSMark Yao .dsp_st = VOP_REG(RK3036_WIN1_DSP_ST, 0x1fff1fff, 0), 120b51502adSMark Yao .yrgb_mst = VOP_REG(RK3036_WIN1_MST, 0xffffffff, 0), 121b51502adSMark Yao .yrgb_vir = VOP_REG(RK3036_WIN1_VIR, 0xffff, 0), 122b51502adSMark Yao }; 123b51502adSMark Yao 124b51502adSMark Yao static const struct vop_win_data rk3036_vop_win_data[] = { 125b51502adSMark Yao { .base = 0x00, .phy = &rk3036_win0_data, 126b51502adSMark Yao .type = DRM_PLANE_TYPE_PRIMARY }, 127b51502adSMark Yao { .base = 0x00, .phy = &rk3036_win1_data, 128b51502adSMark Yao .type = DRM_PLANE_TYPE_CURSOR }, 129b51502adSMark Yao }; 130b51502adSMark Yao 131b51502adSMark Yao static const int rk3036_vop_intrs[] = { 132b51502adSMark Yao DSP_HOLD_VALID_INTR, 133b51502adSMark Yao FS_INTR, 134b51502adSMark Yao LINE_FLAG_INTR, 135b51502adSMark Yao BUS_ERROR_INTR, 136b51502adSMark Yao }; 137b51502adSMark Yao 138b51502adSMark Yao static const struct vop_intr rk3036_intr = { 139b51502adSMark Yao .intrs = rk3036_vop_intrs, 140b51502adSMark Yao .nintrs = ARRAY_SIZE(rk3036_vop_intrs), 141ac6560dfSMark yao .line_flag_num[0] = VOP_REG(RK3036_INT_STATUS, 0xfff, 12), 1429a61c54bSMark yao .status = VOP_REG_SYNC(RK3036_INT_STATUS, 0xf, 0), 1439a61c54bSMark yao .enable = VOP_REG_SYNC(RK3036_INT_STATUS, 0xf, 4), 1449a61c54bSMark yao .clear = VOP_REG_SYNC(RK3036_INT_STATUS, 0xf, 8), 145b51502adSMark Yao }; 146b51502adSMark Yao 1479a61c54bSMark yao static const struct vop_modeset rk3036_modeset = { 148b51502adSMark Yao .htotal_pw = VOP_REG(RK3036_DSP_HTOTAL_HS_END, 0x1fff1fff, 0), 149b51502adSMark Yao .hact_st_end = VOP_REG(RK3036_DSP_HACT_ST_END, 0x1fff1fff, 0), 150b51502adSMark Yao .vtotal_pw = VOP_REG(RK3036_DSP_VTOTAL_VS_END, 0x1fff1fff, 0), 151b51502adSMark Yao .vact_st_end = VOP_REG(RK3036_DSP_VACT_ST_END, 0x1fff1fff, 0), 1529a61c54bSMark yao }; 1539a61c54bSMark yao 1549a61c54bSMark yao static const struct vop_output rk3036_output = { 1559a61c54bSMark yao .pin_pol = VOP_REG(RK3036_DSP_CTRL0, 0xf, 4), 1569a61c54bSMark yao }; 1579a61c54bSMark yao 1589a61c54bSMark yao static const struct vop_common rk3036_common = { 1599a61c54bSMark yao .standby = VOP_REG_SYNC(RK3036_SYS_CTRL, 0x1, 30), 1609a61c54bSMark yao .out_mode = VOP_REG(RK3036_DSP_CTRL0, 0xf, 0), 1619a61c54bSMark yao .dsp_blank = VOP_REG(RK3036_DSP_CTRL1, 0x1, 24), 162a5c0fa44SUrja Rannikko .dither_down_sel = VOP_REG(RK3036_DSP_CTRL0, 0x1, 27), 163a5c0fa44SUrja Rannikko .dither_down_en = VOP_REG(RK3036_DSP_CTRL0, 0x1, 11), 164a5c0fa44SUrja Rannikko .dither_down_mode = VOP_REG(RK3036_DSP_CTRL0, 0x1, 10), 1659548e1b4SMark yao .cfg_done = VOP_REG_SYNC(RK3036_REG_CFG_DONE, 0x1, 0), 166b51502adSMark Yao }; 167b51502adSMark Yao 168b51502adSMark Yao static const struct vop_data rk3036_vop = { 169b51502adSMark Yao .intr = &rk3036_intr, 1709a61c54bSMark yao .common = &rk3036_common, 1719a61c54bSMark yao .modeset = &rk3036_modeset, 1729a61c54bSMark yao .output = &rk3036_output, 173b51502adSMark Yao .win = rk3036_vop_win_data, 174b51502adSMark Yao .win_size = ARRAY_SIZE(rk3036_vop_win_data), 175b51502adSMark Yao }; 176b51502adSMark Yao 177460c3b00SSandy Huang static const struct vop_win_phy rk3126_win1_data = { 178460c3b00SSandy Huang .data_formats = formats_win_lite, 179460c3b00SSandy Huang .nformats = ARRAY_SIZE(formats_win_lite), 1807707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_lite, 181460c3b00SSandy Huang .enable = VOP_REG(RK3036_SYS_CTRL, 0x1, 1), 182460c3b00SSandy Huang .format = VOP_REG(RK3036_SYS_CTRL, 0x7, 6), 183460c3b00SSandy Huang .rb_swap = VOP_REG(RK3036_SYS_CTRL, 0x1, 19), 184460c3b00SSandy Huang .dsp_info = VOP_REG(RK3126_WIN1_DSP_INFO, 0x0fff0fff, 0), 185460c3b00SSandy Huang .dsp_st = VOP_REG(RK3126_WIN1_DSP_ST, 0x1fff1fff, 0), 186460c3b00SSandy Huang .yrgb_mst = VOP_REG(RK3126_WIN1_MST, 0xffffffff, 0), 187460c3b00SSandy Huang .yrgb_vir = VOP_REG(RK3036_WIN1_VIR, 0xffff, 0), 188460c3b00SSandy Huang }; 189460c3b00SSandy Huang 190460c3b00SSandy Huang static const struct vop_win_data rk3126_vop_win_data[] = { 191460c3b00SSandy Huang { .base = 0x00, .phy = &rk3036_win0_data, 192460c3b00SSandy Huang .type = DRM_PLANE_TYPE_PRIMARY }, 193460c3b00SSandy Huang { .base = 0x00, .phy = &rk3126_win1_data, 194460c3b00SSandy Huang .type = DRM_PLANE_TYPE_CURSOR }, 195460c3b00SSandy Huang }; 196460c3b00SSandy Huang 197460c3b00SSandy Huang static const struct vop_data rk3126_vop = { 198460c3b00SSandy Huang .intr = &rk3036_intr, 199460c3b00SSandy Huang .common = &rk3036_common, 200460c3b00SSandy Huang .modeset = &rk3036_modeset, 201460c3b00SSandy Huang .output = &rk3036_output, 202460c3b00SSandy Huang .win = rk3126_vop_win_data, 203460c3b00SSandy Huang .win_size = ARRAY_SIZE(rk3126_vop_win_data), 204460c3b00SSandy Huang }; 205460c3b00SSandy Huang 206570913e0SSandy Huang static const int px30_vop_intrs[] = { 207570913e0SSandy Huang FS_INTR, 208570913e0SSandy Huang 0, 0, 209570913e0SSandy Huang LINE_FLAG_INTR, 210570913e0SSandy Huang 0, 211570913e0SSandy Huang BUS_ERROR_INTR, 212570913e0SSandy Huang 0, 0, 213570913e0SSandy Huang DSP_HOLD_VALID_INTR, 214570913e0SSandy Huang }; 215570913e0SSandy Huang 216570913e0SSandy Huang static const struct vop_intr px30_intr = { 217570913e0SSandy Huang .intrs = px30_vop_intrs, 218570913e0SSandy Huang .nintrs = ARRAY_SIZE(px30_vop_intrs), 219a6edf839SSandy Huang .line_flag_num[0] = VOP_REG(PX30_LINE_FLAG, 0xfff, 0), 220a6edf839SSandy Huang .status = VOP_REG_MASK_SYNC(PX30_INTR_STATUS, 0xffff, 0), 221a6edf839SSandy Huang .enable = VOP_REG_MASK_SYNC(PX30_INTR_EN, 0xffff, 0), 222a6edf839SSandy Huang .clear = VOP_REG_MASK_SYNC(PX30_INTR_CLEAR, 0xffff, 0), 223570913e0SSandy Huang }; 224570913e0SSandy Huang 225570913e0SSandy Huang static const struct vop_common px30_common = { 226570913e0SSandy Huang .standby = VOP_REG_SYNC(PX30_SYS_CTRL2, 0x1, 1), 227570913e0SSandy Huang .out_mode = VOP_REG(PX30_DSP_CTRL2, 0xf, 16), 228570913e0SSandy Huang .dsp_blank = VOP_REG(PX30_DSP_CTRL2, 0x1, 14), 229a5c0fa44SUrja Rannikko .dither_down_en = VOP_REG(PX30_DSP_CTRL2, 0x1, 8), 230a5c0fa44SUrja Rannikko .dither_down_sel = VOP_REG(PX30_DSP_CTRL2, 0x1, 7), 231a5c0fa44SUrja Rannikko .dither_down_mode = VOP_REG(PX30_DSP_CTRL2, 0x1, 6), 232570913e0SSandy Huang .cfg_done = VOP_REG_SYNC(PX30_REG_CFG_DONE, 0x1, 0), 233570913e0SSandy Huang }; 234570913e0SSandy Huang 235570913e0SSandy Huang static const struct vop_modeset px30_modeset = { 236570913e0SSandy Huang .htotal_pw = VOP_REG(PX30_DSP_HTOTAL_HS_END, 0x0fff0fff, 0), 237570913e0SSandy Huang .hact_st_end = VOP_REG(PX30_DSP_HACT_ST_END, 0x0fff0fff, 0), 238570913e0SSandy Huang .vtotal_pw = VOP_REG(PX30_DSP_VTOTAL_VS_END, 0x0fff0fff, 0), 239570913e0SSandy Huang .vact_st_end = VOP_REG(PX30_DSP_VACT_ST_END, 0x0fff0fff, 0), 240570913e0SSandy Huang }; 241570913e0SSandy Huang 242570913e0SSandy Huang static const struct vop_output px30_output = { 2431f6c62caSNickey Yang .rgb_dclk_pol = VOP_REG(PX30_DSP_CTRL0, 0x1, 1), 2441f6c62caSNickey Yang .rgb_pin_pol = VOP_REG(PX30_DSP_CTRL0, 0x7, 2), 245570913e0SSandy Huang .rgb_en = VOP_REG(PX30_DSP_CTRL0, 0x1, 0), 2461f6c62caSNickey Yang .mipi_dclk_pol = VOP_REG(PX30_DSP_CTRL0, 0x1, 25), 2471f6c62caSNickey Yang .mipi_pin_pol = VOP_REG(PX30_DSP_CTRL0, 0x7, 26), 248570913e0SSandy Huang .mipi_en = VOP_REG(PX30_DSP_CTRL0, 0x1, 24), 249570913e0SSandy Huang }; 250570913e0SSandy Huang 251570913e0SSandy Huang static const struct vop_scl_regs px30_win_scl = { 252570913e0SSandy Huang .scale_yrgb_x = VOP_REG(PX30_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0), 253570913e0SSandy Huang .scale_yrgb_y = VOP_REG(PX30_WIN0_SCL_FACTOR_YRGB, 0xffff, 16), 254570913e0SSandy Huang .scale_cbcr_x = VOP_REG(PX30_WIN0_SCL_FACTOR_CBR, 0xffff, 0x0), 255570913e0SSandy Huang .scale_cbcr_y = VOP_REG(PX30_WIN0_SCL_FACTOR_CBR, 0xffff, 16), 256570913e0SSandy Huang }; 257570913e0SSandy Huang 258570913e0SSandy Huang static const struct vop_win_phy px30_win0_data = { 259570913e0SSandy Huang .scl = &px30_win_scl, 260570913e0SSandy Huang .data_formats = formats_win_full, 261570913e0SSandy Huang .nformats = ARRAY_SIZE(formats_win_full), 2627707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_full, 263570913e0SSandy Huang .enable = VOP_REG(PX30_WIN0_CTRL0, 0x1, 0), 264570913e0SSandy Huang .format = VOP_REG(PX30_WIN0_CTRL0, 0x7, 1), 265570913e0SSandy Huang .rb_swap = VOP_REG(PX30_WIN0_CTRL0, 0x1, 12), 266570913e0SSandy Huang .act_info = VOP_REG(PX30_WIN0_ACT_INFO, 0xffffffff, 0), 267570913e0SSandy Huang .dsp_info = VOP_REG(PX30_WIN0_DSP_INFO, 0xffffffff, 0), 268570913e0SSandy Huang .dsp_st = VOP_REG(PX30_WIN0_DSP_ST, 0xffffffff, 0), 269570913e0SSandy Huang .yrgb_mst = VOP_REG(PX30_WIN0_YRGB_MST0, 0xffffffff, 0), 270570913e0SSandy Huang .uv_mst = VOP_REG(PX30_WIN0_CBR_MST0, 0xffffffff, 0), 271570913e0SSandy Huang .yrgb_vir = VOP_REG(PX30_WIN0_VIR, 0x1fff, 0), 272570913e0SSandy Huang .uv_vir = VOP_REG(PX30_WIN0_VIR, 0x1fff, 16), 2732aae8ed1SPaul Kocialkowski .alpha_pre_mul = VOP_REG(PX30_WIN0_ALPHA_CTRL, 0x1, 2), 2742aae8ed1SPaul Kocialkowski .alpha_mode = VOP_REG(PX30_WIN0_ALPHA_CTRL, 0x1, 1), 2752aae8ed1SPaul Kocialkowski .alpha_en = VOP_REG(PX30_WIN0_ALPHA_CTRL, 0x1, 0), 276570913e0SSandy Huang }; 277570913e0SSandy Huang 278570913e0SSandy Huang static const struct vop_win_phy px30_win1_data = { 279570913e0SSandy Huang .data_formats = formats_win_lite, 280570913e0SSandy Huang .nformats = ARRAY_SIZE(formats_win_lite), 2817707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_lite, 282570913e0SSandy Huang .enable = VOP_REG(PX30_WIN1_CTRL0, 0x1, 0), 283570913e0SSandy Huang .format = VOP_REG(PX30_WIN1_CTRL0, 0x7, 4), 284570913e0SSandy Huang .rb_swap = VOP_REG(PX30_WIN1_CTRL0, 0x1, 12), 285570913e0SSandy Huang .dsp_info = VOP_REG(PX30_WIN1_DSP_INFO, 0xffffffff, 0), 286570913e0SSandy Huang .dsp_st = VOP_REG(PX30_WIN1_DSP_ST, 0xffffffff, 0), 287570913e0SSandy Huang .yrgb_mst = VOP_REG(PX30_WIN1_MST, 0xffffffff, 0), 288570913e0SSandy Huang .yrgb_vir = VOP_REG(PX30_WIN1_VIR, 0x1fff, 0), 2892aae8ed1SPaul Kocialkowski .alpha_pre_mul = VOP_REG(PX30_WIN1_ALPHA_CTRL, 0x1, 2), 2902aae8ed1SPaul Kocialkowski .alpha_mode = VOP_REG(PX30_WIN1_ALPHA_CTRL, 0x1, 1), 2912aae8ed1SPaul Kocialkowski .alpha_en = VOP_REG(PX30_WIN1_ALPHA_CTRL, 0x1, 0), 292570913e0SSandy Huang }; 293570913e0SSandy Huang 294570913e0SSandy Huang static const struct vop_win_phy px30_win2_data = { 295570913e0SSandy Huang .data_formats = formats_win_lite, 296570913e0SSandy Huang .nformats = ARRAY_SIZE(formats_win_lite), 2977707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_lite, 298a6edf839SSandy Huang .gate = VOP_REG(PX30_WIN2_CTRL0, 0x1, 4), 299a6edf839SSandy Huang .enable = VOP_REG(PX30_WIN2_CTRL0, 0x1, 0), 300570913e0SSandy Huang .format = VOP_REG(PX30_WIN2_CTRL0, 0x3, 5), 301570913e0SSandy Huang .rb_swap = VOP_REG(PX30_WIN2_CTRL0, 0x1, 20), 302570913e0SSandy Huang .dsp_info = VOP_REG(PX30_WIN2_DSP_INFO0, 0x0fff0fff, 0), 303570913e0SSandy Huang .dsp_st = VOP_REG(PX30_WIN2_DSP_ST0, 0x1fff1fff, 0), 304570913e0SSandy Huang .yrgb_mst = VOP_REG(PX30_WIN2_MST0, 0xffffffff, 0), 305570913e0SSandy Huang .yrgb_vir = VOP_REG(PX30_WIN2_VIR0_1, 0x1fff, 0), 3062aae8ed1SPaul Kocialkowski .alpha_pre_mul = VOP_REG(PX30_WIN2_ALPHA_CTRL, 0x1, 2), 3072aae8ed1SPaul Kocialkowski .alpha_mode = VOP_REG(PX30_WIN2_ALPHA_CTRL, 0x1, 1), 3082aae8ed1SPaul Kocialkowski .alpha_en = VOP_REG(PX30_WIN2_ALPHA_CTRL, 0x1, 0), 309570913e0SSandy Huang }; 310570913e0SSandy Huang 311570913e0SSandy Huang static const struct vop_win_data px30_vop_big_win_data[] = { 312570913e0SSandy Huang { .base = 0x00, .phy = &px30_win0_data, 313570913e0SSandy Huang .type = DRM_PLANE_TYPE_PRIMARY }, 314570913e0SSandy Huang { .base = 0x00, .phy = &px30_win1_data, 315570913e0SSandy Huang .type = DRM_PLANE_TYPE_OVERLAY }, 316570913e0SSandy Huang { .base = 0x00, .phy = &px30_win2_data, 317570913e0SSandy Huang .type = DRM_PLANE_TYPE_CURSOR }, 318570913e0SSandy Huang }; 319570913e0SSandy Huang 320570913e0SSandy Huang static const struct vop_data px30_vop_big = { 321570913e0SSandy Huang .intr = &px30_intr, 3228d544233SSandy Huang .feature = VOP_FEATURE_INTERNAL_RGB, 323570913e0SSandy Huang .common = &px30_common, 324570913e0SSandy Huang .modeset = &px30_modeset, 325570913e0SSandy Huang .output = &px30_output, 326570913e0SSandy Huang .win = px30_vop_big_win_data, 327570913e0SSandy Huang .win_size = ARRAY_SIZE(px30_vop_big_win_data), 328570913e0SSandy Huang }; 329570913e0SSandy Huang 330570913e0SSandy Huang static const struct vop_win_data px30_vop_lit_win_data[] = { 331570913e0SSandy Huang { .base = 0x00, .phy = &px30_win1_data, 332570913e0SSandy Huang .type = DRM_PLANE_TYPE_PRIMARY }, 333570913e0SSandy Huang }; 334570913e0SSandy Huang 335570913e0SSandy Huang static const struct vop_data px30_vop_lit = { 336570913e0SSandy Huang .intr = &px30_intr, 3378d544233SSandy Huang .feature = VOP_FEATURE_INTERNAL_RGB, 338570913e0SSandy Huang .common = &px30_common, 339570913e0SSandy Huang .modeset = &px30_modeset, 340570913e0SSandy Huang .output = &px30_output, 341570913e0SSandy Huang .win = px30_vop_lit_win_data, 342570913e0SSandy Huang .win_size = ARRAY_SIZE(px30_vop_lit_win_data), 343570913e0SSandy Huang }; 344570913e0SSandy Huang 345f4a6de85SMark Yao static const struct vop_scl_regs rk3066_win_scl = { 346f4a6de85SMark Yao .scale_yrgb_x = VOP_REG(RK3066_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0), 347f4a6de85SMark Yao .scale_yrgb_y = VOP_REG(RK3066_WIN0_SCL_FACTOR_YRGB, 0xffff, 16), 348f4a6de85SMark Yao .scale_cbcr_x = VOP_REG(RK3066_WIN0_SCL_FACTOR_CBR, 0xffff, 0x0), 349f4a6de85SMark Yao .scale_cbcr_y = VOP_REG(RK3066_WIN0_SCL_FACTOR_CBR, 0xffff, 16), 350f4a6de85SMark Yao }; 351f4a6de85SMark Yao 352f4a6de85SMark Yao static const struct vop_win_phy rk3066_win0_data = { 353f4a6de85SMark Yao .scl = &rk3066_win_scl, 354f4a6de85SMark Yao .data_formats = formats_win_full, 355f4a6de85SMark Yao .nformats = ARRAY_SIZE(formats_win_full), 3567707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_full, 357f4a6de85SMark Yao .enable = VOP_REG(RK3066_SYS_CTRL1, 0x1, 0), 358f4a6de85SMark Yao .format = VOP_REG(RK3066_SYS_CTRL0, 0x7, 4), 359f4a6de85SMark Yao .rb_swap = VOP_REG(RK3066_SYS_CTRL0, 0x1, 19), 360f4a6de85SMark Yao .act_info = VOP_REG(RK3066_WIN0_ACT_INFO, 0x1fff1fff, 0), 361f4a6de85SMark Yao .dsp_info = VOP_REG(RK3066_WIN0_DSP_INFO, 0x0fff0fff, 0), 362f4a6de85SMark Yao .dsp_st = VOP_REG(RK3066_WIN0_DSP_ST, 0x1fff1fff, 0), 363f4a6de85SMark Yao .yrgb_mst = VOP_REG(RK3066_WIN0_YRGB_MST0, 0xffffffff, 0), 364f4a6de85SMark Yao .uv_mst = VOP_REG(RK3066_WIN0_CBR_MST0, 0xffffffff, 0), 365f4a6de85SMark Yao .yrgb_vir = VOP_REG(RK3066_WIN0_VIR, 0xffff, 0), 366f4a6de85SMark Yao .uv_vir = VOP_REG(RK3066_WIN0_VIR, 0x1fff, 16), 367f4a6de85SMark Yao }; 368f4a6de85SMark Yao 369f4a6de85SMark Yao static const struct vop_win_phy rk3066_win1_data = { 370f4a6de85SMark Yao .scl = &rk3066_win_scl, 371f4a6de85SMark Yao .data_formats = formats_win_full, 372f4a6de85SMark Yao .nformats = ARRAY_SIZE(formats_win_full), 3737707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_full, 374f4a6de85SMark Yao .enable = VOP_REG(RK3066_SYS_CTRL1, 0x1, 1), 375f4a6de85SMark Yao .format = VOP_REG(RK3066_SYS_CTRL0, 0x7, 7), 376f4a6de85SMark Yao .rb_swap = VOP_REG(RK3066_SYS_CTRL0, 0x1, 23), 377f4a6de85SMark Yao .act_info = VOP_REG(RK3066_WIN1_ACT_INFO, 0x1fff1fff, 0), 378f4a6de85SMark Yao .dsp_info = VOP_REG(RK3066_WIN1_DSP_INFO, 0x0fff0fff, 0), 379f4a6de85SMark Yao .dsp_st = VOP_REG(RK3066_WIN1_DSP_ST, 0x1fff1fff, 0), 380f4a6de85SMark Yao .yrgb_mst = VOP_REG(RK3066_WIN1_YRGB_MST, 0xffffffff, 0), 381f4a6de85SMark Yao .uv_mst = VOP_REG(RK3066_WIN1_CBR_MST, 0xffffffff, 0), 382f4a6de85SMark Yao .yrgb_vir = VOP_REG(RK3066_WIN1_VIR, 0xffff, 0), 383f4a6de85SMark Yao .uv_vir = VOP_REG(RK3066_WIN1_VIR, 0x1fff, 16), 384f4a6de85SMark Yao }; 385f4a6de85SMark Yao 386f4a6de85SMark Yao static const struct vop_win_phy rk3066_win2_data = { 387f4a6de85SMark Yao .data_formats = formats_win_lite, 388f4a6de85SMark Yao .nformats = ARRAY_SIZE(formats_win_lite), 3897707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_lite, 390f4a6de85SMark Yao .enable = VOP_REG(RK3066_SYS_CTRL1, 0x1, 2), 391f4a6de85SMark Yao .format = VOP_REG(RK3066_SYS_CTRL0, 0x7, 10), 392f4a6de85SMark Yao .rb_swap = VOP_REG(RK3066_SYS_CTRL0, 0x1, 27), 393f4a6de85SMark Yao .dsp_info = VOP_REG(RK3066_WIN2_DSP_INFO, 0x0fff0fff, 0), 394f4a6de85SMark Yao .dsp_st = VOP_REG(RK3066_WIN2_DSP_ST, 0x1fff1fff, 0), 395f4a6de85SMark Yao .yrgb_mst = VOP_REG(RK3066_WIN2_MST, 0xffffffff, 0), 396f4a6de85SMark Yao .yrgb_vir = VOP_REG(RK3066_WIN2_VIR, 0xffff, 0), 397f4a6de85SMark Yao }; 398f4a6de85SMark Yao 399f4a6de85SMark Yao static const struct vop_modeset rk3066_modeset = { 400f4a6de85SMark Yao .htotal_pw = VOP_REG(RK3066_DSP_HTOTAL_HS_END, 0x1fff1fff, 0), 401f4a6de85SMark Yao .hact_st_end = VOP_REG(RK3066_DSP_HACT_ST_END, 0x1fff1fff, 0), 402f4a6de85SMark Yao .vtotal_pw = VOP_REG(RK3066_DSP_VTOTAL_VS_END, 0x1fff1fff, 0), 403f4a6de85SMark Yao .vact_st_end = VOP_REG(RK3066_DSP_VACT_ST_END, 0x1fff1fff, 0), 404f4a6de85SMark Yao }; 405f4a6de85SMark Yao 406f4a6de85SMark Yao static const struct vop_output rk3066_output = { 407f4a6de85SMark Yao .pin_pol = VOP_REG(RK3066_DSP_CTRL0, 0x7, 4), 408f4a6de85SMark Yao }; 409f4a6de85SMark Yao 410f4a6de85SMark Yao static const struct vop_common rk3066_common = { 411f4a6de85SMark Yao .standby = VOP_REG(RK3066_SYS_CTRL0, 0x1, 1), 412f4a6de85SMark Yao .out_mode = VOP_REG(RK3066_DSP_CTRL0, 0xf, 0), 413f4a6de85SMark Yao .cfg_done = VOP_REG(RK3066_REG_CFG_DONE, 0x1, 0), 414a5c0fa44SUrja Rannikko .dither_down_en = VOP_REG(RK3066_DSP_CTRL0, 0x1, 11), 415a5c0fa44SUrja Rannikko .dither_down_mode = VOP_REG(RK3066_DSP_CTRL0, 0x1, 10), 416f4a6de85SMark Yao .dsp_blank = VOP_REG(RK3066_DSP_CTRL1, 0x1, 24), 417f4a6de85SMark Yao }; 418f4a6de85SMark Yao 419f4a6de85SMark Yao static const struct vop_win_data rk3066_vop_win_data[] = { 420f4a6de85SMark Yao { .base = 0x00, .phy = &rk3066_win0_data, 421f4a6de85SMark Yao .type = DRM_PLANE_TYPE_PRIMARY }, 422f4a6de85SMark Yao { .base = 0x00, .phy = &rk3066_win1_data, 423f4a6de85SMark Yao .type = DRM_PLANE_TYPE_OVERLAY }, 424f4a6de85SMark Yao { .base = 0x00, .phy = &rk3066_win2_data, 425f4a6de85SMark Yao .type = DRM_PLANE_TYPE_CURSOR }, 426f4a6de85SMark Yao }; 427f4a6de85SMark Yao 428f4a6de85SMark Yao static const int rk3066_vop_intrs[] = { 429f4a6de85SMark Yao /* 430f4a6de85SMark Yao * hs_start interrupt fires at frame-start, so serves 431f4a6de85SMark Yao * the same purpose as dsp_hold in the driver. 432f4a6de85SMark Yao */ 433f4a6de85SMark Yao DSP_HOLD_VALID_INTR, 434f4a6de85SMark Yao FS_INTR, 435f4a6de85SMark Yao LINE_FLAG_INTR, 436f4a6de85SMark Yao BUS_ERROR_INTR, 437f4a6de85SMark Yao }; 438f4a6de85SMark Yao 439f4a6de85SMark Yao static const struct vop_intr rk3066_intr = { 440f4a6de85SMark Yao .intrs = rk3066_vop_intrs, 441f4a6de85SMark Yao .nintrs = ARRAY_SIZE(rk3066_vop_intrs), 442f4a6de85SMark Yao .line_flag_num[0] = VOP_REG(RK3066_INT_STATUS, 0xfff, 12), 443f4a6de85SMark Yao .status = VOP_REG(RK3066_INT_STATUS, 0xf, 0), 444f4a6de85SMark Yao .enable = VOP_REG(RK3066_INT_STATUS, 0xf, 4), 445f4a6de85SMark Yao .clear = VOP_REG(RK3066_INT_STATUS, 0xf, 8), 446f4a6de85SMark Yao }; 447f4a6de85SMark Yao 448f4a6de85SMark Yao static const struct vop_data rk3066_vop = { 449f4a6de85SMark Yao .version = VOP_VERSION(2, 1), 450f4a6de85SMark Yao .intr = &rk3066_intr, 451f4a6de85SMark Yao .common = &rk3066_common, 452f4a6de85SMark Yao .modeset = &rk3066_modeset, 453f4a6de85SMark Yao .output = &rk3066_output, 454f4a6de85SMark Yao .win = rk3066_vop_win_data, 455f4a6de85SMark Yao .win_size = ARRAY_SIZE(rk3066_vop_win_data), 456f4a6de85SMark Yao }; 457f4a6de85SMark Yao 458428e15ccSHeiko Stuebner static const struct vop_scl_regs rk3188_win_scl = { 459428e15ccSHeiko Stuebner .scale_yrgb_x = VOP_REG(RK3188_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0), 460428e15ccSHeiko Stuebner .scale_yrgb_y = VOP_REG(RK3188_WIN0_SCL_FACTOR_YRGB, 0xffff, 16), 461428e15ccSHeiko Stuebner .scale_cbcr_x = VOP_REG(RK3188_WIN0_SCL_FACTOR_CBR, 0xffff, 0x0), 462428e15ccSHeiko Stuebner .scale_cbcr_y = VOP_REG(RK3188_WIN0_SCL_FACTOR_CBR, 0xffff, 16), 463428e15ccSHeiko Stuebner }; 464428e15ccSHeiko Stuebner 465428e15ccSHeiko Stuebner static const struct vop_win_phy rk3188_win0_data = { 466428e15ccSHeiko Stuebner .scl = &rk3188_win_scl, 467428e15ccSHeiko Stuebner .data_formats = formats_win_full, 468428e15ccSHeiko Stuebner .nformats = ARRAY_SIZE(formats_win_full), 4697707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_full, 470428e15ccSHeiko Stuebner .enable = VOP_REG(RK3188_SYS_CTRL, 0x1, 0), 471428e15ccSHeiko Stuebner .format = VOP_REG(RK3188_SYS_CTRL, 0x7, 3), 472428e15ccSHeiko Stuebner .rb_swap = VOP_REG(RK3188_SYS_CTRL, 0x1, 15), 473428e15ccSHeiko Stuebner .act_info = VOP_REG(RK3188_WIN0_ACT_INFO, 0x1fff1fff, 0), 474428e15ccSHeiko Stuebner .dsp_info = VOP_REG(RK3188_WIN0_DSP_INFO, 0x0fff0fff, 0), 475428e15ccSHeiko Stuebner .dsp_st = VOP_REG(RK3188_WIN0_DSP_ST, 0x1fff1fff, 0), 476428e15ccSHeiko Stuebner .yrgb_mst = VOP_REG(RK3188_WIN0_YRGB_MST0, 0xffffffff, 0), 477428e15ccSHeiko Stuebner .uv_mst = VOP_REG(RK3188_WIN0_CBR_MST0, 0xffffffff, 0), 478428e15ccSHeiko Stuebner .yrgb_vir = VOP_REG(RK3188_WIN_VIR, 0x1fff, 0), 479428e15ccSHeiko Stuebner }; 480428e15ccSHeiko Stuebner 481428e15ccSHeiko Stuebner static const struct vop_win_phy rk3188_win1_data = { 482428e15ccSHeiko Stuebner .data_formats = formats_win_lite, 483428e15ccSHeiko Stuebner .nformats = ARRAY_SIZE(formats_win_lite), 4847707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_lite, 485428e15ccSHeiko Stuebner .enable = VOP_REG(RK3188_SYS_CTRL, 0x1, 1), 486428e15ccSHeiko Stuebner .format = VOP_REG(RK3188_SYS_CTRL, 0x7, 6), 487428e15ccSHeiko Stuebner .rb_swap = VOP_REG(RK3188_SYS_CTRL, 0x1, 19), 488428e15ccSHeiko Stuebner /* no act_info on window1 */ 489428e15ccSHeiko Stuebner .dsp_info = VOP_REG(RK3188_WIN1_DSP_INFO, 0x07ff07ff, 0), 490428e15ccSHeiko Stuebner .dsp_st = VOP_REG(RK3188_WIN1_DSP_ST, 0x0fff0fff, 0), 491428e15ccSHeiko Stuebner .yrgb_mst = VOP_REG(RK3188_WIN1_MST, 0xffffffff, 0), 492428e15ccSHeiko Stuebner .yrgb_vir = VOP_REG(RK3188_WIN_VIR, 0x1fff, 16), 493428e15ccSHeiko Stuebner }; 494428e15ccSHeiko Stuebner 495428e15ccSHeiko Stuebner static const struct vop_modeset rk3188_modeset = { 496428e15ccSHeiko Stuebner .htotal_pw = VOP_REG(RK3188_DSP_HTOTAL_HS_END, 0x0fff0fff, 0), 497428e15ccSHeiko Stuebner .hact_st_end = VOP_REG(RK3188_DSP_HACT_ST_END, 0x0fff0fff, 0), 498428e15ccSHeiko Stuebner .vtotal_pw = VOP_REG(RK3188_DSP_VTOTAL_VS_END, 0x0fff0fff, 0), 499428e15ccSHeiko Stuebner .vact_st_end = VOP_REG(RK3188_DSP_VACT_ST_END, 0x0fff0fff, 0), 500428e15ccSHeiko Stuebner }; 501428e15ccSHeiko Stuebner 502428e15ccSHeiko Stuebner static const struct vop_output rk3188_output = { 503428e15ccSHeiko Stuebner .pin_pol = VOP_REG(RK3188_DSP_CTRL0, 0xf, 4), 504428e15ccSHeiko Stuebner }; 505428e15ccSHeiko Stuebner 506428e15ccSHeiko Stuebner static const struct vop_common rk3188_common = { 507428e15ccSHeiko Stuebner .gate_en = VOP_REG(RK3188_SYS_CTRL, 0x1, 31), 508428e15ccSHeiko Stuebner .standby = VOP_REG(RK3188_SYS_CTRL, 0x1, 30), 509428e15ccSHeiko Stuebner .out_mode = VOP_REG(RK3188_DSP_CTRL0, 0xf, 0), 510428e15ccSHeiko Stuebner .cfg_done = VOP_REG(RK3188_REG_CFG_DONE, 0x1, 0), 511a5c0fa44SUrja Rannikko .dither_down_sel = VOP_REG(RK3188_DSP_CTRL0, 0x1, 27), 512a5c0fa44SUrja Rannikko .dither_down_en = VOP_REG(RK3188_DSP_CTRL0, 0x1, 11), 513a5c0fa44SUrja Rannikko .dither_down_mode = VOP_REG(RK3188_DSP_CTRL0, 0x1, 10), 514428e15ccSHeiko Stuebner .dsp_blank = VOP_REG(RK3188_DSP_CTRL1, 0x3, 24), 515428e15ccSHeiko Stuebner }; 516428e15ccSHeiko Stuebner 517428e15ccSHeiko Stuebner static const struct vop_win_data rk3188_vop_win_data[] = { 518428e15ccSHeiko Stuebner { .base = 0x00, .phy = &rk3188_win0_data, 519428e15ccSHeiko Stuebner .type = DRM_PLANE_TYPE_PRIMARY }, 520428e15ccSHeiko Stuebner { .base = 0x00, .phy = &rk3188_win1_data, 521428e15ccSHeiko Stuebner .type = DRM_PLANE_TYPE_CURSOR }, 522428e15ccSHeiko Stuebner }; 523428e15ccSHeiko Stuebner 524428e15ccSHeiko Stuebner static const int rk3188_vop_intrs[] = { 5254f297df8SHeiko Stuebner /* 5264f297df8SHeiko Stuebner * hs_start interrupt fires at frame-start, so serves 5274f297df8SHeiko Stuebner * the same purpose as dsp_hold in the driver. 5284f297df8SHeiko Stuebner */ 5294f297df8SHeiko Stuebner DSP_HOLD_VALID_INTR, 530428e15ccSHeiko Stuebner FS_INTR, 531428e15ccSHeiko Stuebner LINE_FLAG_INTR, 532428e15ccSHeiko Stuebner BUS_ERROR_INTR, 533428e15ccSHeiko Stuebner }; 534428e15ccSHeiko Stuebner 535428e15ccSHeiko Stuebner static const struct vop_intr rk3188_vop_intr = { 536428e15ccSHeiko Stuebner .intrs = rk3188_vop_intrs, 537428e15ccSHeiko Stuebner .nintrs = ARRAY_SIZE(rk3188_vop_intrs), 538428e15ccSHeiko Stuebner .line_flag_num[0] = VOP_REG(RK3188_INT_STATUS, 0xfff, 12), 539428e15ccSHeiko Stuebner .status = VOP_REG(RK3188_INT_STATUS, 0xf, 0), 540428e15ccSHeiko Stuebner .enable = VOP_REG(RK3188_INT_STATUS, 0xf, 4), 541428e15ccSHeiko Stuebner .clear = VOP_REG(RK3188_INT_STATUS, 0xf, 8), 542428e15ccSHeiko Stuebner }; 543428e15ccSHeiko Stuebner 544428e15ccSHeiko Stuebner static const struct vop_data rk3188_vop = { 545428e15ccSHeiko Stuebner .intr = &rk3188_vop_intr, 546428e15ccSHeiko Stuebner .common = &rk3188_common, 547428e15ccSHeiko Stuebner .modeset = &rk3188_modeset, 548428e15ccSHeiko Stuebner .output = &rk3188_output, 549428e15ccSHeiko Stuebner .win = rk3188_vop_win_data, 550428e15ccSHeiko Stuebner .win_size = ARRAY_SIZE(rk3188_vop_win_data), 551428e15ccSHeiko Stuebner .feature = VOP_FEATURE_INTERNAL_RGB, 552428e15ccSHeiko Stuebner }; 553428e15ccSHeiko Stuebner 554f7673453SMark Yao static const struct vop_scl_extension rk3288_win_full_scl_ext = { 555f7673453SMark Yao .cbcr_vsd_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 31), 556f7673453SMark Yao .cbcr_vsu_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 30), 557f7673453SMark Yao .cbcr_hsd_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 28), 558f7673453SMark Yao .cbcr_ver_scl_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 26), 559f7673453SMark Yao .cbcr_hor_scl_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 24), 560f7673453SMark Yao .yrgb_vsd_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 23), 561f7673453SMark Yao .yrgb_vsu_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 22), 562f7673453SMark Yao .yrgb_hsd_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 20), 563f7673453SMark Yao .yrgb_ver_scl_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 18), 564f7673453SMark Yao .yrgb_hor_scl_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 16), 565f7673453SMark Yao .line_load_mode = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 15), 566f7673453SMark Yao .cbcr_axi_gather_num = VOP_REG(RK3288_WIN0_CTRL1, 0x7, 12), 567f7673453SMark Yao .yrgb_axi_gather_num = VOP_REG(RK3288_WIN0_CTRL1, 0xf, 8), 568f7673453SMark Yao .vsd_cbcr_gt2 = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 7), 569f7673453SMark Yao .vsd_cbcr_gt4 = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 6), 570f7673453SMark Yao .vsd_yrgb_gt2 = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 5), 571f7673453SMark Yao .vsd_yrgb_gt4 = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 4), 572f7673453SMark Yao .bic_coe_sel = VOP_REG(RK3288_WIN0_CTRL1, 0x3, 2), 573f7673453SMark Yao .cbcr_axi_gather_en = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 1), 574f7673453SMark Yao .yrgb_axi_gather_en = VOP_REG(RK3288_WIN0_CTRL1, 0x1, 0), 575f7673453SMark Yao .lb_mode = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 5), 5761194fffbSMark Yao }; 5771194fffbSMark Yao 578f7673453SMark Yao static const struct vop_scl_regs rk3288_win_full_scl = { 579f7673453SMark Yao .ext = &rk3288_win_full_scl_ext, 580f7673453SMark Yao .scale_yrgb_x = VOP_REG(RK3288_WIN0_SCL_FACTOR_YRGB, 0xffff, 0x0), 581f7673453SMark Yao .scale_yrgb_y = VOP_REG(RK3288_WIN0_SCL_FACTOR_YRGB, 0xffff, 16), 582f7673453SMark Yao .scale_cbcr_x = VOP_REG(RK3288_WIN0_SCL_FACTOR_CBR, 0xffff, 0x0), 583f7673453SMark Yao .scale_cbcr_y = VOP_REG(RK3288_WIN0_SCL_FACTOR_CBR, 0xffff, 16), 584a67719d1SMark Yao }; 585a67719d1SMark Yao 586f7673453SMark Yao static const struct vop_win_phy rk3288_win01_data = { 587f7673453SMark Yao .scl = &rk3288_win_full_scl, 588f7673453SMark Yao .data_formats = formats_win_full, 589f7673453SMark Yao .nformats = ARRAY_SIZE(formats_win_full), 5907707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_full, 591f7673453SMark Yao .enable = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 0), 592f7673453SMark Yao .format = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 1), 593f7673453SMark Yao .rb_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 12), 594f7673453SMark Yao .act_info = VOP_REG(RK3288_WIN0_ACT_INFO, 0x1fff1fff, 0), 595f7673453SMark Yao .dsp_info = VOP_REG(RK3288_WIN0_DSP_INFO, 0x0fff0fff, 0), 596f7673453SMark Yao .dsp_st = VOP_REG(RK3288_WIN0_DSP_ST, 0x1fff1fff, 0), 597f7673453SMark Yao .yrgb_mst = VOP_REG(RK3288_WIN0_YRGB_MST, 0xffffffff, 0), 598f7673453SMark Yao .uv_mst = VOP_REG(RK3288_WIN0_CBR_MST, 0xffffffff, 0), 599f7673453SMark Yao .yrgb_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 0), 600f7673453SMark Yao .uv_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 16), 601f7673453SMark Yao .src_alpha_ctl = VOP_REG(RK3288_WIN0_SRC_ALPHA_CTRL, 0xff, 0), 602f7673453SMark Yao .dst_alpha_ctl = VOP_REG(RK3288_WIN0_DST_ALPHA_CTRL, 0xff, 0), 6039dd2aca4SMark yao .channel = VOP_REG(RK3288_WIN0_CTRL2, 0xff, 0), 604a67719d1SMark Yao }; 605a67719d1SMark Yao 606f7673453SMark Yao static const struct vop_win_phy rk3288_win23_data = { 607f7673453SMark Yao .data_formats = formats_win_lite, 608f7673453SMark Yao .nformats = ARRAY_SIZE(formats_win_lite), 6097707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_lite, 61060b7ae7fSMark yao .enable = VOP_REG(RK3288_WIN2_CTRL0, 0x1, 4), 61160b7ae7fSMark yao .gate = VOP_REG(RK3288_WIN2_CTRL0, 0x1, 0), 612f7673453SMark Yao .format = VOP_REG(RK3288_WIN2_CTRL0, 0x7, 1), 613f7673453SMark Yao .rb_swap = VOP_REG(RK3288_WIN2_CTRL0, 0x1, 12), 614f7673453SMark Yao .dsp_info = VOP_REG(RK3288_WIN2_DSP_INFO0, 0x0fff0fff, 0), 615f7673453SMark Yao .dsp_st = VOP_REG(RK3288_WIN2_DSP_ST0, 0x1fff1fff, 0), 616f7673453SMark Yao .yrgb_mst = VOP_REG(RK3288_WIN2_MST0, 0xffffffff, 0), 617f7673453SMark Yao .yrgb_vir = VOP_REG(RK3288_WIN2_VIR0_1, 0x1fff, 0), 618f7673453SMark Yao .src_alpha_ctl = VOP_REG(RK3288_WIN2_SRC_ALPHA_CTRL, 0xff, 0), 619f7673453SMark Yao .dst_alpha_ctl = VOP_REG(RK3288_WIN2_DST_ALPHA_CTRL, 0xff, 0), 620a67719d1SMark Yao }; 621a67719d1SMark Yao 6229a61c54bSMark yao static const struct vop_modeset rk3288_modeset = { 623f7673453SMark Yao .htotal_pw = VOP_REG(RK3288_DSP_HTOTAL_HS_END, 0x1fff1fff, 0), 624f7673453SMark Yao .hact_st_end = VOP_REG(RK3288_DSP_HACT_ST_END, 0x1fff1fff, 0), 625f7673453SMark Yao .vtotal_pw = VOP_REG(RK3288_DSP_VTOTAL_VS_END, 0x1fff1fff, 0), 626f7673453SMark Yao .vact_st_end = VOP_REG(RK3288_DSP_VACT_ST_END, 0x1fff1fff, 0), 627f7673453SMark Yao .hpost_st_end = VOP_REG(RK3288_POST_DSP_HACT_INFO, 0x1fff1fff, 0), 628f7673453SMark Yao .vpost_st_end = VOP_REG(RK3288_POST_DSP_VACT_INFO, 0x1fff1fff, 0), 6299a61c54bSMark yao }; 6309a61c54bSMark yao 6319a61c54bSMark yao static const struct vop_output rk3288_output = { 6329a61c54bSMark yao .pin_pol = VOP_REG(RK3288_DSP_CTRL0, 0xf, 4), 6339a61c54bSMark yao .rgb_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 12), 6349a61c54bSMark yao .hdmi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 13), 6359a61c54bSMark yao .edp_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 14), 6369a61c54bSMark yao .mipi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 15), 6379a61c54bSMark yao }; 6389a61c54bSMark yao 6399a61c54bSMark yao static const struct vop_common rk3288_common = { 6409a61c54bSMark yao .standby = VOP_REG_SYNC(RK3288_SYS_CTRL, 0x1, 22), 6419a61c54bSMark yao .gate_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 23), 6429a61c54bSMark yao .mmu_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 20), 643a5c0fa44SUrja Rannikko .dither_down_sel = VOP_REG(RK3288_DSP_CTRL1, 0x1, 4), 644a5c0fa44SUrja Rannikko .dither_down_mode = VOP_REG(RK3288_DSP_CTRL1, 0x1, 3), 645a5c0fa44SUrja Rannikko .dither_down_en = VOP_REG(RK3288_DSP_CTRL1, 0x1, 2), 6466bda8112SMark Yao .pre_dither_down = VOP_REG(RK3288_DSP_CTRL1, 0x1, 1), 6479a61c54bSMark yao .dither_up = VOP_REG(RK3288_DSP_CTRL1, 0x1, 6), 648b23ab6acSEzequiel Garcia .dsp_lut_en = VOP_REG(RK3288_DSP_CTRL1, 0x1, 0), 6499a61c54bSMark yao .data_blank = VOP_REG(RK3288_DSP_CTRL0, 0x1, 19), 6509a61c54bSMark yao .dsp_blank = VOP_REG(RK3288_DSP_CTRL0, 0x3, 18), 6519a61c54bSMark yao .out_mode = VOP_REG(RK3288_DSP_CTRL0, 0xf, 0), 6529548e1b4SMark yao .cfg_done = VOP_REG_SYNC(RK3288_REG_CFG_DONE, 0x1, 0), 653a67719d1SMark Yao }; 654a67719d1SMark Yao 655a67719d1SMark Yao /* 656a67719d1SMark Yao * Note: rk3288 has a dedicated 'cursor' window, however, that window requires 657a67719d1SMark Yao * special support to get alpha blending working. For now, just use overlay 658a67719d1SMark Yao * window 3 for the drm cursor. 659a67719d1SMark Yao * 660a67719d1SMark Yao */ 661a67719d1SMark Yao static const struct vop_win_data rk3288_vop_win_data[] = { 662f7673453SMark Yao { .base = 0x00, .phy = &rk3288_win01_data, 663f7673453SMark Yao .type = DRM_PLANE_TYPE_PRIMARY }, 664f7673453SMark Yao { .base = 0x40, .phy = &rk3288_win01_data, 665f7673453SMark Yao .type = DRM_PLANE_TYPE_OVERLAY }, 666f7673453SMark Yao { .base = 0x00, .phy = &rk3288_win23_data, 667f7673453SMark Yao .type = DRM_PLANE_TYPE_OVERLAY }, 668f7673453SMark Yao { .base = 0x50, .phy = &rk3288_win23_data, 669f7673453SMark Yao .type = DRM_PLANE_TYPE_CURSOR }, 670a67719d1SMark Yao }; 671a67719d1SMark Yao 672a67719d1SMark Yao static const int rk3288_vop_intrs[] = { 673a67719d1SMark Yao DSP_HOLD_VALID_INTR, 674a67719d1SMark Yao FS_INTR, 675a67719d1SMark Yao LINE_FLAG_INTR, 676a67719d1SMark Yao BUS_ERROR_INTR, 677a67719d1SMark Yao }; 678a67719d1SMark Yao 679a67719d1SMark Yao static const struct vop_intr rk3288_vop_intr = { 680a67719d1SMark Yao .intrs = rk3288_vop_intrs, 681a67719d1SMark Yao .nintrs = ARRAY_SIZE(rk3288_vop_intrs), 682ac6560dfSMark yao .line_flag_num[0] = VOP_REG(RK3288_INTR_CTRL0, 0x1fff, 12), 683f7673453SMark Yao .status = VOP_REG(RK3288_INTR_CTRL0, 0xf, 0), 684f7673453SMark Yao .enable = VOP_REG(RK3288_INTR_CTRL0, 0xf, 4), 685f7673453SMark Yao .clear = VOP_REG(RK3288_INTR_CTRL0, 0xf, 8), 686a67719d1SMark Yao }; 687a67719d1SMark Yao 688a67719d1SMark Yao static const struct vop_data rk3288_vop = { 689eb5cb6aaSMark yao .version = VOP_VERSION(3, 1), 690efd11cc8SMark yao .feature = VOP_FEATURE_OUTPUT_RGB10, 691a67719d1SMark Yao .intr = &rk3288_vop_intr, 6929a61c54bSMark yao .common = &rk3288_common, 6939a61c54bSMark yao .modeset = &rk3288_modeset, 6949a61c54bSMark yao .output = &rk3288_output, 695a67719d1SMark Yao .win = rk3288_vop_win_data, 696a67719d1SMark Yao .win_size = ARRAY_SIZE(rk3288_vop_win_data), 697b23ab6acSEzequiel Garcia .lut_size = 1024, 698a67719d1SMark Yao }; 699a67719d1SMark Yao 700eb5cb6aaSMark yao static const int rk3368_vop_intrs[] = { 7010a63bfd0SMark Yao FS_INTR, 7020a63bfd0SMark Yao 0, 0, 7030a63bfd0SMark Yao LINE_FLAG_INTR, 7040a63bfd0SMark Yao 0, 7050a63bfd0SMark Yao BUS_ERROR_INTR, 7060a63bfd0SMark Yao 0, 0, 0, 0, 0, 0, 0, 7070a63bfd0SMark Yao DSP_HOLD_VALID_INTR, 708f7673453SMark Yao }; 709f7673453SMark Yao 710eb5cb6aaSMark yao static const struct vop_intr rk3368_vop_intr = { 711eb5cb6aaSMark yao .intrs = rk3368_vop_intrs, 712eb5cb6aaSMark yao .nintrs = ARRAY_SIZE(rk3368_vop_intrs), 713eb5cb6aaSMark yao .line_flag_num[0] = VOP_REG(RK3368_LINE_FLAG, 0xffff, 0), 714eb5cb6aaSMark yao .line_flag_num[1] = VOP_REG(RK3368_LINE_FLAG, 0xffff, 16), 715eb5cb6aaSMark yao .status = VOP_REG_MASK_SYNC(RK3368_INTR_STATUS, 0x3fff, 0), 716eb5cb6aaSMark yao .enable = VOP_REG_MASK_SYNC(RK3368_INTR_EN, 0x3fff, 0), 717eb5cb6aaSMark yao .clear = VOP_REG_MASK_SYNC(RK3368_INTR_CLEAR, 0x3fff, 0), 718eb5cb6aaSMark yao }; 719eb5cb6aaSMark yao 720fbb1c738SEzequiel Garcia static const struct vop_win_phy rk3368_win01_data = { 721fbb1c738SEzequiel Garcia .scl = &rk3288_win_full_scl, 722fbb1c738SEzequiel Garcia .data_formats = formats_win_full, 723fbb1c738SEzequiel Garcia .nformats = ARRAY_SIZE(formats_win_full), 7247707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_full, 725fbb1c738SEzequiel Garcia .enable = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 0), 726fbb1c738SEzequiel Garcia .format = VOP_REG(RK3368_WIN0_CTRL0, 0x7, 1), 727fbb1c738SEzequiel Garcia .rb_swap = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 12), 728677e8bbcSDaniele Castagna .x_mir_en = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 21), 729677e8bbcSDaniele Castagna .y_mir_en = VOP_REG(RK3368_WIN0_CTRL0, 0x1, 22), 730fbb1c738SEzequiel Garcia .act_info = VOP_REG(RK3368_WIN0_ACT_INFO, 0x1fff1fff, 0), 731fbb1c738SEzequiel Garcia .dsp_info = VOP_REG(RK3368_WIN0_DSP_INFO, 0x0fff0fff, 0), 732fbb1c738SEzequiel Garcia .dsp_st = VOP_REG(RK3368_WIN0_DSP_ST, 0x1fff1fff, 0), 733fbb1c738SEzequiel Garcia .yrgb_mst = VOP_REG(RK3368_WIN0_YRGB_MST, 0xffffffff, 0), 734fbb1c738SEzequiel Garcia .uv_mst = VOP_REG(RK3368_WIN0_CBR_MST, 0xffffffff, 0), 735fbb1c738SEzequiel Garcia .yrgb_vir = VOP_REG(RK3368_WIN0_VIR, 0x3fff, 0), 736fbb1c738SEzequiel Garcia .uv_vir = VOP_REG(RK3368_WIN0_VIR, 0x3fff, 16), 737fbb1c738SEzequiel Garcia .src_alpha_ctl = VOP_REG(RK3368_WIN0_SRC_ALPHA_CTRL, 0xff, 0), 738fbb1c738SEzequiel Garcia .dst_alpha_ctl = VOP_REG(RK3368_WIN0_DST_ALPHA_CTRL, 0xff, 0), 739fbb1c738SEzequiel Garcia .channel = VOP_REG(RK3368_WIN0_CTRL2, 0xff, 0), 740fbb1c738SEzequiel Garcia }; 741fbb1c738SEzequiel Garcia 742eb5cb6aaSMark yao static const struct vop_win_phy rk3368_win23_data = { 743eb5cb6aaSMark yao .data_formats = formats_win_lite, 744eb5cb6aaSMark yao .nformats = ARRAY_SIZE(formats_win_lite), 7457707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_lite, 746eb5cb6aaSMark yao .gate = VOP_REG(RK3368_WIN2_CTRL0, 0x1, 0), 747eb5cb6aaSMark yao .enable = VOP_REG(RK3368_WIN2_CTRL0, 0x1, 4), 748eb5cb6aaSMark yao .format = VOP_REG(RK3368_WIN2_CTRL0, 0x3, 5), 749eb5cb6aaSMark yao .rb_swap = VOP_REG(RK3368_WIN2_CTRL0, 0x1, 20), 750677e8bbcSDaniele Castagna .y_mir_en = VOP_REG(RK3368_WIN2_CTRL1, 0x1, 15), 751eb5cb6aaSMark yao .dsp_info = VOP_REG(RK3368_WIN2_DSP_INFO0, 0x0fff0fff, 0), 752eb5cb6aaSMark yao .dsp_st = VOP_REG(RK3368_WIN2_DSP_ST0, 0x1fff1fff, 0), 753eb5cb6aaSMark yao .yrgb_mst = VOP_REG(RK3368_WIN2_MST0, 0xffffffff, 0), 754eb5cb6aaSMark yao .yrgb_vir = VOP_REG(RK3368_WIN2_VIR0_1, 0x1fff, 0), 755eb5cb6aaSMark yao .src_alpha_ctl = VOP_REG(RK3368_WIN2_SRC_ALPHA_CTRL, 0xff, 0), 756eb5cb6aaSMark yao .dst_alpha_ctl = VOP_REG(RK3368_WIN2_DST_ALPHA_CTRL, 0xff, 0), 757eb5cb6aaSMark yao }; 758eb5cb6aaSMark yao 759eb5cb6aaSMark yao static const struct vop_win_data rk3368_vop_win_data[] = { 760fbb1c738SEzequiel Garcia { .base = 0x00, .phy = &rk3368_win01_data, 761eb5cb6aaSMark yao .type = DRM_PLANE_TYPE_PRIMARY }, 762fbb1c738SEzequiel Garcia { .base = 0x40, .phy = &rk3368_win01_data, 763eb5cb6aaSMark yao .type = DRM_PLANE_TYPE_OVERLAY }, 764eb5cb6aaSMark yao { .base = 0x00, .phy = &rk3368_win23_data, 765eb5cb6aaSMark yao .type = DRM_PLANE_TYPE_OVERLAY }, 766eb5cb6aaSMark yao { .base = 0x50, .phy = &rk3368_win23_data, 767eb5cb6aaSMark yao .type = DRM_PLANE_TYPE_CURSOR }, 768eb5cb6aaSMark yao }; 769eb5cb6aaSMark yao 770eb5cb6aaSMark yao static const struct vop_output rk3368_output = { 7711f6c62caSNickey Yang .rgb_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 19), 7721f6c62caSNickey Yang .hdmi_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 23), 7731f6c62caSNickey Yang .edp_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 27), 7741f6c62caSNickey Yang .mipi_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 31), 7751f6c62caSNickey Yang .rgb_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 16), 7761f6c62caSNickey Yang .hdmi_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 20), 7771f6c62caSNickey Yang .edp_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 24), 7781f6c62caSNickey Yang .mipi_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 28), 779eb5cb6aaSMark yao .rgb_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 12), 780eb5cb6aaSMark yao .hdmi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 13), 781eb5cb6aaSMark yao .edp_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 14), 782eb5cb6aaSMark yao .mipi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 15), 783eb5cb6aaSMark yao }; 784eb5cb6aaSMark yao 785eb5cb6aaSMark yao static const struct vop_misc rk3368_misc = { 786eb5cb6aaSMark yao .global_regdone_en = VOP_REG(RK3368_SYS_CTRL, 0x1, 11), 787eb5cb6aaSMark yao }; 788eb5cb6aaSMark yao 789eb5cb6aaSMark yao static const struct vop_data rk3368_vop = { 790eb5cb6aaSMark yao .version = VOP_VERSION(3, 2), 791eb5cb6aaSMark yao .intr = &rk3368_vop_intr, 792eb5cb6aaSMark yao .common = &rk3288_common, 793eb5cb6aaSMark yao .modeset = &rk3288_modeset, 794eb5cb6aaSMark yao .output = &rk3368_output, 795eb5cb6aaSMark yao .misc = &rk3368_misc, 796eb5cb6aaSMark yao .win = rk3368_vop_win_data, 797eb5cb6aaSMark yao .win_size = ARRAY_SIZE(rk3368_vop_win_data), 798eb5cb6aaSMark yao }; 799eb5cb6aaSMark yao 800eb5cb6aaSMark yao static const struct vop_intr rk3366_vop_intr = { 801eb5cb6aaSMark yao .intrs = rk3368_vop_intrs, 802eb5cb6aaSMark yao .nintrs = ARRAY_SIZE(rk3368_vop_intrs), 803eb5cb6aaSMark yao .line_flag_num[0] = VOP_REG(RK3366_LINE_FLAG, 0xffff, 0), 804eb5cb6aaSMark yao .line_flag_num[1] = VOP_REG(RK3366_LINE_FLAG, 0xffff, 16), 805eb5cb6aaSMark yao .status = VOP_REG_MASK_SYNC(RK3366_INTR_STATUS0, 0xffff, 0), 806eb5cb6aaSMark yao .enable = VOP_REG_MASK_SYNC(RK3366_INTR_EN0, 0xffff, 0), 807eb5cb6aaSMark yao .clear = VOP_REG_MASK_SYNC(RK3366_INTR_CLEAR0, 0xffff, 0), 808eb5cb6aaSMark yao }; 809eb5cb6aaSMark yao 810eb5cb6aaSMark yao static const struct vop_data rk3366_vop = { 811eb5cb6aaSMark yao .version = VOP_VERSION(3, 4), 812eb5cb6aaSMark yao .intr = &rk3366_vop_intr, 813eb5cb6aaSMark yao .common = &rk3288_common, 814eb5cb6aaSMark yao .modeset = &rk3288_modeset, 815eb5cb6aaSMark yao .output = &rk3368_output, 816eb5cb6aaSMark yao .misc = &rk3368_misc, 817eb5cb6aaSMark yao .win = rk3368_vop_win_data, 818eb5cb6aaSMark yao .win_size = ARRAY_SIZE(rk3368_vop_win_data), 819f7673453SMark Yao }; 820f7673453SMark Yao 8219a61c54bSMark yao static const struct vop_output rk3399_output = { 8221f6c62caSNickey Yang .dp_dclk_pol = VOP_REG(RK3399_DSP_CTRL1, 0x1, 19), 8231f6c62caSNickey Yang .rgb_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 19), 8241f6c62caSNickey Yang .hdmi_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 23), 8251f6c62caSNickey Yang .edp_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 27), 8261f6c62caSNickey Yang .mipi_dclk_pol = VOP_REG(RK3368_DSP_CTRL1, 0x1, 31), 8271f6c62caSNickey Yang .dp_pin_pol = VOP_REG(RK3399_DSP_CTRL1, 0x7, 16), 8281f6c62caSNickey Yang .rgb_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 16), 8291f6c62caSNickey Yang .hdmi_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 20), 8301f6c62caSNickey Yang .edp_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 24), 8311f6c62caSNickey Yang .mipi_pin_pol = VOP_REG(RK3368_DSP_CTRL1, 0x7, 28), 8329a61c54bSMark yao .dp_en = VOP_REG(RK3399_SYS_CTRL, 0x1, 11), 8339a61c54bSMark yao .rgb_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 12), 8349a61c54bSMark yao .hdmi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 13), 8359a61c54bSMark yao .edp_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 14), 8369a61c54bSMark yao .mipi_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 15), 837cf6d100dSHeiko Stuebner .mipi_dual_channel_en = VOP_REG(RK3288_SYS_CTRL, 0x1, 3), 8389a61c54bSMark yao }; 8399a61c54bSMark yao 8401c21aa8fSDaniele Castagna static const struct vop_yuv2yuv_phy rk3399_yuv2yuv_win01_data = { 8411c21aa8fSDaniele Castagna .y2r_coefficients = { 8421c21aa8fSDaniele Castagna VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 0, 0xffff, 0), 8431c21aa8fSDaniele Castagna VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 0, 0xffff, 16), 8441c21aa8fSDaniele Castagna VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 4, 0xffff, 0), 8451c21aa8fSDaniele Castagna VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 4, 0xffff, 16), 8461c21aa8fSDaniele Castagna VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 8, 0xffff, 0), 8471c21aa8fSDaniele Castagna VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 8, 0xffff, 16), 8481c21aa8fSDaniele Castagna VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 12, 0xffff, 0), 8491c21aa8fSDaniele Castagna VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 12, 0xffff, 16), 8501c21aa8fSDaniele Castagna VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 16, 0xffff, 0), 8511c21aa8fSDaniele Castagna VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 20, 0xffffffff, 0), 8521c21aa8fSDaniele Castagna VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 24, 0xffffffff, 0), 8531c21aa8fSDaniele Castagna VOP_REG(RK3399_WIN0_YUV2YUV_Y2R + 28, 0xffffffff, 0), 8541c21aa8fSDaniele Castagna }, 8551c21aa8fSDaniele Castagna }; 8561c21aa8fSDaniele Castagna 8571c21aa8fSDaniele Castagna static const struct vop_yuv2yuv_phy rk3399_yuv2yuv_win23_data = { }; 8581c21aa8fSDaniele Castagna 8591c21aa8fSDaniele Castagna static const struct vop_win_yuv2yuv_data rk3399_vop_big_win_yuv2yuv_data[] = { 8601c21aa8fSDaniele Castagna { .base = 0x00, .phy = &rk3399_yuv2yuv_win01_data, 8611c21aa8fSDaniele Castagna .y2r_en = VOP_REG(RK3399_YUV2YUV_WIN, 0x1, 1) }, 8621c21aa8fSDaniele Castagna { .base = 0x60, .phy = &rk3399_yuv2yuv_win01_data, 8631c21aa8fSDaniele Castagna .y2r_en = VOP_REG(RK3399_YUV2YUV_WIN, 0x1, 9) }, 8641c21aa8fSDaniele Castagna { .base = 0xC0, .phy = &rk3399_yuv2yuv_win23_data }, 8651c21aa8fSDaniele Castagna { .base = 0x120, .phy = &rk3399_yuv2yuv_win23_data }, 8667707f722SAndrzej Pietrasiewicz 8677707f722SAndrzej Pietrasiewicz }; 8687707f722SAndrzej Pietrasiewicz 8697707f722SAndrzej Pietrasiewicz static const struct vop_win_phy rk3399_win01_data = { 8707707f722SAndrzej Pietrasiewicz .scl = &rk3288_win_full_scl, 8717707f722SAndrzej Pietrasiewicz .data_formats = formats_win_full, 8727707f722SAndrzej Pietrasiewicz .nformats = ARRAY_SIZE(formats_win_full), 8737707f722SAndrzej Pietrasiewicz .format_modifiers = format_modifiers_win_full_afbc, 8747707f722SAndrzej Pietrasiewicz .enable = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 0), 8757707f722SAndrzej Pietrasiewicz .format = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 1), 8767707f722SAndrzej Pietrasiewicz .rb_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 12), 8777707f722SAndrzej Pietrasiewicz .y_mir_en = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 22), 8787707f722SAndrzej Pietrasiewicz .act_info = VOP_REG(RK3288_WIN0_ACT_INFO, 0x1fff1fff, 0), 8797707f722SAndrzej Pietrasiewicz .dsp_info = VOP_REG(RK3288_WIN0_DSP_INFO, 0x0fff0fff, 0), 8807707f722SAndrzej Pietrasiewicz .dsp_st = VOP_REG(RK3288_WIN0_DSP_ST, 0x1fff1fff, 0), 8817707f722SAndrzej Pietrasiewicz .yrgb_mst = VOP_REG(RK3288_WIN0_YRGB_MST, 0xffffffff, 0), 8827707f722SAndrzej Pietrasiewicz .uv_mst = VOP_REG(RK3288_WIN0_CBR_MST, 0xffffffff, 0), 8837707f722SAndrzej Pietrasiewicz .yrgb_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 0), 8847707f722SAndrzej Pietrasiewicz .uv_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 16), 8857707f722SAndrzej Pietrasiewicz .src_alpha_ctl = VOP_REG(RK3288_WIN0_SRC_ALPHA_CTRL, 0xff, 0), 8867707f722SAndrzej Pietrasiewicz .dst_alpha_ctl = VOP_REG(RK3288_WIN0_DST_ALPHA_CTRL, 0xff, 0), 8877707f722SAndrzej Pietrasiewicz }; 8887707f722SAndrzej Pietrasiewicz 8897707f722SAndrzej Pietrasiewicz /* 8907707f722SAndrzej Pietrasiewicz * rk3399 vop big windows register layout is same as rk3288, but we 8917707f722SAndrzej Pietrasiewicz * have a separate rk3399 win data array here so that we can advertise 8927707f722SAndrzej Pietrasiewicz * AFBC on the primary plane. 8937707f722SAndrzej Pietrasiewicz */ 8947707f722SAndrzej Pietrasiewicz static const struct vop_win_data rk3399_vop_win_data[] = { 8957707f722SAndrzej Pietrasiewicz { .base = 0x00, .phy = &rk3399_win01_data, 8967707f722SAndrzej Pietrasiewicz .type = DRM_PLANE_TYPE_PRIMARY }, 8977707f722SAndrzej Pietrasiewicz { .base = 0x40, .phy = &rk3288_win01_data, 8987707f722SAndrzej Pietrasiewicz .type = DRM_PLANE_TYPE_OVERLAY }, 8997707f722SAndrzej Pietrasiewicz { .base = 0x00, .phy = &rk3288_win23_data, 9007707f722SAndrzej Pietrasiewicz .type = DRM_PLANE_TYPE_OVERLAY }, 9017707f722SAndrzej Pietrasiewicz { .base = 0x50, .phy = &rk3288_win23_data, 9027707f722SAndrzej Pietrasiewicz .type = DRM_PLANE_TYPE_CURSOR }, 9037707f722SAndrzej Pietrasiewicz }; 9047707f722SAndrzej Pietrasiewicz 9057707f722SAndrzej Pietrasiewicz static const struct vop_afbc rk3399_vop_afbc = { 9067707f722SAndrzej Pietrasiewicz .rstn = VOP_REG(RK3399_AFBCD0_CTRL, 0x1, 3), 9077707f722SAndrzej Pietrasiewicz .enable = VOP_REG(RK3399_AFBCD0_CTRL, 0x1, 0), 9087707f722SAndrzej Pietrasiewicz .win_sel = VOP_REG(RK3399_AFBCD0_CTRL, 0x3, 1), 9097707f722SAndrzej Pietrasiewicz .format = VOP_REG(RK3399_AFBCD0_CTRL, 0x1f, 16), 9107707f722SAndrzej Pietrasiewicz .hreg_block_split = VOP_REG(RK3399_AFBCD0_CTRL, 0x1, 21), 9117707f722SAndrzej Pietrasiewicz .hdr_ptr = VOP_REG(RK3399_AFBCD0_HDR_PTR, 0xffffffff, 0), 9127707f722SAndrzej Pietrasiewicz .pic_size = VOP_REG(RK3399_AFBCD0_PIC_SIZE, 0xffffffff, 0), 9131c21aa8fSDaniele Castagna }; 9141c21aa8fSDaniele Castagna 9150a63bfd0SMark Yao static const struct vop_data rk3399_vop_big = { 916eb5cb6aaSMark yao .version = VOP_VERSION(3, 5), 917efd11cc8SMark yao .feature = VOP_FEATURE_OUTPUT_RGB10, 918eb5cb6aaSMark yao .intr = &rk3366_vop_intr, 9199a61c54bSMark yao .common = &rk3288_common, 9209a61c54bSMark yao .modeset = &rk3288_modeset, 9219a61c54bSMark yao .output = &rk3399_output, 9227707f722SAndrzej Pietrasiewicz .afbc = &rk3399_vop_afbc, 923eb5cb6aaSMark yao .misc = &rk3368_misc, 9247707f722SAndrzej Pietrasiewicz .win = rk3399_vop_win_data, 9257707f722SAndrzej Pietrasiewicz .win_size = ARRAY_SIZE(rk3399_vop_win_data), 9261c21aa8fSDaniele Castagna .win_yuv2yuv = rk3399_vop_big_win_yuv2yuv_data, 9270a63bfd0SMark Yao }; 9280a63bfd0SMark Yao 9290a63bfd0SMark Yao static const struct vop_win_data rk3399_vop_lit_win_data[] = { 930fbb1c738SEzequiel Garcia { .base = 0x00, .phy = &rk3368_win01_data, 931f7673453SMark Yao .type = DRM_PLANE_TYPE_PRIMARY }, 932eb5cb6aaSMark yao { .base = 0x00, .phy = &rk3368_win23_data, 933f7673453SMark Yao .type = DRM_PLANE_TYPE_CURSOR}, 934f7673453SMark Yao }; 935f7673453SMark Yao 9361c21aa8fSDaniele Castagna static const struct vop_win_yuv2yuv_data rk3399_vop_lit_win_yuv2yuv_data[] = { 9371c21aa8fSDaniele Castagna { .base = 0x00, .phy = &rk3399_yuv2yuv_win01_data, 9381c21aa8fSDaniele Castagna .y2r_en = VOP_REG(RK3399_YUV2YUV_WIN, 0x1, 1)}, 9391c21aa8fSDaniele Castagna { .base = 0x60, .phy = &rk3399_yuv2yuv_win23_data }, 9401c21aa8fSDaniele Castagna }; 9411c21aa8fSDaniele Castagna 9420a63bfd0SMark Yao static const struct vop_data rk3399_vop_lit = { 943eb5cb6aaSMark yao .version = VOP_VERSION(3, 6), 944eb5cb6aaSMark yao .intr = &rk3366_vop_intr, 9459a61c54bSMark yao .common = &rk3288_common, 9469a61c54bSMark yao .modeset = &rk3288_modeset, 9479a61c54bSMark yao .output = &rk3399_output, 948eb5cb6aaSMark yao .misc = &rk3368_misc, 9490a63bfd0SMark Yao .win = rk3399_vop_lit_win_data, 9500a63bfd0SMark Yao .win_size = ARRAY_SIZE(rk3399_vop_lit_win_data), 9511c21aa8fSDaniele Castagna .win_yuv2yuv = rk3399_vop_lit_win_yuv2yuv_data, 952f7673453SMark Yao }; 953f7673453SMark Yao 954eb5cb6aaSMark yao static const struct vop_win_data rk3228_vop_win_data[] = { 955eb5cb6aaSMark yao { .base = 0x00, .phy = &rk3288_win01_data, 956eb5cb6aaSMark yao .type = DRM_PLANE_TYPE_PRIMARY }, 957eb5cb6aaSMark yao { .base = 0x40, .phy = &rk3288_win01_data, 958eb5cb6aaSMark yao .type = DRM_PLANE_TYPE_CURSOR }, 959eb5cb6aaSMark yao }; 960eb5cb6aaSMark yao 961eb5cb6aaSMark yao static const struct vop_data rk3228_vop = { 962eb5cb6aaSMark yao .version = VOP_VERSION(3, 7), 963eb5cb6aaSMark yao .feature = VOP_FEATURE_OUTPUT_RGB10, 964eb5cb6aaSMark yao .intr = &rk3366_vop_intr, 965eb5cb6aaSMark yao .common = &rk3288_common, 966eb5cb6aaSMark yao .modeset = &rk3288_modeset, 967eb5cb6aaSMark yao .output = &rk3399_output, 968eb5cb6aaSMark yao .misc = &rk3368_misc, 969eb5cb6aaSMark yao .win = rk3228_vop_win_data, 970eb5cb6aaSMark yao .win_size = ARRAY_SIZE(rk3228_vop_win_data), 971eb5cb6aaSMark yao }; 972eb5cb6aaSMark yao 973eb5cb6aaSMark yao static const struct vop_modeset rk3328_modeset = { 974eb5cb6aaSMark yao .htotal_pw = VOP_REG(RK3328_DSP_HTOTAL_HS_END, 0x1fff1fff, 0), 975eb5cb6aaSMark yao .hact_st_end = VOP_REG(RK3328_DSP_HACT_ST_END, 0x1fff1fff, 0), 976eb5cb6aaSMark yao .vtotal_pw = VOP_REG(RK3328_DSP_VTOTAL_VS_END, 0x1fff1fff, 0), 977eb5cb6aaSMark yao .vact_st_end = VOP_REG(RK3328_DSP_VACT_ST_END, 0x1fff1fff, 0), 978eb5cb6aaSMark yao .hpost_st_end = VOP_REG(RK3328_POST_DSP_HACT_INFO, 0x1fff1fff, 0), 979eb5cb6aaSMark yao .vpost_st_end = VOP_REG(RK3328_POST_DSP_VACT_INFO, 0x1fff1fff, 0), 980eb5cb6aaSMark yao }; 981eb5cb6aaSMark yao 982eb5cb6aaSMark yao static const struct vop_output rk3328_output = { 9831f6c62caSNickey Yang .rgb_dclk_pol = VOP_REG(RK3328_DSP_CTRL1, 0x1, 19), 9841f6c62caSNickey Yang .hdmi_dclk_pol = VOP_REG(RK3328_DSP_CTRL1, 0x1, 23), 9851f6c62caSNickey Yang .edp_dclk_pol = VOP_REG(RK3328_DSP_CTRL1, 0x1, 27), 9861f6c62caSNickey Yang .mipi_dclk_pol = VOP_REG(RK3328_DSP_CTRL1, 0x1, 31), 987eb5cb6aaSMark yao .rgb_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 12), 988eb5cb6aaSMark yao .hdmi_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 13), 989eb5cb6aaSMark yao .edp_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 14), 990eb5cb6aaSMark yao .mipi_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 15), 9911f6c62caSNickey Yang .rgb_pin_pol = VOP_REG(RK3328_DSP_CTRL1, 0x7, 16), 9921f6c62caSNickey Yang .hdmi_pin_pol = VOP_REG(RK3328_DSP_CTRL1, 0x7, 20), 9931f6c62caSNickey Yang .edp_pin_pol = VOP_REG(RK3328_DSP_CTRL1, 0x7, 24), 9941f6c62caSNickey Yang .mipi_pin_pol = VOP_REG(RK3328_DSP_CTRL1, 0x7, 28), 995eb5cb6aaSMark yao }; 996eb5cb6aaSMark yao 997eb5cb6aaSMark yao static const struct vop_misc rk3328_misc = { 998eb5cb6aaSMark yao .global_regdone_en = VOP_REG(RK3328_SYS_CTRL, 0x1, 11), 999eb5cb6aaSMark yao }; 1000eb5cb6aaSMark yao 1001eb5cb6aaSMark yao static const struct vop_common rk3328_common = { 1002eb5cb6aaSMark yao .standby = VOP_REG_SYNC(RK3328_SYS_CTRL, 0x1, 22), 1003a5c0fa44SUrja Rannikko .dither_down_sel = VOP_REG(RK3328_DSP_CTRL1, 0x1, 4), 1004a5c0fa44SUrja Rannikko .dither_down_mode = VOP_REG(RK3328_DSP_CTRL1, 0x1, 3), 1005a5c0fa44SUrja Rannikko .dither_down_en = VOP_REG(RK3328_DSP_CTRL1, 0x1, 2), 1006a5c0fa44SUrja Rannikko .pre_dither_down = VOP_REG(RK3328_DSP_CTRL1, 0x1, 1), 1007eb5cb6aaSMark yao .dither_up = VOP_REG(RK3328_DSP_CTRL1, 0x1, 6), 1008eb5cb6aaSMark yao .dsp_blank = VOP_REG(RK3328_DSP_CTRL0, 0x3, 18), 1009eb5cb6aaSMark yao .out_mode = VOP_REG(RK3328_DSP_CTRL0, 0xf, 0), 1010eb5cb6aaSMark yao .cfg_done = VOP_REG_SYNC(RK3328_REG_CFG_DONE, 0x1, 0), 1011eb5cb6aaSMark yao }; 1012eb5cb6aaSMark yao 1013eb5cb6aaSMark yao static const struct vop_intr rk3328_vop_intr = { 1014eb5cb6aaSMark yao .intrs = rk3368_vop_intrs, 1015eb5cb6aaSMark yao .nintrs = ARRAY_SIZE(rk3368_vop_intrs), 1016eb5cb6aaSMark yao .line_flag_num[0] = VOP_REG(RK3328_LINE_FLAG, 0xffff, 0), 1017eb5cb6aaSMark yao .line_flag_num[1] = VOP_REG(RK3328_LINE_FLAG, 0xffff, 16), 1018eb5cb6aaSMark yao .status = VOP_REG_MASK_SYNC(RK3328_INTR_STATUS0, 0xffff, 0), 1019eb5cb6aaSMark yao .enable = VOP_REG_MASK_SYNC(RK3328_INTR_EN0, 0xffff, 0), 1020eb5cb6aaSMark yao .clear = VOP_REG_MASK_SYNC(RK3328_INTR_CLEAR0, 0xffff, 0), 1021eb5cb6aaSMark yao }; 1022eb5cb6aaSMark yao 1023eb5cb6aaSMark yao static const struct vop_win_data rk3328_vop_win_data[] = { 1024fbb1c738SEzequiel Garcia { .base = 0xd0, .phy = &rk3368_win01_data, 1025eb5cb6aaSMark yao .type = DRM_PLANE_TYPE_PRIMARY }, 1026fbb1c738SEzequiel Garcia { .base = 0x1d0, .phy = &rk3368_win01_data, 1027eb5cb6aaSMark yao .type = DRM_PLANE_TYPE_OVERLAY }, 1028fbb1c738SEzequiel Garcia { .base = 0x2d0, .phy = &rk3368_win01_data, 1029eb5cb6aaSMark yao .type = DRM_PLANE_TYPE_CURSOR }, 1030eb5cb6aaSMark yao }; 1031eb5cb6aaSMark yao 1032eb5cb6aaSMark yao static const struct vop_data rk3328_vop = { 1033eb5cb6aaSMark yao .version = VOP_VERSION(3, 8), 1034eb5cb6aaSMark yao .feature = VOP_FEATURE_OUTPUT_RGB10, 1035eb5cb6aaSMark yao .intr = &rk3328_vop_intr, 1036eb5cb6aaSMark yao .common = &rk3328_common, 1037eb5cb6aaSMark yao .modeset = &rk3328_modeset, 1038eb5cb6aaSMark yao .output = &rk3328_output, 1039eb5cb6aaSMark yao .misc = &rk3328_misc, 1040eb5cb6aaSMark yao .win = rk3328_vop_win_data, 1041eb5cb6aaSMark yao .win_size = ARRAY_SIZE(rk3328_vop_win_data), 1042eb5cb6aaSMark yao }; 1043eb5cb6aaSMark yao 1044a67719d1SMark Yao static const struct of_device_id vop_driver_dt_match[] = { 1045f7673453SMark Yao { .compatible = "rockchip,rk3036-vop", 1046f7673453SMark Yao .data = &rk3036_vop }, 1047460c3b00SSandy Huang { .compatible = "rockchip,rk3126-vop", 1048460c3b00SSandy Huang .data = &rk3126_vop }, 1049570913e0SSandy Huang { .compatible = "rockchip,px30-vop-big", 1050570913e0SSandy Huang .data = &px30_vop_big }, 1051570913e0SSandy Huang { .compatible = "rockchip,px30-vop-lit", 1052570913e0SSandy Huang .data = &px30_vop_lit }, 1053f4a6de85SMark Yao { .compatible = "rockchip,rk3066-vop", 1054f4a6de85SMark Yao .data = &rk3066_vop }, 1055428e15ccSHeiko Stuebner { .compatible = "rockchip,rk3188-vop", 1056428e15ccSHeiko Stuebner .data = &rk3188_vop }, 1057b51502adSMark Yao { .compatible = "rockchip,rk3288-vop", 1058b51502adSMark Yao .data = &rk3288_vop }, 1059eb5cb6aaSMark yao { .compatible = "rockchip,rk3368-vop", 1060eb5cb6aaSMark yao .data = &rk3368_vop }, 1061eb5cb6aaSMark yao { .compatible = "rockchip,rk3366-vop", 1062eb5cb6aaSMark yao .data = &rk3366_vop }, 10630a63bfd0SMark Yao { .compatible = "rockchip,rk3399-vop-big", 10640a63bfd0SMark Yao .data = &rk3399_vop_big }, 10650a63bfd0SMark Yao { .compatible = "rockchip,rk3399-vop-lit", 10660a63bfd0SMark Yao .data = &rk3399_vop_lit }, 1067eb5cb6aaSMark yao { .compatible = "rockchip,rk3228-vop", 1068eb5cb6aaSMark yao .data = &rk3228_vop }, 1069eb5cb6aaSMark yao { .compatible = "rockchip,rk3328-vop", 1070eb5cb6aaSMark yao .data = &rk3328_vop }, 1071a67719d1SMark Yao {}, 1072a67719d1SMark Yao }; 1073a67719d1SMark Yao MODULE_DEVICE_TABLE(of, vop_driver_dt_match); 1074a67719d1SMark Yao 1075a67719d1SMark Yao static int vop_probe(struct platform_device *pdev) 1076a67719d1SMark Yao { 1077a67719d1SMark Yao struct device *dev = &pdev->dev; 1078a67719d1SMark Yao 1079a67719d1SMark Yao if (!dev->of_node) { 1080d8dd6804SHaneen Mohammed DRM_DEV_ERROR(dev, "can't find vop devices\n"); 1081a67719d1SMark Yao return -ENODEV; 1082a67719d1SMark Yao } 1083a67719d1SMark Yao 1084a67719d1SMark Yao return component_add(dev, &vop_component_ops); 1085a67719d1SMark Yao } 1086a67719d1SMark Yao 1087a67719d1SMark Yao static int vop_remove(struct platform_device *pdev) 1088a67719d1SMark Yao { 1089a67719d1SMark Yao component_del(&pdev->dev, &vop_component_ops); 1090a67719d1SMark Yao 1091a67719d1SMark Yao return 0; 1092a67719d1SMark Yao } 1093a67719d1SMark Yao 10948820b68bSJeffy Chen struct platform_driver vop_platform_driver = { 1095a67719d1SMark Yao .probe = vop_probe, 1096a67719d1SMark Yao .remove = vop_remove, 1097a67719d1SMark Yao .driver = { 1098a67719d1SMark Yao .name = "rockchip-vop", 1099a67719d1SMark Yao .of_match_table = of_match_ptr(vop_driver_dt_match), 1100a67719d1SMark Yao }, 1101a67719d1SMark Yao }; 1102