svn commit: r279553 - head/sys/dev/gpio
Luiz Otavio O Souza
loos at FreeBSD.org
Mon Mar 2 22:28:49 UTC 2015
Author: loos
Date: Mon Mar 2 22:28:47 2015
New Revision: 279553
URL: https://svnweb.freebsd.org/changeset/base/279553
Log:
Move duplicate code to a new public function.
This new function can be used by other drivers to reserve the use of GPIO
pins.
Anyway, the use of ofw_gpiobus_parse_gpios() is preferred when possible.
Requested by: Michal Meloun
Modified:
head/sys/dev/gpio/gpiobus.c
head/sys/dev/gpio/gpiobusvar.h
head/sys/dev/gpio/ofw_gpiobus.c
Modified: head/sys/dev/gpio/gpiobus.c
==============================================================================
--- head/sys/dev/gpio/gpiobus.c Mon Mar 2 22:13:33 2015 (r279552)
+++ head/sys/dev/gpio/gpiobus.c Mon Mar 2 22:28:47 2015 (r279553)
@@ -228,6 +228,29 @@ gpiobus_free_ivars(struct gpiobus_ivar *
}
}
+int
+gpiobus_map_pin(device_t bus, device_t child, uint32_t pin)
+{
+ struct gpiobus_softc *sc;
+
+ sc = device_get_softc(bus);
+ /* Consistency check. */
+ if (pin >= sc->sc_npins) {
+ device_printf(child,
+ "invalid pin %d, max: %d\n", pin, sc->sc_npins - 1);
+ return (-1);
+ }
+ /* Mark pin as mapped and give warning if it's already mapped. */
+ if (sc->sc_pins_mapped[pin]) {
+ device_printf(child,
+ "warning: pin %d is already mapped\n", pin);
+ return (-1);
+ }
+ sc->sc_pins_mapped[pin] = 1;
+
+ return (0);
+}
+
static int
gpiobus_parse_pins(struct gpiobus_softc *sc, device_t child, int mask)
{
@@ -252,24 +275,12 @@ gpiobus_parse_pins(struct gpiobus_softc
for (i = 0; i < 32; i++) {
if ((mask & (1 << i)) == 0)
continue;
- if (i >= sc->sc_npins) {
- device_printf(child,
- "invalid pin %d, max: %d\n", i, sc->sc_npins - 1);
+ /* Reserve the GPIO pin. */
+ if (gpiobus_map_pin(sc->sc_busdev, child, i) != 0) {
gpiobus_free_ivars(devi);
return (EINVAL);
}
-
devi->pins[npins++] = i;
- /*
- * Mark pin as mapped and give warning if it's already mapped
- */
- if (sc->sc_pins_mapped[i]) {
- device_printf(child,
- "warning: pin %d is already mapped\n", i);
- gpiobus_free_ivars(devi);
- return (EINVAL);
- }
- sc->sc_pins_mapped[i] = 1;
}
return (0);
Modified: head/sys/dev/gpio/gpiobusvar.h
==============================================================================
--- head/sys/dev/gpio/gpiobusvar.h Mon Mar 2 22:13:33 2015 (r279552)
+++ head/sys/dev/gpio/gpiobusvar.h Mon Mar 2 22:28:47 2015 (r279553)
@@ -110,6 +110,7 @@ int gpiobus_detach_bus(device_t);
int gpiobus_init_softc(device_t);
int gpiobus_alloc_ivars(struct gpiobus_ivar *);
void gpiobus_free_ivars(struct gpiobus_ivar *);
+int gpiobus_map_pin(device_t, device_t, uint32_t);
extern driver_t gpiobus_driver;
Modified: head/sys/dev/gpio/ofw_gpiobus.c
==============================================================================
--- head/sys/dev/gpio/ofw_gpiobus.c Mon Mar 2 22:13:33 2015 (r279552)
+++ head/sys/dev/gpio/ofw_gpiobus.c Mon Mar 2 22:28:47 2015 (r279553)
@@ -272,22 +272,10 @@ ofw_gpiobus_parse_gpios_impl(device_t co
"cannot map the gpios specifier.\n");
goto fail;
}
- /* Consistency check. */
- if ((*pins)[j].pin >= bussc->sc_npins) {
- device_printf(consumer, "invalid pin %d, max: %d\n",
- (*pins)[j].pin, bussc->sc_npins - 1);
+ /* Reserve the GPIO pin. */
+ if (gpiobus_map_pin(bussc->sc_busdev, consumer,
+ (*pins)[j].pin) != 0)
goto fail;
- }
- /*
- * Mark pin as mapped and give warning if it's already mapped.
- */
- if (bussc->sc_pins_mapped[(*pins)[j].pin]) {
- device_printf(consumer,
- "warning: pin %d is already mapped\n",
- pins[j]->pin);
- goto fail;
- }
- bussc->sc_pins_mapped[(*pins)[j].pin] = 1;
j++;
i += gpiocells + 1;
}
More information about the svn-src-head
mailing list