Blame view

cmd/pmic.c 4.49 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
101
  		ret = pmic_reg_read(dev, reg);
  		if (ret < 0) {
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);
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
110
  		printf(fmt, ret);
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
111
112
113
114
115
116
117
118
119
  	}
  	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...
120
  	struct uc_pmic_priv *priv;
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
121
122
  	struct udevice *dev;
  	int regs, ret;
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
123
  	char fmt[24];
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
124
  	uint reg;
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
125
126
127
128
129
  	if (!currdev) {
  		printf("First, set the PMIC device!
  ");
  		return CMD_RET_USAGE;
  	}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
130
131
  
  	dev = currdev;
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
132
  	priv = dev_get_uclass_priv(dev);
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
133
134
135
136
137
138
139
  
  	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:...
140
141
142
  		printf("PMIC max reg: %d
  ", regs);
  		return failure(-EFAULT);
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
143
  	}
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
144
145
  	ret = pmic_reg_read(dev, reg);
  	if (ret < 0) {
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
146
147
148
149
  		printf("Can't read PMIC register: %d!
  ", reg);
  		return failure(ret);
  	}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
150

d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
151
152
153
154
  	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...
155
156
157
158
159
160
161
  
  	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...
162
  	uint reg, value;
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
163
  	int regs, ret;
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
164

493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
165
166
167
168
169
  	if (!currdev) {
  		printf("First, set the PMIC device!
  ");
  		return CMD_RET_USAGE;
  	}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
170
171
172
173
174
175
176
177
178
  
  	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:...
179
180
181
  		printf("PMIC max reg: %d
  ", regs);
  		return failure(-EFAULT);
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
182
183
184
  	}
  
  	value = simple_strtoul(argv[2], NULL, 0);
d4505c8e0   Lukasz Majewski   pmic: Rewrite the...
185
  	ret = pmic_reg_write(dev, reg, value);
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
186
187
188
189
190
  	if (ret) {
  		printf("Can't write PMIC register: %d!
  ", reg);
  		return failure(ret);
  	}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
  
  	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...
219
  	"PMIC sub-system",
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
220
221
  	"list          - list pmic devices
  "
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
222
223
  	"pmic dev [name]    - show or [set] operating PMIC device
  "
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
224
225
226
227
228
229
230
  	"pmic dump          - dump registers
  "
  	"pmic read address  - read byte of register at address
  "
  	"pmic write address - write byte to register at address
  "
  );