1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd 3*4882a593Smuzhiyun * Author: 4*4882a593Smuzhiyun * algea cao <algea.cao@rock-chips.com> 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * This software is licensed under the terms of the GNU General Public 7*4882a593Smuzhiyun * License version 2, as published by the Free Software Foundation, and 8*4882a593Smuzhiyun * may be copied, distributed, and modified under those terms. 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, 11*4882a593Smuzhiyun * but WITHOUT ANY WARRANTY; without even the implied warranty of 12*4882a593Smuzhiyun * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*4882a593Smuzhiyun * GNU General Public License for more details. 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun #ifndef __ROCKCHIP_DRM_TVE_H__ 16*4882a593Smuzhiyun #define __ROCKCHIP_DRM_TVE_H__ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define RK3036_GRF_SOC_CON3 0x0154 19*4882a593Smuzhiyun #define RK312X_GRF_TVE_CON 0x0170 20*4882a593Smuzhiyun #define m_EXTREF_EN BIT(0) 21*4882a593Smuzhiyun #define m_VBG_EN BIT(1) 22*4882a593Smuzhiyun #define m_DAC_EN BIT(2) 23*4882a593Smuzhiyun #define m_SENSE_EN BIT(3) 24*4882a593Smuzhiyun #define m_BIAS_EN (7 << 4) 25*4882a593Smuzhiyun #define m_DAC_GAIN (0x3f << 7) 26*4882a593Smuzhiyun #define v_DAC_GAIN(x) (((x) & 0x3f) << 7) 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define TV_CTRL (0x00) 29*4882a593Smuzhiyun #define m_CVBS_MODE BIT(24) 30*4882a593Smuzhiyun #define m_CLK_UPSTREAM_EN (3 << 18) 31*4882a593Smuzhiyun #define m_TIMING_EN (3 << 16) 32*4882a593Smuzhiyun #define m_LUMA_FILTER_GAIN (3 << 9) 33*4882a593Smuzhiyun #define m_LUMA_FILTER_BW BIT(8) 34*4882a593Smuzhiyun #define m_CSC_PATH (3 << 1) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #define v_CVBS_MODE(x) (((x) & 1) << 24) 37*4882a593Smuzhiyun #define v_CLK_UPSTREAM_EN(x) (((x) & 3) << 18) 38*4882a593Smuzhiyun #define v_TIMING_EN(x) (((x) & 3) << 16) 39*4882a593Smuzhiyun #define v_LUMA_FILTER_GAIN(x) (((x) & 3) << 9) 40*4882a593Smuzhiyun #define v_LUMA_FILTER_UPSAMPLE(x) (((x) & 1) << 8) 41*4882a593Smuzhiyun #define v_CSC_PATH(x) (((x) & 3) << 1) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define TV_SYNC_TIMING (0x04) 44*4882a593Smuzhiyun #define TV_ACT_TIMING (0x08) 45*4882a593Smuzhiyun #define TV_ADJ_TIMING (0x0c) 46*4882a593Smuzhiyun #define TV_FREQ_SC (0x10) 47*4882a593Smuzhiyun #define TV_LUMA_FILTER0 (0x14) 48*4882a593Smuzhiyun #define TV_LUMA_FILTER1 (0x18) 49*4882a593Smuzhiyun #define TV_LUMA_FILTER2 (0x1C) 50*4882a593Smuzhiyun #define TV_ACT_ST (0x34) 51*4882a593Smuzhiyun #define TV_ROUTING (0x38) 52*4882a593Smuzhiyun #define m_DAC_SENSE_EN BIT(27) 53*4882a593Smuzhiyun #define m_Y_IRE_7_5 BIT(19) 54*4882a593Smuzhiyun #define m_Y_AGC_PULSE_ON BIT(15) 55*4882a593Smuzhiyun #define m_Y_VIDEO_ON BIT(11) 56*4882a593Smuzhiyun #define m_Y_SYNC_ON BIT(7) 57*4882a593Smuzhiyun #define m_YPP_MODE BIT(3) 58*4882a593Smuzhiyun #define m_MONO_EN BIT(2) 59*4882a593Smuzhiyun #define m_PIC_MODE BIT(1) 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun #define v_DAC_SENSE_EN(x) (((x) & 1) << 27) 62*4882a593Smuzhiyun #define v_Y_IRE_7_5(x) (((x) & 1) << 19) 63*4882a593Smuzhiyun #define v_Y_AGC_PULSE_ON(x) (((x) & 1) << 15) 64*4882a593Smuzhiyun #define v_Y_VIDEO_ON(x) (((x) & 1) << 11) 65*4882a593Smuzhiyun #define v_Y_SYNC_ON(x) (((x) & 1) << 7) 66*4882a593Smuzhiyun #define v_YPP_MODE(x) (((x) & 1) << 3) 67*4882a593Smuzhiyun #define v_MONO_EN(x) (((x) & 1) << 2) 68*4882a593Smuzhiyun #define v_PIC_MODE(x) (((x) & 1) << 1) 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun #define TV_SYNC_ADJUST (0x50) 71*4882a593Smuzhiyun #define TV_STATUS (0x54) 72*4882a593Smuzhiyun #define TV_RESET (0x68) 73*4882a593Smuzhiyun #define m_RESET BIT(1) 74*4882a593Smuzhiyun #define v_RESET(x) (((x) & 1) << 1) 75*4882a593Smuzhiyun #define TV_SATURATION (0x78) 76*4882a593Smuzhiyun #define TV_BW_CTRL (0x8C) 77*4882a593Smuzhiyun #define m_CHROMA_BW (3 << 4) 78*4882a593Smuzhiyun #define m_COLOR_DIFF_BW (0xf) 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun enum { 81*4882a593Smuzhiyun BP_FILTER_PASS = 0, 82*4882a593Smuzhiyun BP_FILTER_NTSC, 83*4882a593Smuzhiyun BP_FILTER_PAL, 84*4882a593Smuzhiyun }; 85*4882a593Smuzhiyun enum { 86*4882a593Smuzhiyun COLOR_DIFF_FILTER_OFF = 0, 87*4882a593Smuzhiyun COLOR_DIFF_FILTER_BW_0_6, 88*4882a593Smuzhiyun COLOR_DIFF_FILTER_BW_1_3, 89*4882a593Smuzhiyun COLOR_DIFF_FILTER_BW_2_0 90*4882a593Smuzhiyun }; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun #define v_CHROMA_BW(x) ((3 & (x)) << 4) 93*4882a593Smuzhiyun #define v_COLOR_DIFF_BW(x) (0xF & (x)) 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun #define TV_BRIGHTNESS_CONTRAST (0x90) 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun #define VDAC_VDAC0 (0x00) 98*4882a593Smuzhiyun #define m_RST_ANA BIT(7) 99*4882a593Smuzhiyun #define m_RST_DIG BIT(6) 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun #define v_RST_ANA(x) (((x) & 1) << 7) 102*4882a593Smuzhiyun #define v_RST_DIG(x) (((x) & 1) << 6) 103*4882a593Smuzhiyun #define VDAC_VDAC1 (0x280) 104*4882a593Smuzhiyun #define m_CUR_REG (0xf << 4) 105*4882a593Smuzhiyun #define m_DR_PWR_DOWN BIT(1) 106*4882a593Smuzhiyun #define m_BG_PWR_DOWN BIT(0) 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #define v_CUR_REG(x) (((x) & 0xf) << 4) 109*4882a593Smuzhiyun #define v_DR_PWR_DOWN(x) (((x) & 1) << 1) 110*4882a593Smuzhiyun #define v_BG_PWR_DOWN(x) (((x) & 1) << 0) 111*4882a593Smuzhiyun #define VDAC_VDAC2 (0x284) 112*4882a593Smuzhiyun #define m_CUR_CTR (0X3f) 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun #define v_CUR_CTR(x) (((x) & 0x3f)) 115*4882a593Smuzhiyun #define VDAC_VDAC3 (0x288) 116*4882a593Smuzhiyun #define m_CAB_EN BIT(5) 117*4882a593Smuzhiyun #define m_CAB_REF BIT(4) 118*4882a593Smuzhiyun #define m_CAB_FLAG BIT(0) 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun #define v_CAB_EN(x) (((x) & 1) << 5) 121*4882a593Smuzhiyun #define v_CAB_REF(x) (((x) & 1) << 4) 122*4882a593Smuzhiyun #define v_CAB_FLAG(x) (((x) & 1) << 0) 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun // RK3528 CVBS GRF 125*4882a593Smuzhiyun #define RK3528_VO_GRF_CVBS_CON 0x60010 126*4882a593Smuzhiyun #define m_TVE_DCLK_POL BIT(5) 127*4882a593Smuzhiyun #define m_TVE_DCLK_EN BIT(4) 128*4882a593Smuzhiyun #define m_DCLK_UPSAMPLE_2X4X BIT(3) 129*4882a593Smuzhiyun #define m_DCLK_UPSAMPLE_EN BIT(2) 130*4882a593Smuzhiyun #define m_TVE_MODE BIT(1) 131*4882a593Smuzhiyun #define m_TVE_EN BIT(0) 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun #define v_TVE_DCLK_POL(x) (((x) & 1) << 5) 134*4882a593Smuzhiyun #define v_TVE_DCLK_EN(x) (((x) & 1) << 4) 135*4882a593Smuzhiyun #define v_DCLK_UPSAMPLE_2X4X(x) (((x) & 1) << 3) 136*4882a593Smuzhiyun #define v_DCLK_UPSAMPLE_EN(x) (((x) & 1) << 2) 137*4882a593Smuzhiyun #define v_TVE_MODE(x) (((x) & 1) << 1) 138*4882a593Smuzhiyun #define v_TVE_EN(x) (((x) & 1) << 0) 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun // RK3528 CVBS BT656 141*4882a593Smuzhiyun #define BT656_DECODER_CTRL (0x3D00) 142*4882a593Smuzhiyun #define BT656_DECODER_CROP (0x3D04) 143*4882a593Smuzhiyun #define BT656_DECODER_SIZE (0x3D08) 144*4882a593Smuzhiyun #define BT656_DECODER_HTOTAL_HS_END (0x3D0C) 145*4882a593Smuzhiyun #define BT656_DECODER_VACT_ST_HACT_ST (0x3D10) 146*4882a593Smuzhiyun #define BT656_DECODER_VTOTAL_VS_END (0x3D14) 147*4882a593Smuzhiyun #define BT656_DECODER_VS_ST_END_F1 (0x3D18) 148*4882a593Smuzhiyun #define BT656_DECODER_DBG_REG (0x3D1C) 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun // RK3528 CVBS TVE 151*4882a593Smuzhiyun #define TVE_MODE_CTRL (0x3E00) 152*4882a593Smuzhiyun #define TVE_HOR_TIMING1 (0x3E04) 153*4882a593Smuzhiyun #define TVE_HOR_TIMING2 (0x3E08) 154*4882a593Smuzhiyun #define TVE_HOR_TIMING3 (0x3E0C) 155*4882a593Smuzhiyun #define TVE_SUB_CAR_FRQ (0x3E10) 156*4882a593Smuzhiyun #define TVE_LUMA_FILTER1 (0x3E14) 157*4882a593Smuzhiyun #define TVE_LUMA_FILTER2 (0x3E18) 158*4882a593Smuzhiyun #define TVE_LUMA_FILTER3 (0x3E1C) 159*4882a593Smuzhiyun #define TVE_LUMA_FILTER4 (0x3E20) 160*4882a593Smuzhiyun #define TVE_LUMA_FILTER5 (0x3E24) 161*4882a593Smuzhiyun #define TVE_LUMA_FILTER6 (0x3E28) 162*4882a593Smuzhiyun #define TVE_LUMA_FILTER7 (0x3E2C) 163*4882a593Smuzhiyun #define TVE_LUMA_FILTER8 (0x3E30) 164*4882a593Smuzhiyun #define TVE_IMAGE_POSITION (0x3E34) 165*4882a593Smuzhiyun #define TVE_ROUTING (0x3E38) 166*4882a593Smuzhiyun #define TVE_SYNC_ADJUST (0x3E50) 167*4882a593Smuzhiyun #define TVE_STATUS (0x3E54) 168*4882a593Smuzhiyun #define TVE_CTRL (0x3E68) 169*4882a593Smuzhiyun #define TVE_INTR_STATUS (0x3E6C) 170*4882a593Smuzhiyun #define TVE_INTR_EN (0x3E70) 171*4882a593Smuzhiyun #define TVE_INTR_CLR (0x3E74) 172*4882a593Smuzhiyun #define TVE_COLOR_BUSRT_SAT (0x3E78) 173*4882a593Smuzhiyun #define TVE_CHROMA_BANDWIDTH (0x3E8C) 174*4882a593Smuzhiyun #define TVE_BRIGHTNESS_CONTRAST (0x3E90) 175*4882a593Smuzhiyun #define TVE_ID (0x3E98) 176*4882a593Smuzhiyun #define TVE_REVISION (0x3E9C) 177*4882a593Smuzhiyun #define TVE_CLAMP (0x3EA0) 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun // RK3528 CVBS VDAC 180*4882a593Smuzhiyun #define VDAC_CLK_RST (0x0000) 181*4882a593Smuzhiyun #define m_ANALOG_RST BIT(7) 182*4882a593Smuzhiyun #define m_DIGITAL_RST BIT(6) 183*4882a593Smuzhiyun #define m_INPUT_CLK_INV BIT(0) 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun #define v_ANALOG_RST(x) (((x) & 1) << 7) 186*4882a593Smuzhiyun #define v_DIGITAL_RST(x) (((x) & 1) << 6) 187*4882a593Smuzhiyun #define v_INPUT_CLK_INV(x) (((x) & 1) << 0) 188*4882a593Smuzhiyun #define VDAC_SINE_CTRL (0x0004) 189*4882a593Smuzhiyun #define VDAC_SQUARE_CTRL (0x0008) 190*4882a593Smuzhiyun #define VDAC_LEVEL_CTRL0 (0x0018) 191*4882a593Smuzhiyun #define VDAC_LEVEL_CTRL1 (0x001C) 192*4882a593Smuzhiyun #define VDAC_PWM_REF_CTRL (0x0280) 193*4882a593Smuzhiyun #define m_REF_VOLTAGE (0xf << 4) 194*4882a593Smuzhiyun #define m_REF_RESISTOR BIT(3) 195*4882a593Smuzhiyun #define m_SMP_CLK_INV BIT(2) 196*4882a593Smuzhiyun #define m_DAC_PWN BIT(1) 197*4882a593Smuzhiyun #define m_BIAS_PWN BIT(0) 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun #define v_REF_VOLTAGE(x) (((x) & 0xf) << 4) 200*4882a593Smuzhiyun #define v_SMP_CLK_INV(x) (((x) & 1) << 2) 201*4882a593Smuzhiyun #define v_REF_RESISTOR(x) (((x) & 1) << 3) 202*4882a593Smuzhiyun #define v_DAC_PWN(x) (((x) & 1) << 1) 203*4882a593Smuzhiyun #define v_BIAS_PWN(x) (((x) & 1) << 0) 204*4882a593Smuzhiyun #define VDAC_CURRENT_CTRL (0x0284) 205*4882a593Smuzhiyun #define m_OUT_CURRENT (0xff << 0) 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun #define v_OUT_CURRENT(x) (((x) & 0xff) << 0) 208*4882a593Smuzhiyun #define VDAC_CABLE_CTRL (0x0288) 209*4882a593Smuzhiyun #define VDAC_VOLTAGE_CTRL (0x028C) 210*4882a593Smuzhiyun #define VDAC_BIAS_CLK_CTRL0 (0x0290) 211*4882a593Smuzhiyun #define VDAC_BIAS_CLK_CTRL1 (0x0294) 212*4882a593Smuzhiyun #define VDAC_AUTO_CLK_CTRL0 (0x0298) 213*4882a593Smuzhiyun #define VDAC_AUTO_CLK_CTRL1 (0x029C) 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun enum { 216*4882a593Smuzhiyun TVOUT_CVBS_NTSC = 0, 217*4882a593Smuzhiyun TVOUT_CVBS_PAL, 218*4882a593Smuzhiyun }; 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun enum { 221*4882a593Smuzhiyun INPUT_FORMAT_RGB = 0, 222*4882a593Smuzhiyun INPUT_FORMAT_YUV 223*4882a593Smuzhiyun }; 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun enum { 226*4882a593Smuzhiyun SOC_RK3036 = 0, 227*4882a593Smuzhiyun SOC_RK312X, 228*4882a593Smuzhiyun SOC_RK322X, 229*4882a593Smuzhiyun SOC_RK3328, 230*4882a593Smuzhiyun SOC_RK3528 231*4882a593Smuzhiyun }; 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun enum { 234*4882a593Smuzhiyun DCLK_UPSAMPLEx1 = 0, 235*4882a593Smuzhiyun DCLK_UPSAMPLEx2, 236*4882a593Smuzhiyun DCLK_UPSAMPLEx4 237*4882a593Smuzhiyun }; 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun #define grf_writel(offset, v) do { \ 240*4882a593Smuzhiyun writel_relaxed(v, RK_GRF_VIRT + (offset)); \ 241*4882a593Smuzhiyun dsb(sy); \ 242*4882a593Smuzhiyun } while (0) 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun struct rockchip_tve { 245*4882a593Smuzhiyun struct device *dev; 246*4882a593Smuzhiyun struct drm_device *drm_dev; 247*4882a593Smuzhiyun struct drm_connector connector; 248*4882a593Smuzhiyun struct drm_encoder encoder; 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun u32 tv_format; 251*4882a593Smuzhiyun void __iomem *regbase; 252*4882a593Smuzhiyun void __iomem *vdacbase; 253*4882a593Smuzhiyun struct clk *aclk; 254*4882a593Smuzhiyun struct clk *hclk; 255*4882a593Smuzhiyun struct clk *pclk_vdac; 256*4882a593Smuzhiyun struct clk *dclk; 257*4882a593Smuzhiyun struct clk *dclk_4x; 258*4882a593Smuzhiyun struct regmap *dac_grf; 259*4882a593Smuzhiyun u32 reg_phy_base; 260*4882a593Smuzhiyun u32 len; 261*4882a593Smuzhiyun int input_format; 262*4882a593Smuzhiyun int soc_type; 263*4882a593Smuzhiyun int upsample_mode; 264*4882a593Smuzhiyun bool enable; 265*4882a593Smuzhiyun u32 test_mode; 266*4882a593Smuzhiyun u32 saturation; 267*4882a593Smuzhiyun u32 brightcontrast; 268*4882a593Smuzhiyun u32 adjtiming; 269*4882a593Smuzhiyun u32 lumafilter0; 270*4882a593Smuzhiyun u32 lumafilter1; 271*4882a593Smuzhiyun u32 lumafilter2; 272*4882a593Smuzhiyun u32 lumafilter3; 273*4882a593Smuzhiyun u32 lumafilter4; 274*4882a593Smuzhiyun u32 lumafilter5; 275*4882a593Smuzhiyun u32 lumafilter6; 276*4882a593Smuzhiyun u32 lumafilter7; 277*4882a593Smuzhiyun u32 daclevel; 278*4882a593Smuzhiyun u32 dac1level; 279*4882a593Smuzhiyun u32 preferred_mode; 280*4882a593Smuzhiyun u8 vdac_out_current; 281*4882a593Smuzhiyun struct mutex suspend_lock; /* mutex for tve resume operation*/ 282*4882a593Smuzhiyun struct rockchip_drm_sub_dev sub_dev; 283*4882a593Smuzhiyun }; 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun #endif /* _ROCKCHIP_DRM_TVE_ */ 286