xref: /rk3399_rockchip-uboot/test/rockchip/test-power.c (revision fcdd83d4455871c49a93236c3f1cb964727f8c0c)
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
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 
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
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
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)
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 
114 	ret = uclass_get_device(UCLASS_WDT, 0, &dev);
115 	if (ret) {
116 		if (ret != -ENODEV)
117 			ut_err("wdt: failed to get device, ret=%d\n", ret);
118 		return ret;
119 	}
120 
121 	printf("Watchdog would reset system 10s later\n");
122 	wdt_start(dev, 5000, 0);
123 	wdt_stop(dev);
124 
125 	return 0;
126 }
127 #endif
128 
129 #ifdef CONFIG_DM_THERMAL
130 static int do_test_thermal(cmd_tbl_t *cmdtp, int flag,
131 			   int argc, char *const argv[])
132 {
133 	struct udevice *dev;
134 	int ret, temp;
135 
136 	ret = uclass_get_device(UCLASS_THERMAL, 0, &dev);
137 	if (ret) {
138 		ut_err("thermal: failed to get device, ret=%d\n", ret);
139 		return ret;
140 	}
141 
142 	ret = thermal_get_temp(dev, &temp);
143 	if (ret) {
144 		ut_err("thermal: failed to get temperature, ret=%d\n", ret);
145 		return ret;
146 	}
147 
148 	printf("Get temperature: %d'c\n", temp);
149 
150 	return 0;
151 }
152 #endif
153 
154 #ifdef CONFIG_CMD_PMIC
155 static int do_test_pmic(cmd_tbl_t *cmdtp, int flag,
156 			int argc, char *const argv[])
157 {
158 	struct udevice *dev;
159 	struct uclass *uc;
160 	int ret;
161 
162 	ret = uclass_get(UCLASS_PMIC, &uc);
163 	if (ret)
164 		return ret;
165 
166 	for (uclass_first_device(UCLASS_PMIC, &dev);
167 	     dev;
168 	     uclass_next_device(&dev)) {
169 		env_set("this_pmic", dev->name);
170 		run_command("pmic dev $this_pmic", 0);
171 		ret = run_command("pmic dump", 0);
172 		if (ret) {
173 			ut_err("pmic: failed to dump register, ret=%d\n", ret);
174 			goto out;
175 		}
176 	}
177 
178 out:
179 	env_set("this_pmic", NULL);
180 
181 	return ret;
182 }
183 #endif
184 
185 #ifdef CONFIG_DM_CHARGE_DISPLAY
186 static int do_test_charge(cmd_tbl_t *cmdtp, int flag,
187 			  int argc, char *const argv[])
188 {
189 	/* TODO */
190 	return 0;
191 }
192 #endif
193 
194 static cmd_tbl_t sub_cmd[] = {
195 #ifdef CONFIG_CMD_CHARGE_DISPLAY
196 	UNIT_CMD_ATTR_DEFINE(charge, 0, CMD_FLG_NORETURN),
197 #endif
198 #ifdef CONFIG_CMD_DVFS
199 	UNIT_CMD_DEFINE(dvfs, 0),
200 #endif
201 #ifdef CONFIG_CMD_PMIC
202 	UNIT_CMD_DEFINE(pmic, 0),
203 #endif
204 #ifdef CONFIG_DM_RESET
205 	UNIT_CMD_ATTR_DEFINE(reset, 0, CMD_FLG_NORETURN),
206 #endif
207 #ifdef CONFIG_DM_REGULATOR
208 	UNIT_CMD_ATTR_DEFINE(regulator, 0, CMD_FLG_INTERACTIVE),
209 #endif
210 #ifdef CONFIG_DM_THERMAL
211 	UNIT_CMD_DEFINE(thermal, 0),
212 #endif
213 #if defined(CONFIG_WDT)
214 	UNIT_CMD_DEFINE(wdt, 0),
215 #endif
216 };
217 
218 static char sub_cmd_help[] =
219 #ifdef CONFIG_CMD_CHARGE_DISPLAY
220 "    [i] rktest charge                      - test charge animation\n"
221 #endif
222 #ifdef CONFIG_CMD_DVFS
223 "    [.] rktest dvfs                        - test rockchip wide temperature dvfs\n"
224 #endif
225 #ifdef CONFIG_CMD_PMIC
226 "    [.] rktest pmic                        - test pmic, dump registers\n"
227 #endif
228 #ifdef CONFIG_DM_RESET
229 "    [n] rktest reset                       - test sysreset\n"
230 #endif
231 #ifdef CONFIG_DM_REGULATOR
232 "    [i] rktest regulator                   - test regulator set and show\n"
233 #endif
234 #ifdef CONFIG_DM_THERMAL
235 "    [.] rktest thermal                     - test thermal, getting temperature\n"
236 #endif
237 ;
238 
239 const struct cmd_group cmd_grp_power = {
240 	.id	= TEST_ID_POWER,
241 	.help	= sub_cmd_help,
242 	.cmd	= sub_cmd,
243 	.cmd_n	= ARRAY_SIZE(sub_cmd),
244 };
245