124289208SHans de Goede /*
224289208SHans de Goede * (C) Copyright 2012
324289208SHans de Goede * Henrik Nordstrom <henrik@henriknordstrom.net>
424289208SHans de Goede *
524289208SHans de Goede * SPDX-License-Identifier: GPL-2.0+
624289208SHans de Goede */
724289208SHans de Goede #include <common.h>
8c286cdfeSHans de Goede #include <command.h>
930490b52SHans de Goede #include <asm/arch/pmic_bus.h>
106944aff1SHans de Goede #include <axp_pmic.h>
1124289208SHans de Goede
axp152_mvolt_to_target(int mvolt,int min,int max,int div)1224289208SHans de Goede static u8 axp152_mvolt_to_target(int mvolt, int min, int max, int div)
1324289208SHans de Goede {
1424289208SHans de Goede if (mvolt < min)
1524289208SHans de Goede mvolt = min;
1624289208SHans de Goede else if (mvolt > max)
1724289208SHans de Goede mvolt = max;
1824289208SHans de Goede
1924289208SHans de Goede return (mvolt - min) / div;
2024289208SHans de Goede }
2124289208SHans de Goede
axp_set_dcdc2(unsigned int mvolt)226944aff1SHans de Goede int axp_set_dcdc2(unsigned int mvolt)
2324289208SHans de Goede {
2424289208SHans de Goede int rc;
2524289208SHans de Goede u8 current, target;
2624289208SHans de Goede
2724289208SHans de Goede target = axp152_mvolt_to_target(mvolt, 700, 2275, 25);
2824289208SHans de Goede
2924289208SHans de Goede /* Do we really need to be this gentle? It has built-in voltage slope */
3030490b52SHans de Goede while ((rc = pmic_bus_read(AXP152_DCDC2_VOLTAGE, ¤t)) == 0 &&
3124289208SHans de Goede current != target) {
3224289208SHans de Goede if (current < target)
3324289208SHans de Goede current++;
3424289208SHans de Goede else
3524289208SHans de Goede current--;
3630490b52SHans de Goede rc = pmic_bus_write(AXP152_DCDC2_VOLTAGE, current);
3724289208SHans de Goede if (rc)
3824289208SHans de Goede break;
3924289208SHans de Goede }
4024289208SHans de Goede return rc;
4124289208SHans de Goede }
4224289208SHans de Goede
axp_set_dcdc3(unsigned int mvolt)436944aff1SHans de Goede int axp_set_dcdc3(unsigned int mvolt)
4424289208SHans de Goede {
4574bf7961SHans de Goede u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 50);
4624289208SHans de Goede
4730490b52SHans de Goede return pmic_bus_write(AXP152_DCDC3_VOLTAGE, target);
4824289208SHans de Goede }
4924289208SHans de Goede
axp_set_dcdc4(unsigned int mvolt)506944aff1SHans de Goede int axp_set_dcdc4(unsigned int mvolt)
5124289208SHans de Goede {
5224289208SHans de Goede u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 25);
5324289208SHans de Goede
5430490b52SHans de Goede return pmic_bus_write(AXP152_DCDC4_VOLTAGE, target);
5524289208SHans de Goede }
5624289208SHans de Goede
axp_set_aldo2(unsigned int mvolt)576944aff1SHans de Goede int axp_set_aldo2(unsigned int mvolt)
5824289208SHans de Goede {
5924289208SHans de Goede u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 100);
6024289208SHans de Goede
6130490b52SHans de Goede return pmic_bus_write(AXP152_LDO2_VOLTAGE, target);
6224289208SHans de Goede }
6324289208SHans de Goede
axp_init(void)646944aff1SHans de Goede int axp_init(void)
6524289208SHans de Goede {
6624289208SHans de Goede u8 ver;
6724289208SHans de Goede int rc;
6824289208SHans de Goede
6930490b52SHans de Goede rc = pmic_bus_init();
7030490b52SHans de Goede if (rc)
7130490b52SHans de Goede return rc;
7230490b52SHans de Goede
7330490b52SHans de Goede rc = pmic_bus_read(AXP152_CHIP_VERSION, &ver);
7424289208SHans de Goede if (rc)
7524289208SHans de Goede return rc;
7624289208SHans de Goede
7724289208SHans de Goede if (ver != 0x05)
78*505cf475SJaehoon Chung return -EINVAL;
7924289208SHans de Goede
8024289208SHans de Goede return 0;
8124289208SHans de Goede }
82c286cdfeSHans de Goede
do_poweroff(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])83c286cdfeSHans de Goede int do_poweroff(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
84c286cdfeSHans de Goede {
85c286cdfeSHans de Goede pmic_bus_write(AXP152_SHUTDOWN, AXP152_POWEROFF);
86c286cdfeSHans de Goede
87c286cdfeSHans de Goede /* infinite loop during shutdown */
88c286cdfeSHans de Goede while (1) {}
89c286cdfeSHans de Goede
90c286cdfeSHans de Goede /* not reached */
91c286cdfeSHans de Goede return 0;
92c286cdfeSHans de Goede }
93