1 /*
2 * (C) Copyright 2019 Rockchip Electronics Co., Ltd
3 *
4 * SPDX-License-Identifier: GPL-2.0+
5 */
6
7 #include <common.h>
8 #include <console.h>
9 #include <dm.h>
10 #include <thermal.h>
11 #include <wdt.h>
12 #include <asm/io.h>
13 #include <power/pmic.h>
14 #include <power/regulator.h>
15 #include "test-rockchip.h"
16
17 #ifdef CONFIG_DM_REGULATOR
regulator_change_voltage(struct udevice * dev)18 static int regulator_change_voltage(struct udevice *dev)
19 {
20 struct dm_regulator_uclass_platdata *uc_pdata;
21 int uV, save_uV, step_uV = 12500;
22 int i, ret;
23
24 uc_pdata = dev_get_uclass_platdata(dev);
25
26 /* Only voltage changeable regulator will be tested! */
27 if ((uc_pdata->max_uV == uc_pdata->min_uV) ||
28 !regulator_get_enable(dev) || strncmp("DCDC", dev->name, 4))
29 return 0;
30
31 /* Test get/set() */
32 save_uV = regulator_get_value(dev);
33 if (save_uV < 0) {
34 ut_err("regulator: failed to get volt, ret=%d\n", save_uV);
35 return save_uV;
36 }
37
38 ret = regulator_set_value(dev, save_uV);
39 if (ret < 0) {
40 ut_err("regulator: failed to set volt, ret=%d\n", ret);
41 return ret;
42 }
43
44 for (i = 1; i < 4; i++) {
45 uV = regulator_get_value(dev);
46 regulator_set_value(dev, uV + step_uV * i);
47 printf("%s@%s: set %d uV -> %d uV; read back %d uV\n",
48 dev->name, uc_pdata->name, uV, uV + step_uV * i,
49 regulator_get_value(dev));
50
51 if ((uV + step_uV * i) != regulator_get_value(dev)) {
52 ut_err("regulator: %s@%s failed to set volt\n",
53 dev->name, uc_pdata->name);
54 ret = -EINVAL;
55 break;
56 }
57 }
58
59 regulator_set_value(dev, save_uV);
60
61 return ret;
62 }
63
do_test_regulator(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])64 static int do_test_regulator(cmd_tbl_t *cmdtp, int flag,
65 int argc, char *const argv[])
66 {
67 struct udevice *dev;
68 struct uclass *uc;
69 int ret;
70
71 ret = uclass_get(UCLASS_REGULATOR, &uc);
72 if (ret) {
73 ut_err("regulator: failed to get uclass, ret=%d\n", ret);
74 return ret;
75 }
76
77 for (uclass_first_device(UCLASS_REGULATOR, &dev);
78 dev;
79 uclass_next_device(&dev)) {
80 ret = regulator_change_voltage(dev);
81 if (ret) {
82 ut_err("regulator: failed to change volt, ret=%d\n", ret);
83 return ret;
84 }
85 }
86
87 return 0;
88 }
89 #endif
90
91 #ifdef CONFIG_DM_RESET
do_test_reset(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])92 static int do_test_reset(cmd_tbl_t *cmdtp, int flag,
93 int argc, char *const argv[])
94 {
95 return run_command("reset", 0);
96 }
97 #endif
98
99 #ifdef CONFIG_CMD_DVFS
do_test_dvfs(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])100 static int do_test_dvfs(cmd_tbl_t *cmdtp, int flag,
101 int argc, char *const argv[])
102 {
103 return run_command("dvfs", 0);
104 }
105 #endif
106
107 #if defined(CONFIG_WDT)
do_test_wdt(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])108 static int do_test_wdt(cmd_tbl_t *cmdtp, int flag,
109 int argc, char *const argv[])
110 {
111 struct udevice *dev;
112 int ret;
113 int i;
114
115 ret = uclass_get_device(UCLASS_WDT, 0, &dev);
116 if (ret) {
117 if (ret != -ENODEV)
118 ut_err("wdt: failed to get device, ret=%d\n", ret);
119 return ret;
120 }
121
122 wdt_start(dev, 5000, 0);
123
124 for (i = 0; i < 5; i++) {
125 printf("%s, Ping\n", dev->name);
126 wdt_reset(dev);
127 mdelay(1000);
128 }
129
130 printf("Watchdog would reset system 5s later\n");
131 printf("Wait reboot");
132 while(1){
133 printf(".");
134 mdelay(500);
135 }
136
137 return 0;
138 }
139 #endif
140
141 #ifdef CONFIG_DM_THERMAL
do_test_thermal(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])142 static int do_test_thermal(cmd_tbl_t *cmdtp, int flag,
143 int argc, char *const argv[])
144 {
145 struct udevice *dev;
146 int ret, temp;
147
148 ret = uclass_get_device(UCLASS_THERMAL, 0, &dev);
149 if (ret) {
150 ut_err("thermal: failed to get device, ret=%d\n", ret);
151 return ret;
152 }
153
154 ret = thermal_get_temp(dev, &temp);
155 if (ret) {
156 ut_err("thermal: failed to get temperature, ret=%d\n", ret);
157 return ret;
158 }
159
160 printf("Get temperature: %d'c\n", temp);
161
162 return 0;
163 }
164 #endif
165
166 #ifdef CONFIG_CMD_PMIC
do_test_pmic(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])167 static int do_test_pmic(cmd_tbl_t *cmdtp, int flag,
168 int argc, char *const argv[])
169 {
170 struct udevice *dev;
171 struct uclass *uc;
172 int ret;
173
174 ret = uclass_get(UCLASS_PMIC, &uc);
175 if (ret)
176 return ret;
177
178 for (uclass_first_device(UCLASS_PMIC, &dev);
179 dev;
180 uclass_next_device(&dev)) {
181 env_set("this_pmic", dev->name);
182 run_command("pmic dev $this_pmic", 0);
183 ret = run_command("pmic dump", 0);
184 if (ret) {
185 ut_err("pmic: failed to dump register, ret=%d\n", ret);
186 goto out;
187 }
188 }
189
190 out:
191 env_set("this_pmic", NULL);
192
193 return ret;
194 }
195 #endif
196
197 #ifdef CONFIG_DM_CHARGE_DISPLAY
do_test_charge(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])198 static int do_test_charge(cmd_tbl_t *cmdtp, int flag,
199 int argc, char *const argv[])
200 {
201 /* TODO */
202 return 0;
203 }
204 #endif
205
206 static cmd_tbl_t sub_cmd[] = {
207 #ifdef CONFIG_CMD_CHARGE_DISPLAY
208 UNIT_CMD_ATTR_DEFINE(charge, 0, CMD_FLG_NORETURN),
209 #endif
210 #ifdef CONFIG_CMD_DVFS
211 UNIT_CMD_DEFINE(dvfs, 0),
212 #endif
213 #ifdef CONFIG_CMD_PMIC
214 UNIT_CMD_DEFINE(pmic, 0),
215 #endif
216 #ifdef CONFIG_DM_RESET
217 UNIT_CMD_ATTR_DEFINE(reset, 0, CMD_FLG_NORETURN),
218 #endif
219 #ifdef CONFIG_DM_REGULATOR
220 UNIT_CMD_ATTR_DEFINE(regulator, 0, CMD_FLG_INTERACTIVE),
221 #endif
222 #ifdef CONFIG_DM_THERMAL
223 UNIT_CMD_DEFINE(thermal, 0),
224 #endif
225 #if defined(CONFIG_WDT)
226 UNIT_CMD_DEFINE(wdt, 0),
227 #endif
228 #ifdef CONFIG_DM_CHARGE_DISPLAY
229 UNIT_CMD_DEFINE(charge, 0),
230 #endif
231 };
232
233 static char sub_cmd_help[] =
234 #ifdef CONFIG_CMD_CHARGE_DISPLAY
235 " [i] rktest charge - test charge animation\n"
236 #endif
237 #ifdef CONFIG_CMD_DVFS
238 " [.] rktest dvfs - test rockchip wide temperature dvfs\n"
239 #endif
240 #ifdef CONFIG_CMD_PMIC
241 " [.] rktest pmic - test pmic, dump registers\n"
242 #endif
243 #ifdef CONFIG_DM_RESET
244 " [n] rktest reset - test sysreset\n"
245 #endif
246 #ifdef CONFIG_DM_REGULATOR
247 " [i] rktest regulator - test regulator set and show\n"
248 #endif
249 #ifdef CONFIG_DM_THERMAL
250 " [.] rktest thermal - test thermal, getting temperature\n"
251 #endif
252 ;
253
254 const struct cmd_group cmd_grp_power = {
255 .id = TEST_ID_POWER,
256 .help = sub_cmd_help,
257 .cmd = sub_cmd,
258 .cmd_n = ARRAY_SIZE(sub_cmd),
259 };
260