git: da94bc915a14 - main - gpio: don't misuse pin->flags

From: Ed Maste <emaste_at_FreeBSD.org>
Date: Mon, 21 Apr 2025 16:28:31 UTC
The branch main has been updated by emaste:

URL: https://cgit.FreeBSD.org/src/commit/?id=da94bc915a142d3ca44dea6277db89f194f3f628

commit da94bc915a142d3ca44dea6277db89f194f3f628
Author:     Ahmad Khalifa <ahmadkhalifa570@gmail.com>
AuthorDate: 2025-03-11 11:39:28 +0000
Commit:     Ed Maste <emaste@FreeBSD.org>
CommitDate: 2025-04-21 16:28:14 +0000

    gpio: don't misuse pin->flags
    
    The flags member of gpio_pin_t was only meant for pin flags acquired via
    the FDT.
    
    Instead, make an accessor so gpioaei can still access the flags and
    remove the now unused gpio_pin_get_by_acpi_index.
    
    Reviewed-by: Warner Losh <imp@FreeBSD.org>
    Pull-request: https://github.com/freebsd/freebsd-src/pull/1667
    Signed-off-by: Ahmad Khalifa <ahmadkhalifa570@gmail.com>
---
 sys/dev/gpio/acpi_gpiobus.c    | 20 +++-----------------
 sys/dev/gpio/acpi_gpiobusvar.h |  5 ++---
 sys/dev/gpio/gpioaei.c         |  9 ++++++---
 3 files changed, 11 insertions(+), 23 deletions(-)

diff --git a/sys/dev/gpio/acpi_gpiobus.c b/sys/dev/gpio/acpi_gpiobus.c
index 935f4bb4569c..96faec5e6f02 100644
--- a/sys/dev/gpio/acpi_gpiobus.c
+++ b/sys/dev/gpio/acpi_gpiobus.c
@@ -380,23 +380,6 @@ acpi_gpiobus_detach(device_t dev)
 	return (gpiobus_detach(dev));
 }
 
-int
-gpio_pin_get_by_acpi_index(device_t consumer, uint32_t idx,
-    gpio_pin_t *out_pin)
-{
-	struct acpi_gpiobus_ivar *devi;
-	int rv;
-
-	rv = gpio_pin_get_by_child_index(consumer, idx, out_pin);
-	if (rv != 0)
-		return (rv);
-
-	devi = device_get_ivars(consumer);
-	(*out_pin)->flags = devi->flags;
-
-	return (0);
-}
-
 static int
 acpi_gpiobus_read_ivar(device_t dev, device_t child, int which, uintptr_t *result)
 {
@@ -406,6 +389,9 @@ acpi_gpiobus_read_ivar(device_t dev, device_t child, int which, uintptr_t *resul
 	case ACPI_GPIOBUS_IVAR_HANDLE:
 		*result = (uintptr_t)devi->dev_handle;
 		break;
+	case ACPI_GPIOBUS_IVAR_FLAGS:
+		*result = (uintptr_t)devi->flags;
+		break;
 	default:
 		return (gpiobus_read_ivar(dev, child, which, result));
 	}
diff --git a/sys/dev/gpio/acpi_gpiobusvar.h b/sys/dev/gpio/acpi_gpiobusvar.h
index 77cb91110cb5..f8d502eab9d1 100644
--- a/sys/dev/gpio/acpi_gpiobusvar.h
+++ b/sys/dev/gpio/acpi_gpiobusvar.h
@@ -34,16 +34,15 @@
 
 enum acpi_gpiobus_ivars {
 	ACPI_GPIOBUS_IVAR_HANDLE	= 10600,
+	ACPI_GPIOBUS_IVAR_FLAGS,
 };
 
 #define ACPI_GPIOBUS_ACCESSOR(var, ivar, type)			\
 	__BUS_ACCESSOR(acpi_gpiobus, var, ACPI_GPIOBUS, ivar, type)
 
 ACPI_GPIOBUS_ACCESSOR(handle,	HANDLE,		ACPI_HANDLE)
+ACPI_GPIOBUS_ACCESSOR(flags,	FLAGS,		uint32_t)
 
 #undef ACPI_GPIOBUS_ACCESSOR
 
-int gpio_pin_get_by_acpi_index(device_t consumer, uint32_t idx,
-    gpio_pin_t *out_pin);
-
 #endif	/* __ACPI_GPIOBUS_H__ */
diff --git a/sys/dev/gpio/gpioaei.c b/sys/dev/gpio/gpioaei.c
index f43674b53c7d..6cbb5f1bb7ed 100644
--- a/sys/dev/gpio/gpioaei.c
+++ b/sys/dev/gpio/gpioaei.c
@@ -79,6 +79,7 @@ gpio_aei_attach(device_t dev)
 {
 	struct gpio_aei_softc * sc = device_get_softc(dev);
 	gpio_pin_t pin;
+	uint32_t flags;
 	ACPI_HANDLE handle;
 	int err;
 
@@ -87,17 +88,19 @@ gpio_aei_attach(device_t dev)
 
 	/* Store parameters needed by gpio_aei_intr. */
 	handle = acpi_gpiobus_get_handle(dev);
-	if (gpio_pin_get_by_acpi_index(dev, 0, &pin) != 0) {
+	if (gpio_pin_get_by_child_index(dev, 0, &pin) != 0) {
 		device_printf(dev, "Unable to get the input pin\n");
 		return (ENXIO);
 	}
 
 	sc->type = ACPI_AEI_TYPE_UNKNOWN;
 	sc->pin = pin->pin;
+
+	flags = acpi_gpiobus_get_flags(dev);
 	if (pin->pin <= 255) {
 		char objname[5];	/* "_EXX" or "_LXX" */
 		sprintf(objname, "_%c%02X",
-		    (pin->flags & GPIO_INTR_EDGE_MASK) ? 'E' : 'L', pin->pin);
+		    (flags & GPIO_INTR_EDGE_MASK) ? 'E' : 'L', pin->pin);
 		if (ACPI_SUCCESS(AcpiGetHandle(handle, objname, &sc->handle)))
 			sc->type = ACPI_AEI_TYPE_ELX;
 	}
@@ -113,7 +116,7 @@ gpio_aei_attach(device_t dev)
 
 	/* Set up the interrupt. */
 	if ((sc->intr_res = gpio_alloc_intr_resource(dev, &sc->intr_rid,
-	    RF_ACTIVE, pin, pin->flags & GPIO_INTR_MASK)) == NULL) {
+	    RF_ACTIVE, pin, flags & GPIO_INTR_MASK)) == NULL) {
 		device_printf(dev, "Cannot allocate an IRQ\n");
 		return (ENOTSUP);
 	}