diff --git a/drivers/gpio/sunxi_gpio.c b/drivers/gpio/sunxi_gpio.c
index afa165ab784d91bcf753f474bcde82503743fa26..57b78e55e23b9ef048bb4edd69ad110443ec9384 100644
--- a/drivers/gpio/sunxi_gpio.c
+++ b/drivers/gpio/sunxi_gpio.c
@@ -266,16 +266,28 @@ static int gpio_sunxi_bind(struct udevice *parent)
 {
 	struct sunxi_gpio_platdata *plat = parent->platdata;
 	struct sunxi_gpio_reg *ctlr;
-	int bank;
-	int ret;
+	int bank, no_banks, ret, start;
 
 	/* If this is a child device, there is nothing to do here */
 	if (plat)
 		return 0;
 
+	if (fdt_node_check_compatible(gd->fdt_blob, parent->of_offset,
+				"allwinner,sun6i-a31-r-pinctrl") == 0) {
+		start = 'L' - 'A';
+		no_banks = 2; /* L & M */
+	} else if (fdt_node_check_compatible(gd->fdt_blob, parent->of_offset,
+				"allwinner,sun8i-a23-r-pinctrl") == 0) {
+		start = 'L' - 'A';
+		no_banks = 1; /* L only */
+	} else {
+		start = 0;
+		no_banks = SUNXI_GPIO_BANKS;
+	}
+
 	ctlr = (struct sunxi_gpio_reg *)fdtdec_get_addr(gd->fdt_blob,
 						   parent->of_offset, "reg");
-	for (bank = 0; bank < SUNXI_GPIO_BANKS; bank++) {
+	for (bank = 0; bank < no_banks; bank++) {
 		struct sunxi_gpio_platdata *plat;
 		struct udevice *dev;
 
@@ -283,7 +295,7 @@ static int gpio_sunxi_bind(struct udevice *parent)
 		if (!plat)
 			return -ENOMEM;
 		plat->regs = &ctlr->gpio_bank[bank];
-		plat->bank_name = gpio_bank_name(bank);
+		plat->bank_name = gpio_bank_name(start + bank);
 		plat->gpio_count = SUNXI_GPIOS_PER_BANK;
 
 		ret = device_bind(parent, parent->driver,
@@ -306,6 +318,8 @@ static const struct udevice_id sunxi_gpio_ids[] = {
 	{ .compatible = "allwinner,sun8i-a23-pinctrl" },
 	{ .compatible = "allwinner,sun8i-a33-pinctrl" },
 	{ .compatible = "allwinner,sun9i-a80-pinctrl" },
+	{ .compatible = "allwinner,sun6i-a31-r-pinctrl" },
+	{ .compatible = "allwinner,sun8i-a23-r-pinctrl" },
 	{ }
 };