diff options
author | loos <loos@FreeBSD.org> | 2013-09-06 23:47:50 +0000 |
---|---|---|
committer | loos <loos@FreeBSD.org> | 2013-09-06 23:47:50 +0000 |
commit | 1bfbe0af368b4bd2e86e176eb139d5269d78ebdc (patch) | |
tree | 9fe11d08fa7ba203cabe9569f0bd026f21c8bbfd /sys/mips | |
parent | b6096f6e1ef3c9bf35a1fe78f7576c4beb6b7762 (diff) | |
download | FreeBSD-src-1bfbe0af368b4bd2e86e176eb139d5269d78ebdc.zip FreeBSD-src-1bfbe0af368b4bd2e86e176eb139d5269d78ebdc.tar.gz |
Remove the hardcoded limit for the number of gpio_pins that can be used.
Allocate it dynamically.
Approved by: adrian (mentor)
Diffstat (limited to 'sys/mips')
-rw-r--r-- | sys/mips/atheros/ar71xx_gpio.c | 10 | ||||
-rw-r--r-- | sys/mips/atheros/ar71xx_gpiovar.h | 2 |
2 files changed, 10 insertions, 2 deletions
diff --git a/sys/mips/atheros/ar71xx_gpio.c b/sys/mips/atheros/ar71xx_gpio.c index 0c2e528..c6933bc 100644 --- a/sys/mips/atheros/ar71xx_gpio.c +++ b/sys/mips/atheros/ar71xx_gpio.c @@ -41,6 +41,7 @@ __FBSDID("$FreeBSD$"); #include <sys/module.h> #include <sys/rman.h> #include <sys/lock.h> +#include <sys/malloc.h> #include <sys/mutex.h> #include <sys/gpio.h> @@ -418,6 +419,13 @@ ar71xx_gpio_attach(device_t dev) "pinon", &pinon) != 0) pinon = 0; device_printf(dev, "gpio pinmask=0x%x\n", mask); + for (j = 0; j <= maxpin; j++) { + if ((mask & (1 << j)) == 0) + continue; + sc->gpio_npins++; + } + sc->gpio_pins = malloc(sizeof(*sc->gpio_pins) * sc->gpio_npins, + M_DEVBUF, M_WAITOK | M_ZERO); for (i = 0, j = 0; j <= maxpin; j++) { if ((mask & (1 << j)) == 0) continue; @@ -429,7 +437,6 @@ ar71xx_gpio_attach(device_t dev) ar71xx_gpio_pin_configure(sc, &sc->gpio_pins[i], DEFAULT_CAPS); i++; } - sc->gpio_npins = i; for (i = 0; i < sc->gpio_npins; i++) { j = sc->gpio_pins[i].gp_pin; if ((pinon & (1 << j)) != 0) @@ -455,6 +462,7 @@ ar71xx_gpio_detach(device_t dev) bus_release_resource(dev, SYS_RES_MEMORY, sc->gpio_mem_rid, sc->gpio_mem_res); + free(sc->gpio_pins, M_DEVBUF); mtx_destroy(&sc->gpio_mtx); return(0); diff --git a/sys/mips/atheros/ar71xx_gpiovar.h b/sys/mips/atheros/ar71xx_gpiovar.h index 3489f5a..a1c6e2f 100644 --- a/sys/mips/atheros/ar71xx_gpiovar.h +++ b/sys/mips/atheros/ar71xx_gpiovar.h @@ -64,7 +64,7 @@ struct ar71xx_gpio_softc { int gpio_irq_rid; void *gpio_ih; int gpio_npins; - struct gpio_pin gpio_pins[AR71XX_GPIO_PINS]; + struct gpio_pin *gpio_pins; }; #endif /* __AR71XX_GPIOVAR_H__ */ |