tizen 2.4 release
[kernel/u-boot-tm1.git] / drivers / power / fan5405.c
1
2 #include <asm/arch/sci_types.h>
3 #include <asm/arch/os_api.h>
4 #include <asm/arch/chip_drvapi.h>
5 #include <asm/arch/chip_plf_export.h>
6 #include <asm/arch/sprd_reg_global.h>
7 #include <asm/arch/sprd_reg_base.h>
8 #include "sp8830_i2c.h"
9
10
11 /******************************************************************************
12 * Register addresses
13 ******************************************************************************/
14 #define FAN5405_REG_CONTROL0                  0
15 #define FAN5405_REG_CONTROL1                  1
16 #define FAN5405_REG_OREG                      2
17 #define FAN5405_REG_IC_INFO                   3
18 #define FAN5405_REG_IBAT                      4
19 #define FAN5405_REG_SP_CHARGER                5
20 #define FAN5405_REG_SAFETY                    6
21 #define FAN5405_REG_MONITOR                  16
22
23 /******************************************************************************
24 * Register bits
25 ******************************************************************************/
26 /* FAN5405_REG_CONTROL0 (0x00) */
27 #define FAN5405_FAULT                   (0x07)
28 #define FAN5405_FAULT_SHIFT                  0
29 #define FAN5405_BOOST              (0x01 << 3)
30 #define FAN5405_BOOST_SHIFT                  3
31 #define FAN5405_STAT               (0x3 <<  4)
32 #define FAN5405_STAT_SHIFT                   4
33 #define FAN5405_EN_STAT            (0x01 << 6)
34 #define FAN5405_EN_STAT_SHIFT                6
35 #define FAN5405_TMR_RST_OTG        (0x01 << 7)  // writing a 1 resets the t32s timer, writing a 0 has no effect
36 #define FAN5405_TMR_RST_OTG_SHIFT            7
37
38 /* FAN5405_REG_CONTROL1 (0x01) */
39 #define FAN5405_OPA_MODE                (0x01)
40 #define FAN5405_OPA_MODE_SHIFT               0
41 #define FAN5405_HZ_MODE            (0x01 << 1)
42 #define FAN5405_HZ_MODE_SHIFT                1
43 #define FAN5405_CE_N               (0x01 << 2)
44 #define FAN5405_CE_N_SHIFT                   2
45 #define FAN5405_TE                 (0x01 << 3)
46 #define FAN5405_TE_SHIFT                     3
47 #define FAN5405_VLOWV              (0x03 << 4)
48 #define FAN5405_VLOWV_SHIFT                  4
49 #define FAN5405_IINLIM             (0x03 << 6)
50 #define FAN5405_IINLIM_SHIFT                 6
51
52 /* FAN5405_REG_OREG (0x02) */
53 #define FAN5405_OTG_EN                  (0x01)
54 #define FAN5405_OTG_EN_SHIFT                 0
55 #define FAN5405_OTG_PL             (0x01 << 1)
56 #define FAN5405_OTG_PL_SHIFT                 1
57 #define FAN5405_OREG               (0x3f << 2)
58 #define FAN5405_OREG_SHIFT                   2
59
60 /* FAN5405_REG_IC_INFO (0x03) */
61 #define FAN5405_REV                     (0x03)
62 #define FAN5405_REV_SHIFT                    0
63 #define FAN5405_PN                 (0x07 << 2)
64 #define FAN5405_PN_SHIFT                     2
65 #define FAN5405_VENDOR_CODE        (0x07 << 5)
66 #define FAN5405_VENDOR_CODE_SHIFT            5
67
68 /* FAN5405_REG_IBAT (0x04) */
69 #define FAN5405_ITERM                   (0x07)
70 #define FAN5405_ITERM_SHIFT                  0
71 #define FAN5405_IOCHARGE           (0x07 << 4)
72 #define FAN5405_IOCHARGE_SHIFT               4
73 #define FAN5405_RESET              (0x01 << 7)
74 #define FAN5405_RESET_SHIFT                  7
75
76 /* FAN5405_REG_SP_CHARGER (0x05) */
77 #define FAN5405_VSP                     (0x07)
78 #define FAN5405_VSP_SHIFT                    0
79 #define FAN5405_EN_LEVEL           (0x01 << 3)
80 #define FAN5405_EN_LEVEL_SHIFT               3
81 #define FAN5405_SP                 (0x01 << 4)
82 #define FAN5405_SP_SHIFT                     4
83 #define FAN5405_IO_LEVEL           (0x01 << 5)
84 #define FAN5405_IO_LEVEL_SHIFT               5
85 #define FAN5405_DIS_VREG           (0x01 << 6)
86 #define FAN5405_DIS_VREG_SHIFT               6
87
88 /* FAN5405_REG_SAFETY (0x06) */
89 #define FAN5405_VSAFE                   (0x0f)
90 #define FAN5405_VSAFE_SHIFT                  0
91 #define FAN5405_ISAFE              (0x07 << 4)
92 #define FAN5405_ISAFE_SHIFT                  4
93
94 /* FAN5405_REG_MONITOR (0x10) */
95 #define FAN5405_CV                      (0x01)
96 #define FAN5405_CV_SHIFT                     0
97 #define FAN5405_VBUS_VALID         (0x01 << 1)
98 #define FAN5405_VBUS_VALID_SHIFT             1
99 #define FAN5405_IBUS               (0x01 << 2)
100 #define FAN5405_IBUS_SHIFT                   2
101 #define FAN5405_ICHG               (0x01 << 3)
102 #define FAN5405_ICHG_SHIFT                   3
103 #define FAN5405_T_120              (0x01 << 4)
104 #define FAN5405_T_120_SHIFT                  4
105 #define FAN5405_LINCHG             (0x01 << 5)
106 #define FAN5405_LINCHG_SHIFT                 5
107 #define FAN5405_VBAT_CMP           (0x01 << 6)
108 #define FAN5405_VBAT_CMP_SHIFT               6
109 #define FAN5405_ITERM_CMP          (0x01 << 7)
110 #define FAN5405_ITERM_CMP_SHIFT              7
111
112 /******************************************************************************
113 * bit definitions
114 ******************************************************************************/
115 /********** FAN5405_REG_CONTROL0 (0x00) **********/
116 // EN_STAT [6]
117 #define ENSTAT 1
118 #define DISSTAT 0
119 // TMR_RST [7]
120 #define RESET32S 1
121
122 /********** FAN5405_REG_CONTROL1 (0x01) **********/
123 // OPA_MODE [0]
124 #define CHARGEMODE 0
125 #define BOOSTMODE 1
126 //HZ_MODE [1]
127 #define NOTHIGHIMP 0
128 #define HIGHIMP 1
129 // CE/ [2]
130 #define ENCHARGER 0
131 #define DISCHARGER 1
132 // TE [3]
133 #define DISTE 0
134 #define ENTE 1
135 // VLOWV [5:4]
136 #define VLOWV3P4 0
137 #define VLOWV3P5 1
138 #define VLOWV3P6 2
139 #define VLOWV3P7 3
140 // IINLIM [7:6]
141 #define IINLIM100 0
142 #define IINLIM500 1
143 #define IINLIM800 2
144 #define NOLIMIT 3
145
146 /********** FAN5405_REG_OREG (0x02) **********/
147 // OTG_EN [0]
148 #define DISOTG 0
149 #define ENOTG 1
150 // OTG_PL [1]
151 #define OTGACTIVELOW 0
152 #define OTGACTIVEHIGH 1
153 // OREG [7:2]
154 #define VOREG4P2 35  // refer to table 3
155
156 /********** FAN5405_REG_IC_INFO (0x03) **********/
157
158 /********** FAN5405_REG_IBAT (0x04) **********/
159 // ITERM [2:0] - 68mOhm
160 #define ITERM49 0
161 #define ITERM97 1
162 #define ITERM146 2
163 #define ITERM194 3
164 #define ITERM243 4
165 #define ITERM291 5
166 #define ITERM340 6
167 #define ITERM388 7
168 // IOCHARGE [6:4] - 68mOhm
169 #define IOCHARGE550 0
170 #define IOCHARGE650 1
171 #define IOCHARGE750 2
172 #define IOCHARGE850 3
173 #define IOCHARGE1050 4
174 #define IOCHARGE1150 5
175 #define IOCHARGE1350 6
176 #define IOCHARGE1450 7
177
178 /********** FAN5405_REG_SP_CHARGER (0x05) **********/
179 // VSP [2:0]
180 #define VSP4P213 0
181 #define VSP4P293 1
182 #define VSP4P373 2
183 #define VSP4P453 3
184 #define VSP4P533 4
185 #define VSP4P613 5
186 #define VSP4P693 6
187 #define VSP4P773 7
188 // IO_LEVEL [5]
189 #define ENIOLEVEL 0
190 #define DISIOLEVEL 1
191 // DIS_VREG [6]
192 #define VREGON 0
193 #define VREGOFF 1
194
195 /********** FAN5405_REG_SAFETY (0x06) **********/
196 // VSAFE [3:0]
197 #define VSAFE4P20 0
198 #define VSAFE4P22 1
199 #define VSAFE4P24 2
200 #define VSAFE4P26 3
201 #define VSAFE4P28 4
202 #define VSAFE4P30 5
203 #define VSAFE4P32 6
204 #define VSAFE4P34 7
205 #define VSAFE4P36 8
206 #define VSAFE4P38 9
207 #define VSAFE4P40 10
208 #define VSAFE4P42 11
209 #define VSAFE4P44 12
210 // ISAFE [6:4] - 68mOhm
211 #define ISAFE550 0
212 #define ISAFE650 1
213 #define ISAFE750 2
214 #define ISAFE850 3
215 #define ISAFE1050 4
216 #define ISAFE1150 5
217 #define ISAFE1350 6
218 #define ISAFE1450 7
219
220
221 #define mdelay(t)       ({unsigned long msec=(t); while (msec--) { udelay(1000);}})
222 //#define msleep(ms) udelay(ms*1000)
223
224 typedef unsigned char BYTE;
225
226 static int fan5405_ReadReg(int reg);
227
228
229 static I2C_DEV i2c_fan5405_bridge = {
230         .id = 3,
231         .freq = 100*1000,
232         .bus = 2,
233         .slave_addr = 0xd4,
234         .reg_addr_num = 1,
235         .check_ack = 1,
236         .no_stop = 0,
237 };
238
239
240 static int reset_flag = 0;      // use when assert reset
241
242
243 static const BYTE fan5405_def_reg[17] = {
244     0x40,    // #0x00(CONTROL0)
245     0x30,    // #0x01(CONTROL1)
246     0x0a,    // #0x02(OREG)
247     0x84,    // #0x03(IC_INFO)
248     0x09,    // #0x04(IBAT) default is 0x89 but writing 1 to IBAT[7] resets charge parameters, except the safety reg, so
249     0x24,    // #0x05(SP_CHARGER)
250     0x40,    // #0x06(SAFETY)
251     0x00,    // #0x07 - unused
252     0x00,    // #0x08 - unused
253     0x00,    // #0x09 - unused
254     0x00,    // #0x0a - unused
255     0x00,    // #0x0b - unused
256     0x00,    // #0x0c - unused
257     0x00,    // #0x0d - unused
258     0x00,    // #0x0e - unused
259     0x00,    // #0x0f - unused
260     0x00,    // #0x10(MONITOR)
261 };
262
263 static BYTE fan5405_curr_reg[17];
264
265 static int fan54015_init_flag = 0;
266 static int count = 0;
267
268 static int32 handle = 0;
269
270
271 void sprd_ext_charger_disable(int disable)
272 {
273         sprd_gpio_request(NULL,219);
274         sprd_gpio_direction_output(NULL, 219, disable);
275
276         mdelay(20);
277         sprd_gpio_set(NULL, 219, disable);
278 }
279
280 extern int sprdchg_charger_is_adapter(void);
281 enum sprd_adapter_type {
282         ADP_TYPE_UNKNOW = 0,    //unknow adapter type
283         ADP_TYPE_CDP = 1,       //Charging Downstream Port,USB&standard charger
284         ADP_TYPE_DCP = 2,       //Dedicated Charging Port, standard charger
285         ADP_TYPE_SDP = 4,       //Standard Downstream Port,USB and nonstandard charge
286 };
287
288 void sprd_ext_charger_init(void)
289 {
290         int i = 0;
291         enum sprd_adapter_type adp_type = sprdchg_charger_is_adapter();
292         if(fan54015_init_flag == 0){
293                 fan5405_Initialization();
294                 if(adp_type == ADP_TYPE_CDP || adp_type == ADP_TYPE_DCP){
295                         printf("charge start with AC\n");
296                         fan5405_TA_StartCharging();
297                         }
298                 else{
299                         printf("charge start with USB\n");
300                         fan5405_USB_StartCharging();
301                         }
302                 fan54015_init_flag = 1;
303                 }
304
305         count ++;
306         if(count == 10){
307                 count = 0;
308                 fan5405_Reset32sTimer();
309                 }
310         for( i; i<7; i++){
311                 printf("read uboot ext ic i2c reg[%d] = 0x%x\n", i ,fan5405_ReadReg(i));
312         }
313
314         return;
315 }
316
317
318 uint16_t sprd_fan54015_i2c_init(void)
319 {
320         handle = I2C_HAL_Open(&i2c_fan5405_bridge);
321         return 1;
322 }
323
324 uint16_t sprd_fan54015_i2c_uninit(void)
325 {
326         I2C_HAL_Close(handle);
327         return 1;
328 }
329
330
331 void sprd_ext_charger_uninit(void)
332 {
333         sprd_fan54015_i2c_uninit();
334 }
335
336
337 //pengwei added for i2c read error
338 static int read_err_flag = 0;
339 static int write_error_count = 0;
340 static int read_err_count = 0;
341
342
343 static int fan5405_WriteReg(int reg, int val)
344 {
345     int ret;
346         printf("####uboot low power fan54015 write reg = %d val = %d ,handle =%d\n",reg,val,handle);
347
348         ret = I2C_HAL_Write(handle, &reg, &val, 1);
349         if (ret < 0)
350                 write_error_count ++;
351                 printf("%s: error = %d ,write error time is %d\n", __func__, ret ,write_error_count);
352
353         if((reset_flag == 1) ||
354                 ((reg == FAN5405_REG_IBAT) && (val & FAN5405_RESET)))
355         {
356             memcpy(fan5405_curr_reg,fan5405_def_reg,6);  // resets charge paremeters, except the safety register(#6)
357             reset_flag = 0;
358         }
359         else
360         {
361             fan5405_curr_reg[reg] = val;
362         }
363
364     return ret;
365 }
366
367 static void fan5405_SetValue(BYTE reg, BYTE reg_bit,BYTE reg_shift, BYTE val)
368         {
369                 BYTE tmp;
370                 tmp = fan5405_curr_reg[reg] & (~reg_bit);
371                 printf("test value of i2c fan5405_curr_reg[%d] = 0x%x , temp = %d\n",reg,fan5405_curr_reg[reg],tmp);
372                 tmp |= (val << reg_shift);
373                 printf("continue test tmp =0x%x\n",tmp);
374                 if(reg_bit == FAN5405_RESET)
375                 {
376                         reset_flag = 1;
377                 }
378                 fan5405_WriteReg(reg,tmp);
379         }
380
381
382 static int fan5405_ReadReg(int reg)
383 {
384     int ret;
385         uint8_t value = 0xFF;
386         ret = I2C_HAL_Read(handle, &reg, &value, 1);
387         printf("######fan5405_readreg reg = %d value =%d ret =%d read_err_count = %d\n",reg,value,ret,read_err_count);
388         if (ret < 0)
389                 {
390                 read_err_flag = 1;
391                 read_err_count ++;
392                 }
393
394
395     return value;
396 }
397
398
399 static BYTE fan5405_GetValue(BYTE reg, BYTE reg_bit, BYTE reg_shift)
400 {
401         BYTE tmp,ret;
402
403         tmp = (BYTE)fan5405_ReadReg(reg);
404         ret = (tmp & reg_bit) >> reg_shift;
405
406         return ret;
407 }
408
409
410 void fan5405_USB_StartCharging(void)
411 {
412         printf("uboot fan54015 enter USB charging fan5405\n");
413     fan5405_SetValue(FAN5405_REG_IBAT, FAN5405_IOCHARGE,FAN5405_IOCHARGE_SHIFT, IOCHARGE550);  //550mA
414     fan5405_SetValue(FAN5405_REG_IBAT, FAN5405_ITERM, FAN5405_ITERM_SHIFT,ITERM194);  //194mA
415     fan5405_SetValue(FAN5405_REG_CONTROL1, FAN5405_IINLIM,FAN5405_IINLIM_SHIFT, IINLIM500);  // limit 500mA (default)
416     fan5405_SetValue(FAN5405_REG_CONTROL1, FAN5405_TE,FAN5405_TE_SHIFT, ENTE);
417     fan5405_SetValue(FAN5405_REG_CONTROL1, FAN5405_CE_N,FAN5405_CE_N_SHIFT, ENCHARGER);
418 }
419
420
421 void fan5405_TA_StartCharging(void)
422 {
423         printf("uboot fan54015 enter TA charging fan5405\n");
424     fan5405_SetValue(FAN5405_REG_IBAT, FAN5405_IOCHARGE,FAN5405_IOCHARGE_SHIFT, IOCHARGE1450);  //1050mA
425     fan5405_SetValue(FAN5405_REG_IBAT, FAN5405_ITERM,FAN5405_ITERM_SHIFT, ITERM97);  //97ma
426     fan5405_SetValue(FAN5405_REG_CONTROL1, FAN5405_IINLIM, FAN5405_IINLIM_SHIFT,NOLIMIT);  // no limit
427     fan5405_SetValue(FAN5405_REG_CONTROL1, FAN5405_TE,FAN5405_TE_SHIFT, ENTE);
428     fan5405_SetValue(FAN5405_REG_CONTROL1, FAN5405_CE_N,FAN5405_CE_N_SHIFT, ENCHARGER);
429 }
430
431
432
433 void fan5405_Initialization(void)
434 {
435     memcpy(fan5405_curr_reg,fan5405_def_reg,sizeof(fan5405_curr_reg));
436         printf("fan5405init\n");
437         sprd_fan54015_i2c_init();
438 //reg 6
439         fan5405_SetValue(FAN5405_REG_SAFETY, FAN5405_VSAFE,FAN5405_VSAFE_SHIFT, VSAFE4P20);  // VSAFE = 4.20V
440         fan5405_SetValue(FAN5405_REG_SAFETY, FAN5405_ISAFE, FAN5405_ISAFE_SHIFT, ISAFE1450);  // ISAFE = 1050mA (68mOhm)
441 //reg 1
442         fan5405_SetValue(FAN5405_REG_CONTROL1, FAN5405_VLOWV, FAN5405_VLOWV_SHIFT,VLOWV3P4);  // VLOWV = 3.4V
443         fan5405_SetValue(FAN5405_REG_CONTROL1, FAN5405_IINLIM, FAN5405_IINLIM_SHIFT,IINLIM500);  // INLIM = 500mA
444 //reg 2
445         fan5405_SetValue(FAN5405_REG_OREG, FAN5405_OREG,FAN5405_OREG_SHIFT, VOREG4P2);  //OREG = 4.20V
446 //reg 5
447         fan5405_SetValue(FAN5405_REG_SP_CHARGER, FAN5405_IO_LEVEL,FAN5405_IO_LEVEL_SHIFT, ENIOLEVEL);  //IO_LEVEL is 0. Output current is controlled by IOCHARGE bits.
448
449 }
450
451 void fan5405_Reset32sTimer(void)
452 {
453         printf("fan 5405 reset rimer\n");
454     fan5405_SetValue(FAN5405_REG_CONTROL0, FAN5405_TMR_RST_OTG,FAN5405_TMR_RST_OTG_SHIFT, RESET32S);
455 }
456
457