|
@@ -439,3 +439,81 @@ s3c_irq_demux_uart2(unsigned int irq,
|
|
|
struct irq_desc *desc)
|
|
|
{
|
|
|
irq = irq;
|
|
|
+ s3c_irq_demux_uart(IRQ_S3CUART_RX2);
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+s3c_irq_demux_extint8(unsigned int irq,
|
|
|
+ struct irq_desc *desc)
|
|
|
+{
|
|
|
+ unsigned long eintpnd = __raw_readl(S3C24XX_EINTPEND);
|
|
|
+ unsigned long eintmsk = __raw_readl(S3C24XX_EINTMASK);
|
|
|
+
|
|
|
+ eintpnd &= ~eintmsk;
|
|
|
+ eintpnd &= ~0xff; /* ignore lower irqs */
|
|
|
+
|
|
|
+ /* we may as well handle all the pending IRQs here */
|
|
|
+
|
|
|
+ while (eintpnd) {
|
|
|
+ irq = __ffs(eintpnd);
|
|
|
+ eintpnd &= ~(1<<irq);
|
|
|
+
|
|
|
+ irq += (IRQ_EINT4 - 4);
|
|
|
+ generic_handle_irq(irq);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+s3c_irq_demux_extint4t7(unsigned int irq,
|
|
|
+ struct irq_desc *desc)
|
|
|
+{
|
|
|
+ unsigned long eintpnd = __raw_readl(S3C24XX_EINTPEND);
|
|
|
+ unsigned long eintmsk = __raw_readl(S3C24XX_EINTMASK);
|
|
|
+
|
|
|
+ eintpnd &= ~eintmsk;
|
|
|
+ eintpnd &= 0xff; /* only lower irqs */
|
|
|
+
|
|
|
+ /* we may as well handle all the pending IRQs here */
|
|
|
+
|
|
|
+ while (eintpnd) {
|
|
|
+ irq = __ffs(eintpnd);
|
|
|
+ eintpnd &= ~(1<<irq);
|
|
|
+
|
|
|
+ irq += (IRQ_EINT4 - 4);
|
|
|
+
|
|
|
+ generic_handle_irq(irq);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef CONFIG_FIQ
|
|
|
+/**
|
|
|
+ * s3c24xx_set_fiq - set the FIQ routing
|
|
|
+ * @irq: IRQ number to route to FIQ on processor.
|
|
|
+ * @on: Whether to route @irq to the FIQ, or to remove the FIQ routing.
|
|
|
+ *
|
|
|
+ * Change the state of the IRQ to FIQ routing depending on @irq and @on. If
|
|
|
+ * @on is true, the @irq is checked to see if it can be routed and the
|
|
|
+ * interrupt controller updated to route the IRQ. If @on is false, the FIQ
|
|
|
+ * routing is cleared, regardless of which @irq is specified.
|
|
|
+ */
|
|
|
+int s3c24xx_set_fiq(unsigned int irq, bool on)
|
|
|
+{
|
|
|
+ u32 intmod;
|
|
|
+ unsigned offs;
|
|
|
+
|
|
|
+ if (on) {
|
|
|
+ offs = irq - FIQ_START;
|
|
|
+ if (offs > 31)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ intmod = 1 << offs;
|
|
|
+ } else {
|
|
|
+ intmod = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ __raw_writel(intmod, S3C2410_INTMOD);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+EXPORT_SYMBOL_GPL(s3c24xx_set_fiq);
|