1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
224289208SHans de Goede /*
324289208SHans de Goede * (C) Copyright 2012
424289208SHans de Goede * Henrik Nordstrom <henrik@henriknordstrom.net>
524289208SHans de Goede */
624289208SHans de Goede #include <common.h>
7c286cdfeSHans de Goede #include <command.h>
830490b52SHans de Goede #include <asm/arch/pmic_bus.h>
96944aff1SHans de Goede #include <axp_pmic.h>
1024289208SHans de Goede
axp152_mvolt_to_target(int mvolt,int min,int max,int div)1124289208SHans de Goede static u8 axp152_mvolt_to_target(int mvolt, int min, int max, int div)
1224289208SHans de Goede {
1324289208SHans de Goede if (mvolt < min)
1424289208SHans de Goede mvolt = min;
1524289208SHans de Goede else if (mvolt > max)
1624289208SHans de Goede mvolt = max;
1724289208SHans de Goede
1824289208SHans de Goede return (mvolt - min) / div;
1924289208SHans de Goede }
2024289208SHans de Goede
axp_set_dcdc2(unsigned int mvolt)216944aff1SHans de Goede int axp_set_dcdc2(unsigned int mvolt)
2224289208SHans de Goede {
2324289208SHans de Goede int rc;
2424289208SHans de Goede u8 current, target;
2524289208SHans de Goede
2624289208SHans de Goede target = axp152_mvolt_to_target(mvolt, 700, 2275, 25);
2724289208SHans de Goede
2824289208SHans de Goede /* Do we really need to be this gentle? It has built-in voltage slope */
2930490b52SHans de Goede while ((rc = pmic_bus_read(AXP152_DCDC2_VOLTAGE, ¤t)) == 0 &&
3024289208SHans de Goede current != target) {
3124289208SHans de Goede if (current < target)
3224289208SHans de Goede current++;
3324289208SHans de Goede else
3424289208SHans de Goede current--;
3530490b52SHans de Goede rc = pmic_bus_write(AXP152_DCDC2_VOLTAGE, current);
3624289208SHans de Goede if (rc)
3724289208SHans de Goede break;
3824289208SHans de Goede }
3924289208SHans de Goede return rc;
4024289208SHans de Goede }
4124289208SHans de Goede
axp_set_dcdc3(unsigned int mvolt)426944aff1SHans de Goede int axp_set_dcdc3(unsigned int mvolt)
4324289208SHans de Goede {
4474bf7961SHans de Goede u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 50);
4524289208SHans de Goede
4630490b52SHans de Goede return pmic_bus_write(AXP152_DCDC3_VOLTAGE, target);
4724289208SHans de Goede }
4824289208SHans de Goede
axp_set_dcdc4(unsigned int mvolt)496944aff1SHans de Goede int axp_set_dcdc4(unsigned int mvolt)
5024289208SHans de Goede {
5124289208SHans de Goede u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 25);
5224289208SHans de Goede
5330490b52SHans de Goede return pmic_bus_write(AXP152_DCDC4_VOLTAGE, target);
5424289208SHans de Goede }
5524289208SHans de Goede
axp_set_aldo2(unsigned int mvolt)566944aff1SHans de Goede int axp_set_aldo2(unsigned int mvolt)
5724289208SHans de Goede {
5824289208SHans de Goede u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 100);
5924289208SHans de Goede
6030490b52SHans de Goede return pmic_bus_write(AXP152_LDO2_VOLTAGE, target);
6124289208SHans de Goede }
6224289208SHans de Goede
axp_init(void)636944aff1SHans de Goede int axp_init(void)
6424289208SHans de Goede {
6524289208SHans de Goede u8 ver;
6624289208SHans de Goede int rc;
6724289208SHans de Goede
6830490b52SHans de Goede rc = pmic_bus_init();
6930490b52SHans de Goede if (rc)
7030490b52SHans de Goede return rc;
7130490b52SHans de Goede
7230490b52SHans de Goede rc = pmic_bus_read(AXP152_CHIP_VERSION, &ver);
7324289208SHans de Goede if (rc)
7424289208SHans de Goede return rc;
7524289208SHans de Goede
7624289208SHans de Goede if (ver != 0x05)
77505cf475SJaehoon Chung return -EINVAL;
7824289208SHans de Goede
7924289208SHans de Goede return 0;
8024289208SHans de Goede }
81c286cdfeSHans de Goede
do_poweroff(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])82c286cdfeSHans de Goede int do_poweroff(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
83c286cdfeSHans de Goede {
84c286cdfeSHans de Goede pmic_bus_write(AXP152_SHUTDOWN, AXP152_POWEROFF);
85c286cdfeSHans de Goede
86c286cdfeSHans de Goede /* infinite loop during shutdown */
87c286cdfeSHans de Goede while (1) {}
88c286cdfeSHans de Goede
89c286cdfeSHans de Goede /* not reached */
90c286cdfeSHans de Goede return 0;
91c286cdfeSHans de Goede }
92