Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --- ar71xx_gpio.c 2011-11-23 23:58:51.000000000 +0200
- +++ ar724x_gpio.c 2011-11-23 23:59:04.000000000 +0200
- @@ -27,11 +27,11 @@
- */
- /*
- - * GPIO driver for AR71xx
- + * GPIO driver for AR724x
- */
- #include <sys/cdefs.h>
- -__FBSDID("$FreeBSD: head/sys/mips/atheros/ar71xx_gpio.c 221518 2011-05-06 02:45:02Z adrian $");
- +__FBSDID("$FreeBSD$");
- #include <sys/param.h>
- #include <sys/systm.h>
- @@ -47,60 +47,51 @@
- #include <machine/bus.h>
- #include <machine/resource.h>
- #include <mips/atheros/ar71xxreg.h>
- +#include <mips/atheros/ar724xreg.h>
- #include <mips/atheros/ar71xx_setup.h>
- -#include <mips/atheros/ar71xx_gpiovar.h>
- +#include <mips/atheros/ar724x_gpiovar.h>
- #include "gpio_if.h"
- #define DEFAULT_CAPS (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT)
- /*
- -struct ar71xx_gpio_pin {
- - const char *name;
- - int pin;
- - int flags;
- -};
- -static struct ar71xx_gpio_pin ar71xx_gpio_pins[] = {
- - { "RFled", 2, GPIO_PIN_OUTPUT},
- - { "SW4", 8, GPIO_PIN_INPUT},
- - { NULL, 0, 0},
- -};
- -*/
- -
- -/*
- * Helpers
- */
- -static void ar71xx_gpio_function_enable(struct ar71xx_gpio_softc *sc,
- +#if 0
- +static void ar724x_gpio_function_enable(struct ar724x_gpio_softc *sc,
- uint32_t mask);
- -static void ar71xx_gpio_function_disable(struct ar71xx_gpio_softc *sc,
- +static void ar724x_gpio_function_disable(struct ar724x_gpio_softc *sc,
- uint32_t mask);
- -static void ar71xx_gpio_pin_configure(struct ar71xx_gpio_softc *sc,
- +#endif
- +static void ar724x_gpio_pin_configure(struct ar724x_gpio_softc *sc,
- struct gpio_pin *pin, uint32_t flags);
- /*
- * Driver stuff
- */
- -static int ar71xx_gpio_probe(device_t dev);
- -static int ar71xx_gpio_attach(device_t dev);
- -static int ar71xx_gpio_detach(device_t dev);
- -static int ar71xx_gpio_filter(void *arg);
- -static void ar71xx_gpio_intr(void *arg);
- +static int ar724x_gpio_probe(device_t dev);
- +static int ar724x_gpio_attach(device_t dev);
- +static int ar724x_gpio_detach(device_t dev);
- +static int ar724x_gpio_filter(void *arg);
- +static void ar724x_gpio_intr(void *arg);
- /*
- * GPIO interface
- */
- -static int ar71xx_gpio_pin_max(device_t dev, int *maxpin);
- -static int ar71xx_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps);
- -static int ar71xx_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t
- +static int ar724x_gpio_pin_max(device_t dev, int *maxpin);
- +static int ar724x_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps);
- +static int ar724x_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t
- *flags);
- -static int ar71xx_gpio_pin_getname(device_t dev, uint32_t pin, char *name);
- -static int ar71xx_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags);
- -static int ar71xx_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value);
- -static int ar71xx_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val);
- -static int ar71xx_gpio_pin_toggle(device_t dev, uint32_t pin);
- +static int ar724x_gpio_pin_getname(device_t dev, uint32_t pin, char *name);
- +static int ar724x_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags);
- +static int ar724x_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value);
- +static int ar724x_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val);
- +static int ar724x_gpio_pin_toggle(device_t dev, uint32_t pin);
- +#if 0
- static void
- -ar71xx_gpio_function_enable(struct ar71xx_gpio_softc *sc, uint32_t mask)
- +ar724x_gpio_function_enable(struct ar724x_gpio_softc *sc, uint32_t mask)
- {
- GPIO_LOCK(sc);
- GPIO_SET_BITS(sc, AR71XX_GPIO_FUNCTION, mask);
- @@ -108,15 +99,16 @@
- }
- static void
- -ar71xx_gpio_function_disable(struct ar71xx_gpio_softc *sc, uint32_t mask)
- +ar724x_gpio_function_disable(struct ar724x_gpio_softc *sc, uint32_t mask)
- {
- GPIO_LOCK(sc);
- GPIO_CLEAR_BITS(sc, AR71XX_GPIO_FUNCTION, mask);
- GPIO_UNLOCK(sc);
- }
- +#endif
- static void
- -ar71xx_gpio_pin_configure(struct ar71xx_gpio_softc *sc, struct gpio_pin *pin,
- +ar724x_gpio_pin_configure(struct ar724x_gpio_softc *sc, struct gpio_pin *pin,
- unsigned int flags)
- {
- uint32_t mask;
- @@ -143,29 +135,17 @@
- }
- static int
- -ar71xx_gpio_pin_max(device_t dev, int *maxpin)
- +ar724x_gpio_pin_max(device_t dev, int *maxpin)
- {
- - switch (ar71xx_soc) {
- - case AR71XX_SOC_AR9130:
- - case AR71XX_SOC_AR9132:
- - *maxpin = AR91XX_GPIO_PINS - 1;
- - break;
- - case AR71XX_SOC_AR7240:
- - case AR71XX_SOC_AR7241:
- - case AR71XX_SOC_AR7242:
- - *maxpin = AR724X_GPIO_PINS - 1;
- - break;
- - default:
- - *maxpin = AR71XX_GPIO_PINS - 1;
- - }
- + *maxpin = AR724X_GPIO_PINS - 1;
- return (0);
- }
- static int
- -ar71xx_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps)
- +ar724x_gpio_pin_getcaps(device_t dev, uint32_t pin, uint32_t *caps)
- {
- - struct ar71xx_gpio_softc *sc = device_get_softc(dev);
- + struct ar724x_gpio_softc *sc = device_get_softc(dev);
- int i;
- for (i = 0; i < sc->gpio_npins; i++) {
- @@ -184,9 +164,9 @@
- }
- static int
- -ar71xx_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags)
- +ar724x_gpio_pin_getflags(device_t dev, uint32_t pin, uint32_t *flags)
- {
- - struct ar71xx_gpio_softc *sc = device_get_softc(dev);
- + struct ar724x_gpio_softc *sc = device_get_softc(dev);
- int i;
- for (i = 0; i < sc->gpio_npins; i++) {
- @@ -205,9 +185,9 @@
- }
- static int
- -ar71xx_gpio_pin_getname(device_t dev, uint32_t pin, char *name)
- +ar724x_gpio_pin_getname(device_t dev, uint32_t pin, char *name)
- {
- - struct ar71xx_gpio_softc *sc = device_get_softc(dev);
- + struct ar724x_gpio_softc *sc = device_get_softc(dev);
- int i;
- for (i = 0; i < sc->gpio_npins; i++) {
- @@ -226,10 +206,10 @@
- }
- static int
- -ar71xx_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
- +ar724x_gpio_pin_setflags(device_t dev, uint32_t pin, uint32_t flags)
- {
- int i;
- - struct ar71xx_gpio_softc *sc = device_get_softc(dev);
- + struct ar724x_gpio_softc *sc = device_get_softc(dev);
- for (i = 0; i < sc->gpio_npins; i++) {
- if (sc->gpio_pins[i].gp_pin == pin)
- @@ -248,14 +228,14 @@
- (GPIO_PIN_INPUT|GPIO_PIN_OUTPUT))
- return (EINVAL);
- - ar71xx_gpio_pin_configure(sc, &sc->gpio_pins[i], flags);
- + ar724x_gpio_pin_configure(sc, &sc->gpio_pins[i], flags);
- return (0);
- }
- static int
- -ar71xx_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value)
- +ar724x_gpio_pin_set(device_t dev, uint32_t pin, unsigned int value)
- {
- - struct ar71xx_gpio_softc *sc = device_get_softc(dev);
- + struct ar724x_gpio_softc *sc = device_get_softc(dev);
- int i;
- for (i = 0; i < sc->gpio_npins; i++) {
- @@ -277,9 +257,9 @@
- }
- static int
- -ar71xx_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val)
- +ar724x_gpio_pin_get(device_t dev, uint32_t pin, unsigned int *val)
- {
- - struct ar71xx_gpio_softc *sc = device_get_softc(dev);
- + struct ar724x_gpio_softc *sc = device_get_softc(dev);
- int i;
- for (i = 0; i < sc->gpio_npins; i++) {
- @@ -298,10 +278,10 @@
- }
- static int
- -ar71xx_gpio_pin_toggle(device_t dev, uint32_t pin)
- +ar724x_gpio_pin_toggle(device_t dev, uint32_t pin)
- {
- int res, i;
- - struct ar71xx_gpio_softc *sc = device_get_softc(dev);
- + struct ar724x_gpio_softc *sc = device_get_softc(dev);
- for (i = 0; i < sc->gpio_npins; i++) {
- if (sc->gpio_pins[i].gp_pin == pin)
- @@ -323,7 +303,7 @@
- }
- static int
- -ar71xx_gpio_filter(void *arg)
- +ar724x_gpio_filter(void *arg)
- {
- /* TODO: something useful */
- @@ -333,41 +313,41 @@
- static void
- -ar71xx_gpio_intr(void *arg)
- +ar724x_gpio_intr(void *arg)
- {
- - struct ar71xx_gpio_softc *sc = arg;
- + struct ar724x_gpio_softc *sc = arg;
- GPIO_LOCK(sc);
- /* TODO: something useful */
- GPIO_UNLOCK(sc);
- }
- static int
- -ar71xx_gpio_probe(device_t dev)
- +ar724x_gpio_probe(device_t dev)
- {
- switch (ar71xx_soc) {
- case AR71XX_SOC_AR7240:
- case AR71XX_SOC_AR7241:
- case AR71XX_SOC_AR7242:
- - return (ENXIO);
- + device_set_desc(dev, "Atheros AR724X GPIO driver");
- + return (0);
- break;
- default:
- break;
- }
- - device_set_desc(dev, "Atheros AR71XX GPIO driver");
- - return (0);
- + return (ENXIO);
- }
- static int
- -ar71xx_gpio_attach(device_t dev)
- +ar724x_gpio_attach(device_t dev)
- {
- - struct ar71xx_gpio_softc *sc = device_get_softc(dev);
- + struct ar724x_gpio_softc *sc = device_get_softc(dev);
- int error = 0;
- -// struct ar71xx_gpio_pin *pinp;
- int i, maxpin;
- + uint32_t reg;
- KASSERT((device_get_unit(dev) == 0),
- - ("ar71xx_gpio: Only one gpio module supported"));
- + ("ar724x_gpio: Only one gpio module supported"));
- mtx_init(&sc->gpio_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
- MTX_DEF);
- @@ -380,7 +360,7 @@
- if (sc->gpio_mem_res == NULL) {
- device_printf(dev, "couldn't map memory\n");
- error = ENXIO;
- - ar71xx_gpio_detach(dev);
- + ar724x_gpio_detach(dev);
- return(error);
- }
- @@ -391,48 +371,50 @@
- }
- if ((bus_setup_intr(dev, sc->gpio_irq_res, INTR_TYPE_MISC,
- - ar71xx_gpio_filter, ar71xx_gpio_intr, sc, &sc->gpio_ih))) {
- + ar724x_gpio_filter, ar724x_gpio_intr, sc, &sc->gpio_ih))) {
- device_printf(dev,
- "WARNING: unable to register interrupt handler\n");
- return (ENXIO);
- }
- sc->dev = dev;
- - if (0) {
- - ar71xx_gpio_function_enable(sc, GPIO_FUNC_SPI_CS1_EN);
- - ar71xx_gpio_function_enable(sc, GPIO_FUNC_SPI_CS2_EN);
- - }
- +
- + /* XXX: use something like hints for it */
- + reg = GPIO_READ(sc, AR71XX_GPIO_FUNCTION);
- + device_printf(dev, "GPIO Functions reg old value = 0x%08x\n", reg);
- +
- + /* Disable JTAG on GPIO and enable GE0 MII clock */
- + //AR724X_GPIO_FUNC_GE0_MII_CLK_EN |
- + reg |= AR724X_GPIO_FUNC_JTAG_DISABLE;
- + GPIO_WRITE(sc, AR71XX_GPIO_FUNCTION, reg);
- +
- + device_printf(dev, "GPIO Functions reg new value = 0x%08x\n",
- + GPIO_READ(sc, AR71XX_GPIO_FUNCTION));
- +
- /* Configure all pins as input */
- /* disable interrupts for all pins */
- GPIO_WRITE(sc, AR71XX_GPIO_INT_MASK, 0);
- - ar71xx_gpio_pin_max(dev, &maxpin);
- + ar724x_gpio_pin_max(dev, &maxpin);
- for (i = 0; i <= maxpin; i++) {
- -// strncpy(sc->gpio_pins[i].gp_name, pinp->name, GPIOMAXNAME);
- sc->gpio_pins[i].gp_pin = i;
- sc->gpio_pins[i].gp_caps = DEFAULT_CAPS;
- sc->gpio_pins[i].gp_flags = 0;
- -// ar71xx_gpio_pin_configure(sc, &sc->gpio_pins[i], pinp->flags);
- -// pinp++;
- -// i++;
- }
- sc->gpio_npins = i;
- - //device_add_child(dev, "gpioc", device_get_unit(dev));
- device_add_child(dev, "gpiobus", device_get_unit(dev));
- return (bus_generic_attach(dev));
- }
- static int
- -ar71xx_gpio_detach(device_t dev)
- +ar724x_gpio_detach(device_t dev)
- {
- - struct ar71xx_gpio_softc *sc = device_get_softc(dev);
- + struct ar724x_gpio_softc *sc = device_get_softc(dev);
- KASSERT(mtx_initialized(&sc->gpio_mtx), ("gpio mutex not initialized"));
- - ar71xx_gpio_function_disable(sc, GPIO_FUNC_SPI_CS1_EN);
- - ar71xx_gpio_function_disable(sc, GPIO_FUNC_SPI_CS2_EN);
- bus_generic_detach(dev);
- if (sc->gpio_mem_res)
- @@ -444,28 +426,28 @@
- return(0);
- }
- -static device_method_t ar71xx_gpio_methods[] = {
- - DEVMETHOD(device_probe, ar71xx_gpio_probe),
- - DEVMETHOD(device_attach, ar71xx_gpio_attach),
- - DEVMETHOD(device_detach, ar71xx_gpio_detach),
- +static device_method_t ar724x_gpio_methods[] = {
- + DEVMETHOD(device_probe, ar724x_gpio_probe),
- + DEVMETHOD(device_attach, ar724x_gpio_attach),
- + DEVMETHOD(device_detach, ar724x_gpio_detach),
- /* GPIO protocol */
- - DEVMETHOD(gpio_pin_max, ar71xx_gpio_pin_max),
- - DEVMETHOD(gpio_pin_getname, ar71xx_gpio_pin_getname),
- - DEVMETHOD(gpio_pin_getflags, ar71xx_gpio_pin_getflags),
- - DEVMETHOD(gpio_pin_getcaps, ar71xx_gpio_pin_getcaps),
- - DEVMETHOD(gpio_pin_setflags, ar71xx_gpio_pin_setflags),
- - DEVMETHOD(gpio_pin_get, ar71xx_gpio_pin_get),
- - DEVMETHOD(gpio_pin_set, ar71xx_gpio_pin_set),
- - DEVMETHOD(gpio_pin_toggle, ar71xx_gpio_pin_toggle),
- + DEVMETHOD(gpio_pin_max, ar724x_gpio_pin_max),
- + DEVMETHOD(gpio_pin_getname, ar724x_gpio_pin_getname),
- + DEVMETHOD(gpio_pin_getflags, ar724x_gpio_pin_getflags),
- + DEVMETHOD(gpio_pin_getcaps, ar724x_gpio_pin_getcaps),
- + DEVMETHOD(gpio_pin_setflags, ar724x_gpio_pin_setflags),
- + DEVMETHOD(gpio_pin_get, ar724x_gpio_pin_get),
- + DEVMETHOD(gpio_pin_set, ar724x_gpio_pin_set),
- + DEVMETHOD(gpio_pin_toggle, ar724x_gpio_pin_toggle),
- DEVMETHOD_END
- };
- -static driver_t ar71xx_gpio_driver = {
- +static driver_t ar724x_gpio_driver = {
- "gpio",
- - ar71xx_gpio_methods,
- - sizeof(struct ar71xx_gpio_softc),
- + ar724x_gpio_methods,
- + sizeof(struct ar724x_gpio_softc),
- };
- -static devclass_t ar71xx_gpio_devclass;
- +static devclass_t ar724x_gpio_devclass;
- -DRIVER_MODULE(ar71xx_gpio, apb, ar71xx_gpio_driver, ar71xx_gpio_devclass, 0, 0);
- +DRIVER_MODULE(ar724x_gpio, apb, ar724x_gpio_driver, ar724x_gpio_devclass, 0, 0);
Advertisement
Add Comment
Please, Sign In to add comment