1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * (C) Copyright 2012 4 * Henrik Nordstrom <henrik@henriknordstrom.net> 5 */ 6 #include <common.h> 7 #include <command.h> 8 #include <asm/arch/pmic_bus.h> 9 #include <axp_pmic.h> 10 11 static u8 axp152_mvolt_to_target(int mvolt, int min, int max, int div) 12 { 13 if (mvolt < min) 14 mvolt = min; 15 else if (mvolt > max) 16 mvolt = max; 17 18 return (mvolt - min) / div; 19 } 20 21 int axp_set_dcdc2(unsigned int mvolt) 22 { 23 int rc; 24 u8 current, target; 25 26 target = axp152_mvolt_to_target(mvolt, 700, 2275, 25); 27 28 /* Do we really need to be this gentle? It has built-in voltage slope */ 29 while ((rc = pmic_bus_read(AXP152_DCDC2_VOLTAGE, ¤t)) == 0 && 30 current != target) { 31 if (current < target) 32 current++; 33 else 34 current--; 35 rc = pmic_bus_write(AXP152_DCDC2_VOLTAGE, current); 36 if (rc) 37 break; 38 } 39 return rc; 40 } 41 42 int axp_set_dcdc3(unsigned int mvolt) 43 { 44 u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 50); 45 46 return pmic_bus_write(AXP152_DCDC3_VOLTAGE, target); 47 } 48 49 int axp_set_dcdc4(unsigned int mvolt) 50 { 51 u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 25); 52 53 return pmic_bus_write(AXP152_DCDC4_VOLTAGE, target); 54 } 55 56 int axp_set_aldo2(unsigned int mvolt) 57 { 58 u8 target = axp152_mvolt_to_target(mvolt, 700, 3500, 100); 59 60 return pmic_bus_write(AXP152_LDO2_VOLTAGE, target); 61 } 62 63 int axp_init(void) 64 { 65 u8 ver; 66 int rc; 67 68 rc = pmic_bus_init(); 69 if (rc) 70 return rc; 71 72 rc = pmic_bus_read(AXP152_CHIP_VERSION, &ver); 73 if (rc) 74 return rc; 75 76 if (ver != 0x05) 77 return -EINVAL; 78 79 return 0; 80 } 81 82 int do_poweroff(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 83 { 84 pmic_bus_write(AXP152_SHUTDOWN, AXP152_POWEROFF); 85 86 /* infinite loop during shutdown */ 87 while (1) {} 88 89 /* not reached */ 90 return 0; 91 } 92