Merge git://git.denx.de/u-boot-usb
diff --git a/arch/arc/include/asm/posix_types.h b/arch/arc/include/asm/posix_types.h
index 20415f0..51347a4 100644
--- a/arch/arc/include/asm/posix_types.h
+++ b/arch/arc/include/asm/posix_types.h
@@ -16,7 +16,11 @@
 typedef unsigned short		__kernel_ipc_pid_t;
 typedef unsigned short		__kernel_uid_t;
 typedef unsigned short		__kernel_gid_t;
+#ifdef __GNUC__
+typedef __SIZE_TYPE__		__kernel_size_t;
+#else
 typedef unsigned int		__kernel_size_t;
+#endif
 typedef int			__kernel_ssize_t;
 typedef int			__kernel_ptrdiff_t;
 typedef long			__kernel_time_t;
diff --git a/arch/powerpc/cpu/mpc5xxx/Makefile b/arch/powerpc/cpu/mpc5xxx/Makefile
index 5c67e1d..d122b29 100644
--- a/arch/powerpc/cpu/mpc5xxx/Makefile
+++ b/arch/powerpc/cpu/mpc5xxx/Makefile
@@ -7,6 +7,7 @@
 
 extra-y	= start.o
 extra-y += traps.o
+obj-y  += cache.o
 obj-y  += io.o
 obj-y  += firmware_sc_task_bestcomm.impl.o
 obj-y += i2c.o
diff --git a/arch/powerpc/cpu/mpc5xxx/cache.c b/arch/powerpc/cpu/mpc5xxx/cache.c
new file mode 100644
index 0000000..5d674bc
--- /dev/null
+++ b/arch/powerpc/cpu/mpc5xxx/cache.c
@@ -0,0 +1,15 @@
+/*
+ * This file contains stub implementation of
+ *   invalidate_dcache_range()
+ *   flush_dcache_range()
+ *
+ * SPDX-License-Identifier:	GPL-2.0+
+ */
+
+void invalidate_dcache_range(unsigned long start, unsigned long stop)
+{
+}
+
+void flush_dcache_range(unsigned long start, unsigned long stop)
+{
+}
diff --git a/arch/sandbox/dts/sandbox.dts b/arch/sandbox/dts/sandbox.dts
index 62d8037..efffacb 100644
--- a/arch/sandbox/dts/sandbox.dts
+++ b/arch/sandbox/dts/sandbox.dts
@@ -113,4 +113,12 @@
 			0x070b0067 0x070c0069>;
 	};
 
+	gpio_a: gpios {
+		gpio-controller;
+		compatible = "sandbox,gpio";
+		#gpio-cells = <1>;
+		gpio-bank-name = "a";
+		num-gpios = <20>;
+	};
+
 };
diff --git a/board/synopsys/axs101/nand.c b/board/synopsys/axs101/nand.c
index c7f90c4..ff35286 100644
--- a/board/synopsys/axs101/nand.c
+++ b/board/synopsys/axs101/nand.c
@@ -62,8 +62,10 @@
 	uint32_t buffer_ptr1;	/* DES3 */
 };
 
-#define NAND_REG_WRITE(r, v)	writel(v, CONFIG_SYS_NAND_BASE + r)
-#define NAND_REG_READ(r)	readl(CONFIG_SYS_NAND_BASE + r)
+#define NAND_REG_WRITE(r, v)	\
+	writel(v, (volatile void __iomem *)(CONFIG_SYS_NAND_BASE + r))
+#define NAND_REG_READ(r)		\
+	readl((const volatile void __iomem *)(CONFIG_SYS_NAND_BASE + r))
 
 static struct nand_bd *bd;	/* DMA buffer descriptors	*/
 
diff --git a/common/cmd_gpio.c b/common/cmd_gpio.c
index 4634f91..11f4e40 100644
--- a/common/cmd_gpio.c
+++ b/common/cmd_gpio.c
@@ -8,6 +8,7 @@
 
 #include <common.h>
 #include <command.h>
+#include <errno.h>
 #include <dm.h>
 #include <asm/gpio.h>
 
@@ -24,18 +25,46 @@
 };
 
 #if defined(CONFIG_DM_GPIO) && !defined(gpio_status)
-static const char * const gpio_function[] = {
+static const char * const gpio_function[GPIOF_COUNT] = {
 	"input",
 	"output",
+	"unused",
 	"unknown",
+	"func",
 };
 
-static void show_gpio(struct udevice *dev, const char *bank_name, int offset)
+/* 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 show_gpio(struct udevice *dev, const char *bank_name, int offset,
+		      int *flagsp)
 {
 	struct dm_gpio_ops *ops = gpio_get_ops(dev);
+	int func = GPIOF_UNKNOWN;
 	char buf[80];
 	int ret;
 
+	BUILD_BUG_ON(GPIOF_COUNT != ARRAY_SIZE(gpio_function));
+
+	if (ops->get_function) {
+		ret = ops->get_function(dev, offset);
+		if (ret >= 0 && ret < ARRAY_SIZE(gpio_function))
+			func = ret;
+	}
+	if (!(*flagsp & FLAG_SHOW_ALL) && func == 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;
+	}
 	*buf = '\0';
 	if (ops->get_state) {
 		ret = ops->get_state(dev, offset, buf, sizeof(buf));
@@ -44,14 +73,6 @@
 			return;
 		}
 	} else {
-		int func =  GPIOF_UNKNOWN;
-		int ret;
-
-		if (ops->get_function) {
-			ret = ops->get_function(dev, offset);
-			if (ret >= 0 && ret < ARRAY_SIZE(gpio_function))
-				func = ret;
-		}
 		sprintf(buf, "%s%u: %8s %d", bank_name, offset,
 			gpio_function[func], ops->get_value(dev, offset));
 	}
@@ -60,12 +81,14 @@
 	puts("\n");
 }
 
-static int do_gpio_status(const char *gpio_name)
+static int do_gpio_status(bool all, const char *gpio_name)
 {
 	struct udevice *dev;
-	int newline = 0;
+	int banklen;
+	int flags;
 	int ret;
 
+	flags = 0;
 	if (gpio_name && !*gpio_name)
 		gpio_name = NULL;
 	for (ret = uclass_first_device(UCLASS_GPIO, &dev);
@@ -74,28 +97,33 @@
 		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)
+			continue;
+		banklen = bank_name ? strlen(bank_name) : 0;
 
 		if (!gpio_name || !bank_name ||
-		    !strncmp(gpio_name, bank_name, strlen(bank_name))) {
+		    !strncmp(gpio_name, bank_name, banklen)) {
 			const char *p = NULL;
 			int offset;
 
-			if (bank_name) {
-				if (newline)
-					putc('\n');
-				printf("Bank %s:\n", bank_name);
-			}
-			newline = 1;
-			if (gpio_name && bank_name) {
-				p = gpio_name + strlen(bank_name);
+			p = gpio_name + banklen;
+			if (gpio_name && *p) {
 				offset = simple_strtoul(p, NULL, 10);
-				show_gpio(dev, bank_name, offset);
+				show_gpio(dev, bank_name, offset, &flags);
 			} else {
-				for (offset = 0; offset < num_bits; offset++)
-					show_gpio(dev, bank_name, offset);
+				for (offset = 0; offset < num_bits; offset++) {
+					show_gpio(dev, bank_name, offset,
+						  &flags);
+				}
 			}
 		}
+		/* Add a newline between bank names */
+		if (!(flags & FLAG_SHOW_BANK))
+			flags |= FLAG_SHOW_NEWLINE;
 	}
 
 	return ret;
@@ -108,23 +136,33 @@
 	enum gpio_cmd sub_cmd;
 	ulong value;
 	const char *str_cmd, *str_gpio = NULL;
-#ifdef CONFIG_DM_GPIO
 	int ret;
+#ifdef CONFIG_DM_GPIO
+	bool all = false;
 #endif
 
 	if (argc < 2)
  show_usage:
 		return CMD_RET_USAGE;
 	str_cmd = argv[1];
-	if (argc > 2)
-		str_gpio = argv[2];
+	argc -= 2;
+	argv += 2;
+#ifdef CONFIG_DM_GPIO
+	if (argc > 0 && !strcmp(*argv, "-a")) {
+		all = true;
+		argc--;
+		argv++;
+	}
+#endif
+	if (argc > 0)
+		str_gpio = *argv;
 	if (!strcmp(str_cmd, "status")) {
 		/* Support deprecated gpio_status() */
 #ifdef gpio_status
 		gpio_status();
 		return 0;
 #elif defined(CONFIG_DM_GPIO)
-		return cmd_process_error(cmdtp, do_gpio_status(str_gpio));
+		return cmd_process_error(cmdtp, do_gpio_status(all, str_gpio));
 #else
 		goto show_usage;
 #endif
@@ -160,7 +198,8 @@
 		goto show_usage;
 #endif
 	/* grab the pin before we tweak it */
-	if (gpio_request(gpio, "cmd_gpio")) {
+	ret = gpio_request(gpio, "cmd_gpio");
+	if (ret && ret != -EBUSY) {
 		printf("gpio: requesting pin %u failed\n", gpio);
 		return -1;
 	}
@@ -181,13 +220,14 @@
 	printf("gpio: pin %s (gpio %i) value is %lu\n",
 		str_gpio, gpio, value);
 
-	gpio_free(gpio);
+	if (ret != -EBUSY)
+		gpio_free(gpio);
 
 	return value;
 }
 
-U_BOOT_CMD(gpio, 3, 0, do_gpio,
-	"query and control gpio pins",
-	"<input|set|clear|toggle> <pin>\n"
-	"    - input/set/clear/toggle the specified pin\n"
-	"gpio status [<bank> | <pin>]");
+U_BOOT_CMD(gpio, 4, 0, do_gpio,
+	   "query and control gpio pins",
+	   "<input|set|clear|toggle> <pin>\n"
+	   "    - input/set/clear/toggle the specified pin\n"
+	   "gpio status [-a] [<bank> | <pin>]  - show [all/claimed] GPIOs");
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
index a6e52a0..60539d8 100644
--- a/include/asm-generic/gpio.h
+++ b/include/asm-generic/gpio.h
@@ -79,11 +79,15 @@
  */
 int gpio_set_value(unsigned gpio, int value);
 
-/* State of a GPIO, as reported by get_state() */
+/* State of a GPIO, as reported by get_function() */
 enum {
 	GPIOF_INPUT = 0,
 	GPIOF_OUTPUT,
-	GPIOF_UNKNOWN,
+	GPIOF_UNUSED,		/* Not claimed */
+	GPIOF_UNKNOWN,		/* Not known */
+	GPIOF_FUNC,		/* Not used as a GPIO */
+
+	GPIOF_COUNT,
 };
 
 struct udevice;
@@ -123,6 +127,13 @@
 				int value);
 	int (*get_value)(struct udevice *dev, unsigned offset);
 	int (*set_value)(struct udevice *dev, unsigned offset, int value);
+	/**
+	 * get_function() Get the GPIO function
+	 *
+	 * @dev:     Device to check
+	 * @offset:  GPIO offset within that device
+	 * @return current function - GPIOF_...
+	 */
 	int (*get_function)(struct udevice *dev, unsigned offset);
 	int (*get_state)(struct udevice *dev, unsigned offset, char *state,
 			 int maxlen);