hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Rockchip MIPI CSI2 DPHY driver
 *
 * Copyright (C) 2020 Rockchip Electronics Co., Ltd.
 */
 
#ifndef _PHY_ROCKCHIP_CSI2_DPHY_COMMON_H_
#define _PHY_ROCKCHIP_CSI2_DPHY_COMMON_H_
 
#include <linux/rk-camera-module.h>
#include <linux/rkcif-config.h>
 
#define PHY_MAX 16
#define MAX_DEV_NAME_LEN 32
 
#define MAX_SAMSUNG_PHY_NUM 2
 
#define MAX_INNO_PHY_NUM 2
 
/* add new chip id in tail by time order */
enum csi2_dphy_chip_id {
   CHIP_ID_RK3568 = 0x0,
   CHIP_ID_RK3588 = 0x1,
   CHIP_ID_RK3588_DCPHY = 0x2,
   CHIP_ID_RV1106 = 0x3,
   CHIP_ID_RK3562 = 0x4,
};
 
enum csi2_dphy_rx_pads {
   CSI2_DPHY_RX_PAD_SINK = 0,
   CSI2_DPHY_RX_PAD_SOURCE,
   CSI2_DPHY_RX_PADS_NUM,
};
 
enum csi2_dphy_lane_mode {
   LANE_MODE_UNDEF = 0x0,
   LANE_MODE_FULL,
   LANE_MODE_SPLIT,
};
 
struct grf_reg {
   u32 offset;
   u32 mask;
   u32 shift;
};
 
struct csi2dphy_reg {
   u32 offset;
};
 
#define MAX_DPHY_SENSORS    (2)
#define MAX_NUM_CSI2_DPHY    (0x2)
 
struct csi2_sensor {
   struct v4l2_subdev *sd;
   struct v4l2_mbus_config mbus;
   struct v4l2_mbus_framefmt format;
   int lanes;
};
 
struct csi2_dphy_hw;
struct samsung_mipi_dcphy;
 
struct dphy_drv_data {
   const char dev_name[MAX_DEV_NAME_LEN];
   enum csi2_dphy_chip_id chip_id;
   char num_inno_phy;
   char num_samsung_phy;
};
 
struct csi2_dphy {
   struct device *dev;
   struct list_head list;
   struct csi2_dphy_hw *dphy_hw;
   struct csi2_dphy_hw *dphy_hw_group[MAX_INNO_PHY_NUM];
   struct samsung_mipi_dcphy *samsung_phy;
   struct samsung_mipi_dcphy *samsung_phy_group[MAX_SAMSUNG_PHY_NUM];
   struct v4l2_async_notifier notifier;
   struct v4l2_subdev sd;
   struct mutex mutex; /* lock for updating protection */
   struct media_pad pads[CSI2_DPHY_RX_PADS_NUM];
   struct csi2_sensor sensors[MAX_DPHY_SENSORS];
   u64 data_rate_mbps;
   int num_sensors;
   int phy_index;
   struct rkcif_csi_info csi_info;
   void *phy_hw[RKMODULE_MULTI_DEV_NUM];
   bool is_streaming;
   int lane_mode;
   const struct dphy_drv_data *drv_data;
   struct rkmodule_csi_dphy_param dphy_param;
};
 
struct dphy_hw_drv_data {
   const struct hsfreq_range *hsfreq_ranges;
   int num_hsfreq_ranges;
   const struct hsfreq_range *hsfreq_ranges_cphy;
   int num_hsfreq_ranges_cphy;
   const struct grf_reg *grf_regs;
   const struct txrx_reg *txrx_regs;
   const struct csi2dphy_reg *csi2dphy_regs;
   void (*individual_init)(struct csi2_dphy_hw *hw);
   int (*stream_on)(struct csi2_dphy *dphy, struct v4l2_subdev *sd);
   int (*stream_off)(struct csi2_dphy *dphy, struct v4l2_subdev *sd);
   enum csi2_dphy_chip_id chip_id;
};
 
struct csi2_dphy_hw {
   struct device *dev;
   struct regmap *regmap_grf;
   struct regmap *regmap_sys_grf;
   const struct grf_reg *grf_regs;
   const struct txrx_reg *txrx_regs;
   const struct csi2dphy_reg *csi2dphy_regs;
   const struct dphy_hw_drv_data *drv_data;
   void __iomem *hw_base_addr;
   struct clk_bulk_data    *clks_bulk;
   struct reset_control    *rsts_bulk;
   struct csi2_dphy *dphy_dev[MAX_NUM_CSI2_DPHY];
   struct v4l2_subdev sd;
   struct mutex mutex; /* lock for updating protection */
   atomic_t stream_cnt;
   int num_clks;
   int num_sensors;
   int dphy_dev_num;
   enum csi2_dphy_lane_mode lane_mode;
 
   int (*stream_on)(struct csi2_dphy *dphy, struct v4l2_subdev *sd);
   int (*stream_off)(struct csi2_dphy *dphy, struct v4l2_subdev *sd);
   int (*ttl_mode_enable)(struct csi2_dphy_hw *hw);
   void (*ttl_mode_disable)(struct csi2_dphy_hw *hw);
};
 
int rockchip_csi2_dphy_hw_init(void);
int rockchip_csi2_dphy_init(void);
 
#endif