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