On Thu, Aug 11, 2016 at 05:41:35AM +0300, Artturi Alm wrote: > Hi, > > what's the plan for solving ordering issues for these devices? > could this be attached 'manually' from sunxi_platform_init_mainbus() or > something? What's acceptable? > I'd like to have this for carddetect before moving forward with that. > > -Artturi
If you can't find any fdts where a device that requires gpio will attach before sxipio I think this is fine. The compatible string does not seem to cover all the other allwinner socs the sunxi code attempts to support though, ie: "allwinner,sun5i-a10s-pinctrl" "allwinner,sun5i-a13-pinctrl" (for r8) "allwinner,sun7i-a20-pinctrl" > > > diff --git a/sys/arch/armv7/conf/GENERIC b/sys/arch/armv7/conf/GENERIC > index f9fdf06..843b002 100644 > --- a/sys/arch/armv7/conf/GENERIC > +++ b/sys/arch/armv7/conf/GENERIC > @@ -86,7 +86,7 @@ sunxi0 at mainbus? > > # Sunxi on-chip devices > sxiintc* at fdt? # A1x interrupt controller > -sxipio* at sunxi? # GPIO pins for leds & PHYs > +sxipio* at fdt? > gpio* at sxipio? > sxiccmu* at sunxi? # Clock Control Module/Unit > sxitimer* at sunxi? > diff --git a/sys/arch/armv7/conf/RAMDISK b/sys/arch/armv7/conf/RAMDISK > index adbfb82..e517ae2 100644 > --- a/sys/arch/armv7/conf/RAMDISK > +++ b/sys/arch/armv7/conf/RAMDISK > @@ -85,7 +85,7 @@ sunxi0 at mainbus? > > # Sunxi on-chip devices > sxiintc* at fdt? # A1x interrupt controller > -sxipio* at sunxi? # GPIO pins for leds & PHYs > +sxipio* at fdt? > gpio* at sxipio? > sxiccmu* at sunxi? # Clock Control Module/Unit > sxitimer* at sunxi? > diff --git a/sys/arch/armv7/sunxi/files.sunxi > b/sys/arch/armv7/sunxi/files.sunxi > index 9a9c7a4..fde1cb2 100644 > --- a/sys/arch/armv7/sunxi/files.sunxi > +++ b/sys/arch/armv7/sunxi/files.sunxi > @@ -13,7 +13,7 @@ attach sxiccmu at sunxi > file arch/armv7/sunxi/sxiccmu.c sxiccmu > > device sxipio {}: gpiobus > -attach sxipio at sunxi > +attach sxipio at fdt > file arch/armv7/sunxi/sxipio.c sxipio > > device sxiintc > diff --git a/sys/arch/armv7/sunxi/sunxi.c b/sys/arch/armv7/sunxi/sunxi.c > index edfa4fd..9127c29 100644 > --- a/sys/arch/armv7/sunxi/sunxi.c > +++ b/sys/arch/armv7/sunxi/sunxi.c > @@ -40,7 +40,6 @@ struct cfdriver sunxi_cd = { > }; > > struct board_dev sun4i_devs[] = { > - { "sxipio", 0 }, > { "sxiccmu", 0 }, > { "sxitimer", 0 }, > { "sxitimer", 1 }, > diff --git a/sys/arch/armv7/sunxi/sxipio.c b/sys/arch/armv7/sunxi/sxipio.c > index 9a49343..8a9d78a 100644 > --- a/sys/arch/armv7/sunxi/sxipio.c > +++ b/sys/arch/armv7/sunxi/sxipio.c > @@ -23,6 +23,7 @@ > #include <sys/evcount.h> > > #include <machine/bus.h> > +#include <machine/fdt.h> > #include <machine/intr.h> > > #include <dev/gpio/gpiovar.h> > @@ -31,6 +32,10 @@ > #include <armv7/sunxi/sunxireg.h> > #include <armv7/sunxi/sxipiovar.h> > > +#include <dev/ofw/openfirm.h> > +#include <dev/ofw/ofw_gpio.h> > +#include <dev/ofw/fdt.h> > + > #include "gpio.h" > > #define SXIPIO_NPORT 9 > @@ -73,6 +78,8 @@ struct sxipio_softc { > gpio_pin_t sc_gpio_pins[SXIPIO_NPORT][32]; > > struct intrhand *sc_handlers[32]; > + int sc_node; > + struct gpio_controller sc_gc; > }; > > #define SXIPIO_CFG(port, pin) 0x00 + ((port) * 0x24) + ((pin) << 2) > @@ -87,9 +94,15 @@ struct sxipio_softc { > > void sxipio_attach(struct device *, struct device *, void *); > void sxipio_attach_gpio(struct device *); > +int sxipio_match(struct device *, void *, void *); > + > +void sxigpio_config_pin(void *, uint32_t *, int); > +int sxigpio_get_pin(void *, uint32_t *); > +void sxigpio_set_pin(void *, uint32_t *, int); > + > > struct cfattach sxipio_ca = { > - sizeof (struct sxipio_softc), NULL, sxipio_attach > + sizeof (struct sxipio_softc), sxipio_match, sxipio_attach > }; > > struct cfdriver sxipio_cd = { > @@ -100,29 +113,80 @@ struct sxipio_softc *sxipio_sc = NULL; > bus_space_tag_t sxipio_iot; > bus_space_handle_t sxipio_ioh; > > +int > +sxipio_match(struct device *parent, void *match, void *args) > +{ > + struct fdt_attach_args *faa = args; > + > + return OF_is_compatible(faa->fa_node, "allwinner,sun4i-a10-pinctrl"); > +} > + > void > sxipio_attach(struct device *parent, struct device *self, void *args) > { > struct sxipio_softc *sc = (struct sxipio_softc *)self; > - struct armv7_attach_args *aa = args; > - > - /* XXX check unit, bail if != 0 */ > + struct fdt_attach_args *faa = args; > > - sc->sc_iot = sxipio_iot = aa->aa_iot; > - if (bus_space_map(sxipio_iot, aa->aa_dev->mem[0].addr, > - aa->aa_dev->mem[0].size, 0, &sc->sc_ioh)) > + sc->sc_node = faa->fa_node; > + sc->sc_iot = sxipio_iot = faa->fa_iot; > + if (bus_space_map(sxipio_iot, faa->fa_reg[0].addr, > + faa->fa_reg[0].size, 0, &sc->sc_ioh)) > panic("sxipio_attach: bus_space_map failed!"); > sxipio_ioh = sc->sc_ioh; > > sxipio_sc = sc; > > - sc->sc_irq = aa->aa_dev->irq[0]; > +/* XXX sc->sc_irq = aa->aa_dev->irq[0];*/ > + > + sc->sc_gc.gc_node = faa->fa_node; > + sc->sc_gc.gc_cookie = sc; > + sc->sc_gc.gc_config_pin = sxigpio_config_pin; > + sc->sc_gc.gc_get_pin = sxigpio_get_pin; > + sc->sc_gc.gc_set_pin = sxigpio_set_pin; > + gpio_controller_register(&sc->sc_gc); > > config_defer(self, sxipio_attach_gpio); > > printf("\n"); > } > > +void > +sxigpio_config_pin(void *cookie, uint32_t *cells, int config) > +{ > + uint32_t pin = (cells[0] * 32) + cells[1]; > + > + if (config & GPIO_CONFIG_OUTPUT) > + sxipio_setcfg(pin, SXIPIO_OUTPUT); > + else > + sxipio_setcfg(pin, SXIPIO_INPUT); > +} > + > +int > +sxigpio_get_pin(void *cookie, uint32_t *cells) > +{ > + uint32_t pin = (cells[0] * 32) + cells[1]; > + uint32_t flags = cells[2]; > + int val; > + > + val = sxipio_getpin(pin); > + if (flags & GPIO_ACTIVE_LOW) > + val = !val; > + return val; > +} > + > +void > +sxigpio_set_pin(void *cookie, uint32_t *cells, int val) > +{ > + uint32_t pin = (cells[0] * 32) + cells[1]; > + uint32_t flags = cells[2]; > + > + if (flags & GPIO_ACTIVE_LOW) > + val = !val; > + if (val) > + sxipio_setpin(pin); > + else > + sxipio_clrpin(pin); > +} > /* > * GPIO support code > */