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 114 ret = uclass_get_device(UCLASS_WDT, 0, &dev); 115 if (ret) { 116 if (ret != -ENODEV) 117 ut_err("wdt: failed to get device, ret=%d\n", ret); 118 return ret; 119 } 120 121 printf("Watchdog would reset system 10s later\n"); 122 wdt_start(dev, 5000, 0); 123 wdt_stop(dev); 124 125 return 0; 126 } 127 #endif 128 129 #ifdef CONFIG_DM_THERMAL 130 static int do_test_thermal(cmd_tbl_t *cmdtp, int flag, 131 int argc, char *const argv[]) 132 { 133 struct udevice *dev; 134 int ret, temp; 135 136 ret = uclass_get_device(UCLASS_THERMAL, 0, &dev); 137 if (ret) { 138 ut_err("thermal: failed to get device, ret=%d\n", ret); 139 return ret; 140 } 141 142 ret = thermal_get_temp(dev, &temp); 143 if (ret) { 144 ut_err("thermal: failed to get temperature, ret=%d\n", ret); 145 return ret; 146 } 147 148 printf("Get temperature: %d'c\n", temp); 149 150 return 0; 151 } 152 #endif 153 154 #ifdef CONFIG_CMD_PMIC 155 static int do_test_pmic(cmd_tbl_t *cmdtp, int flag, 156 int argc, char *const argv[]) 157 { 158 struct udevice *dev; 159 struct uclass *uc; 160 int ret; 161 162 ret = uclass_get(UCLASS_PMIC, &uc); 163 if (ret) 164 return ret; 165 166 for (uclass_first_device(UCLASS_PMIC, &dev); 167 dev; 168 uclass_next_device(&dev)) { 169 env_set("this_pmic", dev->name); 170 run_command("pmic dev $this_pmic", 0); 171 ret = run_command("pmic dump", 0); 172 if (ret) { 173 ut_err("pmic: failed to dump register, ret=%d\n", ret); 174 goto out; 175 } 176 } 177 178 out: 179 env_set("this_pmic", NULL); 180 181 return ret; 182 } 183 #endif 184 185 #ifdef CONFIG_DM_CHARGE_DISPLAY 186 static int do_test_charge(cmd_tbl_t *cmdtp, int flag, 187 int argc, char *const argv[]) 188 { 189 /* TODO */ 190 return 0; 191 } 192 #endif 193 194 static cmd_tbl_t sub_cmd[] = { 195 #ifdef CONFIG_CMD_CHARGE_DISPLAY 196 UNIT_CMD_ATTR_DEFINE(charge, 0, CMD_FLG_NORETURN), 197 #endif 198 #ifdef CONFIG_CMD_DVFS 199 UNIT_CMD_DEFINE(dvfs, 0), 200 #endif 201 #ifdef CONFIG_CMD_PMIC 202 UNIT_CMD_DEFINE(pmic, 0), 203 #endif 204 #ifdef CONFIG_DM_RESET 205 UNIT_CMD_ATTR_DEFINE(reset, 0, CMD_FLG_NORETURN), 206 #endif 207 #ifdef CONFIG_DM_REGULATOR 208 UNIT_CMD_ATTR_DEFINE(regulator, 0, CMD_FLG_INTERACTIVE), 209 #endif 210 #ifdef CONFIG_DM_THERMAL 211 UNIT_CMD_DEFINE(thermal, 0), 212 #endif 213 #if defined(CONFIG_WDT) 214 UNIT_CMD_DEFINE(wdt, 0), 215 #endif 216 #ifdef CONFIG_DM_CHARGE_DISPLAY 217 UNIT_CMD_DEFINE(charge, 0), 218 #endif 219 }; 220 221 static char sub_cmd_help[] = 222 #ifdef CONFIG_CMD_CHARGE_DISPLAY 223 " [i] rktest charge - test charge animation\n" 224 #endif 225 #ifdef CONFIG_CMD_DVFS 226 " [.] rktest dvfs - test rockchip wide temperature dvfs\n" 227 #endif 228 #ifdef CONFIG_CMD_PMIC 229 " [.] rktest pmic - test pmic, dump registers\n" 230 #endif 231 #ifdef CONFIG_DM_RESET 232 " [n] rktest reset - test sysreset\n" 233 #endif 234 #ifdef CONFIG_DM_REGULATOR 235 " [i] rktest regulator - test regulator set and show\n" 236 #endif 237 #ifdef CONFIG_DM_THERMAL 238 " [.] rktest thermal - test thermal, getting temperature\n" 239 #endif 240 ; 241 242 const struct cmd_group cmd_grp_power = { 243 .id = TEST_ID_POWER, 244 .help = sub_cmd_help, 245 .cmd = sub_cmd, 246 .cmd_n = ARRAY_SIZE(sub_cmd), 247 }; 248