Add FDT attachment, plus minor code shuffle.

This commit is contained in:
Warner Losh 2014-02-09 20:57:26 +00:00
parent 210c0e4c87
commit 4da9131d2a

View File

@ -24,6 +24,8 @@
* SUCH DAMAGE.
*/
#include "opt_platform.h"
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
@ -48,6 +50,12 @@ __FBSDID("$FreeBSD$");
#include <arm/at91/at91var.h>
#include <arm/at91/at91_pitreg.h>
#ifdef FDT
#include <dev/fdt/fdt_common.h>
#include <dev/ofw/ofw_bus.h>
#include <dev/ofw/ofw_bus_subr.h>
#endif
#ifndef PIT_PRESCALE
#define PIT_PRESCALE (16)
#endif
@ -83,6 +91,9 @@ at91_pit_delay(int us)
uint64_t pit_freq;
const uint64_t mhz = 1E6;
if (sc == NULL)
return;
last = PIT_PIV(RD4(sc, PIT_PIIR));
/* Max delay ~= 260s. @ 133Mhz */
@ -111,7 +122,10 @@ static struct timecounter at91_pit_timecounter = {
static int
at91_pit_probe(device_t dev)
{
#ifdef FDT
if (!ofw_bus_is_compatible(dev, "atmel,at91sam9260-pit"))
return (ENXIO);
#endif
device_set_desc(dev, "AT91SAM9 PIT");
return (0);
}
@ -121,10 +135,8 @@ at91_pit_attach(device_t dev)
{
void *ih;
int rid, err = 0;
struct at91_softc *at91_sc;
struct resource *irq;
at91_sc = device_get_softc(device_get_parent(dev));
sc = device_get_softc(dev);
sc->sc_dev = dev;
@ -158,22 +170,6 @@ at91_pit_attach(device_t dev)
return (err);
}
static device_method_t at91_pit_methods[] = {
DEVMETHOD(device_probe, at91_pit_probe),
DEVMETHOD(device_attach, at91_pit_attach),
DEVMETHOD_END
};
static driver_t at91_pit_driver = {
"at91_pit",
at91_pit_methods,
sizeof(struct pit_softc),
};
static devclass_t at91_pit_devclass;
DRIVER_MODULE(at91_pit, atmelarm, at91_pit_driver, at91_pit_devclass, NULL,
NULL);
static int
pit_intr(void *arg)
@ -202,3 +198,25 @@ at91_pit_get_timecount(struct timecounter *tc)
icnt = piir >> 20; /* Overflows */
return (timecount + PIT_PIV(piir) + PIT_PIV(RD4(sc, PIT_MR)) * icnt);
}
static device_method_t at91_pit_methods[] = {
DEVMETHOD(device_probe, at91_pit_probe),
DEVMETHOD(device_attach, at91_pit_attach),
DEVMETHOD_END
};
static driver_t at91_pit_driver = {
"at91_pit",
at91_pit_methods,
sizeof(struct pit_softc),
};
static devclass_t at91_pit_devclass;
#ifdef FDT
DRIVER_MODULE(at91_pit, simplebus, at91_pit_driver, at91_pit_devclass, NULL,
NULL);
#else
DRIVER_MODULE(at91_pit, atmelarm, at91_pit_driver, at91_pit_devclass, NULL,
NULL);
#endif