xref: /OK3568_Linux_fs/kernel/drivers/media/platform/rockchip/cif/mipi-csi2.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /* Copyright (c) 2020 Rockchip Electronics Co., Ltd. */
3*4882a593Smuzhiyun #ifndef _RKCIF_MIPI_CSI2_H_
4*4882a593Smuzhiyun #define _RKCIF_MIPI_CSI2_H_
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun #include <linux/notifier.h>
7*4882a593Smuzhiyun #include <media/v4l2-device.h>
8*4882a593Smuzhiyun #include <media/v4l2-fwnode.h>
9*4882a593Smuzhiyun #include <media/v4l2-subdev.h>
10*4882a593Smuzhiyun #include <media/v4l2-event.h>
11*4882a593Smuzhiyun #include <linux/rkcif-config.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define CSI2_ERR_FSFE_MASK	(0xff << 8)
14*4882a593Smuzhiyun #define CSI2_ERR_COUNT_ALL_MASK	(0xff)
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #define RKCIF_V4L2_EVENT_ELEMS 4
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /*
19*4882a593Smuzhiyun  * there must be 5 pads: 1 input pad from sensor, and
20*4882a593Smuzhiyun  * the 4 virtual channel output pads
21*4882a593Smuzhiyun  */
22*4882a593Smuzhiyun #define CSI2_SINK_PAD			0
23*4882a593Smuzhiyun #define CSI2_NUM_SINK_PADS		4
24*4882a593Smuzhiyun #define CSI2_NUM_SRC_PADS		11
25*4882a593Smuzhiyun #define CSI2_NUM_PADS			5
26*4882a593Smuzhiyun #define CSI2_NUM_PADS_MAX		12
27*4882a593Smuzhiyun #define CSI2_NUM_PADS_SINGLE_LINK	2
28*4882a593Smuzhiyun #define MAX_CSI2_SENSORS		2
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #define RKCIF_DEFAULT_WIDTH	640
31*4882a593Smuzhiyun #define RKCIF_DEFAULT_HEIGHT	480
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define CSI_ERRSTR_LEN		(256)
34*4882a593Smuzhiyun #define CSI_VCINFO_LEN		(12)
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /*
37*4882a593Smuzhiyun  * The default maximum bit-rate per lane in Mbps, if the
38*4882a593Smuzhiyun  * source subdev does not provide V4L2_CID_LINK_FREQ.
39*4882a593Smuzhiyun  */
40*4882a593Smuzhiyun #define CSI2_DEFAULT_MAX_MBPS 849
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define IMX_MEDIA_GRP_ID_CSI2      BIT(8)
43*4882a593Smuzhiyun #define CSIHOST_MAX_ERRINT_COUNT	10
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define DEVICE_NAME "rockchip-mipi-csi2"
46*4882a593Smuzhiyun #define DEVICE_NAME_HW "rockchip-mipi-csi2-hw"
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun /* CSI Host Registers Define */
49*4882a593Smuzhiyun #define CSIHOST_N_LANES		0x04
50*4882a593Smuzhiyun #define CSIHOST_DPHY_SHUTDOWNZ	0x08
51*4882a593Smuzhiyun #define CSIHOST_PHY_RSTZ	0x0c
52*4882a593Smuzhiyun #define CSIHOST_RESETN		0x10
53*4882a593Smuzhiyun #define CSIHOST_PHY_STATE	0x14
54*4882a593Smuzhiyun #define CSIHOST_ERR1		0x20
55*4882a593Smuzhiyun #define CSIHOST_ERR2		0x24
56*4882a593Smuzhiyun #define CSIHOST_MSK1		0x28
57*4882a593Smuzhiyun #define CSIHOST_MSK2		0x2c
58*4882a593Smuzhiyun #define CSIHOST_CONTROL		0x40
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun #define CSIHOST_ERR1_PHYERR_SPTSYNCHS	0x0000000f
61*4882a593Smuzhiyun #define CSIHOST_ERR1_ERR_BNDRY_MATCH	0x000000f0
62*4882a593Smuzhiyun #define CSIHOST_ERR1_ERR_SEQ		0x00000f00
63*4882a593Smuzhiyun #define CSIHOST_ERR1_ERR_FRM_DATA	0x0000f000
64*4882a593Smuzhiyun #define CSIHOST_ERR1_ERR_CRC		0x0f000000
65*4882a593Smuzhiyun #define CSIHOST_ERR1_ERR_ECC2		0x10000000
66*4882a593Smuzhiyun #define CSIHOST_ERR1_ERR_CTRL		0x000f0000
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun #define CSIHOST_ERR2_PHYERR_ESC		0x0000000f
69*4882a593Smuzhiyun #define CSIHOST_ERR2_PHYERR_SOTHS	0x000000f0
70*4882a593Smuzhiyun #define CSIHOST_ERR2_ECC_CORRECTED	0x00000f00
71*4882a593Smuzhiyun #define CSIHOST_ERR2_ERR_ID		0x0000f000
72*4882a593Smuzhiyun #define CSIHOST_ERR2_PHYERR_CODEHS	0x01000000
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun #define SW_CPHY_EN(x)		((x) << 0)
75*4882a593Smuzhiyun #define SW_DSI_EN(x)		((x) << 4)
76*4882a593Smuzhiyun #define SW_DATATYPE_FS(x)	((x) << 8)
77*4882a593Smuzhiyun #define SW_DATATYPE_FE(x)	((x) << 14)
78*4882a593Smuzhiyun #define SW_DATATYPE_LS(x)	((x) << 20)
79*4882a593Smuzhiyun #define SW_DATATYPE_LE(x)	((x) << 26)
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun #define RK_MAX_CSI_HW		(6)
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun /*
84*4882a593Smuzhiyun  * add new chip id in tail in time order
85*4882a593Smuzhiyun  * by increasing to distinguish csi2 host version
86*4882a593Smuzhiyun  */
87*4882a593Smuzhiyun enum rkcsi2_chip_id {
88*4882a593Smuzhiyun 	CHIP_PX30_CSI2,
89*4882a593Smuzhiyun 	CHIP_RK1808_CSI2,
90*4882a593Smuzhiyun 	CHIP_RK3128_CSI2,
91*4882a593Smuzhiyun 	CHIP_RK3288_CSI2,
92*4882a593Smuzhiyun 	CHIP_RV1126_CSI2,
93*4882a593Smuzhiyun 	CHIP_RK3568_CSI2,
94*4882a593Smuzhiyun 	CHIP_RK3588_CSI2,
95*4882a593Smuzhiyun 	CHIP_RV1106_CSI2,
96*4882a593Smuzhiyun 	CHIP_RK3562_CSI2,
97*4882a593Smuzhiyun };
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun enum csi2_pads {
100*4882a593Smuzhiyun 	RK_CSI2_PAD_SINK = 0,
101*4882a593Smuzhiyun 	RK_CSI2X_PAD_SOURCE0,
102*4882a593Smuzhiyun 	RK_CSI2X_PAD_SOURCE1,
103*4882a593Smuzhiyun 	RK_CSI2X_PAD_SOURCE2,
104*4882a593Smuzhiyun 	RK_CSI2X_PAD_SOURCE3
105*4882a593Smuzhiyun };
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun enum csi2_err {
108*4882a593Smuzhiyun 	RK_CSI2_ERR_SOTSYN = 0x0,
109*4882a593Smuzhiyun 	RK_CSI2_ERR_FS_FE_MIS,
110*4882a593Smuzhiyun 	RK_CSI2_ERR_FRM_SEQ_ERR,
111*4882a593Smuzhiyun 	RK_CSI2_ERR_CRC_ONCE,
112*4882a593Smuzhiyun 	RK_CSI2_ERR_CRC,
113*4882a593Smuzhiyun 	RK_CSI2_ERR_ALL,
114*4882a593Smuzhiyun 	RK_CSI2_ERR_MAX
115*4882a593Smuzhiyun };
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun enum host_type_t {
118*4882a593Smuzhiyun 	RK_CSI_RXHOST,
119*4882a593Smuzhiyun 	RK_DSI_RXHOST
120*4882a593Smuzhiyun };
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun struct csi2_match_data {
123*4882a593Smuzhiyun 	int chip_id;
124*4882a593Smuzhiyun 	int num_pads;
125*4882a593Smuzhiyun 	int num_hw;
126*4882a593Smuzhiyun };
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun struct csi2_hw_match_data {
129*4882a593Smuzhiyun 	int chip_id;
130*4882a593Smuzhiyun };
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun struct csi2_sensor_info {
133*4882a593Smuzhiyun 	struct v4l2_subdev *sd;
134*4882a593Smuzhiyun 	struct v4l2_mbus_config mbus;
135*4882a593Smuzhiyun 	int lanes;
136*4882a593Smuzhiyun };
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun struct csi2_err_stats {
139*4882a593Smuzhiyun 	unsigned int cnt;
140*4882a593Smuzhiyun };
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun struct csi2_dev {
143*4882a593Smuzhiyun 	struct device		*dev;
144*4882a593Smuzhiyun 	struct v4l2_subdev	sd;
145*4882a593Smuzhiyun 	struct media_pad	pad[CSI2_NUM_PADS_MAX];
146*4882a593Smuzhiyun 	struct clk_bulk_data	*clks_bulk;
147*4882a593Smuzhiyun 	int			clks_num;
148*4882a593Smuzhiyun 	struct reset_control	*rsts_bulk;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	void __iomem		*base;
151*4882a593Smuzhiyun 	struct v4l2_async_notifier	notifier;
152*4882a593Smuzhiyun 	struct v4l2_fwnode_bus_mipi_csi2	bus;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	/* lock to protect all members below */
155*4882a593Smuzhiyun 	struct mutex lock;
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 	struct v4l2_mbus_framefmt	format_mbus;
158*4882a593Smuzhiyun 	struct v4l2_rect	crop;
159*4882a593Smuzhiyun 	int			stream_count;
160*4882a593Smuzhiyun 	struct v4l2_subdev	*src_sd;
161*4882a593Smuzhiyun 	bool			sink_linked[CSI2_NUM_SRC_PADS];
162*4882a593Smuzhiyun 	bool			is_check_sot_sync;
163*4882a593Smuzhiyun 	struct csi2_sensor_info	sensors[MAX_CSI2_SENSORS];
164*4882a593Smuzhiyun 	const struct csi2_match_data	*match_data;
165*4882a593Smuzhiyun 	int			num_sensors;
166*4882a593Smuzhiyun 	atomic_t		frm_sync_seq;
167*4882a593Smuzhiyun 	struct csi2_err_stats	err_list[RK_CSI2_ERR_MAX];
168*4882a593Smuzhiyun 	struct csi2_hw		*csi2_hw[RK_MAX_CSI_HW];
169*4882a593Smuzhiyun 	int			irq1;
170*4882a593Smuzhiyun 	int			irq2;
171*4882a593Smuzhiyun 	int			dsi_input_en;
172*4882a593Smuzhiyun 	struct rkcif_csi_info	csi_info;
173*4882a593Smuzhiyun 	const char		*dev_name;
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun struct csi2_hw {
177*4882a593Smuzhiyun 	struct device		*dev;
178*4882a593Smuzhiyun 	struct clk_bulk_data	*clks_bulk;
179*4882a593Smuzhiyun 	int			clks_num;
180*4882a593Smuzhiyun 	struct reset_control	*rsts_bulk;
181*4882a593Smuzhiyun 	struct csi2_dev		*csi2;
182*4882a593Smuzhiyun 	const struct csi2_hw_match_data	*match_data;
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 	void __iomem		*base;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	/* lock to protect all members below */
187*4882a593Smuzhiyun 	struct mutex lock;
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	int			irq1;
190*4882a593Smuzhiyun 	int			irq2;
191*4882a593Smuzhiyun 	const char		*dev_name;
192*4882a593Smuzhiyun };
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun u32 rkcif_csi2_get_sof(struct csi2_dev *csi2_dev);
195*4882a593Smuzhiyun void rkcif_csi2_set_sof(struct csi2_dev *csi2_dev, u32 seq);
196*4882a593Smuzhiyun void rkcif_csi2_event_inc_sof(struct csi2_dev *csi2_dev);
197*4882a593Smuzhiyun int rkcif_csi2_plat_drv_init(void);
198*4882a593Smuzhiyun void rkcif_csi2_plat_drv_exit(void);
199*4882a593Smuzhiyun int rkcif_csi2_hw_plat_drv_init(void);
200*4882a593Smuzhiyun void rkcif_csi2_hw_plat_drv_exit(void);
201*4882a593Smuzhiyun int rkcif_csi2_register_notifier(struct notifier_block *nb);
202*4882a593Smuzhiyun int rkcif_csi2_unregister_notifier(struct notifier_block *nb);
203*4882a593Smuzhiyun void rkcif_csi2_event_reset_pipe(struct csi2_dev *csi2_dev, int reset_src);
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun #endif
206