1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef ROCKCHIP_MIPI_CSI_TX 7*4882a593Smuzhiyun #define ROCKCHIP_MIPI_CSI_TX 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #define DRIVER_NAME "rockchip-mipi-csi" 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define CSITX_CONFIG_DONE 0x0000 12*4882a593Smuzhiyun #define m_CONFIG_DONE BIT(0) 13*4882a593Smuzhiyun #define m_CONFIG_DONE_IMD BIT(4) 14*4882a593Smuzhiyun #define m_CONFIG_DONE_MODE BIT(8) 15*4882a593Smuzhiyun #define v_CONFIG_DONE(x) (((x) & 0x1) << 0) 16*4882a593Smuzhiyun #define v_CONFIG_DONE_IMD(x) (((x) & 0x1) << 4) 17*4882a593Smuzhiyun #define v_CONFIG_DONE_MODE(x) (((x) & 0x1) << 8) 18*4882a593Smuzhiyun enum CONFIG_DONE_MODE { 19*4882a593Smuzhiyun FRAME_END_RX_MODE, 20*4882a593Smuzhiyun FRAME_END_TX_MODE 21*4882a593Smuzhiyun }; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define CSITX_ENABLE 0x0004 24*4882a593Smuzhiyun #define m_CSITX_EN BIT(0) 25*4882a593Smuzhiyun #define m_CPHY_EN BIT(1) 26*4882a593Smuzhiyun #define m_DPHY_EN BIT(2) 27*4882a593Smuzhiyun #define m_LANE_NUM GENMASK(5, 4) 28*4882a593Smuzhiyun #define m_IDI_48BIT_EN BIT(9) 29*4882a593Smuzhiyun #define v_CSITX_EN(x) (((x) & 0x1) << 0) 30*4882a593Smuzhiyun #define v_CPHY_EN(x) (((x) & 0x1) << 1) 31*4882a593Smuzhiyun #define v_DPHY_EN(x) (((x) & 0x1) << 2) 32*4882a593Smuzhiyun #define v_LANE_NUM(x) (((x) & 0x3) << 4) 33*4882a593Smuzhiyun #define v_IDI_48BIT_EN(x) (((x) & 0x1) << 9) 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define CSITX_VERSION 0x0008 36*4882a593Smuzhiyun #define CSITX_SYS_CTRL0 0x0010 37*4882a593Smuzhiyun #define m_SOFT_RESET BIT(0) 38*4882a593Smuzhiyun #define v_SOFT_RESET(x) (((x) & 0x1) << 0) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define CSITX_SYS_CTRL1 0x0014 41*4882a593Smuzhiyun #define m_BYPASS_SELECT BIT(0) 42*4882a593Smuzhiyun #define v_BYPASS_SELECT(x) (((x) & 0x1) << 0) 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define CSITX_SYS_CTRL2 0x0018 45*4882a593Smuzhiyun #define m_VSYNC_ENABLE BIT(0) 46*4882a593Smuzhiyun #define m_HSYNC_ENABLE BIT(1) 47*4882a593Smuzhiyun #define m_IDI_WHOLE_FRM_EN BIT(4) 48*4882a593Smuzhiyun #define m_VOP_WHOLE_FRM_EN BIT(5) 49*4882a593Smuzhiyun #define v_VSYNC_ENABLE(x) (((x) & 0x1) << 0) 50*4882a593Smuzhiyun #define v_HSYNC_ENABLE(x) (((x) & 0x1) << 1) 51*4882a593Smuzhiyun #define v_IDI_WHOLE_FRM_EN(x) (((x) & 0x1) << 4) 52*4882a593Smuzhiyun #define v_VOP_WHOLE_FRM_EN(x) (((x) & 0x1) << 5) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun #define CSITX_SYS_CTRL3 0x001c 55*4882a593Smuzhiyun #define m_NON_CONTINUES_MODE_EN BIT(0) 56*4882a593Smuzhiyun #define m_CONT_MODE_CLK_SET BIT(4) 57*4882a593Smuzhiyun #define m_CONT_MODE_CLK_CLR BIT(8) 58*4882a593Smuzhiyun #define v_NON_CONTINUES_MODE_EN(x) (((x) & 0x1) << 0) 59*4882a593Smuzhiyun #define v_CONT_MODE_CLK_SET(x) (((x) & 0x1) << 4) 60*4882a593Smuzhiyun #define v_CONT_MODE_CLK_CLR(x) (((x) & 0x1) << 8) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define CSITX_TIMING_CTRL 0x0020 63*4882a593Smuzhiyun #define CSITX_TIMING_VPW_NUM 0x0024 64*4882a593Smuzhiyun #define CSITX_TIMING_VBP_NUM 0x0028 65*4882a593Smuzhiyun #define CSITX_TIMING_VFP_NUM 0x002c 66*4882a593Smuzhiyun #define CSITX_TIMING_HPW_PADDING_NUM 0x0030 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define CSITX_VOP_PATH_CTRL 0x0040 69*4882a593Smuzhiyun #define m_VOP_PATH_EN BIT(0) 70*4882a593Smuzhiyun #define m_VOP_DT_USERDEFINE_EN BIT(1) 71*4882a593Smuzhiyun #define m_VOP_VC_USERDEFINE_EN BIT(2) 72*4882a593Smuzhiyun #define m_VOP_WC_USERDEFINE_EN BIT(3) 73*4882a593Smuzhiyun #define m_PIXEL_FORMAT GENMASK(7, 4) 74*4882a593Smuzhiyun #define m_VOP_DT_USERDEFINE GENMASK(13, 8) 75*4882a593Smuzhiyun #define m_VOP_VC_USERDEFINE GENMASK(15, 14) 76*4882a593Smuzhiyun #define m_VOP_WC_USERDEFINE GENMASK(31, 16) 77*4882a593Smuzhiyun #define v_VOP_PATH_EN(x) (((x) & 0x1) << 0) 78*4882a593Smuzhiyun #define v_VOP_DT_USERDEFINE_EN(x) (((x) & 0x1) << 1) 79*4882a593Smuzhiyun #define v_VOP_VC_USERDEFINE_EN(x) (((x) & 0x1) << 2) 80*4882a593Smuzhiyun #define v_VOP_WC_USERDEFINE_EN(x) (((x) & 0x1) << 3) 81*4882a593Smuzhiyun #define v_PIXEL_FORMAT(x) (((x) & 0xf) << 4) 82*4882a593Smuzhiyun #define v_VOP_DT_USERDEFINE(x) (((x) & 0x3f) << 8) 83*4882a593Smuzhiyun #define v_VOP_VC_USERDEFINE(x) (((x) & 0x3) << 14) 84*4882a593Smuzhiyun #define v_VOP_WC_USERDEFINE(x) (((x) & 0xffff) << 16) 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun #define CSITX_VOP_PATH_PKT_CTRL 0x0050 87*4882a593Smuzhiyun #define m_VOP_LINE_PADDING_EN BIT(4) 88*4882a593Smuzhiyun #define m_VOP_LINE_PADDING_NUM GENMASK(7, 5) 89*4882a593Smuzhiyun #define m_VOP_PKT_PADDING_EN BIT(8) 90*4882a593Smuzhiyun #define m_VOP_WC_ACTIVE GENMASK(31, 16) 91*4882a593Smuzhiyun #define v_VOP_LINE_PADDING_EN(x) (((x) & 0x1) << 4) 92*4882a593Smuzhiyun #define v_VOP_LINE_PADDING_NUM(x) (((x) & 0x7) << 5) 93*4882a593Smuzhiyun #define v_VOP_PKT_PADDING_EN(x) (((x) & 0x1) << 8) 94*4882a593Smuzhiyun #define v_VOP_WC_ACTIVE(x) (((x) & 0xff) << 16) 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun #define CSITX_BYPASS_PATH_CTRL 0x0060 97*4882a593Smuzhiyun #define m_BYPASS_PATH_EN BIT(0) 98*4882a593Smuzhiyun #define m_BYPASS_DT_USERDEFINE_EN BIT(1) 99*4882a593Smuzhiyun #define m_BYPASS_VC_USERDEFINE_EN BIT(2) 100*4882a593Smuzhiyun #define m_BYPASS_WC_USERDEFINE_EN BIT(3) 101*4882a593Smuzhiyun #define m_CAM_FORMAT GENMASK(7, 4) 102*4882a593Smuzhiyun #define m_BYPASS_DT_USERDEFINE GENMASK(13, 8) 103*4882a593Smuzhiyun #define m_BYPASS_VC_USERDEFINE GENMASK(15, 14) 104*4882a593Smuzhiyun #define m_BYPASS_WC_USERDEFINE GENMASK(31, 16) 105*4882a593Smuzhiyun #define v_BYPASS_PATH_EN(x) (((x) & 0x1) << 0) 106*4882a593Smuzhiyun #define v_BYPASS_DT_USERDEFINE_EN(x) (((x) & 0x1) << 1) 107*4882a593Smuzhiyun #define v_BYPASS_VC_USERDEFINE_EN(x) (((x) & 0x1) << 2) 108*4882a593Smuzhiyun #define v_BYPASS_WC_USERDEFINE_EN(x) (((x) & 0x1) << 3) 109*4882a593Smuzhiyun #define v_CAM_FORMAT(x) (((x) & 0xf) << 4) 110*4882a593Smuzhiyun #define v_BYPASS_DT_USERDEFINE(x) (((x) & 0x3f) << 8) 111*4882a593Smuzhiyun #define v_BYPASS_VC_USERDEFINE(x) (((x) & 0x3) << 14) 112*4882a593Smuzhiyun #define v_BYPASS_WC_USERDEFINE(x) (((x) & 0xff) << 16) 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun #define CSITX_BYPASS_PATH_PKT_CTRL 0x0064 115*4882a593Smuzhiyun #define m_BYPASS_LINE_PADDING_EN BIT(4) 116*4882a593Smuzhiyun #define m_BYPASS_LINE_PADDING_NUM GENMASK(7, 5) 117*4882a593Smuzhiyun #define m_BYPASS_PKT_PADDING_EN BIT(8) 118*4882a593Smuzhiyun #define m_BYPASS_WC_ACTIVE GENMASK(31, 16) 119*4882a593Smuzhiyun #define v_BYPASS_LINE_PADDING_EN(x) (((x) & 0x1) << 4) 120*4882a593Smuzhiyun #define v_BYPASS_LINE_PADDING_NUM(x) (((x) & 0x7) << 5) 121*4882a593Smuzhiyun #define v_BYPASS_PKT_PADDING_EN(x) (((x) & 0x1) << 8) 122*4882a593Smuzhiyun #define v_BYPASS_WC_ACTIVE(x) (((x) & 0xff) << 16) 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun #define CSITX_STATUS0 0x0070 125*4882a593Smuzhiyun #define CSITX_STATUS1 0x0074 126*4882a593Smuzhiyun #define m_DPHY_PLL_LOCK BIT(0) 127*4882a593Smuzhiyun #define m_STOPSTATE_CLK BIT(1) 128*4882a593Smuzhiyun #define m_STOPSTATE_LANE GENMASK(7, 4) 129*4882a593Smuzhiyun #define PHY_STOPSTATELANE (m_STOPSTATE_CLK | m_STOPSTATE_LANE) 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun #define CSITX_STATUS2 0x0078 132*4882a593Smuzhiyun #define CSITX_LINE_FLAG_NUM 0x007c 133*4882a593Smuzhiyun #define CSITX_INTR_EN 0x0080 134*4882a593Smuzhiyun #define m_INTR_MASK GENMASK(26, 16) 135*4882a593Smuzhiyun #define m_FRM_ST_RX BIT(0 + 16) 136*4882a593Smuzhiyun #define m_FRM_END_RX BIT(1 + 16) 137*4882a593Smuzhiyun #define m_LINE_END_TX BIT(2 + 16) 138*4882a593Smuzhiyun #define m_FRM_ST_TX BIT(3 + 16) 139*4882a593Smuzhiyun #define m_FRM_END_TX BIT(4 + 16) 140*4882a593Smuzhiyun #define m_LINE_END_RX BIT(5 + 16) 141*4882a593Smuzhiyun #define m_LINE_FLAG0 BIT(6 + 16) 142*4882a593Smuzhiyun #define m_LINE_FLAG1 BIT(7 + 16) 143*4882a593Smuzhiyun #define m_STOP_STATE BIT(8 + 16) 144*4882a593Smuzhiyun #define m_PLL_LOCK BIT(9 + 16) 145*4882a593Smuzhiyun #define m_CSITX_IDLE BIT(10 + 16) 146*4882a593Smuzhiyun #define v_FRM_ST_RX(x) (((x) & 0x1) << 0) 147*4882a593Smuzhiyun #define v_FRM_END_RX(x) (((x) & 0x1) << 1) 148*4882a593Smuzhiyun #define v_LINE_END_TX(x) (((x) & 0x1) << 2) 149*4882a593Smuzhiyun #define v_FRM_ST_TX(x) (((x) & 0x1) << 3) 150*4882a593Smuzhiyun #define v_FRM_END_TX(x) (((x) & 0x1) << 4) 151*4882a593Smuzhiyun #define v_LINE_END_RX(x) (((x) & 0x1) << 5) 152*4882a593Smuzhiyun #define v_LINE_FLAG0(x) (((x) & 0x1) << 6) 153*4882a593Smuzhiyun #define v_LINE_FLAG1(x) (((x) & 0x1) << 7) 154*4882a593Smuzhiyun #define v_STOP_STATE(x) (((x) & 0x1) << 8) 155*4882a593Smuzhiyun #define v_PLL_LOCK(x) (((x) & 0x1) << 9) 156*4882a593Smuzhiyun #define v_CSITX_IDLE(x) (((x) & 0x1) << 10) 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun #define CSITX_INTR_CLR 0x0084 159*4882a593Smuzhiyun #define CSITX_INTR_STATUS 0x0088 160*4882a593Smuzhiyun #define CSITX_INTR_RAW_STATUS 0x008c 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun #define CSITX_ERR_INTR_EN 0x0090 163*4882a593Smuzhiyun #define m_ERR_INTR_EN GENMASK(11, 0) 164*4882a593Smuzhiyun #define m_ERR_INTR_MASK GENMASK(27, 16) 165*4882a593Smuzhiyun #define m_IDI_HDR_FIFO_OVERFLOW BIT(0 + 16) 166*4882a593Smuzhiyun #define m_IDI_HDR_FIFO_UNDERFLOW BIT(1 + 16) 167*4882a593Smuzhiyun #define m_IDI_PLD_FIFO_OVERFLOW BIT(2 + 16) 168*4882a593Smuzhiyun #define m_IDI_PLD_FIFO_UNDERFLOW BIT(3 + 16) 169*4882a593Smuzhiyun #define m_HDR_FIFO_OVERFLOW BIT(4 + 16) 170*4882a593Smuzhiyun #define m_HDR_FIFO_UNDERFLOW BIT(5 + 16) 171*4882a593Smuzhiyun #define m_PLD_FIFO_OVERFLOW BIT(6 + 16) 172*4882a593Smuzhiyun #define m_PLD_FIFO_UNDERFLOW BIT(7 + 16) 173*4882a593Smuzhiyun #define m_OUTBUFFER_OVERFLOW BIT(8 + 16) 174*4882a593Smuzhiyun #define m_OUTBUFFER_UNDERFLOW BIT(9 + 16) 175*4882a593Smuzhiyun #define m_TX_TXREADYHS_OVERFLOW BIT(10 + 16) 176*4882a593Smuzhiyun #define m_TX_TXREADYHS_UNDERFLOW BIT(11 + 16) 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun #define CSITX_ERR_INTR_CLR 0x0094 179*4882a593Smuzhiyun #define CSITX_ERR_INTR_STATUS 0x0098 180*4882a593Smuzhiyun #define CSITX_ERR_INTR_RAW_STATUS 0x009c 181*4882a593Smuzhiyun #define CSITX_ULPS_CTRL 0x00a0 182*4882a593Smuzhiyun #define CSITX_LPDT_CTRL 0x00a4 183*4882a593Smuzhiyun #define CSITX_LPDT_DATA 0x00a8 184*4882a593Smuzhiyun #define CSITX_DPHY_CTRL 0x00b0 185*4882a593Smuzhiyun #define m_CSITX_ENABLE_PHY GENMASK(7, 3) 186*4882a593Smuzhiyun #define v_CSITX_ENABLE_PHY(x) (((x) & 0x1f) << 3) 187*4882a593Smuzhiyun #define CSITX_DPHY_PPI_CTRL 0x00b4 188*4882a593Smuzhiyun #define CSITX_DPHY_TEST_CTRL 0x00b8 189*4882a593Smuzhiyun #define CSITX_DPHY_ERROR 0x00bc 190*4882a593Smuzhiyun #define CSITX_DPHY_SCAN_CTRL 0x00c0 191*4882a593Smuzhiyun #define CSITX_DPHY_SCANIN 0x00c4 192*4882a593Smuzhiyun #define CSITX_DPHY_SCANOUT 0x00c8 193*4882a593Smuzhiyun #define CSITX_DPHY_BIST 0x00d0 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun #define MIPI_CSI_FMT_RAW8 0x10 196*4882a593Smuzhiyun #define MIPI_CSI_FMT_RAW10 0x11 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun #define PHY_STATUS_TIMEOUT_US 10000 199*4882a593Smuzhiyun #define CMD_PKT_STATUS_TIMEOUT_US 20000 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun #define RK_CSI_TX_MAX_RESET 5 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun enum soc_type { 204*4882a593Smuzhiyun RK1808, 205*4882a593Smuzhiyun }; 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun enum csi_path_mode { 208*4882a593Smuzhiyun VOP_PATH, 209*4882a593Smuzhiyun BYPASS_PATH 210*4882a593Smuzhiyun }; 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun #define GRF_REG_FIELD(reg, lsb, msb) ((reg << 16) | (lsb << 8) | (msb)) 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun enum grf_reg_fields { 215*4882a593Smuzhiyun DPIUPDATECFG, 216*4882a593Smuzhiyun DPISHUTDN, 217*4882a593Smuzhiyun DPICOLORM, 218*4882a593Smuzhiyun VOPSEL, 219*4882a593Smuzhiyun TURNREQUEST, 220*4882a593Smuzhiyun TURNDISABLE, 221*4882a593Smuzhiyun FORCETXSTOPMODE, 222*4882a593Smuzhiyun FORCERXMODE, 223*4882a593Smuzhiyun ENABLE_N, 224*4882a593Smuzhiyun MASTERSLAVEZ, 225*4882a593Smuzhiyun ENABLECLK, 226*4882a593Smuzhiyun BASEDIR, 227*4882a593Smuzhiyun DPHY_SEL, 228*4882a593Smuzhiyun TXSKEWCALHS, 229*4882a593Smuzhiyun MAX_FIELDS, 230*4882a593Smuzhiyun }; 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun struct rockchip_mipi_csi_plat_data { 233*4882a593Smuzhiyun const u32 *csi0_grf_reg_fields; 234*4882a593Smuzhiyun const u32 *csi1_grf_reg_fields; 235*4882a593Smuzhiyun unsigned long max_bit_rate_per_lane; 236*4882a593Smuzhiyun enum soc_type soc_type; 237*4882a593Smuzhiyun const char * const *rsts; 238*4882a593Smuzhiyun int rsts_num; 239*4882a593Smuzhiyun }; 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun struct mipi_dphy { 242*4882a593Smuzhiyun /* SNPS PHY */ 243*4882a593Smuzhiyun struct clk *cfg_clk; 244*4882a593Smuzhiyun struct clk *ref_clk; 245*4882a593Smuzhiyun u16 input_div; 246*4882a593Smuzhiyun u16 feedback_div; 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun /* Non-SNPS PHY */ 249*4882a593Smuzhiyun struct phy *phy; 250*4882a593Smuzhiyun struct clk *hs_clk; 251*4882a593Smuzhiyun }; 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun struct rockchip_mipi_csi { 254*4882a593Smuzhiyun struct drm_encoder encoder; 255*4882a593Smuzhiyun struct drm_connector connector; 256*4882a593Smuzhiyun struct device_node *client; 257*4882a593Smuzhiyun struct mipi_dsi_host dsi_host; 258*4882a593Smuzhiyun struct mipi_dphy dphy; 259*4882a593Smuzhiyun struct drm_panel *panel; 260*4882a593Smuzhiyun struct device *dev; 261*4882a593Smuzhiyun struct regmap *grf; 262*4882a593Smuzhiyun struct reset_control *tx_rsts[RK_CSI_TX_MAX_RESET]; 263*4882a593Smuzhiyun void __iomem *regs; 264*4882a593Smuzhiyun void __iomem *test_code_regs; 265*4882a593Smuzhiyun struct regmap *regmap; 266*4882a593Smuzhiyun u32 *regsbak; 267*4882a593Smuzhiyun u32 regs_len; 268*4882a593Smuzhiyun struct clk *pclk; 269*4882a593Smuzhiyun struct clk *ref_clk; 270*4882a593Smuzhiyun int irq; 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun unsigned long mode_flags; 273*4882a593Smuzhiyun unsigned int lane_mbps; /* per lane */ 274*4882a593Smuzhiyun u32 channel; 275*4882a593Smuzhiyun u32 lanes; 276*4882a593Smuzhiyun u32 format; 277*4882a593Smuzhiyun struct drm_display_mode mode; 278*4882a593Smuzhiyun u32 path_mode; /* vop path or bypass path */ 279*4882a593Smuzhiyun struct drm_property *csi_tx_path_property; 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun const struct rockchip_mipi_csi_plat_data *pdata; 282*4882a593Smuzhiyun }; 283*4882a593Smuzhiyun 284*4882a593Smuzhiyun enum rockchip_mipi_csi_mode { 285*4882a593Smuzhiyun DSI_COMMAND_MODE, 286*4882a593Smuzhiyun DSI_VIDEO_MODE, 287*4882a593Smuzhiyun }; 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun #endif 290