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