Blame view

cmd/pmic.c 4.26 KB
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
1
2
3
4
5
6
7
8
9
10
11
  /*
   * Copyright (C) 2014-2015 Samsung Electronics
   * Przemyslaw Marczak <p.marczak@samsung.com>
   *
   * SPDX-License-Identifier:	GPL-2.0+
   */
  #include <common.h>
  #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
23
24
25
  }
  
  static int do_dev(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  {
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
26
27
  	char *name;
  	int ret = -ENODEV;
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
28
29
30
  
  	switch (argc) {
  	case 2:
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
31
32
33
34
35
36
37
  		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...
38
  	case 1:
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
39
40
41
42
43
44
  		if (!currdev) {
  			printf("PMIC device is not set!
  
  ");
  			return CMD_RET_USAGE;
  		}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
45
46
47
48
49
50
  
  		printf("dev: %d @ %s
  ", currdev->seq, currdev->name);
  	}
  
  	return CMD_RET_SUCCESS;
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
51
52
53
54
55
56
  }
  
  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:...
57
58
59
60
  	printf("| %-*.*s| %-*.*s| %s @ %s
  ",
  	       LIMIT_DEV, LIMIT_DEV, "Name",
  	       LIMIT_PARENT, LIMIT_PARENT, "Parent name",
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
61
62
63
64
  	       "Parent uclass", "seq");
  
  	for (ret = uclass_first_device(UCLASS_PMIC, &dev); dev;
  	     ret = uclass_next_device(&dev)) {
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
65
66
67
68
69
70
71
  		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...
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
  		       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[])
  {
  	struct udevice *dev;
  	uint8_t value;
  	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
94
95
96
97
98
99
  
  	dev = currdev;
  
  	printf("Dump pmic: %s registers
  ", dev->name);
  
  	for (reg = 0; reg < pmic_reg_count(dev); reg++) {
  		ret = pmic_read(dev, reg, &value, 1);
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
100
101
102
103
104
  		if (ret) {
  			printf("Can't read register: %d
  ", reg);
  			return failure(ret);
  		}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  
  		if (!(reg % 16))
  			printf("
  0x%02x: ", reg);
  
  		printf("%2.2x ", value);
  	}
  	printf("
  ");
  
  	return CMD_RET_SUCCESS;
  }
  
  static int do_read(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  {
  	struct udevice *dev;
  	int regs, ret;
  	uint8_t value;
  	uint reg;
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
124
125
126
127
128
  	if (!currdev) {
  		printf("First, set the PMIC device!
  ");
  		return CMD_RET_USAGE;
  	}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
129
130
131
132
133
134
135
136
137
  
  	dev = currdev;
  
  	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:...
138
139
140
  		printf("PMIC max reg: %d
  ", regs);
  		return failure(-EFAULT);
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
141
142
143
  	}
  
  	ret = pmic_read(dev, reg, &value, 1);
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
144
145
146
147
148
  	if (ret) {
  		printf("Can't read PMIC register: %d!
  ", reg);
  		return failure(ret);
  	}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
149
150
151
152
153
154
155
156
157
158
159
160
161
  
  	printf("0x%02x: 0x%2.2x
  ", reg, value);
  
  	return CMD_RET_SUCCESS;
  }
  
  static int do_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  {
  	struct udevice *dev;
  	int regs, ret;
  	uint8_t value;
  	uint reg;
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
162
163
164
165
166
  	if (!currdev) {
  		printf("First, set the PMIC device!
  ");
  		return CMD_RET_USAGE;
  	}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
167
168
169
170
171
172
173
174
175
  
  	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:...
176
177
178
  		printf("PMIC max reg: %d
  ", regs);
  		return failure(-EFAULT);
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
179
180
181
182
183
  	}
  
  	value = simple_strtoul(argv[2], NULL, 0);
  
  	ret = pmic_write(dev, reg, &value, 1);
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
184
185
186
187
188
  	if (ret) {
  		printf("Can't write PMIC register: %d!
  ", reg);
  		return failure(ret);
  	}
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
189
190
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
  
  	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...
217
  	"PMIC sub-system",
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
218
219
  	"list          - list pmic devices
  "
493cdec7a   Przemyslaw Marczak   common: cmd pmic:...
220
221
  	"pmic dev [name]    - show or [set] operating PMIC device
  "
d89fdcf9c   Przemyslaw Marczak   dm: pmic: add pmi...
222
223
224
225
226
227
228
  	"pmic dump          - dump registers
  "
  	"pmic read address  - read byte of register at address
  "
  	"pmic write address - write byte to register at address
  "
  );