diff options
author | fang hui <hui.fang@nxp.com> | 2017-10-20 03:55:45 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2017-10-20 03:55:45 +0000 |
commit | 1607f8a339576198ffdd0402216cba1ab031ecc8 (patch) | |
tree | cba5c9b992e7f537ba2cbbf3c18dd94cab1db7a6 | |
parent | beadc787006daf982e5eb48551029839abd21595 (diff) | |
parent | 11dfafb689833b0058674a7894267b972839c444 (diff) | |
download | uboot-imx-1607f8a339576198ffdd0402216cba1ab031ecc8.tar.gz |
MA-10052 [iot] Extensions of AXP152 to support stream812
am: 11dfafb689
Change-Id: Ifb3593cd44154e7a90fea99addef6bc1dad2c06d
-rw-r--r-- | drivers/power/axp152.c | 111 | ||||
-rw-r--r-- | include/axp152.h | 83 |
2 files changed, 191 insertions, 3 deletions
diff --git a/drivers/power/axp152.c b/drivers/power/axp152.c index c4b3fe58a6..a27dee4327 100644 --- a/drivers/power/axp152.c +++ b/drivers/power/axp152.c @@ -6,8 +6,26 @@ */ #include <common.h> #include <command.h> -#include <asm/arch/pmic_bus.h> +#include <i2c.h> #include <axp_pmic.h> +#include <errno.h> + +#define AXP152_I2C_ADDR 0x32 + +static int pmic_bus_init(void) +{ + return 0; +} + +static int pmic_bus_read(u8 reg, u8 *data) +{ + return i2c_read(AXP152_I2C_ADDR, reg, 1, data, 1); +} + +static int pmic_bus_write(u8 reg, u8 data) +{ + return i2c_write(AXP152_I2C_ADDR, reg, 1, &data, 1); +} static u8 axp152_mvolt_to_target(int mvolt, int min, int max, int div) { @@ -19,6 +37,14 @@ static u8 axp152_mvolt_to_target(int mvolt, int min, int max, int div) return (mvolt - min) / div; } +int axp_set_dcdc1(enum axp152_dcdc1_voltages volt) +{ + if (volt < AXP152_DCDC1_1V7 || volt > AXP152_DCDC1_3V5) + return -EINVAL; + + return pmic_bus_write(AXP152_DCDC1_VOLTAGE, volt); +} + int axp_set_dcdc2(unsigned int mvolt) { int rc; @@ -54,17 +80,79 @@ int axp_set_dcdc4(unsigned int mvolt) return pmic_bus_write(AXP152_DCDC4_VOLTAGE, target); } -int axp_set_aldo2(unsigned int mvolt) +int axp_set_ldo0(enum axp152_ldo0_volts volt, enum axp152_ldo0_curr_limit curr_limit) +{ + u8 target = curr_limit | (volt << 4) | (1 << 7); + + return pmic_bus_write(AXP152_LDO0_VOLTAGE, target); +} + +int axp_disable_ldo0(void) +{ + int ret; + u8 target; + + ret = pmic_bus_read(AXP152_LDO0_VOLTAGE, &target); + if (ret) + return ret; + + target &= ~(1 << 7); + + return pmic_bus_write(AXP152_LDO0_VOLTAGE, target); +} + +int axp_set_ldo1(unsigned int mvolt) +{ + u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 100); + + return pmic_bus_write(AXP152_LDO1_VOLTAGE, target); +} + + +int axp_set_ldo2(unsigned int mvolt) { u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 100); return pmic_bus_write(AXP152_LDO2_VOLTAGE, target); } +int axp_set_aldo1(enum axp152_aldo_voltages volt) +{ + u8 val; + int ret; + + ret = pmic_bus_read(AXP152_ALDO1_ALDO2_VOLTAGE, &val); + if (ret) + return ret; + + val |= (volt << 4); + return pmic_bus_write(AXP152_ALDO1_ALDO2_VOLTAGE, val); +} + +int axp_set_aldo2(enum axp152_aldo_voltages volt) +{ + u8 val; + int ret; + + ret = pmic_bus_read(AXP152_ALDO1_ALDO2_VOLTAGE, &val); + if (ret) + return ret; + + val |= volt; + return pmic_bus_write(AXP152_ALDO1_ALDO2_VOLTAGE, val); +} + +int axp_set_power_output(int val) +{ + return pmic_bus_write(AXP152_POWER_CONTROL, val); +} + int axp_init(void) { u8 ver; int rc; + int ret; + u8 reg; rc = pmic_bus_init(); if (rc) @@ -77,7 +165,24 @@ int axp_init(void) if (ver != 0x05) return -EINVAL; - return 0; + /* Set the power off sequence to `reverse of power on sequence` */ + ret = pmic_bus_read(AXP152_SHUTDOWN, ®); + if (ret) + return ret; + reg |= AXP152_POWEROFF_SEQ; + ret = pmic_bus_write(AXP152_SHUTDOWN, reg); + if (ret) + return ret; + + + /* Enable the power recovery */ + ret = pmic_bus_read(AXP152_POWER_RECOVERY, ®); + if (ret) + return ret; + reg |= AXP152_POWER_RECOVERY_EN; + ret = pmic_bus_write(AXP152_POWER_RECOVERY, reg); + return ret; + } int do_poweroff(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) diff --git a/include/axp152.h b/include/axp152.h index 1643266f9a..58727ba2e9 100644 --- a/include/axp152.h +++ b/include/axp152.h @@ -6,14 +6,84 @@ enum axp152_reg { AXP152_CHIP_VERSION = 0x3, + AXP152_POWER_CONTROL = 0x12, + AXP152_LDO0_VOLTAGE = 0x15, AXP152_DCDC2_VOLTAGE = 0x23, + AXP152_DCDC1_VOLTAGE = 0x26, AXP152_DCDC3_VOLTAGE = 0x27, AXP152_DCDC4_VOLTAGE = 0x2B, + AXP152_LDO1_VOLTAGE = 0x29, AXP152_LDO2_VOLTAGE = 0x2A, + AXP152_ALDO1_ALDO2_VOLTAGE = 0x28, + AXP152_POWER_RECOVERY = 0x31, AXP152_SHUTDOWN = 0x32, + AXP152_GPIO0 = 0x90, }; +enum axp152_ldo0_volts { + AXP152_LDO0_5V = 0, + AXP152_LDO0_3V3 = 1, + AXP152_LDO0_2V8 = 2, + AXP152_LDO0_2V5 = 3, +}; + +enum axp152_ldo0_curr_limit { + AXP152_LDO0_CURR_NOLMIT = 0, + AXP152_LDO0_CURR_1500MA = 1, + AXP152_LDO0_CURR_900MA = 2, + AXP152_LDO0_CURR_500MA = 3, +}; + +enum axp152_dcdc1_voltages { + AXP152_DCDC1_1V7 = 0, + AXP152_DCDC1_1V8 = 1, + AXP152_DCDC1_1V9 = 2, + AXP152_DCDC1_2V0 = 3, + AXP152_DCDC1_2V1 = 4, + AXP152_DCDC1_2V4 = 5, + AXP152_DCDC1_2V5 = 6, + AXP152_DCDC1_2V6 = 7, + AXP152_DCDC1_2V7 = 8, + AXP152_DCDC1_2V8 = 9, + AXP152_DCDC1_3V0 = 10, + AXP152_DCDC1_3V1 = 11, + AXP152_DCDC1_3V2 = 12, + AXP152_DCDC1_3V3 = 13, + AXP152_DCDC1_3V4 = 14, + AXP152_DCDC1_3V5 = 15, +}; + +enum axp152_aldo_voltages { + AXP152_ALDO_1V2 = 0, + AXP152_ALDO_1V3 = 1, + AXP152_ALDO_1V4 = 2, + AXP152_ALDO_1V5 = 3, + AXP152_ALDO_1V6 = 4, + AXP152_ALDO_1V7 = 5, + AXP152_ALDO_1V8 = 6, + AXP152_ALDO_1V9 = 7, + AXP152_ALDO_2V0 = 8, + AXP152_ALDO_2V5 = 9, + AXP152_ALDO_2V7 = 10, + AXP152_ALDO_2V8 = 11, + AXP152_ALDO_3V0 = 12, + AXP152_ALDO_3V1 = 13, + AXP152_ALDO_3V2 = 14, + AXP152_ALDO_3V3 = 15, +}; + +#define AXP152_POWEROUT_DC_DC1 BIT(7) +#define AXP152_POWEROUT_DC_DC2 BIT(6) +#define AXP152_POWEROUT_DC_DC3 BIT(5) +#define AXP152_POWEROUT_DC_DC4 BIT(4) +#define AXP152_POWEROUT_ALDO1 BIT(3) +#define AXP152_POWEROUT_ALDO2 BIT(2) +#define AXP152_POWEROUT_DLDO1 BIT(1) +#define AXP152_POWEROUT_DLDO2 BIT(0) + #define AXP152_POWEROFF (1 << 7) +#define AXP152_POWEROFF_SEQ (1 << 2) +#define AXP152_POWER_RECOVERY_EN (1 << 3) /* For axp_gpio.c */ #define AXP_GPIO0_CTRL 0x90 @@ -25,3 +95,16 @@ enum axp152_reg { #define AXP_GPIO_CTRL_INPUT 0x02 /* Input */ #define AXP_GPIO_STATE 0x97 #define AXP_GPIO_STATE_OFFSET 0 + +int axp_set_dcdc1(enum axp152_dcdc1_voltages volt); +int axp_set_dcdc2(unsigned int mvolt); +int axp_set_dcdc3(unsigned int mvolt); +int axp_set_dcdc4(unsigned int mvolt); +int axp_set_ldo0(enum axp152_ldo0_volts volt, enum axp152_ldo0_curr_limit curr_limit); +int axp_disable_ldo0(void); +int axp_set_ldo1(unsigned int mvolt); +int axp_set_ldo2(unsigned int mvolt); +int axp_set_aldo1(enum axp152_aldo_voltages volt); +int axp_set_aldo2(enum axp152_aldo_voltages volt); +int axp_set_power_output(int val); +int axp_init(void); |