2024-07-03 18:30:59 +00:00
|
|
|
From 53b9d9bbb57e292c6b332a2fb9899003586e17ca Mon Sep 17 00:00:00 2001
|
|
|
|
From: Phil Elwell <phil@raspberrypi.com>
|
|
|
|
Date: Thu, 2 May 2024 16:17:02 +0100
|
|
|
|
Subject: [PATCH 1211/1215] 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
|
2024-08-16 19:16:04 +00:00
|
|
|
@@ -111,6 +111,7 @@ static int gpiochip_irqchip_init_valid_m
|
2024-07-03 18:30:59 +00:00
|
|
|
static void gpiochip_irqchip_free_valid_mask(struct gpio_chip *gc);
|
|
|
|
|
|
|
|
static bool gpiolib_initialized;
|
|
|
|
+static int first_dynamic_gpiochip_num = -1;
|
|
|
|
|
|
|
|
static inline void desc_set_label(struct gpio_desc *d, const char *label)
|
|
|
|
{
|
2024-08-16 19:16:04 +00:00
|
|
|
@@ -746,6 +747,7 @@ int gpiochip_add_data_with_key(struct gp
|
2024-07-03 18:30:59 +00:00
|
|
|
unsigned int i;
|
|
|
|
int base = 0;
|
|
|
|
int ret = 0;
|
|
|
|
+ int id;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* First: allocate and populate the internal stat container, and
|
2024-08-16 19:16:04 +00:00
|
|
|
@@ -770,7 +772,16 @@ int gpiochip_add_data_with_key(struct gp
|
2024-07-03 18:30:59 +00:00
|
|
|
else if (gc->parent)
|
|
|
|
device_set_node(&gdev->dev, dev_fwnode(gc->parent));
|
|
|
|
|
|
|
|
- gdev->id = 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;
|
|
|
|
+
|
|
|
|
+ gdev->id = ida_alloc_range(&gpio_ida, id, ~0, GFP_KERNEL);
|
|
|
|
if (gdev->id < 0) {
|
|
|
|
ret = gdev->id;
|
|
|
|
goto err_free_gdev;
|