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