1 #include "camsys_soc_priv.h"
2 #include "camsys_soc_rk3368.h"
5 struct mipiphy_hsfreqrange_s {
11 static struct mipiphy_hsfreqrange_s mipiphy_hsfreqrange[] = {
31 static int camsys_rk3368_mipiphy_wr_reg(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(unsigned long phy_virt,unsigned char addr)
49 return (read_csihost_reg(((CSIHOST_PHY_TEST_CTRL1)&0xff00))>>8);
52 static int camsys_rk3368_csiphy_wr_reg(unsigned long csiphy_virt, unsigned char addr, unsigned char data)
54 write_csiphy_reg(addr,data);
58 static int camsys_rk3368_csiphy_rd_reg(unsigned long csiphy_virt,unsigned char addr)
60 return read_csiphy_reg(addr);
63 static int camsys_rk3368_mipihpy_cfg (camsys_mipiphy_soc_para_t *para)
65 unsigned char hsfreqrange=0xff,i;
66 struct mipiphy_hsfreqrange_s *hsfreqrange_p;
67 unsigned long phy_virt, phy_index;
69 unsigned long csiphy_virt;
71 phy_index = para->phy->phy_index;
72 if (para->camsys_dev->mipiphy[phy_index].reg!=NULL) {
73 phy_virt = para->camsys_dev->mipiphy[phy_index].reg->vir_base;
77 if(para->camsys_dev->csiphy_reg!=NULL){
78 csiphy_virt = (unsigned long)para->camsys_dev->csiphy_reg->vir_base;
82 if ((para->phy->bit_rate == 0) || (para->phy->data_en_bit == 0)) {
83 if (para->phy->phy_index == 0) {
84 camsys_trace(1, ">>>>>>>>>>>>>>>>para->phy->phy_index==0");
85 base = (unsigned long)para->camsys_dev->devmems.registermem->vir_base;
86 *((unsigned int*)(base + (MRV_MIPI_BASE+MRV_MIPI_CTRL))) &= ~(0x0f<<8);
87 camsys_trace(1, "mipi phy 0 standby!");
88 } else if (para->phy->phy_index == 1) {
95 hsfreqrange_p = mipiphy_hsfreqrange;
96 for (i=0; i<(sizeof(mipiphy_hsfreqrange)/sizeof(struct mipiphy_hsfreqrange_s)); i++) {
98 if ((para->phy->bit_rate > hsfreqrange_p->range_l) && (para->phy->bit_rate <= hsfreqrange_p->range_h)) {
99 hsfreqrange = hsfreqrange_p->cfg_bit;
105 if (hsfreqrange == 0xff) {
106 camsys_err("mipi phy config bitrate %d Mbps isn't supported!",para->phy->bit_rate);
109 /* hsfreqrange <<= 1; */
111 if (para->phy->phy_index == 0) {
114 write_grf_reg(GRF_SOC_CON6_OFFSET, ISP_MIPI_CSI_HOST_SEL_OFFSET_MASK | (1<<ISP_MIPI_CSI_HOST_SEL_OFFSET_BIT));
119 /*write_csiphy_reg(0x34,0x00); */
121 write_csiphy_reg((MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET+0x100),hsfreqrange|(read_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET+0x100)&(~0xf)));
123 if(para->phy->data_en_bit > 0x00){
124 write_csiphy_reg((MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET+0x180),hsfreqrange|(read_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET+0x180)&(~0xf)));//lane0
126 if(para->phy->data_en_bit > 0x02){
127 write_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET+0x200,hsfreqrange|(read_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET+0x200)&(~0xf)));//lane1
129 if(para->phy->data_en_bit > 0x04){
130 write_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET+0x280,hsfreqrange|(read_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET+0x280)&(~0xf)));//lane2
131 write_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET+0x300,hsfreqrange|(read_csiphy_reg(MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET+0x300)&(~0xf))); //lane3
134 /*set data lane num and enable clock lane */
135 write_csiphy_reg( 0x00, ((para->phy->data_en_bit << 2)|(0x1<<6)|0x1));
136 //base = (unsigned long)para->camsys_dev->devmems.registermem->vir_base;
137 //*((unsigned int*)(base + (MRV_MIPI_BASE+MRV_MIPI_CTRL))) =( 0x1|((/*para->phy->data_en_bit*/0x0)<<12)|0x1<<18);
140 camsys_trace(1,"vir_base=0x%lx",(unsigned long)para->camsys_dev->devmems.registermem->vir_base);
142 base = (unsigned long)para->camsys_dev->devmems.registermem->vir_base;
143 *((unsigned int*)(base + (MRV_MIPI_BASE+MRV_MIPI_CTRL))) &= ~(0x0f<<8);
144 camsys_trace(1,"val:0x%x",*((unsigned int*)(base + (MRV_MIPI_BASE+MRV_MIPI_CTRL))));
147 else if (para->phy->phy_index == 1){
150 write_grf_reg(GRF_SOC_CON6_OFFSET, ISP_MIPI_CSI_HOST_SEL_OFFSET_MASK | (0<<ISP_MIPI_CSI_HOST_SEL_OFFSET_BIT));
152 write_csihost_reg(CSIHOST_PHY_TEST_CTRL0,0x00000002); //TESTCLK=1
153 write_csihost_reg(CSIHOST_PHY_TEST_CTRL0,0x00000003); //TESTCLR=1 TESTCLK=1
155 write_csihost_reg(CSIHOST_PHY_TEST_CTRL0,0x00000002); //TESTCLR=0 TESTCLK=1
158 //set lane num, csi phy
159 camsys_rk3368_mipiphy_wr_reg(phy_virt, MIPI_CSI_DPHY_CTRL_LANE_ENABLE_OFFSET<<2, para->phy->data_en_bit << MIPI_CSI_DPHY_CTRL_LANE_ENABLE_OFFSET_BIT);
162 camsys_rk3368_mipiphy_wr_reg(phy_virt, (MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET+0x100)<<2,0x00);
164 //camsys_rk3368_mipiphy_wr_reg(phy_virt, (MIPI_CSI_DPHY_LANEX_MSB_EN_OFFSET+0x100)<<2,0x40);
165 if(para->phy->data_en_bit > 0x00){
166 camsys_rk3368_mipiphy_wr_reg(phy_virt, (MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET+0x180)<<2,hsfreqrange);//lane0
168 //camsys_rk3368_mipiphy_wr_reg(phy_virt, (MIPI_CSI_DPHY_LANEX_MSB_EN_OFFSET+0x180)<<2,0x40);
170 if(para->phy->data_en_bit > 0x02){
171 camsys_rk3368_mipiphy_wr_reg(phy_virt, (MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET+0x200)<<2,hsfreqrange);//lane1
173 //camsys_rk3368_mipiphy_wr_reg(phy_virt, (MIPI_CSI_DPHY_LANEX_MSB_EN_OFFSET+0x200)<<2,0x40);
175 if(para->phy->data_en_bit > 0x04){
176 camsys_rk3368_mipiphy_wr_reg(phy_virt, (MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET+0x280)<<2,hsfreqrange);//lane2
178 //camsys_rk3368_mipiphy_wr_reg(phy_virt, (MIPI_CSI_DPHY_LANEX_MSB_EN_OFFSET+0x280)<<2,0x40);
179 camsys_rk3368_mipiphy_wr_reg(phy_virt, (MIPI_CSI_DPHY_LANEX_THS_SETTLE_OFFSET+0x300)<<2,hsfreqrange); //lane3
181 //camsys_rk3368_mipiphy_wr_reg(phy_virt, (MIPI_CSI_DPHY_LANEX_MSB_EN_OFFSET+0x300)<<2,0x40);
185 //set active lane num, csi host
186 if(para->phy->data_en_bit > 0x00){
187 write_csihost_reg(CSIHOST_N_LANES_OFFSET, 0x00);//one lane active
188 }else if(para->phy->data_en_bit > 0x01){
189 write_csihost_reg(CSIHOST_N_LANES_OFFSET, 0x01);//two lane active
190 }else if(para->phy->data_en_bit > 0x04){
191 write_csihost_reg(CSIHOST_N_LANES_OFFSET, 0x02);// three lane active
192 }else if(para->phy->data_en_bit > 0x08){
193 write_csihost_reg(CSIHOST_N_LANES_OFFSET, 0x03);//foure lane active
195 camsys_rk3368_mipiphy_rd_reg(phy_virt,0x0);
196 write_csihost_reg(CSIHOST_PHY_TEST_CTRL0,0x00000002); //TESTCLK=1
197 write_csihost_reg(CSIHOST_PHY_TEST_CTRL1,0x00000000); //TESTCLR=0
198 write_csihost_reg(CSIHOST_PHY_SHUTDOWNZ,0x00000001); //SHUTDOWNZ=1
199 write_csihost_reg(CSIHOST_DPHY_RSTZ,0x00000001); //RSTZ=1
200 write_csihost_reg(CSIHOST_CSI2_RESETN,0x00000001); //RESETN=1
204 camsys_err("mipi phy index %d is invalidate!",para->phy->phy_index);
208 camsys_trace(1, "mipi phy(%d) turn on(lane: 0x%x bit_rate: %dMbps)",para->phy->phy_index,para->phy->data_en_bit, para->phy->bit_rate);
216 #define MRV_AFM_BASE 0x0000
217 #define VI_IRCL 0x0014
218 int camsys_rk3368_cfg (camsys_soc_cfg_t cfg_cmd, void* cfg_para)
220 unsigned int *para_int;
224 case Clk_DriverStrength_Cfg:
226 para_int = (unsigned int*)cfg_para;
227 __raw_writel((((*para_int)&0x03)<<3)|(0x03<<3), (void*)(rk_grf_base+0x204));
228 //__raw_writel(0xffffffff, rk_grf_base+0x204);
232 case Cif_IoDomain_Cfg:
234 para_int = (unsigned int*)cfg_para;
235 if (*para_int < 28000000) {
236 __raw_writel(((1<<1)|(1<<(1+16))),(void*)(rk_grf_base+0x0900)); // 1.8v IO
238 __raw_writel(((0<<1)|(1<<(1+16))),(void*)(rk_grf_base+0x0900)); // 3.3v IO
245 camsys_rk3368_mipihpy_cfg((camsys_mipiphy_soc_para_t*)cfg_para);
249 case Isp_SoftRst: /* ddl@rock-chips.com: v0.d.0 */
252 reset = (unsigned long)cfg_para;
255 write_cru_reg(0x318,0x40004000);
257 write_cru_reg(0x318,0x40000000);
258 camsys_trace(1, "Isp_SoftRst: %d",reset);
262 (void*)(rk_isp_base + MRV_AFM_BASE +
266 (void*)(rk_isp_base + MRV_AFM_BASE +
268 camsys_trace(1, "Isp self soft rst: %ld", reset);
274 camsys_warn("cfg_cmd: 0x%x isn't support",cfg_cmd);