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