PERFORCE change 142745 for review

Andrew Turner andrew at FreeBSD.org
Mon Jun 2 09:45:34 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=142745

Change 142745 by andrew at andrew_bender on 2008/06/02 09:45:32

	First cut at implementing arm_get_next_irq, arm_mask_irq and arm_unmask_irq

Affected files ...

.. //depot/projects/arm/src/sys/arm/s3c2xx0/s3c2410.c#10 edit

Differences ...

==== //depot/projects/arm/src/sys/arm/s3c2xx0/s3c2410.c#10 (text+ko) ====

@@ -332,15 +332,108 @@
 int
 arm_get_next_irq(void)
 {
+	int irq;
+
+	if ((irq = bus_space_read_4(&s3c2xx0_bs_tag,
+	    s3c2xx0_softc->sc_intctl_ioh, INTCTL_INTOFFSET)) != 0) {
+
+		/* Clear the pending bit */
+		bus_space_write_4(&s3c2xx0_bs_tag, s3c2xx0_softc->sc_intctl_ioh,
+		    INTCTL_SRCPND, (1 << irq));
+		bus_space_write_4(&s3c2xx0_bs_tag, s3c2xx0_softc->sc_intctl_ioh,
+		    INTCTL_INTPND, (1 << irq));
+
+		switch (irq) {
+		case S3C24X0_INT_ADCTC:
+		case S3C2410_INT_UART0:
+		case S3C2410_INT_UART1:
+		case S3C2410_INT_UART2:
+			/* Find the sub IRQ */
+			irq = 0x7ff;
+			irq &= bus_space_read_4(&s3c2xx0_bs_tag,
+			    s3c2xx0_softc->sc_intctl_ioh, INTCTL_SUBSRCPND);
+			irq &= bus_space_read_4(&s3c2xx0_bs_tag,
+			    s3c2xx0_softc->sc_intctl_ioh, INTCTL_INTSUBMSK);
+			if (irq == 0)
+				return (-1);
+
+			irq = ffs(irq);
+
+			/* Clear the sub irq pending bit */
+			bus_space_write_4(&s3c2xx0_bs_tag,
+			    s3c2xx0_softc->sc_intctl_ioh, INTCTL_SUBSRCPND,
+			    (1 << irq));
+
+			return (S3C2410_SUBIRQ_MIN + irq);
+		}
+
+		return (irq);
+	}
 	return (-1);
 }
 
 void
 arm_mask_irq(uintptr_t irq)
 {
+	u_int32_t mask;
+
+	if (irq < S3C2410_SUBIRQ_MIN) {
+		mask = bus_space_read_4(&s3c2xx0_bs_tag,
+		    s3c2xx0_softc->sc_intctl_ioh, INTCTL_INTMSK);
+		mask |= (1 << irq);
+		bus_space_write_4(&s3c2xx0_bs_tag, 
+		    s3c2xx0_softc->sc_intctl_ioh, INTCTL_INTMSK, mask);
+	} else {
+		mask = bus_space_read_4(&s3c2xx0_bs_tag,
+		    s3c2xx0_softc->sc_intctl_ioh, INTCTL_INTSUBMSK);
+		mask |= (1 << (irq - S3C2410_SUBIRQ_MIN));
+		bus_space_write_4(&s3c2xx0_bs_tag, 
+		    s3c2xx0_softc->sc_intctl_ioh, INTCTL_INTSUBMSK, mask);
+	}
 }
 
 void
 arm_unmask_irq(uintptr_t irq)
 {
+	u_int32_t mask;
+
+	if (irq >= S3C2410_SUBIRQ_MIN) {
+		mask = bus_space_read_4(&s3c2xx0_bs_tag,
+		    s3c2xx0_softc->sc_intctl_ioh, INTCTL_INTSUBMSK);
+		mask &= ~(1 << (irq - S3C2410_SUBIRQ_MIN));
+		bus_space_write_4(&s3c2xx0_bs_tag, 
+		    s3c2xx0_softc->sc_intctl_ioh, INTCTL_INTSUBMSK, mask);
+
+		/* Find the other irq to unmask */
+		switch (irq) {
+		case S3C2410_INT_ADC:
+		case S3C2410_INT_TC:
+			irq = S3C24X0_INT_ADCTC;
+			break;
+		case S3C2410_INT_RXD0:
+		case S3C2410_INT_TXD0:
+		case S3C2410_INT_ERR0:
+			irq = S3C2410_INT_UART0;
+			break;
+		case S3C2410_INT_RXD1:
+		case S3C2410_INT_TXD1:
+		case S3C2410_INT_ERR1:
+			irq = S3C2410_INT_UART1;
+			break;
+
+		case S3C2410_INT_RXD2:
+		case S3C2410_INT_TXD2:
+		case S3C2410_INT_ERR2:
+			irq = S3C2410_INT_UART2;
+			break;
+		default:
+			/* We don't know which other IRQ to unmask */
+			return;
+		}
+	}
+	mask = bus_space_read_4(&s3c2xx0_bs_tag, s3c2xx0_softc->sc_intctl_ioh,
+	    INTCTL_INTMSK);
+	mask &= ~(1 << irq);
+	bus_space_write_4(&s3c2xx0_bs_tag, s3c2xx0_softc->sc_intctl_ioh,
+	    INTCTL_INTMSK, mask);
 }


More information about the p4-projects mailing list