1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Rockchip Vehicle driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2022 Rockchip Electronics Co., Ltd. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _VEHICLE_CSI2_DPHY_COMMON_H_ 9*4882a593Smuzhiyun #define _VEHICLE_CSI2_DPHY_COMMON_H_ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/kernel.h> 12*4882a593Smuzhiyun #include <linux/rk-camera-module.h> 13*4882a593Smuzhiyun #include <media/v4l2-subdev.h> 14*4882a593Smuzhiyun #include "vehicle_samsung_dcphy_common.h" 15*4882a593Smuzhiyun #include "../../../media/platform/rockchip/cif/mipi-csi2.h" 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* RK3562 DPHY GRF REG OFFSET */ 18*4882a593Smuzhiyun #define RK3562_GRF_VI_CON0 (0x0520) 19*4882a593Smuzhiyun #define RK3562_GRF_VI_CON1 (0x0524) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun /* GRF REG OFFSET */ 22*4882a593Smuzhiyun #define GRF_VI_CON0 (0x0340) 23*4882a593Smuzhiyun #define GRF_VI_CON1 (0x0344) 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /*RK3588 DPHY GRF REG OFFSET */ 26*4882a593Smuzhiyun #define GRF_DPHY_CON0 (0x0) 27*4882a593Smuzhiyun #define GRF_SOC_CON2 (0x0308) 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /*GRF REG BIT DEFINE */ 30*4882a593Smuzhiyun #define GRF_CSI2PHY_LANE_SEL_SPLIT (0x1) 31*4882a593Smuzhiyun #define GRF_CSI2PHY_SEL_SPLIT_0_1 (0x0) 32*4882a593Smuzhiyun #define GRF_CSI2PHY_SEL_SPLIT_2_3 BIT(0) 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /*RK3588 DCPHY GRF REG OFFSET */ 35*4882a593Smuzhiyun #define GRF_DCPHY_CON0 (0x0) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* PHY REG OFFSET */ 38*4882a593Smuzhiyun #define CSI2_DPHY_CTRL_INVALID_OFFSET (0xffff) 39*4882a593Smuzhiyun #define CSI2_DPHY_CTRL_PWRCTL \ 40*4882a593Smuzhiyun CSI2_DPHY_CTRL_INVALID_OFFSET 41*4882a593Smuzhiyun #define CSI2_DPHY_CTRL_LANE_ENABLE (0x00) 42*4882a593Smuzhiyun #define CSI2_DPHY_CLK1_LANE_EN (0x2C) 43*4882a593Smuzhiyun #define CSI2_DPHY_DUAL_CAL_EN (0x80) 44*4882a593Smuzhiyun #define CSI2_DPHY_CLK_WR_THS_SETTLE (0x160) 45*4882a593Smuzhiyun #define CSI2_DPHY_CLK_CALIB_EN (0x168) 46*4882a593Smuzhiyun #define CSI2_DPHY_LANE0_WR_THS_SETTLE (0x1e0) 47*4882a593Smuzhiyun #define CSI2_DPHY_LANE0_CALIB_EN (0x1e8) 48*4882a593Smuzhiyun #define CSI2_DPHY_LANE1_WR_THS_SETTLE (0x260) 49*4882a593Smuzhiyun #define CSI2_DPHY_LANE1_CALIB_EN (0x268) 50*4882a593Smuzhiyun #define CSI2_DPHY_LANE2_WR_THS_SETTLE (0x2e0) 51*4882a593Smuzhiyun #define CSI2_DPHY_LANE2_CALIB_EN (0x2e8) 52*4882a593Smuzhiyun #define CSI2_DPHY_LANE3_WR_THS_SETTLE (0x360) 53*4882a593Smuzhiyun #define CSI2_DPHY_LANE3_CALIB_EN (0x368) 54*4882a593Smuzhiyun #define CSI2_DPHY_CLK1_WR_THS_SETTLE (0x3e0) 55*4882a593Smuzhiyun #define CSI2_DPHY_CLK1_CALIB_EN (0x3e8) 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun //DCPHY 58*4882a593Smuzhiyun #define CSI2_DCPHY_CLK_WR_THS_SETTLE (0x030) 59*4882a593Smuzhiyun #define CSI2_DCPHY_LANE0_WR_THS_SETTLE (0x130) 60*4882a593Smuzhiyun #define CSI2_DCPHY_LANE0_WR_ERR_SOT_SYNC (0x134) 61*4882a593Smuzhiyun #define CSI2_DCPHY_LANE1_WR_THS_SETTLE (0x230) 62*4882a593Smuzhiyun #define CSI2_DCPHY_LANE1_WR_ERR_SOT_SYNC (0x234) 63*4882a593Smuzhiyun #define CSI2_DCPHY_LANE2_WR_THS_SETTLE (0x330) 64*4882a593Smuzhiyun #define CSI2_DCPHY_LANE2_WR_ERR_SOT_SYNC (0x334) 65*4882a593Smuzhiyun #define CSI2_DCPHY_LANE3_WR_THS_SETTLE (0x430) 66*4882a593Smuzhiyun #define CSI2_DCPHY_LANE3_WR_ERR_SOT_SYNC (0x434) 67*4882a593Smuzhiyun #define CSI2_DCPHY_CLK_LANE_ENABLE (0x000) 68*4882a593Smuzhiyun #define CSI2_DCPHY_DATA_LANE0_ENABLE (0x100) 69*4882a593Smuzhiyun #define CSI2_DCPHY_DATA_LANE1_ENABLE (0x200) 70*4882a593Smuzhiyun #define CSI2_DCPHY_DATA_LANE2_ENABLE (0x300) 71*4882a593Smuzhiyun #define CSI2_DCPHY_DATA_LANE3_ENABLE (0x400) 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun #define CSI2_DCPHY_S0C_GNR_CON1 (0x004) 74*4882a593Smuzhiyun #define CSI2_DCPHY_S0C_ANA_CON1 (0x00c) 75*4882a593Smuzhiyun #define CSI2_DCPHY_S0C_ANA_CON2 (0x010) 76*4882a593Smuzhiyun #define CSI2_DCPHY_S0C_ANA_CON3 (0x014) 77*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D0_GNR_CON1 (0x104) 78*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D0_ANA_CON1 (0x10c) 79*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D0_ANA_CON2 (0x110) 80*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D0_ANA_CON3 (0x114) 81*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D0_ANA_CON6 (0x120) 82*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D0_ANA_CON7 (0x124) 83*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D0_DESKEW_CON0 (0x140) 84*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D0_DESKEW_CON2 (0x148) 85*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D0_DESKEW_CON4 (0x150) 86*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D0_CRC_CON1 (0x164) 87*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D0_CRC_CON2 (0x168) 88*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D1_GNR_CON1 (0x204) 89*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D1_ANA_CON1 (0x20c) 90*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D1_ANA_CON2 (0x210) 91*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D1_ANA_CON3 (0x214) 92*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D1_ANA_CON6 (0x220) 93*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D1_ANA_CON7 (0x224) 94*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D1_DESKEW_CON0 (0x240) 95*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D1_DESKEW_CON2 (0x248) 96*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D1_DESKEW_CON4 (0x250) 97*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D1_CRC_CON1 (0x264) 98*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D1_CRC_CON2 (0x268) 99*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D2_GNR_CON1 (0x304) 100*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D2_ANA_CON1 (0x30c) 101*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D2_ANA_CON2 (0x310) 102*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D2_ANA_CON3 (0x314) 103*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D2_ANA_CON6 (0x320) 104*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D2_ANA_CON7 (0x324) 105*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D2_DESKEW_CON0 (0x340) 106*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D2_DESKEW_CON2 (0x348) 107*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D2_DESKEW_CON4 (0x350) 108*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D2_CRC_CON1 (0x364) 109*4882a593Smuzhiyun #define CSI2_DCPHY_COMBO_S0D2_CRC_CON2 (0x368) 110*4882a593Smuzhiyun #define CSI2_DCPHY_S0D3_GNR_CON1 (0x404) 111*4882a593Smuzhiyun #define CSI2_DCPHY_S0D3_ANA_CON1 (0x40c) 112*4882a593Smuzhiyun #define CSI2_DCPHY_S0D3_ANA_CON2 (0x410) 113*4882a593Smuzhiyun #define CSI2_DCPHY_S0D3_ANA_CON3 (0x414) 114*4882a593Smuzhiyun #define CSI2_DCPHY_S0D3_DESKEW_CON0 (0x440) 115*4882a593Smuzhiyun #define CSI2_DCPHY_S0D3_DESKEW_CON2 (0x448) 116*4882a593Smuzhiyun #define CSI2_DCPHY_S0D3_DESKEW_CON4 (0x450) 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* PHY REG BIT DEFINE */ 119*4882a593Smuzhiyun #define CSI2_DPHY_LANE_MODE_FULL (0x4) 120*4882a593Smuzhiyun #define CSI2_DPHY_LANE_MODE_SPLIT (0x2) 121*4882a593Smuzhiyun #define CSI2_DPHY_LANE_SPLIT_TOP (0x1) 122*4882a593Smuzhiyun #define CSI2_DPHY_LANE_SPLIT_BOT (0x2) 123*4882a593Smuzhiyun #define CSI2_DPHY_LANE_SPLIT_LANE0_1 (0x3 << 2) 124*4882a593Smuzhiyun #define CSI2_DPHY_LANE_SPLIT_LANE2_3 (0x3 << 4) 125*4882a593Smuzhiyun #define CSI2_DPHY_LANE_DUAL_MODE_EN BIT(6) 126*4882a593Smuzhiyun #define CSI2_DPHY_LANE_PARA_ARR_NUM (0x2) 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun #define CSI2_DPHY_CTRL_DATALANE_ENABLE_OFFSET_BIT 2 129*4882a593Smuzhiyun #define CSI2_DPHY_CTRL_DATALANE_SPLIT_LANE2_3_OFFSET_BIT 4 130*4882a593Smuzhiyun #define CSI2_DPHY_CTRL_CLKLANE_ENABLE_OFFSET_BIT 6 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun enum csi2_dphy_index { 133*4882a593Smuzhiyun DPHY0 = 0x0, 134*4882a593Smuzhiyun DPHY1, 135*4882a593Smuzhiyun DPHY2, 136*4882a593Smuzhiyun }; 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun enum csi2_dphy_lane { 139*4882a593Smuzhiyun CSI2_DPHY_LANE_CLOCK = 0, 140*4882a593Smuzhiyun CSI2_DPHY_LANE_CLOCK1, 141*4882a593Smuzhiyun CSI2_DPHY_LANE_DATA0, 142*4882a593Smuzhiyun CSI2_DPHY_LANE_DATA1, 143*4882a593Smuzhiyun CSI2_DPHY_LANE_DATA2, 144*4882a593Smuzhiyun CSI2_DPHY_LANE_DATA3 145*4882a593Smuzhiyun }; 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun enum grf_reg_id { 148*4882a593Smuzhiyun GRF_DPHY_RX0_TURNDISABLE = 0, 149*4882a593Smuzhiyun GRF_DPHY_RX0_FORCERXMODE, 150*4882a593Smuzhiyun GRF_DPHY_RX0_FORCETXSTOPMODE, 151*4882a593Smuzhiyun GRF_DPHY_RX0_ENABLE, 152*4882a593Smuzhiyun GRF_DPHY_RX0_TESTCLR, 153*4882a593Smuzhiyun GRF_DPHY_RX0_TESTCLK, 154*4882a593Smuzhiyun GRF_DPHY_RX0_TESTEN, 155*4882a593Smuzhiyun GRF_DPHY_RX0_TESTDIN, 156*4882a593Smuzhiyun GRF_DPHY_RX0_TURNREQUEST, 157*4882a593Smuzhiyun GRF_DPHY_RX0_TESTDOUT, 158*4882a593Smuzhiyun GRF_DPHY_TX0_TURNDISABLE, 159*4882a593Smuzhiyun GRF_DPHY_TX0_FORCERXMODE, 160*4882a593Smuzhiyun GRF_DPHY_TX0_FORCETXSTOPMODE, 161*4882a593Smuzhiyun GRF_DPHY_TX0_TURNREQUEST, 162*4882a593Smuzhiyun GRF_DPHY_TX1RX1_TURNDISABLE, 163*4882a593Smuzhiyun GRF_DPHY_TX1RX1_FORCERXMODE, 164*4882a593Smuzhiyun GRF_DPHY_TX1RX1_FORCETXSTOPMODE, 165*4882a593Smuzhiyun GRF_DPHY_TX1RX1_ENABLE, 166*4882a593Smuzhiyun GRF_DPHY_TX1RX1_MASTERSLAVEZ, 167*4882a593Smuzhiyun GRF_DPHY_TX1RX1_BASEDIR, 168*4882a593Smuzhiyun GRF_DPHY_TX1RX1_ENABLECLK, 169*4882a593Smuzhiyun GRF_DPHY_TX1RX1_TURNREQUEST, 170*4882a593Smuzhiyun GRF_DPHY_RX1_SRC_SEL, 171*4882a593Smuzhiyun /* rk3288 only */ 172*4882a593Smuzhiyun GRF_CON_DISABLE_ISP, 173*4882a593Smuzhiyun GRF_CON_ISP_DPHY_SEL, 174*4882a593Smuzhiyun GRF_DSI_CSI_TESTBUS_SEL, 175*4882a593Smuzhiyun GRF_DVP_V18SEL, 176*4882a593Smuzhiyun /* rk1808 & rk3326 & rv1126 */ 177*4882a593Smuzhiyun GRF_DPHY_CSI2PHY_FORCERXMODE, 178*4882a593Smuzhiyun GRF_DPHY_CSI2PHY_CLKLANE_EN, 179*4882a593Smuzhiyun GRF_DPHY_CSI2PHY_DATALANE_EN, 180*4882a593Smuzhiyun /* rv1126 only */ 181*4882a593Smuzhiyun GRF_DPHY_CLK_INV_SEL, 182*4882a593Smuzhiyun GRF_DPHY_SEL, 183*4882a593Smuzhiyun /* rk3368 only */ 184*4882a593Smuzhiyun GRF_ISP_MIPI_CSI_HOST_SEL, 185*4882a593Smuzhiyun /* below is for rk3399 only */ 186*4882a593Smuzhiyun GRF_DPHY_RX0_CLK_INV_SEL, 187*4882a593Smuzhiyun GRF_DPHY_RX1_CLK_INV_SEL, 188*4882a593Smuzhiyun GRF_DPHY_TX1RX1_SRC_SEL, 189*4882a593Smuzhiyun /* below is for rk3568 only */ 190*4882a593Smuzhiyun GRF_DPHY_CSI2PHY_CLKLANE1_EN, 191*4882a593Smuzhiyun GRF_DPHY_CLK1_INV_SEL, 192*4882a593Smuzhiyun GRF_DPHY_ISP_CSI2PHY_SEL, 193*4882a593Smuzhiyun GRF_DPHY_CIF_CSI2PHY_SEL, 194*4882a593Smuzhiyun GRF_DPHY_CSI2PHY_LANE_SEL, 195*4882a593Smuzhiyun GRF_DPHY_CSI2PHY1_LANE_SEL, 196*4882a593Smuzhiyun GRF_DPHY_CSI2PHY_DATALANE_EN0, 197*4882a593Smuzhiyun GRF_DPHY_CSI2PHY_DATALANE_EN1, 198*4882a593Smuzhiyun GRF_CPHY_MODE, 199*4882a593Smuzhiyun GRF_DPHY_CSIHOST2_SEL, 200*4882a593Smuzhiyun GRF_DPHY_CSIHOST3_SEL, 201*4882a593Smuzhiyun GRF_DPHY_CSIHOST4_SEL, 202*4882a593Smuzhiyun GRF_DPHY_CSIHOST5_SEL, 203*4882a593Smuzhiyun /* below is for rv1106 only */ 204*4882a593Smuzhiyun GRF_MIPI_HOST0_SEL, 205*4882a593Smuzhiyun GRF_LVDS_HOST0_SEL, 206*4882a593Smuzhiyun /* below is for rk3562 */ 207*4882a593Smuzhiyun GRF_DPHY1_CLK_INV_SEL, 208*4882a593Smuzhiyun GRF_DPHY1_CLK1_INV_SEL, 209*4882a593Smuzhiyun GRF_DPHY1_CSI2PHY_CLKLANE1_EN, 210*4882a593Smuzhiyun GRF_DPHY1_CSI2PHY_FORCERXMODE, 211*4882a593Smuzhiyun GRF_DPHY1_CSI2PHY_CLKLANE_EN, 212*4882a593Smuzhiyun GRF_DPHY1_CSI2PHY_DATALANE_EN, 213*4882a593Smuzhiyun GRF_DPHY1_CSI2PHY_DATALANE_EN0, 214*4882a593Smuzhiyun GRF_DPHY1_CSI2PHY_DATALANE_EN1, 215*4882a593Smuzhiyun }; 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun enum csi2dphy_reg_id { 218*4882a593Smuzhiyun CSI2PHY_REG_CTRL_LANE_ENABLE = 0, 219*4882a593Smuzhiyun CSI2PHY_CTRL_PWRCTL, 220*4882a593Smuzhiyun CSI2PHY_CTRL_DIG_RST, 221*4882a593Smuzhiyun CSI2PHY_CLK_THS_SETTLE, 222*4882a593Smuzhiyun CSI2PHY_LANE0_THS_SETTLE, 223*4882a593Smuzhiyun CSI2PHY_LANE1_THS_SETTLE, 224*4882a593Smuzhiyun CSI2PHY_LANE2_THS_SETTLE, 225*4882a593Smuzhiyun CSI2PHY_LANE3_THS_SETTLE, 226*4882a593Smuzhiyun CSI2PHY_CLK_CALIB_ENABLE, 227*4882a593Smuzhiyun CSI2PHY_LANE0_CALIB_ENABLE, 228*4882a593Smuzhiyun CSI2PHY_LANE1_CALIB_ENABLE, 229*4882a593Smuzhiyun CSI2PHY_LANE2_CALIB_ENABLE, 230*4882a593Smuzhiyun CSI2PHY_LANE3_CALIB_ENABLE, 231*4882a593Smuzhiyun //rv1126 only 232*4882a593Smuzhiyun CSI2PHY_MIPI_LVDS_MODEL, 233*4882a593Smuzhiyun CSI2PHY_LVDS_MODE, 234*4882a593Smuzhiyun //rk3568 only 235*4882a593Smuzhiyun CSI2PHY_DUAL_CLK_EN, 236*4882a593Smuzhiyun CSI2PHY_CLK1_THS_SETTLE, 237*4882a593Smuzhiyun CSI2PHY_CLK1_CALIB_ENABLE, 238*4882a593Smuzhiyun //rk3588 239*4882a593Smuzhiyun CSI2PHY_CLK_LANE_ENABLE, 240*4882a593Smuzhiyun CSI2PHY_CLK1_LANE_ENABLE, 241*4882a593Smuzhiyun CSI2PHY_DATA_LANE0_ENABLE, 242*4882a593Smuzhiyun CSI2PHY_DATA_LANE1_ENABLE, 243*4882a593Smuzhiyun CSI2PHY_DATA_LANE2_ENABLE, 244*4882a593Smuzhiyun CSI2PHY_DATA_LANE3_ENABLE, 245*4882a593Smuzhiyun CSI2PHY_LANE0_ERR_SOT_SYNC, 246*4882a593Smuzhiyun CSI2PHY_LANE1_ERR_SOT_SYNC, 247*4882a593Smuzhiyun CSI2PHY_LANE2_ERR_SOT_SYNC, 248*4882a593Smuzhiyun CSI2PHY_LANE3_ERR_SOT_SYNC, 249*4882a593Smuzhiyun CSI2PHY_S0C_GNR_CON1, 250*4882a593Smuzhiyun CSI2PHY_S0C_ANA_CON1, 251*4882a593Smuzhiyun CSI2PHY_S0C_ANA_CON2, 252*4882a593Smuzhiyun CSI2PHY_S0C_ANA_CON3, 253*4882a593Smuzhiyun CSI2PHY_COMBO_S0D0_GNR_CON1, 254*4882a593Smuzhiyun CSI2PHY_COMBO_S0D0_ANA_CON1, 255*4882a593Smuzhiyun CSI2PHY_COMBO_S0D0_ANA_CON2, 256*4882a593Smuzhiyun CSI2PHY_COMBO_S0D0_ANA_CON3, 257*4882a593Smuzhiyun CSI2PHY_COMBO_S0D0_ANA_CON6, 258*4882a593Smuzhiyun CSI2PHY_COMBO_S0D0_ANA_CON7, 259*4882a593Smuzhiyun CSI2PHY_COMBO_S0D0_DESKEW_CON0, 260*4882a593Smuzhiyun CSI2PHY_COMBO_S0D0_DESKEW_CON2, 261*4882a593Smuzhiyun CSI2PHY_COMBO_S0D0_DESKEW_CON4, 262*4882a593Smuzhiyun CSI2PHY_COMBO_S0D0_CRC_CON1, 263*4882a593Smuzhiyun CSI2PHY_COMBO_S0D0_CRC_CON2, 264*4882a593Smuzhiyun CSI2PHY_COMBO_S0D1_GNR_CON1, 265*4882a593Smuzhiyun CSI2PHY_COMBO_S0D1_ANA_CON1, 266*4882a593Smuzhiyun CSI2PHY_COMBO_S0D1_ANA_CON2, 267*4882a593Smuzhiyun CSI2PHY_COMBO_S0D1_ANA_CON3, 268*4882a593Smuzhiyun CSI2PHY_COMBO_S0D1_ANA_CON6, 269*4882a593Smuzhiyun CSI2PHY_COMBO_S0D1_ANA_CON7, 270*4882a593Smuzhiyun CSI2PHY_COMBO_S0D1_DESKEW_CON0, 271*4882a593Smuzhiyun CSI2PHY_COMBO_S0D1_DESKEW_CON2, 272*4882a593Smuzhiyun CSI2PHY_COMBO_S0D1_DESKEW_CON4, 273*4882a593Smuzhiyun CSI2PHY_COMBO_S0D1_CRC_CON1, 274*4882a593Smuzhiyun CSI2PHY_COMBO_S0D1_CRC_CON2, 275*4882a593Smuzhiyun CSI2PHY_COMBO_S0D2_GNR_CON1, 276*4882a593Smuzhiyun CSI2PHY_COMBO_S0D2_ANA_CON1, 277*4882a593Smuzhiyun CSI2PHY_COMBO_S0D2_ANA_CON2, 278*4882a593Smuzhiyun CSI2PHY_COMBO_S0D2_ANA_CON3, 279*4882a593Smuzhiyun CSI2PHY_COMBO_S0D2_ANA_CON6, 280*4882a593Smuzhiyun CSI2PHY_COMBO_S0D2_ANA_CON7, 281*4882a593Smuzhiyun CSI2PHY_COMBO_S0D2_DESKEW_CON0, 282*4882a593Smuzhiyun CSI2PHY_COMBO_S0D2_DESKEW_CON2, 283*4882a593Smuzhiyun CSI2PHY_COMBO_S0D2_DESKEW_CON4, 284*4882a593Smuzhiyun CSI2PHY_COMBO_S0D2_CRC_CON1, 285*4882a593Smuzhiyun CSI2PHY_COMBO_S0D2_CRC_CON2, 286*4882a593Smuzhiyun CSI2PHY_S0D3_GNR_CON1, 287*4882a593Smuzhiyun CSI2PHY_S0D3_ANA_CON1, 288*4882a593Smuzhiyun CSI2PHY_S0D3_ANA_CON2, 289*4882a593Smuzhiyun CSI2PHY_S0D3_ANA_CON3, 290*4882a593Smuzhiyun CSI2PHY_S0D3_DESKEW_CON0, 291*4882a593Smuzhiyun CSI2PHY_S0D3_DESKEW_CON2, 292*4882a593Smuzhiyun CSI2PHY_S0D3_DESKEW_CON4, 293*4882a593Smuzhiyun }; 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun #define HIWORD_UPDATE(val, mask, shift) \ 296*4882a593Smuzhiyun ((val) << (shift) | (mask) << ((shift) + 16)) 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun #define GRF_REG(_offset, _width, _shift) \ 299*4882a593Smuzhiyun { .offset = _offset, .mask = BIT(_width) - 1, .shift = _shift, } 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun #define CSI2PHY_REG(_offset) \ 302*4882a593Smuzhiyun { .offset = _offset, } 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun /* add new chip id in tail by time order */ 305*4882a593Smuzhiyun enum csi2_dphy_chip_id { 306*4882a593Smuzhiyun CHIP_ID_RK3568 = 0x0, 307*4882a593Smuzhiyun CHIP_ID_RK3588 = 0x1, 308*4882a593Smuzhiyun CHIP_ID_RK3588_DCPHY = 0x2, 309*4882a593Smuzhiyun CHIP_ID_RV1106 = 0x3, 310*4882a593Smuzhiyun CHIP_ID_RK3562 = 0x4, 311*4882a593Smuzhiyun }; 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun enum csi2_dphy_rx_pads { 314*4882a593Smuzhiyun CSI2_DPHY_RX_PAD_SINK = 0, 315*4882a593Smuzhiyun CSI2_DPHY_RX_PAD_SOURCE, 316*4882a593Smuzhiyun CSI2_DPHY_RX_PADS_NUM, 317*4882a593Smuzhiyun }; 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun enum csi2_dphy_lane_mode { 320*4882a593Smuzhiyun LANE_MODE_UNDEF = 0x0, 321*4882a593Smuzhiyun LANE_MODE_FULL, 322*4882a593Smuzhiyun LANE_MODE_SPLIT, 323*4882a593Smuzhiyun }; 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun struct grf_reg { 326*4882a593Smuzhiyun u32 offset; 327*4882a593Smuzhiyun u32 mask; 328*4882a593Smuzhiyun u32 shift; 329*4882a593Smuzhiyun }; 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun struct csi2dphy_reg { 332*4882a593Smuzhiyun u32 offset; 333*4882a593Smuzhiyun }; 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun struct hsfreq_range { 336*4882a593Smuzhiyun u32 range_h; 337*4882a593Smuzhiyun u16 cfg_bit; 338*4882a593Smuzhiyun }; 339*4882a593Smuzhiyun 340*4882a593Smuzhiyun #define MAX_DPHY_SENSORS (2) 341*4882a593Smuzhiyun #define MAX_NUM_CSI2_DPHY (0x2) 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun #define RKCSI2_MAX_RESET 8 344*4882a593Smuzhiyun #define RKDPHY_MAX_RESET 8 345*4882a593Smuzhiyun /* csi2 head */ 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun struct csi2_dphy_hw { 348*4882a593Smuzhiyun struct clk_bulk_data *dphy_clks; 349*4882a593Smuzhiyun int num_dphy_clks; 350*4882a593Smuzhiyun struct clk_bulk_data *csi2_clks; 351*4882a593Smuzhiyun int num_csi2_clks; 352*4882a593Smuzhiyun const char * const *csi2_rsts; 353*4882a593Smuzhiyun struct reset_control *csi2_rst[RKCSI2_MAX_RESET]; 354*4882a593Smuzhiyun int num_csi2_rsts; 355*4882a593Smuzhiyun const char * const *dphy_rsts; 356*4882a593Smuzhiyun struct reset_control *dphy_rst[RKDPHY_MAX_RESET]; 357*4882a593Smuzhiyun int num_dphy_rsts; 358*4882a593Smuzhiyun // struct reset_control *rsts_bulk; 359*4882a593Smuzhiyun /* spinlock_t lock; */ 360*4882a593Smuzhiyun bool on; 361*4882a593Smuzhiyun const struct hsfreq_range *hsfreq_ranges; 362*4882a593Smuzhiyun int num_hsfreq_ranges; 363*4882a593Smuzhiyun const struct grf_reg *grf_regs; 364*4882a593Smuzhiyun const struct txrx_reg *txrx_regs; 365*4882a593Smuzhiyun const struct csi2dphy_reg *csi2dphy_regs; 366*4882a593Smuzhiyun enum csi2_dphy_chip_id chip_id; 367*4882a593Smuzhiyun struct device *dev; 368*4882a593Smuzhiyun struct regmap *regmap_grf; 369*4882a593Smuzhiyun struct regmap *regmap_sys_grf; 370*4882a593Smuzhiyun void __iomem *csi2_dphy_base; /*csi2_dphy base addr*/ 371*4882a593Smuzhiyun void __iomem *csi2_base; /*csi2 base addr*/ 372*4882a593Smuzhiyun struct mutex mutex; /* lock for updating protection */ 373*4882a593Smuzhiyun atomic_t stream_cnt; 374*4882a593Smuzhiyun struct csi2_err_stats err_list[RK_CSI2_ERR_MAX]; 375*4882a593Smuzhiyun u64 data_rate_mbps; 376*4882a593Smuzhiyun struct rkmodule_csi_dphy_param *dphy_param; 377*4882a593Smuzhiyun struct samsung_mipi_dcphy *samsung_phy; 378*4882a593Smuzhiyun int phy_index; 379*4882a593Smuzhiyun }; 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun #endif 382