Blame view

cmd/pmic.c 4.63 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
2
3
4
  /*
   * Copyright (C) 2014-2015 Samsung Electronics
   * Przemyslaw Marczak <p.marczak@samsung.com>
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
5
6
7
8
9
10
   */
  #include <common.h>
  #include <errno.h>
  #include <dm.h>
  #include <dm/uclass-internal.h>
  #include <power/pmic.h>
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
11
12
  #define LIMIT_DEV	32
  #define LIMIT_PARENT	20
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
13
14
  
  static struct udevice *currdev;
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
15
  static int failure(int ret)
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
16
  {
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
17
18
  	printf("Error: %d (%s)
  ", ret, errno_str(ret));
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
19

493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
20
  	return CMD_RET_FAILURE;
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
21
22
23
24
  }
  
  static int do_dev(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  {
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
25
26
  	char *name;
  	int ret = -ENODEV;
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
27
28
29
  
  	switch (argc) {
  	case 2:
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
30
31
32
33
34
35
36
  		name = argv[1];
  		ret = pmic_get(name, &currdev);
  		if (ret) {
  			printf("Can't get PMIC: %s!
  ", name);
  			return failure(ret);
  		}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
37
  	case 1:
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
38
39
40
41
42
43
  		if (!currdev) {
  			printf("PMIC device is not set!
  
  ");
  			return CMD_RET_USAGE;
  		}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
44
45
46
47
48
49
  
  		printf("dev: %d @ %s
  ", currdev->seq, currdev->name);
  	}
  
  	return CMD_RET_SUCCESS;
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
50
51
52
53
54
55
  }
  
  static int do_list(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  {
  	struct udevice *dev;
  	int ret;
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
56
57
58
59
  	printf("| %-*.*s| %-*.*s| %s @ %s
  ",
  	       LIMIT_DEV, LIMIT_DEV, "Name",
  	       LIMIT_PARENT, LIMIT_PARENT, "Parent name",
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
60
61
62
63
  	       "Parent uclass", "seq");
  
  	for (ret = uclass_first_device(UCLASS_PMIC, &dev); dev;
  	     ret = uclass_next_device(&dev)) {
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
64
65
66
67
68
69
70
  		if (ret)
  			continue;
  
  		printf("| %-*.*s| %-*.*s| %s @ %d
  ",
  		       LIMIT_DEV, LIMIT_DEV, dev->name,
  		       LIMIT_PARENT, LIMIT_PARENT, dev->parent->name,
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
71
72
73
74
75
76
77
78
79
80
81
  		       dev_get_uclass_name(dev->parent), dev->parent->seq);
  	}
  
  	if (ret)
  		return CMD_RET_FAILURE;
  
  	return CMD_RET_SUCCESS;
  }
  
  static int do_dump(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  {
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
82
  	struct uc_pmic_priv *priv;
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
83
  	struct udevice *dev;
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
84
  	char fmt[16];
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
85
86
  	uint reg;
  	int ret;
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
87
88
89
90
91
  	if (!currdev) {
  		printf("First, set the PMIC device!
  ");
  		return CMD_RET_USAGE;
  	}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
92
93
  
  	dev = currdev;
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
94
  	priv = dev_get_uclass_priv(dev);
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
95
96
  	printf("Dump pmic: %s registers
  ", dev->name);
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
97
98
  	sprintf(fmt, "%%%d.%dx ", priv->trans_len * 2,
  		priv->trans_len * 2);
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
99
  	for (reg = 0; reg < pmic_reg_count(dev); reg++) {
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
100
  		ret = pmic_reg_read(dev, reg);
b852cca8f   Martin Fuzzey   pmic: allow dump ...
101
  		if (ret < 0 && ret != -ENODATA) {
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
102
103
104
105
  			printf("Can't read register: %d
  ", reg);
  			return failure(ret);
  		}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
106
107
108
109
  
  		if (!(reg % 16))
  			printf("
  0x%02x: ", reg);
b852cca8f   Martin Fuzzey   pmic: allow dump ...
110
111
112
113
114
115
116
117
118
  		if (ret == -ENODATA) {
  			int i;
  
  			for (i = 0; i < priv->trans_len; i++)
  				puts("--");
  			puts(" ");
  		} else {
  			printf(fmt, ret);
  		}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
119
120
121
122
123
124
125
126
127
  	}
  	printf("
  ");
  
  	return CMD_RET_SUCCESS;
  }
  
  static int do_read(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  {
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
128
  	struct uc_pmic_priv *priv;
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
129
130
  	struct udevice *dev;
  	int regs, ret;
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
131
  	char fmt[24];
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
132
  	uint reg;
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
133
134
135
136
137
  	if (!currdev) {
  		printf("First, set the PMIC device!
  ");
  		return CMD_RET_USAGE;
  	}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
138
139
  
  	dev = currdev;
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
140
  	priv = dev_get_uclass_priv(dev);
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
141
142
143
144
145
146
147
  
  	if (argc != 2)
  		return CMD_RET_USAGE;
  
  	reg = simple_strtoul(argv[1], NULL, 0);
  	regs = pmic_reg_count(dev);
  	if (reg > regs) {
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
148
149
150
  		printf("PMIC max reg: %d
  ", regs);
  		return failure(-EFAULT);
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
151
  	}
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
152
153
  	ret = pmic_reg_read(dev, reg);
  	if (ret < 0) {
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
154
155
156
157
  		printf("Can't read PMIC register: %d!
  ", reg);
  		return failure(ret);
  	}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
158

d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
159
160
161
162
  	sprintf(fmt, "0x%%02x: 0x%%%d.%dx
  ", priv->trans_len * 2,
  		priv->trans_len * 2);
  	printf(fmt, reg, ret);
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
163
164
165
166
167
168
169
  
  	return CMD_RET_SUCCESS;
  }
  
  static int do_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  {
  	struct udevice *dev;
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
170
  	uint reg, value;
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
171
  	int regs, ret;
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
172

493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
173
174
175
176
177
  	if (!currdev) {
  		printf("First, set the PMIC device!
  ");
  		return CMD_RET_USAGE;
  	}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
178
179
180
181
182
183
184
185
186
  
  	dev = currdev;
  
  	if (argc != 3)
  		return CMD_RET_USAGE;
  
  	reg = simple_strtoul(argv[1], NULL, 0);
  	regs = pmic_reg_count(dev);
  	if (reg > regs) {
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
187
188
189
  		printf("PMIC max reg: %d
  ", regs);
  		return failure(-EFAULT);
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
190
191
192
  	}
  
  	value = simple_strtoul(argv[2], NULL, 0);
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
193
  	ret = pmic_reg_write(dev, reg, value);
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
194
195
196
197
198
  	if (ret) {
  		printf("Can't write PMIC register: %d!
  ", reg);
  		return failure(ret);
  	}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
  
  	return CMD_RET_SUCCESS;
  }
  
  static cmd_tbl_t subcmd[] = {
  	U_BOOT_CMD_MKENT(dev, 2, 1, do_dev, "", ""),
  	U_BOOT_CMD_MKENT(list, 1, 1, do_list, "", ""),
  	U_BOOT_CMD_MKENT(dump, 1, 1, do_dump, "", ""),
  	U_BOOT_CMD_MKENT(read, 2, 1, do_read, "", ""),
  	U_BOOT_CMD_MKENT(write, 3, 1, do_write, "", ""),
  };
  
  static int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc,
  			char * const argv[])
  {
  	cmd_tbl_t *cmd;
  
  	argc--;
  	argv++;
  
  	cmd = find_cmd_tbl(argv[0], subcmd, ARRAY_SIZE(subcmd));
  	if (cmd == NULL || argc > cmd->maxargs)
  		return CMD_RET_USAGE;
  
  	return cmd->cmd(cmdtp, flag, argc, argv);
  }
  
  U_BOOT_CMD(pmic, CONFIG_SYS_MAXARGS, 1, do_pmic,
7e37a8846   Klaus Goger   cmd: pmic: update...
227
  	"PMIC sub-system",
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
228
229
  	"list          - list pmic devices
  "
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
230
231
  	"pmic dev [name]    - show or [set] operating PMIC device
  "
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
232
233
234
235
236
237
238
  	"pmic dump          - dump registers
  "
  	"pmic read address  - read byte of register at address
  "
  	"pmic write address - write byte to register at address
  "
  );