/* ************************************************************************************************************ * * function * * 函数名称: * * 参数列表: * * 返回值 : * * 说明 : * * ************************************************************************************************************ */ int axp22_probe(void) { u8 pmu_type; axp_i2c_config(SUNXI_AXP_22X, AXP22_ADDR); if(axp_i2c_read(AXP22_ADDR, BOOT_POWER22_VERSION, &pmu_type)) { printf("axp read error\n"); return -1; } pmu_type &= 0x0f; if(pmu_type & 0x06) { /* pmu type AXP221 */ tick_printf("PMU: AXP221\n"); return 0; } return -1; }
/* ************************************************************************************************************ * * function * * 函数名称: * * 参数列表: * * 返回值 : * * 说明 : * * ************************************************************************************************************ */ int axp22_set_power_onoff_vol(int set_vol, int stage) { u8 reg_value; if(!set_vol) { if(!stage) { set_vol = 3300; } else { set_vol = 2900; } } if(axp_i2c_read(AXP22_ADDR, BOOT_POWER22_VOFF_SET, ®_value)) { return -1; } reg_value &= 0xf8; if(set_vol >= 2600 && set_vol <= 3300) { reg_value |= (set_vol - 2600)/100; } else if(set_vol <= 2600) { reg_value |= 0x00; } else { reg_value |= 0x07; } if(axp_i2c_write(AXP22_ADDR, BOOT_POWER22_VOFF_SET, reg_value)) { return -1; } return 0; }
/* ************************************************************************************************************ * * function * * 函数名称: * * 参数列表: * * 返回值 : * * 说明 : * * ************************************************************************************************************ */ int axp81_probe_int_pending(uchar *addr) { int i; for(i=0;i<5;i++) { if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_INTSTS1 + i, addr + i)) { return -1; } } for(i=0;i<5;i++) { if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_INTSTS1 + i, 0xff)) { return -1; } } return 0; }
/* ************************************************************************************************************ * * function * * 函数名称: * * 参数列表: * * 返回值 : * * 说明 : * * ************************************************************************************************************ */ int axp81_set_vbus_cur_limit(int current) { uchar reg_value; //set bus current limit off if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_VBUS_SET, ®_value)) { return -1; } reg_value &= 0xfC; if(!current) { reg_value |= 0x03; } else if(current >= 2500) //limit to2500 { reg_value |= 0x03; } else if(current >= 2000) //limit to 2000 { reg_value |= 0x02; } else if(current >= 1500) //limit to 1500 { reg_value |= 0x01; } else //limit to 900 { reg_value |= 0x00; } if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_VBUS_SET, reg_value)) { return -1; } return 0; }
/* ************************************************************************************************************ * * function * * 函数名称: * * 参数列表: * * 返回值 : * * 说明 : * * ************************************************************************************************************ */ int axp809_probe(void) { u8 pmu_type; axp_i2c_config(SUNXI_AXP_809, AXP809_ADDR); if(axp_i2c_read(AXP809_ADDR, BOOT_POWER809_VERSION, &pmu_type)) { printf("axp read error\n"); return -1; } pmu_type &= 0xCF; if(pmu_type == 0x42) { /* pmu type AXP809 */ tick_printf("PMU: AXP809\n"); return 0; } return -1; }
/* ************************************************************************************************************ * * function * * 函数名称: * * 参数列表: * * 返回值 : * * 说明 : * * ************************************************************************************************************ */ static int axp809_set_dldo1(int set_vol, int onoff) { u8 reg_value; u8 tmp_step; if(set_vol > 0) { if(set_vol < 3500) { if(set_vol < 700) { set_vol = 700; } tmp_step = (set_vol - 700)/100; } else { if(set_vol > 4200) { set_vol = 4200; } tmp_step = (set_vol - 3400)/200 + 27; } if(axp_i2c_read(AXP809_ADDR, BOOT_POWER809_DLDO1_VOL, ®_value)) { return -1; } reg_value &= 0xE0; reg_value |= tmp_step; if(axp_i2c_write(AXP809_ADDR, BOOT_POWER809_DLDO1_VOL, reg_value)) { printf("sunxi pmu error : unable to set dldo1\n"); return -1; } } if(onoff < 0) { return 0; } if(axp_i2c_read(AXP809_ADDR, BOOT_POWER809_OUTPUT_CTL2, ®_value)) { return -1; } if(onoff == 0) { reg_value &= ~(1 << 3); } else { reg_value |= (1 << 3); } if(axp_i2c_write(AXP809_ADDR, BOOT_POWER809_OUTPUT_CTL2, reg_value)) { printf("sunxi pmu error : unable to onoff dldo1\n"); return -1; } return 0; }
/* ************************************************************************************************************ * * function * * 函数名称: * * 参数列表: * * 返回值 : * * 说明 : * * ************************************************************************************************************ */ static int axp809_set_dcdc4(int set_vol, int onoff) { u8 reg_value; u8 tmp_step; if(set_vol > 0) { if(set_vol <= 1540) { if(set_vol < 600) { set_vol = 600; } tmp_step = (set_vol - 600)/20; } else { if(set_vol < 1800) { set_vol = 1800; } else if(set_vol > 2600) { set_vol = 2600; } tmp_step = (set_vol - 1800)/100 + 48; } if(axp_i2c_read(AXP809_ADDR, BOOT_POWER809_DC4OUT_VOL, ®_value)) { debug("%d\n", __LINE__); return -1; } reg_value &= 0xC0; reg_value |= tmp_step; if(axp_i2c_write(AXP809_ADDR, BOOT_POWER809_DC4OUT_VOL, reg_value)) { printf("sunxi pmu error : unable to set dcdc4\n"); return -1; } } if(onoff < 0) { return 0; } if(axp_i2c_read(AXP809_ADDR, BOOT_POWER809_OUTPUT_CTL1, ®_value)) { return -1; } if(onoff == 0) { reg_value &= ~(1 << 4); } else { reg_value |= (1 << 4); } if(axp_i2c_write(AXP809_ADDR, BOOT_POWER809_OUTPUT_CTL1, reg_value)) { printf("sunxi pmu error : unable to onoff dcdc4\n"); return -1; } return 0; }
/* ************************************************************************************************************ * * function * * 函数名称: * * 参数列表: * * 返回值 : * * 说明 : * * ************************************************************************************************************ */ static int axp20_set_ldo4(int set_vol, int onoff) { s32 vol_value; s32 ret; u8 reg_addr; u8 reg_value; if(-1 == set_vol) { if(!ldo4_user_set) { ret = script_parser_fetch("target", "ldo4_vol", &vol_value, 1); if(ret) { printf("boot power:unable to find ldo4 set\n"); return -1; } ldo4_user_set = vol_value; } vol_value = ldo4_user_set; } else { vol_value = set_vol; } if(!vol_value) { reg_addr = BOOT_POWER20_OUTPUT_CTL; if(!axp_i2c_read(AXP20_ADDR, reg_addr, ®_value)) { reg_value &= ~(1<<3); if(axp_i2c_write(AXP20_ADDR, reg_addr, reg_value)) { printf("boot power:unable to set ldo2\n"); return -1; } } } else { reg_addr = BOOT_POWER20_LDO24OUT_VOL; if(!axp_i2c_read(AXP20_ADDR, reg_addr, ®_value)) { reg_value &= 0xf0; /************************************************************************************* 0 1300 2000 2500 2700 2800 3000 3300 max *************************************************************************************/ if(vol_value < 1300) { reg_value |= 0x00; } else if(vol_value <= 2000) { reg_value |= (vol_value - 1200)/100; } else if(vol_value < 2700) { reg_value |= 0x09; } else if(vol_value <= 2800) { reg_value |= ((vol_value - 2700)/100) + 0x0a; } else { if(vol_value < 3000) { vol_value = 3000; } else if(vol_value > 3300) { vol_value = 3300; } reg_value |= ((vol_value - 3000)/100) + 0x0c; } if(axp_i2c_write(AXP20_ADDR, reg_addr, reg_value)) { printf("boot power:unable to set ldo4\n"); return -1; } } } return 0; }
/* ************************************************************************************************************ * * function * * 函数名称: * * 参数列表: * * 返回值 : * * 说明 : * * ************************************************************************************************************ */ static int axp20_set_dcdc2(int set_vol, int onoff) { u32 vol, tmp; volatile u32 i; u8 reg_addr, value; if(set_vol == -1) { set_vol = 1400; } //PMU is AXP209 reg_addr = BOOT_POWER20_DC2OUT_VOL; if(axp_i2c_read(AXP20_ADDR, reg_addr, &value)) { return -1; } tmp = value & 0x3f; vol = tmp * 25 + 700; //如果电压过高,则调低 while(vol > set_vol) { tmp -= 1; value &= ~0x3f; value |= tmp; reg_addr = BOOT_POWER20_DC2OUT_VOL; if(axp_i2c_write(AXP20_ADDR, reg_addr, value)) { return -1; } for(i=0;i<2000;i++); reg_addr = BOOT_POWER20_DC2OUT_VOL; if(axp_i2c_read(AXP20_ADDR, reg_addr, &value)) { return -1; } tmp = value & 0x3f; vol = tmp * 25 + 700; } //如果电压过低,则调高,根据先调低再调高的过程,保证电压会大于等于用户设定电压 while(vol < set_vol) { tmp += 1; value &= ~0x3f; value |= tmp; reg_addr = BOOT_POWER20_DC2OUT_VOL; if(axp_i2c_write(AXP20_ADDR, reg_addr, value)) { return -1; } for(i=0;i<2000;i++); reg_addr = BOOT_POWER20_DC2OUT_VOL; if(axp_i2c_read(AXP20_ADDR, reg_addr, &value)) { return -1; } tmp = value & 0x3f; vol = tmp * 25 + 700; } //tick_printf("after set, dcdc2 =%dmv\n",vol); return 0; }
/* ************************************************************************************************************ * * function * * 函数名称: * * 参数列表: * * 返回值 : * * 说明 : * * ************************************************************************************************************ */ static int axp81X_set_dcdc6(int set_vol, int onoff) { u8 reg_value; if(set_vol > 0) { if(set_vol < 600) { set_vol = 600; } else if(set_vol > 1520) { set_vol = 1520; } if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_DC6OUT_VOL, ®_value)) { debug("%d\n", __LINE__); return -1; } reg_value &= (~0x7f); //dcdc6: 0.6v-1.1v 10mv/step 1.12v-1.52v 20mv/step if(set_vol > 1100) { reg_value |= (50+(set_vol - 1100)/20); } else { reg_value |= (set_vol - 600)/10; } if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_DC6OUT_VOL, reg_value)) { printf("sunxi pmu error : unable to set dcdc5\n"); return -1; } } if(onoff < 0) { return 0; } if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_OUTPUT_CTL1, ®_value)) { return -1; } if(onoff == 0) { reg_value &= ~(1 << 5); } else { reg_value |= (1 << 5); } if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_OUTPUT_CTL1, reg_value)) { printf("sunxi pmu error : unable to onoff dcdc5\n"); return -1; } return 0; }
/* ************************************************************************************************************ * * function * * 函数名称: * * 参数列表: * * 返回值 : * * 说明 : * * ************************************************************************************************************ */ static int axp81X_set_dcdc4(int set_vol, int onoff) { u8 reg_value; if(set_vol > 0) { if(set_vol < 500) { set_vol = 500; } else if(set_vol > 1300) { set_vol = 1300; } if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_DC4OUT_VOL, ®_value)) { debug("%d\n", __LINE__); return -1; } reg_value &= (~0x7f); //dcdc4: 0.5v-1.2v 10mv/step 1.22v-1.3v 20mv/step if(set_vol > 1200) { reg_value |= (70+(set_vol - 1200)/20); } else { reg_value |= (set_vol - 500)/10; } if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_DC4OUT_VOL, reg_value)) { printf("sunxi pmu error : unable to set dcdc4\n"); return -1; } #if 0 if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_DC4OUT_VOL, ®_value)) { debug("%d\n", __LINE__); return -1; } printf("BOOT_POWER81X_DC4OUT_VOL=%d\n", reg_value); #endif } if(onoff < 0) { return 0; } if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_OUTPUT_CTL1, ®_value)) { return -1; } if(onoff == 0) { reg_value &= ~(1 << 3); } else { reg_value |= (1 << 3); } if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_OUTPUT_CTL1, reg_value)) { printf("sunxi pmu error : unable to onoff dcdc4\n"); return -1; } return 0; }
/* ************************************************************************************************************ * * function * * 函数名称: * * 参数列表: * * 返回值 : * * 说明 : * * ************************************************************************************************************ */ static int axp81X_set_dldo2(int set_vol, int onoff) { u8 reg_value; if(set_vol > 0) { if(set_vol < 700) { set_vol = 700; } else if(set_vol > 4200) { set_vol = 4200; } if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_DLDO2_VOL, ®_value)) { return -1; } reg_value &= 0xE0; //dldo: 0.7v-3.4v 100mv/step 3.4v-4.2v 200mv/step if(set_vol > 3400) { reg_value |= (27 + ((set_vol - 3400)/200)); //(3400-700)/100 } else { reg_value |= ((set_vol - 700)/100); } if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_DLDO2_VOL, reg_value)) { printf("sunxi pmu error : unable to set dldo2\n"); return -1; } } if(onoff < 0) { return 0; } if(axp_i2c_read(AXP81X_ADDR, BOOT_POWER81X_OUTPUT_CTL2, ®_value)) { return -1; } if(onoff == 0) { reg_value &= ~(1 << 4); } else { reg_value |= (1 << 4); } if(axp_i2c_write(AXP81X_ADDR, BOOT_POWER81X_OUTPUT_CTL2, reg_value)) { printf("sunxi pmu error : unable to onoff dldo2\n"); return -1; } return 0; }