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
regulator_change_voltage(struct udevice * dev)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
do_test_regulator(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])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
do_test_reset(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])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
do_test_dvfs(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])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)
do_test_wdt(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])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;
113*8cd358cbSSimon Xue int i;
11499d14b01SJoseph Chen
11599d14b01SJoseph Chen ret = uclass_get_device(UCLASS_WDT, 0, &dev);
11699d14b01SJoseph Chen if (ret) {
11799d14b01SJoseph Chen if (ret != -ENODEV)
118443feaabSJoseph Chen ut_err("wdt: failed to get device, ret=%d\n", ret);
11999d14b01SJoseph Chen return ret;
12099d14b01SJoseph Chen }
12199d14b01SJoseph Chen
12299d14b01SJoseph Chen wdt_start(dev, 5000, 0);
123*8cd358cbSSimon Xue
124*8cd358cbSSimon Xue for (i = 0; i < 5; i++) {
125*8cd358cbSSimon Xue printf("%s, Ping\n", dev->name);
126*8cd358cbSSimon Xue wdt_reset(dev);
127*8cd358cbSSimon Xue mdelay(1000);
128*8cd358cbSSimon Xue }
129*8cd358cbSSimon Xue
130*8cd358cbSSimon Xue printf("Watchdog would reset system 5s later\n");
131*8cd358cbSSimon Xue printf("Wait reboot");
132*8cd358cbSSimon Xue while(1){
133*8cd358cbSSimon Xue printf(".");
134*8cd358cbSSimon Xue mdelay(500);
135*8cd358cbSSimon Xue }
13699d14b01SJoseph Chen
13799d14b01SJoseph Chen return 0;
13899d14b01SJoseph Chen }
13999d14b01SJoseph Chen #endif
14099d14b01SJoseph Chen
14199d14b01SJoseph Chen #ifdef CONFIG_DM_THERMAL
do_test_thermal(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])14299d14b01SJoseph Chen static int do_test_thermal(cmd_tbl_t *cmdtp, int flag,
14399d14b01SJoseph Chen int argc, char *const argv[])
14499d14b01SJoseph Chen {
14599d14b01SJoseph Chen struct udevice *dev;
14699d14b01SJoseph Chen int ret, temp;
14799d14b01SJoseph Chen
14899d14b01SJoseph Chen ret = uclass_get_device(UCLASS_THERMAL, 0, &dev);
14999d14b01SJoseph Chen if (ret) {
150443feaabSJoseph Chen ut_err("thermal: failed to get device, ret=%d\n", ret);
15199d14b01SJoseph Chen return ret;
15299d14b01SJoseph Chen }
15399d14b01SJoseph Chen
15499d14b01SJoseph Chen ret = thermal_get_temp(dev, &temp);
15599d14b01SJoseph Chen if (ret) {
156443feaabSJoseph Chen ut_err("thermal: failed to get temperature, ret=%d\n", ret);
15799d14b01SJoseph Chen return ret;
15899d14b01SJoseph Chen }
15999d14b01SJoseph Chen
16099d14b01SJoseph Chen printf("Get temperature: %d'c\n", temp);
16199d14b01SJoseph Chen
16299d14b01SJoseph Chen return 0;
16399d14b01SJoseph Chen }
16499d14b01SJoseph Chen #endif
16599d14b01SJoseph Chen
16699d14b01SJoseph Chen #ifdef CONFIG_CMD_PMIC
do_test_pmic(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])16799d14b01SJoseph Chen static int do_test_pmic(cmd_tbl_t *cmdtp, int flag,
16899d14b01SJoseph Chen int argc, char *const argv[])
16999d14b01SJoseph Chen {
17099d14b01SJoseph Chen struct udevice *dev;
17199d14b01SJoseph Chen struct uclass *uc;
17299d14b01SJoseph Chen int ret;
17399d14b01SJoseph Chen
17499d14b01SJoseph Chen ret = uclass_get(UCLASS_PMIC, &uc);
17599d14b01SJoseph Chen if (ret)
17699d14b01SJoseph Chen return ret;
17799d14b01SJoseph Chen
17899d14b01SJoseph Chen for (uclass_first_device(UCLASS_PMIC, &dev);
17999d14b01SJoseph Chen dev;
18099d14b01SJoseph Chen uclass_next_device(&dev)) {
18199d14b01SJoseph Chen env_set("this_pmic", dev->name);
18299d14b01SJoseph Chen run_command("pmic dev $this_pmic", 0);
18399d14b01SJoseph Chen ret = run_command("pmic dump", 0);
184443feaabSJoseph Chen if (ret) {
185443feaabSJoseph Chen ut_err("pmic: failed to dump register, ret=%d\n", ret);
18699d14b01SJoseph Chen goto out;
18799d14b01SJoseph Chen }
188443feaabSJoseph Chen }
18999d14b01SJoseph Chen
19099d14b01SJoseph Chen out:
19199d14b01SJoseph Chen env_set("this_pmic", NULL);
19299d14b01SJoseph Chen
19399d14b01SJoseph Chen return ret;
19499d14b01SJoseph Chen }
19599d14b01SJoseph Chen #endif
19699d14b01SJoseph Chen
19799d14b01SJoseph Chen #ifdef CONFIG_DM_CHARGE_DISPLAY
do_test_charge(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])19899d14b01SJoseph Chen static int do_test_charge(cmd_tbl_t *cmdtp, int flag,
19999d14b01SJoseph Chen int argc, char *const argv[])
20099d14b01SJoseph Chen {
20199d14b01SJoseph Chen /* TODO */
20299d14b01SJoseph Chen return 0;
20399d14b01SJoseph Chen }
20499d14b01SJoseph Chen #endif
20599d14b01SJoseph Chen
20699d14b01SJoseph Chen static cmd_tbl_t sub_cmd[] = {
20799d14b01SJoseph Chen #ifdef CONFIG_CMD_CHARGE_DISPLAY
20899d14b01SJoseph Chen UNIT_CMD_ATTR_DEFINE(charge, 0, CMD_FLG_NORETURN),
20999d14b01SJoseph Chen #endif
21099d14b01SJoseph Chen #ifdef CONFIG_CMD_DVFS
21199d14b01SJoseph Chen UNIT_CMD_DEFINE(dvfs, 0),
21299d14b01SJoseph Chen #endif
21399d14b01SJoseph Chen #ifdef CONFIG_CMD_PMIC
21499d14b01SJoseph Chen UNIT_CMD_DEFINE(pmic, 0),
21599d14b01SJoseph Chen #endif
21654108d04SKever Yang #ifdef CONFIG_DM_RESET
21799d14b01SJoseph Chen UNIT_CMD_ATTR_DEFINE(reset, 0, CMD_FLG_NORETURN),
21854108d04SKever Yang #endif
21999d14b01SJoseph Chen #ifdef CONFIG_DM_REGULATOR
22099d14b01SJoseph Chen UNIT_CMD_ATTR_DEFINE(regulator, 0, CMD_FLG_INTERACTIVE),
22199d14b01SJoseph Chen #endif
22299d14b01SJoseph Chen #ifdef CONFIG_DM_THERMAL
22399d14b01SJoseph Chen UNIT_CMD_DEFINE(thermal, 0),
22499d14b01SJoseph Chen #endif
22599d14b01SJoseph Chen #if defined(CONFIG_WDT)
22699d14b01SJoseph Chen UNIT_CMD_DEFINE(wdt, 0),
22799d14b01SJoseph Chen #endif
228cd1c982eSJoseph Chen #ifdef CONFIG_DM_CHARGE_DISPLAY
229cd1c982eSJoseph Chen UNIT_CMD_DEFINE(charge, 0),
230cd1c982eSJoseph Chen #endif
23199d14b01SJoseph Chen };
23299d14b01SJoseph Chen
23399d14b01SJoseph Chen static char sub_cmd_help[] =
23499d14b01SJoseph Chen #ifdef CONFIG_CMD_CHARGE_DISPLAY
23599d14b01SJoseph Chen " [i] rktest charge - test charge animation\n"
23699d14b01SJoseph Chen #endif
23799d14b01SJoseph Chen #ifdef CONFIG_CMD_DVFS
23899d14b01SJoseph Chen " [.] rktest dvfs - test rockchip wide temperature dvfs\n"
23999d14b01SJoseph Chen #endif
24099d14b01SJoseph Chen #ifdef CONFIG_CMD_PMIC
24199d14b01SJoseph Chen " [.] rktest pmic - test pmic, dump registers\n"
24299d14b01SJoseph Chen #endif
24354108d04SKever Yang #ifdef CONFIG_DM_RESET
24499d14b01SJoseph Chen " [n] rktest reset - test sysreset\n"
24554108d04SKever Yang #endif
24699d14b01SJoseph Chen #ifdef CONFIG_DM_REGULATOR
24799d14b01SJoseph Chen " [i] rktest regulator - test regulator set and show\n"
24899d14b01SJoseph Chen #endif
24999d14b01SJoseph Chen #ifdef CONFIG_DM_THERMAL
25099d14b01SJoseph Chen " [.] rktest thermal - test thermal, getting temperature\n"
25199d14b01SJoseph Chen #endif
25299d14b01SJoseph Chen ;
25399d14b01SJoseph Chen
25499d14b01SJoseph Chen const struct cmd_group cmd_grp_power = {
25599d14b01SJoseph Chen .id = TEST_ID_POWER,
25699d14b01SJoseph Chen .help = sub_cmd_help,
25799d14b01SJoseph Chen .cmd = sub_cmd,
25899d14b01SJoseph Chen .cmd_n = ARRAY_SIZE(sub_cmd),
25999d14b01SJoseph Chen };
260