1*2e192b24SSimon Glass /* 2*2e192b24SSimon Glass * Copyright (C) 2014-2015 Samsung Electronics 3*2e192b24SSimon Glass * Przemyslaw Marczak <p.marczak@samsung.com> 4*2e192b24SSimon Glass * 5*2e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 6*2e192b24SSimon Glass */ 7*2e192b24SSimon Glass #include <common.h> 8*2e192b24SSimon Glass #include <errno.h> 9*2e192b24SSimon Glass #include <dm.h> 10*2e192b24SSimon Glass #include <dm/uclass-internal.h> 11*2e192b24SSimon Glass #include <power/pmic.h> 12*2e192b24SSimon Glass 13*2e192b24SSimon Glass #define LIMIT_DEV 32 14*2e192b24SSimon Glass #define LIMIT_PARENT 20 15*2e192b24SSimon Glass 16*2e192b24SSimon Glass static struct udevice *currdev; 17*2e192b24SSimon Glass 18*2e192b24SSimon Glass static int failure(int ret) 19*2e192b24SSimon Glass { 20*2e192b24SSimon Glass printf("Error: %d (%s)\n", ret, errno_str(ret)); 21*2e192b24SSimon Glass 22*2e192b24SSimon Glass return CMD_RET_FAILURE; 23*2e192b24SSimon Glass } 24*2e192b24SSimon Glass 25*2e192b24SSimon Glass static int do_dev(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 26*2e192b24SSimon Glass { 27*2e192b24SSimon Glass char *name; 28*2e192b24SSimon Glass int ret = -ENODEV; 29*2e192b24SSimon Glass 30*2e192b24SSimon Glass switch (argc) { 31*2e192b24SSimon Glass case 2: 32*2e192b24SSimon Glass name = argv[1]; 33*2e192b24SSimon Glass ret = pmic_get(name, &currdev); 34*2e192b24SSimon Glass if (ret) { 35*2e192b24SSimon Glass printf("Can't get PMIC: %s!\n", name); 36*2e192b24SSimon Glass return failure(ret); 37*2e192b24SSimon Glass } 38*2e192b24SSimon Glass case 1: 39*2e192b24SSimon Glass if (!currdev) { 40*2e192b24SSimon Glass printf("PMIC device is not set!\n\n"); 41*2e192b24SSimon Glass return CMD_RET_USAGE; 42*2e192b24SSimon Glass } 43*2e192b24SSimon Glass 44*2e192b24SSimon Glass printf("dev: %d @ %s\n", currdev->seq, currdev->name); 45*2e192b24SSimon Glass } 46*2e192b24SSimon Glass 47*2e192b24SSimon Glass return CMD_RET_SUCCESS; 48*2e192b24SSimon Glass } 49*2e192b24SSimon Glass 50*2e192b24SSimon Glass static int do_list(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 51*2e192b24SSimon Glass { 52*2e192b24SSimon Glass struct udevice *dev; 53*2e192b24SSimon Glass int ret; 54*2e192b24SSimon Glass 55*2e192b24SSimon Glass printf("| %-*.*s| %-*.*s| %s @ %s\n", 56*2e192b24SSimon Glass LIMIT_DEV, LIMIT_DEV, "Name", 57*2e192b24SSimon Glass LIMIT_PARENT, LIMIT_PARENT, "Parent name", 58*2e192b24SSimon Glass "Parent uclass", "seq"); 59*2e192b24SSimon Glass 60*2e192b24SSimon Glass for (ret = uclass_first_device(UCLASS_PMIC, &dev); dev; 61*2e192b24SSimon Glass ret = uclass_next_device(&dev)) { 62*2e192b24SSimon Glass if (ret) 63*2e192b24SSimon Glass continue; 64*2e192b24SSimon Glass 65*2e192b24SSimon Glass printf("| %-*.*s| %-*.*s| %s @ %d\n", 66*2e192b24SSimon Glass LIMIT_DEV, LIMIT_DEV, dev->name, 67*2e192b24SSimon Glass LIMIT_PARENT, LIMIT_PARENT, dev->parent->name, 68*2e192b24SSimon Glass dev_get_uclass_name(dev->parent), dev->parent->seq); 69*2e192b24SSimon Glass } 70*2e192b24SSimon Glass 71*2e192b24SSimon Glass if (ret) 72*2e192b24SSimon Glass return CMD_RET_FAILURE; 73*2e192b24SSimon Glass 74*2e192b24SSimon Glass return CMD_RET_SUCCESS; 75*2e192b24SSimon Glass } 76*2e192b24SSimon Glass 77*2e192b24SSimon Glass static int do_dump(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 78*2e192b24SSimon Glass { 79*2e192b24SSimon Glass struct udevice *dev; 80*2e192b24SSimon Glass uint8_t value; 81*2e192b24SSimon Glass uint reg; 82*2e192b24SSimon Glass int ret; 83*2e192b24SSimon Glass 84*2e192b24SSimon Glass if (!currdev) { 85*2e192b24SSimon Glass printf("First, set the PMIC device!\n"); 86*2e192b24SSimon Glass return CMD_RET_USAGE; 87*2e192b24SSimon Glass } 88*2e192b24SSimon Glass 89*2e192b24SSimon Glass dev = currdev; 90*2e192b24SSimon Glass 91*2e192b24SSimon Glass printf("Dump pmic: %s registers\n", dev->name); 92*2e192b24SSimon Glass 93*2e192b24SSimon Glass for (reg = 0; reg < pmic_reg_count(dev); reg++) { 94*2e192b24SSimon Glass ret = pmic_read(dev, reg, &value, 1); 95*2e192b24SSimon Glass if (ret) { 96*2e192b24SSimon Glass printf("Can't read register: %d\n", reg); 97*2e192b24SSimon Glass return failure(ret); 98*2e192b24SSimon Glass } 99*2e192b24SSimon Glass 100*2e192b24SSimon Glass if (!(reg % 16)) 101*2e192b24SSimon Glass printf("\n0x%02x: ", reg); 102*2e192b24SSimon Glass 103*2e192b24SSimon Glass printf("%2.2x ", value); 104*2e192b24SSimon Glass } 105*2e192b24SSimon Glass printf("\n"); 106*2e192b24SSimon Glass 107*2e192b24SSimon Glass return CMD_RET_SUCCESS; 108*2e192b24SSimon Glass } 109*2e192b24SSimon Glass 110*2e192b24SSimon Glass static int do_read(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 111*2e192b24SSimon Glass { 112*2e192b24SSimon Glass struct udevice *dev; 113*2e192b24SSimon Glass int regs, ret; 114*2e192b24SSimon Glass uint8_t value; 115*2e192b24SSimon Glass uint reg; 116*2e192b24SSimon Glass 117*2e192b24SSimon Glass if (!currdev) { 118*2e192b24SSimon Glass printf("First, set the PMIC device!\n"); 119*2e192b24SSimon Glass return CMD_RET_USAGE; 120*2e192b24SSimon Glass } 121*2e192b24SSimon Glass 122*2e192b24SSimon Glass dev = currdev; 123*2e192b24SSimon Glass 124*2e192b24SSimon Glass if (argc != 2) 125*2e192b24SSimon Glass return CMD_RET_USAGE; 126*2e192b24SSimon Glass 127*2e192b24SSimon Glass reg = simple_strtoul(argv[1], NULL, 0); 128*2e192b24SSimon Glass regs = pmic_reg_count(dev); 129*2e192b24SSimon Glass if (reg > regs) { 130*2e192b24SSimon Glass printf("PMIC max reg: %d\n", regs); 131*2e192b24SSimon Glass return failure(-EFAULT); 132*2e192b24SSimon Glass } 133*2e192b24SSimon Glass 134*2e192b24SSimon Glass ret = pmic_read(dev, reg, &value, 1); 135*2e192b24SSimon Glass if (ret) { 136*2e192b24SSimon Glass printf("Can't read PMIC register: %d!\n", reg); 137*2e192b24SSimon Glass return failure(ret); 138*2e192b24SSimon Glass } 139*2e192b24SSimon Glass 140*2e192b24SSimon Glass printf("0x%02x: 0x%2.2x\n", reg, value); 141*2e192b24SSimon Glass 142*2e192b24SSimon Glass return CMD_RET_SUCCESS; 143*2e192b24SSimon Glass } 144*2e192b24SSimon Glass 145*2e192b24SSimon Glass static int do_write(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 146*2e192b24SSimon Glass { 147*2e192b24SSimon Glass struct udevice *dev; 148*2e192b24SSimon Glass int regs, ret; 149*2e192b24SSimon Glass uint8_t value; 150*2e192b24SSimon Glass uint reg; 151*2e192b24SSimon Glass 152*2e192b24SSimon Glass if (!currdev) { 153*2e192b24SSimon Glass printf("First, set the PMIC device!\n"); 154*2e192b24SSimon Glass return CMD_RET_USAGE; 155*2e192b24SSimon Glass } 156*2e192b24SSimon Glass 157*2e192b24SSimon Glass dev = currdev; 158*2e192b24SSimon Glass 159*2e192b24SSimon Glass if (argc != 3) 160*2e192b24SSimon Glass return CMD_RET_USAGE; 161*2e192b24SSimon Glass 162*2e192b24SSimon Glass reg = simple_strtoul(argv[1], NULL, 0); 163*2e192b24SSimon Glass regs = pmic_reg_count(dev); 164*2e192b24SSimon Glass if (reg > regs) { 165*2e192b24SSimon Glass printf("PMIC max reg: %d\n", regs); 166*2e192b24SSimon Glass return failure(-EFAULT); 167*2e192b24SSimon Glass } 168*2e192b24SSimon Glass 169*2e192b24SSimon Glass value = simple_strtoul(argv[2], NULL, 0); 170*2e192b24SSimon Glass 171*2e192b24SSimon Glass ret = pmic_write(dev, reg, &value, 1); 172*2e192b24SSimon Glass if (ret) { 173*2e192b24SSimon Glass printf("Can't write PMIC register: %d!\n", reg); 174*2e192b24SSimon Glass return failure(ret); 175*2e192b24SSimon Glass } 176*2e192b24SSimon Glass 177*2e192b24SSimon Glass return CMD_RET_SUCCESS; 178*2e192b24SSimon Glass } 179*2e192b24SSimon Glass 180*2e192b24SSimon Glass static cmd_tbl_t subcmd[] = { 181*2e192b24SSimon Glass U_BOOT_CMD_MKENT(dev, 2, 1, do_dev, "", ""), 182*2e192b24SSimon Glass U_BOOT_CMD_MKENT(list, 1, 1, do_list, "", ""), 183*2e192b24SSimon Glass U_BOOT_CMD_MKENT(dump, 1, 1, do_dump, "", ""), 184*2e192b24SSimon Glass U_BOOT_CMD_MKENT(read, 2, 1, do_read, "", ""), 185*2e192b24SSimon Glass U_BOOT_CMD_MKENT(write, 3, 1, do_write, "", ""), 186*2e192b24SSimon Glass }; 187*2e192b24SSimon Glass 188*2e192b24SSimon Glass static int do_pmic(cmd_tbl_t *cmdtp, int flag, int argc, 189*2e192b24SSimon Glass char * const argv[]) 190*2e192b24SSimon Glass { 191*2e192b24SSimon Glass cmd_tbl_t *cmd; 192*2e192b24SSimon Glass 193*2e192b24SSimon Glass argc--; 194*2e192b24SSimon Glass argv++; 195*2e192b24SSimon Glass 196*2e192b24SSimon Glass cmd = find_cmd_tbl(argv[0], subcmd, ARRAY_SIZE(subcmd)); 197*2e192b24SSimon Glass if (cmd == NULL || argc > cmd->maxargs) 198*2e192b24SSimon Glass return CMD_RET_USAGE; 199*2e192b24SSimon Glass 200*2e192b24SSimon Glass return cmd->cmd(cmdtp, flag, argc, argv); 201*2e192b24SSimon Glass } 202*2e192b24SSimon Glass 203*2e192b24SSimon Glass U_BOOT_CMD(pmic, CONFIG_SYS_MAXARGS, 1, do_pmic, 204*2e192b24SSimon Glass " operations", 205*2e192b24SSimon Glass "list - list pmic devices\n" 206*2e192b24SSimon Glass "pmic dev [name] - show or [set] operating PMIC device\n" 207*2e192b24SSimon Glass "pmic dump - dump registers\n" 208*2e192b24SSimon Glass "pmic read address - read byte of register at address\n" 209*2e192b24SSimon Glass "pmic write address - write byte to register at address\n" 210*2e192b24SSimon Glass ); 211