Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | // SPDX-License-Identifier: GPL-2.0+ /* * Copyright (C) 2018, STMicroelectronics - All Rights Reserved */ #include <command.h> #include <dm.h> #include <errno.h> #include <dm/pinctrl.h> #include <dm/uclass-internal.h> #define LIMIT_DEVNAME 30 static struct udevice *currdev; static int do_dev(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { const char *name; int ret; switch (argc) { case 2: name = argv[1]; ret = uclass_get_device_by_name(UCLASS_PINCTRL, name, &currdev); if (ret) { printf("Can't get the pin-controller: %s!\n", name); return CMD_RET_FAILURE; } /* fall through */ case 1: if (!currdev) { printf("Pin-controller device is not set!\n"); return CMD_RET_USAGE; } printf("dev: %s\n", currdev->name); } return CMD_RET_SUCCESS; } /** * Print the muxing information for one or all pins of one pinctrl device * * @param dev pinctrl device * @param name NULL to display all the pins * or name of the pin to display * Return: 0 on success, non-0 on error */ static int show_pinmux(struct udevice *dev, char *name) { char pin_name[PINNAME_SIZE]; char pin_mux[PINMUX_SIZE]; int pins_count; int i; int ret; bool found = false; pins_count = pinctrl_get_pins_count(dev); if (pins_count == -ENOSYS) { printf("Ops get_pins_count not supported by %s\n", dev->name); return pins_count; } for (i = 0; i < pins_count; i++) { ret = pinctrl_get_pin_name(dev, i, pin_name, PINNAME_SIZE); if (ret) { printf("Ops get_pin_name error (%d) by %s\n", ret, dev->name); return ret; } if (name && strcmp(name, pin_name)) continue; found = true; ret = pinctrl_get_pin_muxing(dev, i, pin_mux, PINMUX_SIZE); if (ret) { printf("Ops get_pin_muxing error (%d) by %s in %s\n", ret, pin_name, dev->name); return ret; } printf("%-*s: %-*s\n", PINNAME_SIZE, pin_name, PINMUX_SIZE, pin_mux); } if (!found) return -ENOENT; return 0; } static int do_status(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { struct udevice *dev; char *name; int ret; if (argc < 2) { if (!currdev) { printf("pin-controller device not selected\n"); return CMD_RET_FAILURE; } show_pinmux(currdev, NULL); return CMD_RET_SUCCESS; } if (strcmp(argv[1], "-a")) name = argv[1]; else name = NULL; uclass_foreach_dev_probe(UCLASS_PINCTRL, dev) { if (!name) { /* insert a separator between each pin-controller display */ printf("--------------------------\n"); printf("%s:\n", dev->name); } ret = show_pinmux(dev, name); /* stop when the status of requested pin is displayed */ if (name && !ret) return CMD_RET_SUCCESS; } if (name) { printf("%s not found\n", name); return CMD_RET_FAILURE; } return CMD_RET_SUCCESS; } static int do_list(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { struct udevice *dev; printf("| %-*.*s| %-*.*s| %s\n", LIMIT_DEVNAME, LIMIT_DEVNAME, "Device", LIMIT_DEVNAME, LIMIT_DEVNAME, "Driver", "Parent"); uclass_foreach_dev_probe(UCLASS_PINCTRL, dev) { printf("| %-*.*s| %-*.*s| %s\n", LIMIT_DEVNAME, LIMIT_DEVNAME, dev->name, LIMIT_DEVNAME, LIMIT_DEVNAME, dev->driver->name, dev->parent->name); } return CMD_RET_SUCCESS; } static struct cmd_tbl pinmux_subcmd[] = { U_BOOT_CMD_MKENT(dev, 2, 1, do_dev, "", ""), U_BOOT_CMD_MKENT(list, 1, 1, do_list, "", ""), U_BOOT_CMD_MKENT(status, 2, 1, do_status, "", ""), }; static int do_pinmux(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { struct cmd_tbl *cmd; argc--; argv++; cmd = find_cmd_tbl(argv[0], pinmux_subcmd, ARRAY_SIZE(pinmux_subcmd)); if (!cmd || argc > cmd->maxargs) return CMD_RET_USAGE; return cmd->cmd(cmdtp, flag, argc, argv); } U_BOOT_CMD(pinmux, CONFIG_SYS_MAXARGS, 1, do_pinmux, "show pin-controller muxing", "list - list UCLASS_PINCTRL devices\n" "pinmux dev [pincontroller-name] - select pin-controller device\n" "pinmux status [-a | pin-name] - print pin-controller muxing [for all | for pin-name]\n" ); |