xref: /rk3399_rockchip-uboot/drivers/power/axp152.c (revision 505cf4750ae55e711663538b3ec7a294c08e7417)
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, &current)) == 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