2 #include "camsys_soc_priv.h"
3 #include "camsys_soc_rk3366.h"
5 struct mipiphy_hsfreqrange_s {
11 static struct mipiphy_hsfreqrange_s mipiphy_hsfreqrange[] = {
30 static int camsys_rk3368_mipiphy_wr_reg(
31 unsigned long phy_virt, unsigned char addr, unsigned char data)
33 /*TESTEN =1,TESTDIN=addr */
34 write_csihost_reg(CSIHOST_PHY_TEST_CTRL1, (0x00010000 | addr));
36 write_csihost_reg(CSIHOST_PHY_TEST_CTRL0, 0x00000000);
38 /*TESTEN =0,TESTDIN=data */
39 write_csihost_reg(CSIHOST_PHY_TEST_CTRL1, (0x00000000 | data));
41 write_csihost_reg(CSIHOST_PHY_TEST_CTRL0, 0x00000002);
47 static int camsys_rk3368_mipiphy_rd_reg(
48 unsigned long phy_virt, unsigned char addr)
50 return (read_csihost_reg(((CSIHOST_PHY_TEST_CTRL1) & 0xff00))>>8);
53 static int camsys_rk3368_csiphy_wr_reg(
54 unsigned long csiphy_virt, unsigned char addr, unsigned char data)
56 write_csiphy_reg(addr, data);
60 static int camsys_rk3368_csiphy_rd_reg(
61 unsigned long csiphy_virt, unsigned char addr)
63 return read_csiphy_reg(addr);
66 static int camsys_rk3366_mipihpy_cfg(
67 camsys_mipiphy_soc_para_t *para)
69 unsigned char hsfreqrange = 0xff, i;
70 struct mipiphy_hsfreqrange_s *hsfreqrange_p;
71 unsigned long phy_virt, phy_index;
73 unsigned long csiphy_virt;
75 phy_index = para->phy->phy_index;
76 if (para->camsys_dev->mipiphy[phy_index].reg != NULL) {
77 phy_virt = para->camsys_dev->mipiphy[phy_index].reg->vir_base;
81 if (para->camsys_dev->csiphy_reg != NULL) {
83 (unsigned long)para->camsys_dev->csiphy_reg->vir_base;
87 if ((para->phy->bit_rate == 0) ||
88 (para->phy->data_en_bit == 0)) {
89 if (para->phy->phy_index == 0) {
92 para->camsys_dev->devmems.registermem->vir_base;
94 (base + (MRV_MIPI_BASE + MRV_MIPI_CTRL)))
96 camsys_trace(1, "mipi phy 0 standby!");
102 hsfreqrange_p = mipiphy_hsfreqrange;
105 (sizeof(mipiphy_hsfreqrange)/
106 sizeof(struct mipiphy_hsfreqrange_s));
109 if ((para->phy->bit_rate > hsfreqrange_p->range_l) &&
110 (para->phy->bit_rate <= hsfreqrange_p->range_h)) {
111 hsfreqrange = hsfreqrange_p->cfg_bit;
117 if (hsfreqrange == 0xff) {
118 camsys_err("mipi phy config bitrate %d Mbps isn't supported!",
119 para->phy->bit_rate);
123 if (para->phy->phy_index == 0) {
126 (GRF_SOC_CON6_OFFSET, ISP_MIPI_CSI_HOST_SEL_OFFSET_MASK
127 | (1 << ISP_MIPI_CSI_HOST_SEL_OFFSET_BIT));
131 ((MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET + 0x100),
133 (read_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET
136 if (para->phy->data_en_bit > 0x00) {
137 write_csiphy_reg((MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET
138 + 0x180), hsfreqrange |
139 (read_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET
142 if (para->phy->data_en_bit > 0x02) {
143 write_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET
144 + 0x200, hsfreqrange |
145 (read_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET
148 if (para->phy->data_en_bit > 0x04) {
149 write_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET
150 + 0x280, hsfreqrange |
151 (read_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET
153 write_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET
154 + 0x300, hsfreqrange |
155 (read_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET
159 /*set data lane num and enable clock lane */
160 write_csiphy_reg(0x00, ((para->phy->data_en_bit << 2)
161 | (0x1 << 6) | 0x1));
165 para->camsys_dev->devmems.registermem->vir_base;
166 *((unsigned int *)(base + (MRV_MIPI_BASE + MRV_MIPI_CTRL)))
169 camsys_err("mipi phy index %d is invalidate!",
170 para->phy->phy_index);
174 camsys_trace(1, "mipi phy(%d) turn on(lane: 0x%x bit_rate: %dMbps)",
175 para->phy->phy_index, para->phy->data_en_bit, para->phy->bit_rate);
183 #define MRV_AFM_BASE 0x0000
184 #define VI_IRCL 0x0014
185 int camsys_rk3366_cfg(
186 camsys_dev_t *camsys_dev, camsys_soc_cfg_t cfg_cmd, void *cfg_para)
188 unsigned int *para_int;
191 case Clk_DriverStrength_Cfg: {
192 para_int = (unsigned int *)cfg_para;
193 __raw_writel((((*para_int) & 0x03) << 3) | (0x03 << 3),
194 (void *)(camsys_dev->rk_grf_base + 0x204));
195 /* set 0xffffffff to max all */
199 case Cif_IoDomain_Cfg: {
200 para_int = (unsigned int *)cfg_para;
201 if (*para_int < 28000000) {
203 __raw_writel(((1 << 1) | (1 << (1 + 16))),
204 (void *)(camsys_dev->rk_grf_base + 0x0900));
207 __raw_writel(((0 << 1) | (1 << (1 + 16))),
208 (void *)(camsys_dev->rk_grf_base + 0x0900));
214 camsys_rk3366_mipihpy_cfg
215 ((camsys_mipiphy_soc_para_t *)cfg_para);
219 case Isp_SoftRst: /* ddl@rock-chips.com: v0.d.0 */ {
221 reset = (unsigned long)cfg_para;
223 __raw_writel(0x80, (void *)(camsys_dev->rk_isp_base +
224 MRV_AFM_BASE + VI_IRCL));
226 __raw_writel(0x00, (void *)(camsys_dev->rk_isp_base +
227 MRV_AFM_BASE + VI_IRCL));
228 camsys_trace(1, "Isp self soft rst: %ld", reset);
233 camsys_warn("cfg_cmd: 0x%x isn't support", cfg_cmd);
241 #endif /* CONFIG_ARM64 */