summaryrefslogtreecommitdiffstats
path: root/sys/arm/xscale/ixp425/ixp425.c
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2009-06-22 20:38:55 +0000
committersam <sam@FreeBSD.org>2009-06-22 20:38:55 +0000
commit8c798bdc5358b4ab9c10fc4c8f1e70f3e9cc74a4 (patch)
treea8cbc380ee6393d97e54a798ed6b99a31f5fe761 /sys/arm/xscale/ixp425/ixp425.c
parente8030f4a28ba52b796c613adfaa81f2f0983d6fd (diff)
downloadFreeBSD-src-8c798bdc5358b4ab9c10fc4c8f1e70f3e9cc74a4.zip
FreeBSD-src-8c798bdc5358b4ab9c10fc4c8f1e70f3e9cc74a4.tar.gz
add ixp425_set_gpio to program the gpio interrupt type
Diffstat (limited to 'sys/arm/xscale/ixp425/ixp425.c')
-rw-r--r--sys/arm/xscale/ixp425/ixp425.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/sys/arm/xscale/ixp425/ixp425.c b/sys/arm/xscale/ixp425/ixp425.c
index ffe48ae..bc67fc48 100644
--- a/sys/arm/xscale/ixp425/ixp425.c
+++ b/sys/arm/xscale/ixp425/ixp425.c
@@ -159,6 +159,25 @@ DB_SHOW_COMMAND(gpio, db_show_gpio)
}
#endif
+void
+ixp425_set_gpio(struct ixp425_softc *sc, int pin, int type)
+{
+ uint32_t gpiotr = GPIO_CONF_READ_4(sc, GPIO_TYPE_REG(pin));
+
+ /* clear interrupt type */
+ GPIO_CONF_WRITE_4(sc, GPIO_TYPE_REG(pin),
+ gpiotr &~ GPIO_TYPE(pin, GPIO_TYPE_MASK));
+ /* clear any pending interrupt */
+ GPIO_CONF_WRITE_4(sc, IXP425_GPIO_GPISR, (1<<pin));
+ /* set new interrupt type */
+ GPIO_CONF_WRITE_4(sc, GPIO_TYPE_REG(pin),
+ gpiotr | GPIO_TYPE(pin, type));
+
+ /* configure gpio line as an input */
+ GPIO_CONF_WRITE_4(sc, IXP425_GPIO_GPOER,
+ GPIO_CONF_READ_4(sc, IXP425_GPIO_GPOER) | (1<<pin));
+}
+
static __inline void
ixp425_gpio_ack(int irq)
{
OpenPOWER on IntegriCloud