PERFORCE change 99835 for review
Warner Losh
imp at FreeBSD.org
Fri Jun 23 03:02:01 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=99835
Change 99835 by imp at imp_lighthouse on 2006/06/22 22:05:33
Allow for GPIO configuration
Affected files ...
.. //depot/projects/arm/src/sys/arm/at91/at91_pio.c#11 edit
Differences ...
==== //depot/projects/arm/src/sys/arm/at91/at91_pio.c#11 (text+ko) ====
@@ -38,7 +38,9 @@
#include <sys/rman.h>
#include <machine/bus.h>
+#include <arm/at91/at91rm92reg.h>
#include <arm/at91/at91_pioreg.h>
+#include <arm/at91/at91_piovar.h>
struct at91_pio_softc
{
@@ -118,6 +120,9 @@
if (err)
goto out;
+ device_printf(dev, "ABSR: %#x OSR: %#x PSR:%#x ODSR: %#x\n",
+ RD4(sc, PIO_ABSR), RD4(sc, PIO_OSR), RD4(sc, PIO_PSR),
+ RD4(sc, PIO_ODSR));
AT91_PIO_LOCK_INIT(sc);
/*
@@ -250,6 +255,69 @@
return (ENXIO);
}
+/*
+ * The following functions are called early in the boot process, so
+ * don't use bus_space, as that isn't yet available when we need to use
+ * them.
+ */
+void
+at91_pio_use_periph_a(uint32_t pio, uint32_t periph_a_mask)
+{
+ uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio);
+
+ PIO[PIO_ASR / 4] = periph_a_mask;
+ PIO[PIO_PDR / 4] = periph_a_mask;
+}
+
+void
+at91_pio_use_periph_b(uint32_t pio, uint32_t periph_b_mask)
+{
+ uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio);
+
+ PIO[PIO_BSR / 4] = periph_b_mask;
+ PIO[PIO_PDR / 4] = periph_b_mask;
+}
+
+void
+at91_pio_use_gpio(uint32_t pio, uint32_t gpio_mask)
+{
+ uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio);
+
+ PIO[PIO_PER / 4] = gpio_mask;
+}
+
+void
+at91_pio_gpio_input(uint32_t pio, uint32_t input_enable_mask)
+{
+ uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio);
+
+ PIO[PIO_ODR / 4] = input_enable_mask;
+}
+
+void
+at91_pio_gpio_output(uint32_t pio, uint32_t output_enable_mask)
+{
+ uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio);
+
+ PIO[PIO_OER / 4] = output_enable_mask;
+}
+
+void
+at91_pio_gpio_set(uint32_t pio, uint32_t data_mask)
+{
+ uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio);
+
+ PIO[PIO_SODR / 4] = data_mask;
+}
+
+void
+at91_pio_gpio_clear(uint32_t pio, uint32_t data_mask)
+{
+ uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio);
+
+ PIO[PIO_CODR / 4] = data_mask;
+}
+
static device_method_t at91_pio_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, at91_pio_probe),
More information about the p4-projects
mailing list