MA-10052 [iot] Extensions of AXP152 to support stream812
authorfang hui <hui.fang@nxp.com>
Thu, 11 May 2017 04:18:38 +0000 (12:18 +0800)
committerLuo Ji <ji.luo@nxp.com>
Thu, 25 Jan 2018 11:38:53 +0000 (19:38 +0800)
Necessary extensions of axp152 to support stream812.

merge patches from Martin Pietryka <martin.pietryka@streamunlimited.com>

Change-Id: I7708db4e59d6403a3576f17a221b448866f469a0
Signed-off-by: fang hui <hui.fang@nxp.com>
drivers/power/axp152.c
include/axp152.h

index c4b3fe5..a27dee4 100644 (file)
@@ -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, &reg);
+       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, &reg);
+       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[])
index 1643266..58727ba 100644 (file)
@@ -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);