xref: /openbmc/u-boot/drivers/power/axp152.c (revision 83d290c56fab2d38cd1ab4c4cc7099559c1d5046)
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, &current)) == 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