1 // SPDX-License-Identifier: GPL-2.0
3 * linux/drivers/media/platform/starfive/stf_csi.c
5 * Copyright (C) 2021 StarFive Technology Co., Ltd.
9 #include <linux/regmap.h>
10 #include <soc/starfive/jh7110_pmic.h>
12 #define CSI2RX_DEVICE_CFG_REG 0x000
14 #define CSI2RX_SOFT_RESET_REG 0x004
15 #define CSI2RX_SOFT_RESET_PROTOCOL BIT(1)
16 #define CSI2RX_SOFT_RESET_FRONT BIT(0)
18 #define CSI2RX_DPHY_LANE_CONTROL 0x040
20 #define CSI2RX_STATIC_CFG_REG 0x008
21 #define CSI2RX_STATIC_CFG_DLANE_MAP(llane, plane) \
22 ((plane) << (16 + (llane) * 4))
23 #define CSI2RX_STATIC_CFG_LANES_MASK GENMASK(11, 8)
25 #define CSI2RX_STREAM_BASE(n) (((n) + 1) * 0x100)
27 #define CSI2RX_STREAM_CTRL_REG(n) (CSI2RX_STREAM_BASE(n) + 0x000)
28 #define CSI2RX_STREAM_CTRL_START BIT(0)
30 #define CSI2RX_STREAM_DATA_CFG_REG(n) (CSI2RX_STREAM_BASE(n) + 0x008)
31 #define CSI2RX_STREAM_DATA_CFG_EN_VC_SELECT BIT(31)
32 #define CSI2RX_STREAM_DATA_CFG_VC_SELECT(n) BIT((n) + 16)
34 #define CSI2RX_STREAM_CFG_REG(n) (CSI2RX_STREAM_BASE(n) + 0x00c)
35 #define CSI2RX_STREAM_CFG_FIFO_MODE_LARGE_BUF (1 << 8)
37 #define CSI2RX_LANES_MAX 4
38 #define CSI2RX_STREAMS_MAX 4
40 static int stf_csi_power_on(struct stf_csi_dev *csi_dev, u8 on)
42 void __iomem *aon_syscon;
44 pmic_set_domain(POWER_SW_0_REG, POWER_SW_0_VDD18_MIPIRX, on);
45 pmic_set_domain(POWER_SW_0_REG, POWER_SW_0_VDD09_MIPIRX, on);
47 aon_syscon = ioremap(0x17010000, 0x4);
48 reg_write(aon_syscon, 0x00, 0x80000000);
53 static int stf_csi_clk_enable(struct stf_csi_dev *csi_dev)
55 struct stfcamss *stfcamss = csi_dev->stfcamss;
57 clk_set_rate(stfcamss->sys_clk[STFCLK_MIPI_RX0_PXL].clk, 204800000);
58 clk_prepare_enable(stfcamss->sys_clk[STFCLK_PIXEL_CLK_IF0].clk);
59 clk_prepare_enable(stfcamss->sys_clk[STFCLK_PIXEL_CLK_IF1].clk);
60 clk_prepare_enable(stfcamss->sys_clk[STFCLK_PIXEL_CLK_IF2].clk);
61 clk_prepare_enable(stfcamss->sys_clk[STFCLK_PIXEL_CLK_IF3].clk);
63 reset_control_deassert(stfcamss->sys_rst[STFRST_PIXEL_CLK_IF0].rstc);
64 reset_control_deassert(stfcamss->sys_rst[STFRST_PIXEL_CLK_IF1].rstc);
65 reset_control_deassert(stfcamss->sys_rst[STFRST_PIXEL_CLK_IF2].rstc);
66 reset_control_deassert(stfcamss->sys_rst[STFRST_PIXEL_CLK_IF3].rstc);
67 reset_control_deassert(stfcamss->sys_rst[STFRST_AXIRD].rstc);
68 reset_control_deassert(stfcamss->sys_rst[STFRST_AXIWR].rstc);
73 static int stf_csi_clk_disable(struct stf_csi_dev *csi_dev)
75 struct stfcamss *stfcamss = csi_dev->stfcamss;
77 reset_control_assert(stfcamss->sys_rst[STFRST_AXIWR].rstc);
78 reset_control_assert(stfcamss->sys_rst[STFRST_AXIRD].rstc);
79 reset_control_assert(stfcamss->sys_rst[STFRST_PIXEL_CLK_IF3].rstc);
80 reset_control_assert(stfcamss->sys_rst[STFRST_PIXEL_CLK_IF2].rstc);
81 reset_control_assert(stfcamss->sys_rst[STFRST_PIXEL_CLK_IF1].rstc);
82 reset_control_assert(stfcamss->sys_rst[STFRST_PIXEL_CLK_IF0].rstc);
84 clk_disable_unprepare(stfcamss->sys_clk[STFCLK_PIXEL_CLK_IF0].clk);
85 clk_disable_unprepare(stfcamss->sys_clk[STFCLK_PIXEL_CLK_IF1].clk);
86 clk_disable_unprepare(stfcamss->sys_clk[STFCLK_PIXEL_CLK_IF2].clk);
87 clk_disable_unprepare(stfcamss->sys_clk[STFCLK_PIXEL_CLK_IF3].clk);
92 static int stf_csi_config_set(struct stf_csi_dev *csi_dev)
94 struct stf_vin_dev *vin = csi_dev->stfcamss->vin;
95 u32 mipi_channel_sel, mipi_vc = 0;
97 st_info(ST_CSI, "%s, csi_id = %d\n", __func__, csi_dev->id);
99 switch (csi_dev->s_type) {
101 st_err(ST_CSI, "%s, %d: need todo\n", __func__, __LINE__);
104 reg_set_bit(vin->clkgen_base,
106 BIT(24), csi_dev->id << 24);
108 reg_set_bit(vin->clkgen_base,
113 mipi_channel_sel = csi_dev->id * 4 + mipi_vc;
114 reg_set_bit(vin->sysctrl_base,
115 SYSCTRL_VIN_SRC_CHAN_SEL,
116 0xF, mipi_channel_sel);
119 reg_set_bit(vin->clkgen_base,
121 BIT(24), csi_dev->id << 24);
123 reg_set_bit(vin->clkgen_base,
128 mipi_channel_sel = csi_dev->id * 4 + mipi_vc;
129 reg_set_bit(vin->sysctrl_base,
130 SYSCTRL_VIN_SRC_CHAN_SEL,
131 0xF << 4, mipi_channel_sel << 4);
139 static int stf_csi_set_format(struct stf_csi_dev *csi_dev,
140 u32 vsize, u8 bpp, int is_raw10)
142 struct stf_vin_dev *vin = csi_dev->stfcamss->vin;
143 void *reg_base = NULL;
145 if (csi_dev->id == 0)
146 reg_base = vin->mipi0_base;
147 else if (csi_dev->id == 1)
148 reg_base = vin->mipi1_base;
152 switch (csi_dev->s_type) {
154 st_err(ST_CSI, "%s, %d: need todo\n", __func__, __LINE__);
158 reg_set_bit(vin->sysctrl_base, SYSCONSAIF_SYSCFG_36,
163 st_err(ST_CSI, "please check csi_dev s_type:%d\n", csi_dev->s_type);
171 static void csi2rx_reset(void *reg_base)
173 writel(CSI2RX_SOFT_RESET_PROTOCOL | CSI2RX_SOFT_RESET_FRONT,
174 reg_base + CSI2RX_SOFT_RESET_REG);
178 writel(0, reg_base + CSI2RX_SOFT_RESET_REG);
181 static int csi2rx_start(struct stf_csi_dev *csi_dev, void *reg_base)
183 struct stfcamss *stfcamss = csi_dev->stfcamss;
184 struct csi2phy_cfg *csiphy =
185 stfcamss->csiphy_dev[csi_dev->csiphy_id].csiphy;
187 unsigned long lanes_used = 0;
191 st_err(ST_CSI, "csiphy%d config not exist\n", csi_dev->csiphy_id);
195 csi2rx_reset(reg_base);
197 reg = csiphy->num_data_lanes << 8;
198 for (i = 0; i < csiphy->num_data_lanes; i++) {
199 reg |= CSI2RX_STATIC_CFG_DLANE_MAP(i, csiphy->data_lanes[i]);
200 set_bit(csiphy->data_lanes[i] - 1, &lanes_used);
204 * Even the unused lanes need to be mapped. In order to avoid
205 * to map twice to the same physical lane, keep the lanes used
206 * in the previous loop, and only map unused physical lanes to
207 * the rest of our logical lanes.
209 for (i = csiphy->num_data_lanes; i < CSI2RX_LANES_MAX; i++) {
210 unsigned int idx = find_first_zero_bit(&lanes_used,
213 set_bit(idx, &lanes_used);
214 reg |= CSI2RX_STATIC_CFG_DLANE_MAP(i, idx + 1);
217 writel(reg, reg_base + CSI2RX_STATIC_CFG_REG);
219 // 0x40 DPHY_LANE_CONTROL
222 for (i = 0; i < csiphy->num_data_lanes; i++)
223 reg |= 1 << i | 1 << (i + 12); //data_clane
225 reg |= 1 << 4 | 1 << 16; //clk_lane
226 writel(reg, reg_base + CSI2RX_DPHY_LANE_CONTROL);
229 * Create a static mapping between the CSI virtual channels
230 * and the output stream.
232 * This should be enhanced, but v4l2 lacks the support for
233 * changing that mapping dynamically.
235 * We also cannot enable and disable independent streams here,
236 * hence the reference counting.
238 for (i = 0; i < CSI2RX_STREAMS_MAX; i++) {
239 writel(CSI2RX_STREAM_CFG_FIFO_MODE_LARGE_BUF,
240 reg_base + CSI2RX_STREAM_CFG_REG(i));
242 writel(CSI2RX_STREAM_DATA_CFG_EN_VC_SELECT |
243 CSI2RX_STREAM_DATA_CFG_VC_SELECT(i),
244 reg_base + CSI2RX_STREAM_DATA_CFG_REG(i));
246 writel(CSI2RX_STREAM_CTRL_START,
247 reg_base + CSI2RX_STREAM_CTRL_REG(i));
253 static void csi2rx_stop(struct stf_csi_dev *csi_dev, void *reg_base)
257 for (i = 0; i < CSI2RX_STREAMS_MAX; i++)
258 writel(0, reg_base + CSI2RX_STREAM_CTRL_REG(i));
261 static int stf_csi_stream_set(struct stf_csi_dev *csi_dev, int on)
263 struct stfcamss *stfcamss = csi_dev->stfcamss;
264 struct stf_vin_dev *vin = csi_dev->stfcamss->vin;
265 void *reg_base = NULL;
267 if (csi_dev->id == 0)
268 reg_base = vin->mipi0_base;
269 else if (csi_dev->id == 1)
270 reg_base = vin->mipi1_base;
274 switch (csi_dev->s_type) {
276 clk_set_parent(stfcamss->sys_clk[STFCLK_AXIWR].clk,
277 stfcamss->sys_clk[STFCLK_MIPI_RX0_PXL].clk);
279 reg_set_bit(vin->sysctrl_base, SYSCONSAIF_SYSCFG_20,
280 BIT(3)|BIT(2)|BIT(1)|BIT(0),
281 0<<0); //u0_vin_cnfg_axiwr0_channel_sel
282 reg_set_bit(vin->sysctrl_base, SYSCONSAIF_SYSCFG_28,
284 1<<13); //u0_vin_cnfg_axiwr0_pix_ct
285 reg_set_bit(vin->sysctrl_base, SYSCONSAIF_SYSCFG_28,
287 0<<15); //u0_vin_cnfg_axiwr0_pixel_high_bit_sel
288 reg_set_bit(vin->sysctrl_base, SYSCONSAIF_SYSCFG_28,
289 BIT(12)|BIT(11)|BIT(10)|BIT(9)|BIT(8)|BIT(7)|BIT(6)|BIT(5)|BIT(4)|BIT(3)|BIT(2),
290 (1920 / 4 - 1)<<2); //u0_vin_cnfg_axiwr0_pix_cnt_end
293 clk_set_parent(stfcamss->sys_clk[STFCLK_WRAPPER_CLK_C].clk,
294 stfcamss->sys_clk[STFCLK_MIPI_RX0_PXL].clk);
296 reg_set_bit(vin->sysctrl_base, SYSCONSAIF_SYSCFG_36,
298 0<<6); //u0_vin_cnfg_mipi_byte_en_isp0
299 reg_set_bit(vin->sysctrl_base, SYSCONSAIF_SYSCFG_36,
300 BIT(11)|BIT(10)|BIT(9)|BIT(8),
301 0<<8); //u0_vin_cnfg_mipi_channel_sel0
302 reg_set_bit(vin->sysctrl_base, SYSCONSAIF_SYSCFG_36,
304 1<<12); //u0_vin_cnfg_p_i_mipi_header_en0
305 reg_set_bit(vin->sysctrl_base, SYSCONSAIF_SYSCFG_36,
306 BIT(16)|BIT(15)|BIT(14)|BIT(13),
307 0<<13); //u0_vin_cnfg_pix_num
310 st_err(ST_CSI, "please check csi_dev s_type:%d\n", csi_dev->s_type);
317 csi2rx_start(csi_dev, reg_base);
319 csi2rx_stop(csi_dev, reg_base);
324 void dump_csi_reg(void *__iomem csibase, int id)
326 st_info(ST_CSI, "DUMP CSI%d register:\n", id);
327 print_reg(ST_CSI, csibase, 0x00);
328 print_reg(ST_CSI, csibase, 0x04);
329 print_reg(ST_CSI, csibase, 0x08);
330 print_reg(ST_CSI, csibase, 0x10);
332 print_reg(ST_CSI, csibase, 0x40);
333 print_reg(ST_CSI, csibase, 0x48);
334 print_reg(ST_CSI, csibase, 0x4c);
335 print_reg(ST_CSI, csibase, 0x50);
338 struct csi_hw_ops csi_ops = {
339 .csi_power_on = stf_csi_power_on,
340 .csi_clk_enable = stf_csi_clk_enable,
341 .csi_clk_disable = stf_csi_clk_disable,
342 .csi_config_set = stf_csi_config_set,
343 .csi_set_format = stf_csi_set_format,
344 .csi_stream_set = stf_csi_stream_set,