Blame view

cmd/pmic.c 4.71 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
   */
  #include <common.h>
091401131   Simon Glass   command: Remove t...
7
  #include <command.h>
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
8
9
10
11
  #include <errno.h>
  #include <dm.h>
  #include <dm/uclass-internal.h>
  #include <power/pmic.h>
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
12
13
  #define LIMIT_DEV	32
  #define LIMIT_PARENT	20
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
14
15
  
  static struct udevice *currdev;
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
16
  static int failure(int ret)
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
17
  {
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
18
19
  	printf("Error: %d (%s)
  ", ret, errno_str(ret));
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
20

493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
21
  	return CMD_RET_FAILURE;
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
22
  }
091401131   Simon Glass   command: Remove t...
23
  static int do_dev(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
24
  {
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

8b85dfc67   Simon Glass   dm: Avoid accessi...
45
46
  		printf("dev: %d @ %s
  ", dev_seq(currdev), currdev->name);
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
47
48
49
  	}
  
  	return CMD_RET_SUCCESS;
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
50
  }
091401131   Simon Glass   command: Remove t...
51
52
  static int do_list(struct cmd_tbl *cmdtp, int flag, int argc,
  		   char *const argv[])
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
53
54
55
  {
  	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,
8b85dfc67   Simon Glass   dm: Avoid accessi...
71
  		       dev_get_uclass_name(dev->parent), dev_seq(dev->parent));
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
72
73
74
75
76
77
78
  	}
  
  	if (ret)
  		return CMD_RET_FAILURE;
  
  	return CMD_RET_SUCCESS;
  }
091401131   Simon Glass   command: Remove t...
79
80
  static int do_dump(struct cmd_tbl *cmdtp, int flag, int argc,
  		   char *const argv[])
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
81
  {
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
  	}
  	printf("
  ");
  
  	return CMD_RET_SUCCESS;
  }
091401131   Simon Glass   command: Remove t...
125
126
  static int do_read(struct cmd_tbl *cmdtp, int flag, int argc,
  		   char *const argv[])
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
127
  {
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
  
  	return CMD_RET_SUCCESS;
  }
091401131   Simon Glass   command: Remove t...
166
167
  static int do_write(struct cmd_tbl *cmdtp, int flag, int argc,
  		    char *const argv[])
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
168
169
  {
  	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
  
  	return CMD_RET_SUCCESS;
  }
091401131   Simon Glass   command: Remove t...
202
  static struct cmd_tbl subcmd[] = {
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
203
204
205
206
207
208
  	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, "", ""),
  };
091401131   Simon Glass   command: Remove t...
209
210
  static int do_pmic(struct cmd_tbl *cmdtp, int flag, int argc,
  		   char *const argv[])
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
211
  {
091401131   Simon Glass   command: Remove t...
212
  	struct cmd_tbl *cmd;
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
213
214
215
216
217
218
219
220
221
222
223
224
  
  	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...
225
  	"PMIC sub-system",
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
226
227
  	"list          - list pmic devices
  "
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
228
229
  	"pmic dev [name]    - show or [set] operating PMIC device
  "
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
230
231
232
233
234
235
236
  	"pmic dump          - dump registers
  "
  	"pmic read address  - read byte of register at address
  "
  	"pmic write address - write byte to register at address
  "
  );