svn commit: r192790 - projects/mips/sys/mips/adm5120
Oleksandr Tymoshenko
gonzo at FreeBSD.org
Tue May 26 05:52:24 UTC 2009
Author: gonzo
Date: Tue May 26 05:52:24 2009
New Revision: 192790
URL: http://svn.freebsd.org/changeset/base/192790
Log:
- Provide proper pre_ithread/post_ithread functions
Modified:
projects/mips/sys/mips/adm5120/obio.c
Modified: projects/mips/sys/mips/adm5120/obio.c
==============================================================================
--- projects/mips/sys/mips/adm5120/obio.c Tue May 26 05:30:21 2009 (r192789)
+++ projects/mips/sys/mips/adm5120/obio.c Tue May 26 05:52:24 2009 (r192790)
@@ -120,6 +120,39 @@ static int obio_setup_intr(device_t, dev
static int obio_teardown_intr(device_t, device_t, struct resource *,
void *);
+
+static void
+obio_mask_irq(void *source)
+{
+ int irq;
+ uint32_t irqmask;
+ uint32_t reg;
+
+ irq = (int)source;
+ irqmask = 1 << irq;
+
+ /* disable IRQ */
+ reg = REG_READ(ICU_DISABLE_REG);
+ REG_WRITE(ICU_DISABLE_REG, (reg | irqmask));
+}
+
+static void
+obio_unmask_irq(void *source)
+{
+ int irq;
+ uint32_t irqmask;
+ uint32_t reg;
+
+ irq = (int)source;
+ irqmask = 1 << irq;
+
+ /* disable IRQ */
+ reg = REG_READ(ICU_DISABLE_REG);
+ REG_WRITE(ICU_DISABLE_REG, (reg & ~irqmask));
+
+}
+
+
static int
obio_probe(device_t dev)
{
@@ -321,7 +354,7 @@ obio_setup_intr(device_t dev, device_t c
event = sc->sc_eventstab[irq];
if (event == NULL) {
error = intr_event_create(&event, (void *)irq, 0, irq,
- (mask_fn)mips_mask_irq, (mask_fn)mips_unmask_irq,
+ obio_mask_irq, obio_unmask_irq,
NULL, NULL, "obio intr%d:", irq);
sc->sc_eventstab[irq] = event;
@@ -343,6 +376,8 @@ obio_setup_intr(device_t dev, device_t c
/* enable */
REG_WRITE(ICU_ENABLE_REG, irqmask);
+ obio_unmask_irq((void*)irq);
+
return (0);
}
@@ -351,7 +386,7 @@ obio_teardown_intr(device_t dev, device_
void *cookie)
{
struct obio_softc *sc = device_get_softc(dev);
- int irq, result;
+ int irq, result, priority;
uint32_t irqmask;
irq = rman_get_start(ires);
@@ -361,10 +396,18 @@ obio_teardown_intr(device_t dev, device_
if (sc->sc_eventstab[irq] == NULL)
panic("Trying to teardown unoccupied IRQ");
- irqmask = 1 << irq; /* only used as a mask from here on */
+ irqmask = (1 << irq);
+ priority = irq_priorities[irq];
- /* disable this irq in HW */
- REG_WRITE(ICU_DISABLE_REG, irqmask);
+ if (priority == INTR_FIQ)
+ REG_WRITE(ICU_MODE_REG, REG_READ(ICU_MODE_REG) & ~irqmask);
+ else
+ REG_WRITE(ICU_MODE_REG, REG_READ(ICU_MODE_REG) | irqmask);
+
+ /* disable */
+ irqmask = REG_READ(ICU_ENABLE_REG);
+ irqmask &= ~(1 << irq);
+ REG_WRITE(ICU_ENABLE_REG, irqmask);
result = intr_event_remove_handler(cookie);
if (!result) {
More information about the svn-src-projects
mailing list