Revert "rk3288:keep camera pwen high alwaysly to avoid leakage of lcdc electricity"
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / rk_camsys / camsys_mipicsi_phy.c
1 #include "camsys_mipicsi_phy.h"
2
3 #if defined(CONFIG_ARCH_ROCKCHIP)
4 //GRF_SOC_CON14
5 //bit 0     dphy_rx0_testclr
6 //bit 1     dphy_rx0_testclk
7 //bit 2     dphy_rx0_testen
8 //bit 3:10 dphy_rx0_testdin
9 #define GRF_SOC_CON14_OFFSET    (0x027c)
10 #define DPHY_RX0_TESTCLR_MASK   (0x1<<16)
11 #define DPHY_RX0_TESTCLK_MASK   (0x1<<17)
12 #define DPHY_RX0_TESTEN_MASK    (0x1<<18)
13 #define DPHY_RX0_TESTDIN_MASK   (0xff<<19)
14
15 #define DPHY_RX0_TESTCLR    (1<<0)
16 #define DPHY_RX0_TESTCLK    (1<<1)
17 #define DPHY_RX0_TESTEN     (1<<2)
18 #define DPHY_RX0_TESTDIN_OFFSET    (3)
19
20 #define DPHY_TX1RX1_ENABLECLK_MASK   (0x1<<28)
21 #define DPHY_RX1_SRC_SEL_MASK        (0x1<<29)
22 #define DPHY_TX1RX1_MASTERSLAVEZ_MASK (0x1<<30)
23 #define DPHY_TX1RX1_BASEDIR_OFFSET  (0x1<<31)
24
25 #define DPHY_TX1RX1_ENABLECLK           (0x1<<12)
26 #define DPHY_TX1RX1_DISABLECLK          (0x0<<12)
27 #define DPHY_RX1_SRC_SEL_ISP          (0x1<<13)
28 #define DPHY_TX1RX1_SLAVEZ            (0x0<<14)
29 #define DPHY_TX1RX1_BASEDIR_REC       (0x1<<15)
30
31
32
33 //GRF_SOC_CON6
34 //bit 0 grf_con_disable_isp
35 //bit 1 grf_con_isp_dphy_sel  1'b0 mipi phy rx0
36 #define GRF_SOC_CON6_OFFSET    (0x025c)
37 #define MIPI_PHY_DISABLE_ISP_MASK       (0x1<<16)
38 #define MIPI_PHY_DISABLE_ISP            (0x0<<0)
39
40 #define DSI_CSI_TESTBUS_SEL_MASK        (0x1<<30)
41 #define DSI_CSI_TESTBUS_SEL_OFFSET_BIT  (14)
42
43
44 #define MIPI_PHY_DPHYSEL_OFFSET_MASK (0x1<<17)
45 #define MIPI_PHY_DPHYSEL_OFFSET_BIT (0x1)
46
47 //GRF_SOC_CON10
48 //bit12:15 grf_dphy_rx0_enable
49 //bit 0:3 turn disable
50 #define GRF_SOC_CON10_OFFSET                (0x026c)
51 #define DPHY_RX0_TURN_DISABLE_MASK          (0xf<<16)
52 #define DPHY_RX0_TURN_DISABLE_OFFSET_BITS   (0x0)
53 #define DPHY_RX0_ENABLE_MASK                (0xf<<28)
54 #define DPHY_RX0_ENABLE_OFFSET_BITS         (12)
55
56 //GRF_SOC_CON9
57 //bit12:15 grf_dphy_rx0_enable
58 //bit 0:3 turn disable
59 #define GRF_SOC_CON9_OFFSET                (0x0268)
60 #define DPHY_TX1RX1_TURN_DISABLE_MASK          (0xf<<16)
61 #define DPHY_TX1RX1_TURN_DISABLE_OFFSET_BITS   (0x0)
62 #define DPHY_TX1RX1_ENABLE_MASK                (0xf<<28)
63 #define DPHY_TX1RX1_ENABLE_OFFSET_BITS         (12)
64
65 //GRF_SOC_CON15
66 //bit 0:3   turn request
67 #define GRF_SOC_CON15_OFFSET                (0x03a4) 
68 #define DPHY_RX0_TURN_REQUEST_MASK          (0xf<<16)
69 #define DPHY_RX0_TURN_REQUEST_OFFSET_BITS   (0x0)
70
71 #define DPHY_TX1RX1_TURN_REQUEST_MASK          (0xf<<20)
72 #define DPHY_TX1RX1_TURN_REQUEST_OFFSET_BITS   (0x0)
73
74
75 #endif
76
77
78 static void phy_select(uint8_t index)
79 {
80     if((index == 0) || (index == 1)){
81         write_grf_reg(GRF_SOC_CON6_OFFSET, MIPI_PHY_DPHYSEL_OFFSET_MASK | (index<<MIPI_PHY_DPHYSEL_OFFSET_BIT)); 
82         if(index == 1){
83             write_grf_reg(GRF_SOC_CON6_OFFSET, DSI_CSI_TESTBUS_SEL_MASK | (1<<DSI_CSI_TESTBUS_SEL_OFFSET_BIT)); 
84
85             write_grf_reg(GRF_SOC_CON14_OFFSET, DPHY_RX1_SRC_SEL_ISP | DPHY_RX1_SRC_SEL_MASK); 
86             write_grf_reg(GRF_SOC_CON14_OFFSET, DPHY_TX1RX1_SLAVEZ | DPHY_TX1RX1_MASTERSLAVEZ_MASK); 
87             write_grf_reg(GRF_SOC_CON14_OFFSET, DPHY_TX1RX1_BASEDIR_REC | DPHY_TX1RX1_BASEDIR_OFFSET); 
88         }
89
90     }else{
91         camsys_err("phy index is erro!");
92         
93     }
94 }
95
96
97 static void phy0_WriteReg(uint8_t addr, uint8_t data)
98 {
99    // uint8_t test_data = 0;
100     //TESTEN =1,TESTDIN=addr
101     write_grf_reg(GRF_SOC_CON14_OFFSET,(( addr << DPHY_RX0_TESTDIN_OFFSET) |DPHY_RX0_TESTDIN_MASK | DPHY_RX0_TESTEN| DPHY_RX0_TESTEN_MASK)); 
102 //      //TESTCLK=1
103     write_grf_reg(GRF_SOC_CON14_OFFSET, DPHY_RX0_TESTCLK_MASK |DPHY_RX0_TESTCLK);
104     
105     //TESTCLK=0
106          write_grf_reg(GRF_SOC_CON14_OFFSET, DPHY_RX0_TESTCLK_MASK); 
107   
108     if(data != -1){ //write data ?
109          //TESTEN =0,TESTDIN=data
110         write_grf_reg(GRF_SOC_CON14_OFFSET, (( data << DPHY_RX0_TESTDIN_OFFSET)|DPHY_RX0_TESTDIN_MASK |DPHY_RX0_TESTEN)); 
111
112         //TESTCLK=1
113         write_grf_reg(GRF_SOC_CON14_OFFSET, DPHY_RX0_TESTCLK_MASK |DPHY_RX0_TESTCLK); 
114     }
115 }
116
117 static uint8_t phy0_ReadReg(uint8_t addr)  
118 {
119     uint8_t data = 0;
120     
121     //TESTEN =1,TESTDIN=addr
122     write_grf_reg(GRF_SOC_CON14_OFFSET,(( addr << DPHY_RX0_TESTDIN_OFFSET) |DPHY_RX0_TESTDIN_MASK | DPHY_RX0_TESTEN| DPHY_RX0_TESTEN_MASK)); 
123
124     //TESTCLK=0
125     write_grf_reg(GRF_SOC_CON14_OFFSET, DPHY_RX0_TESTCLK_MASK); 
126
127     return data ;
128
129     
130 }
131
132 static void phy_config_num_lane(uint8_t index,int numLane)
133 {
134     uint8_t lane_mask =0;
135     int i = 0;
136
137     for(i=0;i<numLane;i++){
138         lane_mask |= 1<<i;
139     }
140     camsys_trace(1,"lane num = 0x%d\n",lane_mask);
141     if(index == 0){
142     //  set lane num
143         write_grf_reg(GRF_SOC_CON10_OFFSET, DPHY_RX0_ENABLE_MASK | (lane_mask << DPHY_RX0_ENABLE_OFFSET_BITS)); 
144     //  set lan turndisab as 1
145         write_grf_reg(GRF_SOC_CON10_OFFSET, DPHY_RX0_TURN_DISABLE_MASK | (0xf << DPHY_RX0_TURN_DISABLE_OFFSET_BITS));
146
147         write_grf_reg(GRF_SOC_CON10_OFFSET, (0xc<<4)|(0xf<<20));
148
149     //  set lan turnrequest as 0   
150         write_grf_reg(GRF_SOC_CON15_OFFSET, DPHY_RX0_TURN_REQUEST_MASK | (0x0 << DPHY_RX0_TURN_REQUEST_OFFSET_BITS));
151     }else if(index == 1){
152     //  set lane num
153         write_grf_reg(GRF_SOC_CON9_OFFSET, DPHY_TX1RX1_ENABLE_MASK | (lane_mask << DPHY_TX1RX1_ENABLE_OFFSET_BITS)); 
154     //  set lan turndisab as 1
155         write_grf_reg(GRF_SOC_CON9_OFFSET, DPHY_TX1RX1_TURN_DISABLE_MASK | (0xf << DPHY_TX1RX1_TURN_DISABLE_OFFSET_BITS));
156     //  set lan turnrequest as 0   
157         write_grf_reg(GRF_SOC_CON15_OFFSET, DPHY_TX1RX1_TURN_REQUEST_MASK | (0x0 << DPHY_TX1RX1_TURN_REQUEST_OFFSET_BITS));
158     }
159 }
160
161 static void phy0_start(int freq,int numLane)
162 {
163 //TESTCLK=1
164     write_grf_reg(GRF_SOC_CON14_OFFSET, DPHY_RX0_TESTCLK_MASK |DPHY_RX0_TESTCLK); 
165 //TESTCLR=1    
166     write_grf_reg(GRF_SOC_CON14_OFFSET, DPHY_RX0_TESTCLR_MASK |DPHY_RX0_TESTCLR);   
167 //TESTCLR=0  zyc
168 //    write_grf_reg(GRF_SOC_CON14_OFFSET, DPHY_RX0_TESTCLR_MASK); 
169     udelay(1000);
170
171 //**********************************************************************//
172
173 #if 1
174 //set clock lane
175     phy0_WriteReg(0x34,0x14);
176
177 //set lane 0
178  /********************
179     500-550M 0x0E
180     600-650M 0x10
181     720M     0x12
182     360M     0x2A
183     *******************/
184     phy0_WriteReg(0x44,0x10);
185     if(numLane > 1)
186         phy0_WriteReg(0x54,0x10);
187 #endif
188  
189  //**********************************************************************//
190
191 //Normal operation
192     phy0_WriteReg(0x0,-1);
193     //TESTCLK=1
194     write_grf_reg(GRF_SOC_CON14_OFFSET, DPHY_RX0_TESTCLK_MASK |DPHY_RX0_TESTCLK); 
195
196     //TESTEN =0
197     write_grf_reg(GRF_SOC_CON14_OFFSET, (DPHY_RX0_TESTEN_MASK)); 
198
199 }
200
201
202
203 static int camsys_mipiphy_ops (void *phy, void *phyinfo, unsigned int on)
204 {
205 #if 0
206     camsys_phyinfo_t* phyinfo_s = (camsys_phyinfo_t*)phyinfo;
207     struct camsys_mipiphy_s* phy_s = (struct camsys_mipiphy_s*)phy;
208     if(phy_s->phy_index == 0){
209         phy_select(phy_s->phy_index);
210         phy_config_num_lane(phy_s->data_en_bit);
211         phy0_start(0,phy_s->data_en_bit);
212
213     }else if(phy_s->phy_index == 1){
214
215     }else{
216
217         camsys_err("phy index is erro!");
218     }
219 #else
220 #if 0
221     if(on == 1){
222     //disable isp
223         write_grf_reg(GRF_SOC_CON6_OFFSET, MIPI_PHY_DISABLE_ISP_MASK | 1); 
224         phy_select(0);
225     //    phy_config_num_lane(0,2);
226         phy0_start(0,2);
227
228         phy_config_num_lane(0,2);
229         udelay(200);
230     //enable isp
231         write_grf_reg(GRF_SOC_CON6_OFFSET, MIPI_PHY_DISABLE_ISP_MASK | 0); 
232     }else
233 #endif
234     {
235     //disable isp
236         write_grf_reg(GRF_SOC_CON6_OFFSET, MIPI_PHY_DISABLE_ISP_MASK | 1); 
237         phy_select(0);
238         phy_config_num_lane(0,1);
239         phy0_start(0,1);
240
241         udelay(200);
242     //enable isp
243         write_grf_reg(GRF_SOC_CON6_OFFSET, MIPI_PHY_DISABLE_ISP_MASK | 0); 
244     }
245
246 #endif   
247     return 0;
248 }
249
250 static int camsys_mipiphy_clkin_cb(void *ptr, unsigned int on)
251 {
252     return 0;
253 }
254
255 static int camsys_mipiphy_remove_cb(struct platform_device *pdev)
256 {
257     return 0;
258 }
259 int camsys_mipiphy_probe_cb(struct platform_device *pdev, camsys_dev_t *camsys_dev)
260 {
261  
262     camsys_dev->mipiphy.clkin_cb = camsys_mipiphy_clkin_cb;
263     camsys_dev->mipiphy.ops = camsys_mipiphy_ops;
264     camsys_dev->mipiphy.remove = camsys_mipiphy_remove_cb;
265
266
267     return 0;
268   
269 }
270