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"
11 /******************************************************************************
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
23 /******************************************************************************
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
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
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
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
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
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
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
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
112 /******************************************************************************
114 ******************************************************************************/
115 /********** FAN5405_REG_CONTROL0 (0x00) **********/
122 /********** FAN5405_REG_CONTROL1 (0x01) **********/
146 /********** FAN5405_REG_OREG (0x02) **********/
151 #define OTGACTIVELOW 0
152 #define OTGACTIVEHIGH 1
154 #define VOREG4P2 35 // refer to table 3
156 /********** FAN5405_REG_IC_INFO (0x03) **********/
158 /********** FAN5405_REG_IBAT (0x04) **********/
159 // ITERM [2:0] - 68mOhm
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
178 /********** FAN5405_REG_SP_CHARGER (0x05) **********/
195 /********** FAN5405_REG_SAFETY (0x06) **********/
210 // ISAFE [6:4] - 68mOhm
221 #define mdelay(t) ({unsigned long msec=(t); while (msec--) { udelay(1000);}})
222 //#define msleep(ms) udelay(ms*1000)
224 typedef unsigned char BYTE;
226 static int fan5405_ReadReg(int reg);
229 static I2C_DEV i2c_fan5405_bridge = {
240 static int reset_flag = 0; // use when assert reset
243 static const BYTE fan5405_def_reg[17] = {
244 0x40, // #0x00(CONTROL0)
245 0x30, // #0x01(CONTROL1)
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)
263 static BYTE fan5405_curr_reg[17];
265 static int fan54015_init_flag = 0;
266 static int count = 0;
268 static int32 handle = 0;
271 void sprd_ext_charger_disable(int disable)
273 sprd_gpio_request(NULL,219);
274 sprd_gpio_direction_output(NULL, 219, disable);
277 sprd_gpio_set(NULL, 219, disable);
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
288 void sprd_ext_charger_init(void)
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();
299 printf("charge start with USB\n");
300 fan5405_USB_StartCharging();
302 fan54015_init_flag = 1;
308 fan5405_Reset32sTimer();
311 printf("read uboot ext ic i2c reg[%d] = 0x%x\n", i ,fan5405_ReadReg(i));
318 uint16_t sprd_fan54015_i2c_init(void)
320 handle = I2C_HAL_Open(&i2c_fan5405_bridge);
324 uint16_t sprd_fan54015_i2c_uninit(void)
326 I2C_HAL_Close(handle);
331 void sprd_ext_charger_uninit(void)
333 sprd_fan54015_i2c_uninit();
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;
343 static int fan5405_WriteReg(int reg, int val)
346 printf("####uboot low power fan54015 write reg = %d val = %d ,handle =%d\n",reg,val,handle);
348 ret = I2C_HAL_Write(handle, ®, &val, 1);
350 write_error_count ++;
351 printf("%s: error = %d ,write error time is %d\n", __func__, ret ,write_error_count);
353 if((reset_flag == 1) ||
354 ((reg == FAN5405_REG_IBAT) && (val & FAN5405_RESET)))
356 memcpy(fan5405_curr_reg,fan5405_def_reg,6); // resets charge paremeters, except the safety register(#6)
361 fan5405_curr_reg[reg] = val;
367 static void fan5405_SetValue(BYTE reg, BYTE reg_bit,BYTE reg_shift, BYTE val)
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)
378 fan5405_WriteReg(reg,tmp);
382 static int fan5405_ReadReg(int reg)
385 uint8_t value = 0xFF;
386 ret = I2C_HAL_Read(handle, ®, &value, 1);
387 printf("######fan5405_readreg reg = %d value =%d ret =%d read_err_count = %d\n",reg,value,ret,read_err_count);
399 static BYTE fan5405_GetValue(BYTE reg, BYTE reg_bit, BYTE reg_shift)
403 tmp = (BYTE)fan5405_ReadReg(reg);
404 ret = (tmp & reg_bit) >> reg_shift;
410 void fan5405_USB_StartCharging(void)
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);
421 void fan5405_TA_StartCharging(void)
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);
433 void fan5405_Initialization(void)
435 memcpy(fan5405_curr_reg,fan5405_def_reg,sizeof(fan5405_curr_reg));
436 printf("fan5405init\n");
437 sprd_fan54015_i2c_init();
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)
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
445 fan5405_SetValue(FAN5405_REG_OREG, FAN5405_OREG,FAN5405_OREG_SHIFT, VOREG4P2); //OREG = 4.20V
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.
451 void fan5405_Reset32sTimer(void)
453 printf("fan 5405 reset rimer\n");
454 fan5405_SetValue(FAN5405_REG_CONTROL0, FAN5405_TMR_RST_OTG,FAN5405_TMR_RST_OTG_SHIFT, RESET32S);