pinmux.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
  4. */
  5. #include <common.h>
  6. #include <command.h>
  7. #include <dm.h>
  8. #include <errno.h>
  9. #include <dm/pinctrl.h>
  10. #include <dm/uclass-internal.h>
  11. #define LIMIT_DEVNAME 30
  12. static struct udevice *currdev;
  13. static int do_dev(struct cmd_tbl *cmdtp, int flag, int argc,
  14. char *const argv[])
  15. {
  16. const char *name;
  17. int ret;
  18. switch (argc) {
  19. case 2:
  20. name = argv[1];
  21. ret = uclass_get_device_by_name(UCLASS_PINCTRL, name, &currdev);
  22. if (ret) {
  23. printf("Can't get the pin-controller: %s!\n", name);
  24. return CMD_RET_FAILURE;
  25. }
  26. /* fall through */
  27. case 1:
  28. if (!currdev) {
  29. printf("Pin-controller device is not set!\n");
  30. return CMD_RET_USAGE;
  31. }
  32. printf("dev: %s\n", currdev->name);
  33. }
  34. return CMD_RET_SUCCESS;
  35. }
  36. static int show_pinmux(struct udevice *dev)
  37. {
  38. char pin_name[PINNAME_SIZE];
  39. char pin_mux[PINMUX_SIZE];
  40. int pins_count;
  41. int i;
  42. int ret;
  43. pins_count = pinctrl_get_pins_count(dev);
  44. if (pins_count == -ENOSYS) {
  45. printf("Ops get_pins_count not supported\n");
  46. return pins_count;
  47. }
  48. for (i = 0; i < pins_count; i++) {
  49. ret = pinctrl_get_pin_name(dev, i, pin_name, PINNAME_SIZE);
  50. if (ret == -ENOSYS) {
  51. printf("Ops get_pin_name not supported\n");
  52. return ret;
  53. }
  54. ret = pinctrl_get_pin_muxing(dev, i, pin_mux, PINMUX_SIZE);
  55. if (ret) {
  56. printf("Ops get_pin_muxing error (%d)\n", ret);
  57. return ret;
  58. }
  59. printf("%-*s: %-*s\n", PINNAME_SIZE, pin_name,
  60. PINMUX_SIZE, pin_mux);
  61. }
  62. return 0;
  63. }
  64. static int do_status(struct cmd_tbl *cmdtp, int flag, int argc,
  65. char *const argv[])
  66. {
  67. struct udevice *dev;
  68. int ret = CMD_RET_USAGE;
  69. if (currdev && (argc < 2 || strcmp(argv[1], "-a")))
  70. return show_pinmux(currdev);
  71. if (argc < 2 || strcmp(argv[1], "-a"))
  72. return ret;
  73. uclass_foreach_dev_probe(UCLASS_PINCTRL, dev) {
  74. /* insert a separator between each pin-controller display */
  75. printf("--------------------------\n");
  76. printf("%s:\n", dev->name);
  77. ret = show_pinmux(dev);
  78. if (ret < 0)
  79. printf("Can't display pin muxing for %s\n",
  80. dev->name);
  81. }
  82. return ret;
  83. }
  84. static int do_list(struct cmd_tbl *cmdtp, int flag, int argc,
  85. char *const argv[])
  86. {
  87. struct udevice *dev;
  88. printf("| %-*.*s| %-*.*s| %s\n",
  89. LIMIT_DEVNAME, LIMIT_DEVNAME, "Device",
  90. LIMIT_DEVNAME, LIMIT_DEVNAME, "Driver",
  91. "Parent");
  92. uclass_foreach_dev_probe(UCLASS_PINCTRL, dev) {
  93. printf("| %-*.*s| %-*.*s| %s\n",
  94. LIMIT_DEVNAME, LIMIT_DEVNAME, dev->name,
  95. LIMIT_DEVNAME, LIMIT_DEVNAME, dev->driver->name,
  96. dev->parent->name);
  97. }
  98. return CMD_RET_SUCCESS;
  99. }
  100. static struct cmd_tbl pinmux_subcmd[] = {
  101. U_BOOT_CMD_MKENT(dev, 2, 1, do_dev, "", ""),
  102. U_BOOT_CMD_MKENT(list, 1, 1, do_list, "", ""),
  103. U_BOOT_CMD_MKENT(status, 2, 1, do_status, "", ""),
  104. };
  105. static int do_pinmux(struct cmd_tbl *cmdtp, int flag, int argc,
  106. char *const argv[])
  107. {
  108. struct cmd_tbl *cmd;
  109. argc--;
  110. argv++;
  111. cmd = find_cmd_tbl(argv[0], pinmux_subcmd, ARRAY_SIZE(pinmux_subcmd));
  112. if (!cmd || argc > cmd->maxargs)
  113. return CMD_RET_USAGE;
  114. return cmd->cmd(cmdtp, flag, argc, argv);
  115. }
  116. U_BOOT_CMD(pinmux, CONFIG_SYS_MAXARGS, 1, do_pinmux,
  117. "show pin-controller muxing",
  118. "list - list UCLASS_PINCTRL devices\n"
  119. "pinmux dev [pincontroller-name] - select pin-controller device\n"
  120. "pinmux status [-a] - print pin-controller muxing [for all]\n"
  121. )