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