xref: /rk3399_rockchip-uboot/test/rockchip/test-power.c (revision 54108d04ceddfbc7c026ac102fdf29d44f72a8f4)
199d14b01SJoseph Chen /*
299d14b01SJoseph Chen  * (C) Copyright 2019 Rockchip Electronics Co., Ltd
399d14b01SJoseph Chen  *
499d14b01SJoseph Chen  * SPDX-License-Identifier:     GPL-2.0+
599d14b01SJoseph Chen  */
699d14b01SJoseph Chen 
799d14b01SJoseph Chen #include <common.h>
899d14b01SJoseph Chen #include <console.h>
999d14b01SJoseph Chen #include <dm.h>
1099d14b01SJoseph Chen #include <thermal.h>
1199d14b01SJoseph Chen #include <wdt.h>
1299d14b01SJoseph Chen #include <asm/io.h>
1399d14b01SJoseph Chen #include <power/pmic.h>
1499d14b01SJoseph Chen #include <power/regulator.h>
1599d14b01SJoseph Chen #include "test-rockchip.h"
1699d14b01SJoseph Chen 
1799d14b01SJoseph Chen #ifdef CONFIG_DM_REGULATOR
1899d14b01SJoseph Chen static int regulator_change_voltage(struct udevice *dev)
1999d14b01SJoseph Chen {
2099d14b01SJoseph Chen 	struct dm_regulator_uclass_platdata *uc_pdata;
2199d14b01SJoseph Chen 	int uV, save_uV, step_uV = 12500;
2299d14b01SJoseph Chen 	int i, ret;
2399d14b01SJoseph Chen 
2499d14b01SJoseph Chen 	uc_pdata = dev_get_uclass_platdata(dev);
2599d14b01SJoseph Chen 
2699d14b01SJoseph Chen 	/* Only voltage changeable regulator will be tested! */
2799d14b01SJoseph Chen 	if ((uc_pdata->max_uV == uc_pdata->min_uV) ||
2899d14b01SJoseph Chen 	    !regulator_get_enable(dev) || strncmp("DCDC", dev->name, 4))
2999d14b01SJoseph Chen 		return 0;
3099d14b01SJoseph Chen 
3199d14b01SJoseph Chen 	/* Test get/set() */
3299d14b01SJoseph Chen 	save_uV = regulator_get_value(dev);
33443feaabSJoseph Chen 	if (save_uV < 0) {
34443feaabSJoseph Chen 		ut_err("regulator: failed to get volt, ret=%d\n", save_uV);
3599d14b01SJoseph Chen 		return save_uV;
36443feaabSJoseph Chen 	}
3799d14b01SJoseph Chen 
3899d14b01SJoseph Chen 	ret = regulator_set_value(dev, save_uV);
39443feaabSJoseph Chen 	if (ret < 0) {
40443feaabSJoseph Chen 		ut_err("regulator: failed to set volt, ret=%d\n", ret);
4199d14b01SJoseph Chen 		return ret;
42443feaabSJoseph Chen 	}
4399d14b01SJoseph Chen 
4499d14b01SJoseph Chen 	for (i = 1; i < 4; i++) {
4599d14b01SJoseph Chen 		uV = regulator_get_value(dev);
4699d14b01SJoseph Chen 		regulator_set_value(dev, uV + step_uV * i);
4799d14b01SJoseph Chen 		printf("%s@%s: set %d uV -> %d uV; read back %d uV\n",
4899d14b01SJoseph Chen 		       dev->name, uc_pdata->name, uV, uV + step_uV * i,
4999d14b01SJoseph Chen 		       regulator_get_value(dev));
5099d14b01SJoseph Chen 
5199d14b01SJoseph Chen 		if ((uV + step_uV * i) != regulator_get_value(dev)) {
52443feaabSJoseph Chen 			ut_err("regulator: %s@%s failed to set volt\n",
5399d14b01SJoseph Chen 			       dev->name, uc_pdata->name);
5499d14b01SJoseph Chen 			ret = -EINVAL;
5599d14b01SJoseph Chen 			break;
5699d14b01SJoseph Chen 		}
5799d14b01SJoseph Chen 	}
5899d14b01SJoseph Chen 
5999d14b01SJoseph Chen 	regulator_set_value(dev, save_uV);
6099d14b01SJoseph Chen 
6199d14b01SJoseph Chen 	return ret;
6299d14b01SJoseph Chen }
6399d14b01SJoseph Chen 
6499d14b01SJoseph Chen static int do_test_regulator(cmd_tbl_t *cmdtp, int flag,
6599d14b01SJoseph Chen 			     int argc, char *const argv[])
6699d14b01SJoseph Chen {
6799d14b01SJoseph Chen 	struct udevice *dev;
6899d14b01SJoseph Chen 	struct uclass *uc;
6999d14b01SJoseph Chen 	int ret;
7099d14b01SJoseph Chen 
7199d14b01SJoseph Chen 	ret = uclass_get(UCLASS_REGULATOR, &uc);
72443feaabSJoseph Chen 	if (ret) {
73443feaabSJoseph Chen 		ut_err("regulator: failed to get uclass, ret=%d\n", ret);
7499d14b01SJoseph Chen 		return ret;
75443feaabSJoseph Chen 	}
7699d14b01SJoseph Chen 
7799d14b01SJoseph Chen 	for (uclass_first_device(UCLASS_REGULATOR, &dev);
7899d14b01SJoseph Chen 	     dev;
7999d14b01SJoseph Chen 	     uclass_next_device(&dev)) {
8099d14b01SJoseph Chen 		ret = regulator_change_voltage(dev);
81443feaabSJoseph Chen 		if (ret) {
82443feaabSJoseph Chen 			ut_err("regulator: failed to change volt, ret=%d\n", ret);
8399d14b01SJoseph Chen 			return ret;
8499d14b01SJoseph Chen 		}
85443feaabSJoseph Chen 	}
8699d14b01SJoseph Chen 
8799d14b01SJoseph Chen 	return 0;
8899d14b01SJoseph Chen }
8999d14b01SJoseph Chen #endif
9099d14b01SJoseph Chen 
9199d14b01SJoseph Chen #ifdef CONFIG_DM_RESET
9299d14b01SJoseph Chen static int do_test_reset(cmd_tbl_t *cmdtp, int flag,
9399d14b01SJoseph Chen 			 int argc, char *const argv[])
9499d14b01SJoseph Chen {
9599d14b01SJoseph Chen 	return run_command("reset", 0);
9699d14b01SJoseph Chen }
9799d14b01SJoseph Chen #endif
9899d14b01SJoseph Chen 
9999d14b01SJoseph Chen #ifdef CONFIG_CMD_DVFS
10099d14b01SJoseph Chen static int do_test_dvfs(cmd_tbl_t *cmdtp, int flag,
10199d14b01SJoseph Chen 			int argc, char *const argv[])
10299d14b01SJoseph Chen {
10399d14b01SJoseph Chen 	return run_command("dvfs", 0);
10499d14b01SJoseph Chen }
10599d14b01SJoseph Chen #endif
10699d14b01SJoseph Chen 
10799d14b01SJoseph Chen #if defined(CONFIG_WDT)
10899d14b01SJoseph Chen static int do_test_wdt(cmd_tbl_t *cmdtp, int flag,
10999d14b01SJoseph Chen 		       int argc, char *const argv[])
11099d14b01SJoseph Chen {
11199d14b01SJoseph Chen 	struct udevice *dev;
11299d14b01SJoseph Chen 	int ret;
11399d14b01SJoseph Chen 
11499d14b01SJoseph Chen 	ret = uclass_get_device(UCLASS_WDT, 0, &dev);
11599d14b01SJoseph Chen 	if (ret) {
11699d14b01SJoseph Chen 		if (ret != -ENODEV)
117443feaabSJoseph Chen 			ut_err("wdt: failed to get device, ret=%d\n", ret);
11899d14b01SJoseph Chen 		return ret;
11999d14b01SJoseph Chen 	}
12099d14b01SJoseph Chen 
12199d14b01SJoseph Chen 	printf("Watchdog would reset system 10s later\n");
12299d14b01SJoseph Chen 	wdt_start(dev, 5000, 0);
12399d14b01SJoseph Chen 	wdt_stop(dev);
12499d14b01SJoseph Chen 
12599d14b01SJoseph Chen 	return 0;
12699d14b01SJoseph Chen }
12799d14b01SJoseph Chen #endif
12899d14b01SJoseph Chen 
12999d14b01SJoseph Chen #ifdef CONFIG_DM_THERMAL
13099d14b01SJoseph Chen static int do_test_thermal(cmd_tbl_t *cmdtp, int flag,
13199d14b01SJoseph Chen 			   int argc, char *const argv[])
13299d14b01SJoseph Chen {
13399d14b01SJoseph Chen 	struct udevice *dev;
13499d14b01SJoseph Chen 	int ret, temp;
13599d14b01SJoseph Chen 
13699d14b01SJoseph Chen 	ret = uclass_get_device(UCLASS_THERMAL, 0, &dev);
13799d14b01SJoseph Chen 	if (ret) {
138443feaabSJoseph Chen 		ut_err("thermal: failed to get device, ret=%d\n", ret);
13999d14b01SJoseph Chen 		return ret;
14099d14b01SJoseph Chen 	}
14199d14b01SJoseph Chen 
14299d14b01SJoseph Chen 	ret = thermal_get_temp(dev, &temp);
14399d14b01SJoseph Chen 	if (ret) {
144443feaabSJoseph Chen 		ut_err("thermal: failed to get temperature, ret=%d\n", ret);
14599d14b01SJoseph Chen 		return ret;
14699d14b01SJoseph Chen 	}
14799d14b01SJoseph Chen 
14899d14b01SJoseph Chen 	printf("Get temperature: %d'c\n", temp);
14999d14b01SJoseph Chen 
15099d14b01SJoseph Chen 	return 0;
15199d14b01SJoseph Chen }
15299d14b01SJoseph Chen #endif
15399d14b01SJoseph Chen 
15499d14b01SJoseph Chen #ifdef CONFIG_CMD_PMIC
15599d14b01SJoseph Chen static int do_test_pmic(cmd_tbl_t *cmdtp, int flag,
15699d14b01SJoseph Chen 			int argc, char *const argv[])
15799d14b01SJoseph Chen {
15899d14b01SJoseph Chen 	struct udevice *dev;
15999d14b01SJoseph Chen 	struct uclass *uc;
16099d14b01SJoseph Chen 	int ret;
16199d14b01SJoseph Chen 
16299d14b01SJoseph Chen 	ret = uclass_get(UCLASS_PMIC, &uc);
16399d14b01SJoseph Chen 	if (ret)
16499d14b01SJoseph Chen 		return ret;
16599d14b01SJoseph Chen 
16699d14b01SJoseph Chen 	for (uclass_first_device(UCLASS_PMIC, &dev);
16799d14b01SJoseph Chen 	     dev;
16899d14b01SJoseph Chen 	     uclass_next_device(&dev)) {
16999d14b01SJoseph Chen 		env_set("this_pmic", dev->name);
17099d14b01SJoseph Chen 		run_command("pmic dev $this_pmic", 0);
17199d14b01SJoseph Chen 		ret = run_command("pmic dump", 0);
172443feaabSJoseph Chen 		if (ret) {
173443feaabSJoseph Chen 			ut_err("pmic: failed to dump register, ret=%d\n", ret);
17499d14b01SJoseph Chen 			goto out;
17599d14b01SJoseph Chen 		}
176443feaabSJoseph Chen 	}
17799d14b01SJoseph Chen 
17899d14b01SJoseph Chen out:
17999d14b01SJoseph Chen 	env_set("this_pmic", NULL);
18099d14b01SJoseph Chen 
18199d14b01SJoseph Chen 	return ret;
18299d14b01SJoseph Chen }
18399d14b01SJoseph Chen #endif
18499d14b01SJoseph Chen 
18599d14b01SJoseph Chen #ifdef CONFIG_DM_CHARGE_DISPLAY
18699d14b01SJoseph Chen static int do_test_charge(cmd_tbl_t *cmdtp, int flag,
18799d14b01SJoseph Chen 			  int argc, char *const argv[])
18899d14b01SJoseph Chen {
18999d14b01SJoseph Chen 	/* TODO */
19099d14b01SJoseph Chen 	return 0;
19199d14b01SJoseph Chen }
19299d14b01SJoseph Chen #endif
19399d14b01SJoseph Chen 
19499d14b01SJoseph Chen static cmd_tbl_t sub_cmd[] = {
19599d14b01SJoseph Chen #ifdef CONFIG_CMD_CHARGE_DISPLAY
19699d14b01SJoseph Chen 	UNIT_CMD_ATTR_DEFINE(charge, 0, CMD_FLG_NORETURN),
19799d14b01SJoseph Chen #endif
19899d14b01SJoseph Chen #ifdef CONFIG_CMD_DVFS
19999d14b01SJoseph Chen 	UNIT_CMD_DEFINE(dvfs, 0),
20099d14b01SJoseph Chen #endif
20199d14b01SJoseph Chen #ifdef CONFIG_CMD_PMIC
20299d14b01SJoseph Chen 	UNIT_CMD_DEFINE(pmic, 0),
20399d14b01SJoseph Chen #endif
204*54108d04SKever Yang #ifdef CONFIG_DM_RESET
20599d14b01SJoseph Chen 	UNIT_CMD_ATTR_DEFINE(reset, 0, CMD_FLG_NORETURN),
206*54108d04SKever Yang #endif
20799d14b01SJoseph Chen #ifdef CONFIG_DM_REGULATOR
20899d14b01SJoseph Chen 	UNIT_CMD_ATTR_DEFINE(regulator, 0, CMD_FLG_INTERACTIVE),
20999d14b01SJoseph Chen #endif
21099d14b01SJoseph Chen #ifdef CONFIG_DM_THERMAL
21199d14b01SJoseph Chen 	UNIT_CMD_DEFINE(thermal, 0),
21299d14b01SJoseph Chen #endif
21399d14b01SJoseph Chen #if defined(CONFIG_WDT)
21499d14b01SJoseph Chen 	UNIT_CMD_DEFINE(wdt, 0),
21599d14b01SJoseph Chen #endif
21699d14b01SJoseph Chen };
21799d14b01SJoseph Chen 
21899d14b01SJoseph Chen static char sub_cmd_help[] =
21999d14b01SJoseph Chen #ifdef CONFIG_CMD_CHARGE_DISPLAY
22099d14b01SJoseph Chen "    [i] rktest charge                      - test charge animation\n"
22199d14b01SJoseph Chen #endif
22299d14b01SJoseph Chen #ifdef CONFIG_CMD_DVFS
22399d14b01SJoseph Chen "    [.] rktest dvfs                        - test rockchip wide temperature dvfs\n"
22499d14b01SJoseph Chen #endif
22599d14b01SJoseph Chen #ifdef CONFIG_CMD_PMIC
22699d14b01SJoseph Chen "    [.] rktest pmic                        - test pmic, dump registers\n"
22799d14b01SJoseph Chen #endif
228*54108d04SKever Yang #ifdef CONFIG_DM_RESET
22999d14b01SJoseph Chen "    [n] rktest reset                       - test sysreset\n"
230*54108d04SKever Yang #endif
23199d14b01SJoseph Chen #ifdef CONFIG_DM_REGULATOR
23299d14b01SJoseph Chen "    [i] rktest regulator                   - test regulator set and show\n"
23399d14b01SJoseph Chen #endif
23499d14b01SJoseph Chen #ifdef CONFIG_DM_THERMAL
23599d14b01SJoseph Chen "    [.] rktest thermal                     - test thermal, getting temperature\n"
23699d14b01SJoseph Chen #endif
23799d14b01SJoseph Chen ;
23899d14b01SJoseph Chen 
23999d14b01SJoseph Chen const struct cmd_group cmd_grp_power = {
24099d14b01SJoseph Chen 	.id	= TEST_ID_POWER,
24199d14b01SJoseph Chen 	.help	= sub_cmd_help,
24299d14b01SJoseph Chen 	.cmd	= sub_cmd,
24399d14b01SJoseph Chen 	.cmd_n	= ARRAY_SIZE(sub_cmd),
24499d14b01SJoseph Chen };
245