1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2011 Samsung Electronics
9 * (C) Copyright 2008-2009 Freescale Semiconductor, Inc.
16 #include <linux/types.h>
17 #include <linux/list.h>
18 #include <power/pmic.h>
20 static LIST_HEAD(pmic_list);
22 int check_reg(struct pmic *p, u32 reg)
24 if (reg >= p->number_of_regs) {
25 printf("<reg num> = %d is invalid. Should be less than %d\n",
26 reg, p->number_of_regs);
33 int pmic_set_output(struct pmic *p, u32 reg, int out, int on)
37 if (pmic_reg_read(p, reg, &val))
45 if (pmic_reg_write(p, reg, val))
51 struct pmic *pmic_alloc(void)
55 p = calloc(sizeof(*p), 1);
57 printf("%s: No available memory for allocation!\n", __func__);
61 list_add_tail(&p->list, &pmic_list);
63 debug("%s: new pmic struct: 0x%p\n", __func__, p);
68 struct pmic *pmic_get(const char *s)
72 list_for_each_entry(p, &pmic_list, list) {
73 if (strcmp(p->name, s) == 0) {
74 debug("%s: pmic %s -> 0x%p\n", __func__, p->name, p);
82 #ifndef CONFIG_SPL_BUILD
83 static int pmic_dump(struct pmic *p)
89 puts("Wrong PMIC name!\n");
93 printf("PMIC: %s\n", p->name);
94 for (i = 0; i < p->number_of_regs; i++) {
95 ret = pmic_reg_read(p, i, &val);
97 puts("PMIC: Registers dump failed\n");
100 printf("\n0x%02x: ", i);
102 printf("%08x ", val);
108 static const char *power_get_interface(int interface)
110 const char *power_interface[] = {"I2C", "SPI", "|+|-|"};
111 return power_interface[interface];
114 static void pmic_list_names(void)
118 puts("PMIC devices:\n");
119 list_for_each_entry(p, &pmic_list, list) {
120 printf("name: %s bus: %s_%d\n", p->name,
121 power_get_interface(p->interface), p->bus);
125 static int do_pmic(struct cmd_tbl *cmdtp, int flag, int argc,
132 /* at least two arguments please */
134 return CMD_RET_USAGE;
136 if (strcmp(argv[1], "list") == 0) {
138 return CMD_RET_SUCCESS;
142 return CMD_RET_USAGE;
147 debug("%s: name: %s cmd: %s\n", __func__, name, cmd);
150 return CMD_RET_FAILURE;
152 if (strcmp(cmd, "dump") == 0) {
154 return CMD_RET_FAILURE;
155 return CMD_RET_SUCCESS;
158 if (strcmp(cmd, "read") == 0) {
160 return CMD_RET_USAGE;
162 reg = simple_strtoul(argv[3], NULL, 16);
163 ret = pmic_reg_read(p, reg, &val);
166 puts("PMIC: Register read failed\n");
168 printf("\n0x%02x: 0x%08x\n", reg, val);
170 return CMD_RET_SUCCESS;
173 if (strcmp(cmd, "write") == 0) {
175 return CMD_RET_USAGE;
177 reg = simple_strtoul(argv[3], NULL, 16);
178 val = simple_strtoul(argv[4], NULL, 16);
179 pmic_reg_write(p, reg, val);
181 return CMD_RET_SUCCESS;
184 if (strcmp(cmd, "bat") == 0) {
186 return CMD_RET_USAGE;
189 printf("%s is not a battery\n", p->name);
190 return CMD_RET_FAILURE;
193 if (strcmp(argv[3], "state") == 0)
194 p->fg->fg_battery_check(p->pbat->fg, p);
196 if (strcmp(argv[3], "charge") == 0) {
197 printf("BAT: %s charging (ctrl+c to break)\n",
199 if (p->low_power_mode)
201 if (p->pbat->battery_charge)
202 p->pbat->battery_charge(p);
205 return CMD_RET_SUCCESS;
208 /* No subcommand found */
209 return CMD_RET_SUCCESS;
213 pmic, CONFIG_SYS_MAXARGS, 1, do_pmic,
215 "list - list available PMICs\n"
216 "pmic name dump - dump named PMIC registers\n"
217 "pmic name read <reg> - read register\n"
218 "pmic name write <reg> <value> - write register\n"
219 "pmic name bat state - write register\n"
220 "pmic name bat charge - write register\n"