xref: /OK3568_Linux_fs/kernel/drivers/video/rockchip/vehicle/vehicle-csi2-dphy-common.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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