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