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