From b1f9389706a14784274d7bc7aaf9760ab0a5d9fa Mon Sep 17 00:00:00 2001
From: Phil Elwell <phil@raspberrypi.com>
Date: Thu, 2 May 2024 16:17:02 +0100
Subject: [PATCH] gpiolib: Override gpiochip numbers with DT aliases

In the same way that other subsystems support the setting of device
id numbers from Device Tree aliases, allow gpiochip numbers to be
derived from "gpiochip<n>" aliases.

Signed-off-by: Phil Elwell <phil@raspberrypi.com>
---
 drivers/gpio/gpiolib.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)

--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -118,6 +118,7 @@ static int gpiochip_irqchip_init_valid_m
 static void gpiochip_irqchip_free_valid_mask(struct gpio_chip *gc);
 
 static bool gpiolib_initialized;
+static int first_dynamic_gpiochip_num = -1;
 
 const char *gpiod_get_label(struct gpio_desc *desc)
 {
@@ -1042,6 +1043,7 @@ int gpiochip_add_data_with_key(struct gp
 	unsigned int desc_index;
 	int base = 0;
 	int ret;
+	int id;
 
 	gdev = kzalloc(sizeof(*gdev), GFP_KERNEL);
 	if (!gdev)
@@ -1049,7 +1051,16 @@ int gpiochip_add_data_with_key(struct gp
 	gc->gpiodev = gdev;
 	gpiochip_set_data(gc, data);
 
-	ret = ida_alloc(&gpio_ida, GFP_KERNEL);
+	if (first_dynamic_gpiochip_num < 0) {
+		id = of_alias_get_highest_id("gpiochip");
+		first_dynamic_gpiochip_num = (id >= 0) ? (id + 1) : 0;
+	}
+
+	id = of_alias_get_id(gdev->dev.of_node, "gpiochip");
+	if (id < 0)
+		id = first_dynamic_gpiochip_num;
+
+	ret = ida_alloc_range(&gpio_ida, id, ~0, GFP_KERNEL);
 	if (ret < 0)
 		goto err_free_gdev;
 	gdev->id = ret;
