+#if defined(CONFIG_DM_GPIO) && !defined(gpio_status)
+
+/* A few flags used by show_gpio() */
+enum {
+ FLAG_SHOW_ALL = 1 << 0,
+ FLAG_SHOW_BANK = 1 << 1,
+ FLAG_SHOW_NEWLINE = 1 << 2,
+};
+
+static void gpio_get_description(struct udevice *dev, const char *bank_name,
+ int offset, int *flagsp)
+{
+ char buf[80];
+ int ret;
+
+ ret = gpio_get_function(dev, offset, NULL);
+ if (ret < 0)
+ goto err;
+ if (!(*flagsp & FLAG_SHOW_ALL) && ret == GPIOF_UNUSED)
+ return;
+ if ((*flagsp & FLAG_SHOW_BANK) && bank_name) {
+ if (*flagsp & FLAG_SHOW_NEWLINE) {
+ putc('\n');
+ *flagsp &= ~FLAG_SHOW_NEWLINE;
+ }
+ printf("Bank %s:\n", bank_name);
+ *flagsp &= ~FLAG_SHOW_BANK;
+ }
+
+ ret = gpio_get_status(dev, offset, buf, sizeof(buf));
+ if (ret)
+ goto err;
+
+ printf("%s\n", buf);
+ return;
+err:
+ printf("Error %d\n", ret);
+}
+
+static int do_gpio_status(bool all, const char *gpio_name)
+{
+ struct udevice *dev;
+ int banklen;
+ int flags;
+ int ret;
+
+ flags = 0;
+ if (gpio_name && !*gpio_name)
+ gpio_name = NULL;
+ for (ret = uclass_first_device(UCLASS_GPIO, &dev);
+ dev;
+ ret = uclass_next_device(&dev)) {
+ const char *bank_name;
+ int num_bits;
+
+ flags |= FLAG_SHOW_BANK;
+ if (all)
+ flags |= FLAG_SHOW_ALL;
+ bank_name = gpio_get_bank_info(dev, &num_bits);
+ if (!num_bits) {
+ debug("GPIO device %s has no bits\n", dev->name);
+ continue;
+ }
+ banklen = bank_name ? strlen(bank_name) : 0;
+
+ if (!gpio_name || !bank_name ||
+ !strncmp(gpio_name, bank_name, banklen)) {
+ const char *p = NULL;
+ int offset;
+
+ p = gpio_name + banklen;
+ if (gpio_name && *p) {
+ offset = simple_strtoul(p, NULL, 10);
+ gpio_get_description(dev, bank_name, offset,
+ &flags);
+ } else {
+ for (offset = 0; offset < num_bits; offset++) {
+ gpio_get_description(dev, bank_name,
+ offset, &flags);
+ }
+ }
+ }
+ /* Add a newline between bank names */
+ if (!(flags & FLAG_SHOW_BANK))
+ flags |= FLAG_SHOW_NEWLINE;
+ }
+
+ return ret;
+}
+#endif
+