mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-25 08:21:14 +00:00
454 lines
14 KiB
Diff
454 lines
14 KiB
Diff
|
From c9e8d4b75d48f02731f25e55247017d60c59d510 Mon Sep 17 00:00:00 2001
|
||
|
From: Zhao Qiang <qiang.zhao@nxp.com>
|
||
|
Date: Thu, 27 Apr 2017 09:56:20 +0800
|
||
|
Subject: [PATCH] irqchip/qeic: remove PPCisms for QEIC
|
||
|
|
||
|
QEIC was supported on PowerPC, and dependent on PPC,
|
||
|
Now it is supported on other platforms, so remove PPCisms.
|
||
|
|
||
|
Signed-off-by: Zhao Qiang <qiang.zhao@nxp.com>
|
||
|
---
|
||
|
drivers/irqchip/irq-qeic.c | 220 +++++++++++++++++++++++----------------------
|
||
|
include/soc/fsl/qe/qe_ic.h | 128 --------------------------
|
||
|
2 files changed, 112 insertions(+), 236 deletions(-)
|
||
|
delete mode 100644 include/soc/fsl/qe/qe_ic.h
|
||
|
|
||
|
--- a/drivers/irqchip/irq-qeic.c
|
||
|
+++ b/drivers/irqchip/irq-qeic.c
|
||
|
@@ -14,7 +14,11 @@
|
||
|
#include <linux/of_address.h>
|
||
|
#include <linux/kernel.h>
|
||
|
#include <linux/init.h>
|
||
|
+#include <linux/irqdomain.h>
|
||
|
+#include <linux/irqchip.h>
|
||
|
#include <linux/errno.h>
|
||
|
+#include <linux/of_address.h>
|
||
|
+#include <linux/of_irq.h>
|
||
|
#include <linux/reboot.h>
|
||
|
#include <linux/slab.h>
|
||
|
#include <linux/stddef.h>
|
||
|
@@ -22,9 +26,8 @@
|
||
|
#include <linux/signal.h>
|
||
|
#include <linux/device.h>
|
||
|
#include <linux/spinlock.h>
|
||
|
-#include <asm/irq.h>
|
||
|
+#include <linux/irq.h>
|
||
|
#include <asm/io.h>
|
||
|
-#include <soc/fsl/qe/qe_ic.h>
|
||
|
|
||
|
#define NR_QE_IC_INTS 64
|
||
|
|
||
|
@@ -82,6 +85,43 @@
|
||
|
#define SIGNAL_HIGH 2
|
||
|
#define SIGNAL_LOW 0
|
||
|
|
||
|
+#define NUM_OF_QE_IC_GROUPS 6
|
||
|
+
|
||
|
+/* Flags when we init the QE IC */
|
||
|
+#define QE_IC_SPREADMODE_GRP_W 0x00000001
|
||
|
+#define QE_IC_SPREADMODE_GRP_X 0x00000002
|
||
|
+#define QE_IC_SPREADMODE_GRP_Y 0x00000004
|
||
|
+#define QE_IC_SPREADMODE_GRP_Z 0x00000008
|
||
|
+#define QE_IC_SPREADMODE_GRP_RISCA 0x00000010
|
||
|
+#define QE_IC_SPREADMODE_GRP_RISCB 0x00000020
|
||
|
+
|
||
|
+#define QE_IC_LOW_SIGNAL 0x00000100
|
||
|
+#define QE_IC_HIGH_SIGNAL 0x00000200
|
||
|
+
|
||
|
+#define QE_IC_GRP_W_PRI0_DEST_SIGNAL_HIGH 0x00001000
|
||
|
+#define QE_IC_GRP_W_PRI1_DEST_SIGNAL_HIGH 0x00002000
|
||
|
+#define QE_IC_GRP_X_PRI0_DEST_SIGNAL_HIGH 0x00004000
|
||
|
+#define QE_IC_GRP_X_PRI1_DEST_SIGNAL_HIGH 0x00008000
|
||
|
+#define QE_IC_GRP_Y_PRI0_DEST_SIGNAL_HIGH 0x00010000
|
||
|
+#define QE_IC_GRP_Y_PRI1_DEST_SIGNAL_HIGH 0x00020000
|
||
|
+#define QE_IC_GRP_Z_PRI0_DEST_SIGNAL_HIGH 0x00040000
|
||
|
+#define QE_IC_GRP_Z_PRI1_DEST_SIGNAL_HIGH 0x00080000
|
||
|
+#define QE_IC_GRP_RISCA_PRI0_DEST_SIGNAL_HIGH 0x00100000
|
||
|
+#define QE_IC_GRP_RISCA_PRI1_DEST_SIGNAL_HIGH 0x00200000
|
||
|
+#define QE_IC_GRP_RISCB_PRI0_DEST_SIGNAL_HIGH 0x00400000
|
||
|
+#define QE_IC_GRP_RISCB_PRI1_DEST_SIGNAL_HIGH 0x00800000
|
||
|
+#define QE_IC_GRP_W_DEST_SIGNAL_SHIFT (12)
|
||
|
+
|
||
|
+/* QE interrupt sources groups */
|
||
|
+enum qe_ic_grp_id {
|
||
|
+ QE_IC_GRP_W = 0, /* QE interrupt controller group W */
|
||
|
+ QE_IC_GRP_X, /* QE interrupt controller group X */
|
||
|
+ QE_IC_GRP_Y, /* QE interrupt controller group Y */
|
||
|
+ QE_IC_GRP_Z, /* QE interrupt controller group Z */
|
||
|
+ QE_IC_GRP_RISCA, /* QE interrupt controller RISC group A */
|
||
|
+ QE_IC_GRP_RISCB /* QE interrupt controller RISC group B */
|
||
|
+};
|
||
|
+
|
||
|
struct qe_ic {
|
||
|
/* Control registers offset */
|
||
|
u32 __iomem *regs;
|
||
|
@@ -260,15 +300,15 @@ static struct qe_ic_info qe_ic_info[] =
|
||
|
},
|
||
|
};
|
||
|
|
||
|
-static inline u32 qe_ic_read(volatile __be32 __iomem * base, unsigned int reg)
|
||
|
+static inline u32 qe_ic_read(__be32 __iomem *base, unsigned int reg)
|
||
|
{
|
||
|
- return in_be32(base + (reg >> 2));
|
||
|
+ return ioread32be(base + (reg >> 2));
|
||
|
}
|
||
|
|
||
|
-static inline void qe_ic_write(volatile __be32 __iomem * base, unsigned int reg,
|
||
|
+static inline void qe_ic_write(__be32 __iomem *base, unsigned int reg,
|
||
|
u32 value)
|
||
|
{
|
||
|
- out_be32(base + (reg >> 2), value);
|
||
|
+ iowrite32be(value, base + (reg >> 2));
|
||
|
}
|
||
|
|
||
|
static inline struct qe_ic *qe_ic_from_irq(unsigned int virq)
|
||
|
@@ -370,8 +410,8 @@ static const struct irq_domain_ops qe_ic
|
||
|
.xlate = irq_domain_xlate_onetwocell,
|
||
|
};
|
||
|
|
||
|
-/* Return an interrupt vector or NO_IRQ if no interrupt is pending. */
|
||
|
-unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic)
|
||
|
+/* Return an interrupt vector or 0 if no interrupt is pending. */
|
||
|
+static unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic)
|
||
|
{
|
||
|
int irq;
|
||
|
|
||
|
@@ -381,13 +421,13 @@ unsigned int qe_ic_get_low_irq(struct qe
|
||
|
irq = qe_ic_read(qe_ic->regs, QEIC_CIVEC) >> 26;
|
||
|
|
||
|
if (irq == 0)
|
||
|
- return NO_IRQ;
|
||
|
+ return 0;
|
||
|
|
||
|
return irq_linear_revmap(qe_ic->irqhost, irq);
|
||
|
}
|
||
|
|
||
|
-/* Return an interrupt vector or NO_IRQ if no interrupt is pending. */
|
||
|
-unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic)
|
||
|
+/* Return an interrupt vector or 0 if no interrupt is pending. */
|
||
|
+static unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic)
|
||
|
{
|
||
|
int irq;
|
||
|
|
||
|
@@ -397,11 +437,69 @@ unsigned int qe_ic_get_high_irq(struct q
|
||
|
irq = qe_ic_read(qe_ic->regs, QEIC_CHIVEC) >> 26;
|
||
|
|
||
|
if (irq == 0)
|
||
|
- return NO_IRQ;
|
||
|
+ return 0;
|
||
|
|
||
|
return irq_linear_revmap(qe_ic->irqhost, irq);
|
||
|
}
|
||
|
|
||
|
+static inline void qe_ic_cascade_low_ipic(struct irq_desc *desc)
|
||
|
+{
|
||
|
+ struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
|
||
|
+ unsigned int cascade_irq = qe_ic_get_low_irq(qe_ic);
|
||
|
+
|
||
|
+ if (cascade_irq != 0)
|
||
|
+ generic_handle_irq(cascade_irq);
|
||
|
+}
|
||
|
+
|
||
|
+static inline void qe_ic_cascade_high_ipic(struct irq_desc *desc)
|
||
|
+{
|
||
|
+ struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
|
||
|
+ unsigned int cascade_irq = qe_ic_get_high_irq(qe_ic);
|
||
|
+
|
||
|
+ if (cascade_irq != 0)
|
||
|
+ generic_handle_irq(cascade_irq);
|
||
|
+}
|
||
|
+
|
||
|
+static inline void qe_ic_cascade_low_mpic(struct irq_desc *desc)
|
||
|
+{
|
||
|
+ struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
|
||
|
+ unsigned int cascade_irq = qe_ic_get_low_irq(qe_ic);
|
||
|
+ struct irq_chip *chip = irq_desc_get_chip(desc);
|
||
|
+
|
||
|
+ if (cascade_irq != 0)
|
||
|
+ generic_handle_irq(cascade_irq);
|
||
|
+
|
||
|
+ chip->irq_eoi(&desc->irq_data);
|
||
|
+}
|
||
|
+
|
||
|
+static inline void qe_ic_cascade_high_mpic(struct irq_desc *desc)
|
||
|
+{
|
||
|
+ struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
|
||
|
+ unsigned int cascade_irq = qe_ic_get_high_irq(qe_ic);
|
||
|
+ struct irq_chip *chip = irq_desc_get_chip(desc);
|
||
|
+
|
||
|
+ if (cascade_irq != 0)
|
||
|
+ generic_handle_irq(cascade_irq);
|
||
|
+
|
||
|
+ chip->irq_eoi(&desc->irq_data);
|
||
|
+}
|
||
|
+
|
||
|
+static inline void qe_ic_cascade_muxed_mpic(struct irq_desc *desc)
|
||
|
+{
|
||
|
+ struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
|
||
|
+ unsigned int cascade_irq;
|
||
|
+ struct irq_chip *chip = irq_desc_get_chip(desc);
|
||
|
+
|
||
|
+ cascade_irq = qe_ic_get_high_irq(qe_ic);
|
||
|
+ if (cascade_irq == 0)
|
||
|
+ cascade_irq = qe_ic_get_low_irq(qe_ic);
|
||
|
+
|
||
|
+ if (cascade_irq != 0)
|
||
|
+ generic_handle_irq(cascade_irq);
|
||
|
+
|
||
|
+ chip->irq_eoi(&desc->irq_data);
|
||
|
+}
|
||
|
+
|
||
|
static int __init qe_ic_init(struct device_node *node, unsigned int flags)
|
||
|
{
|
||
|
struct qe_ic *qe_ic;
|
||
|
@@ -438,7 +536,7 @@ static int __init qe_ic_init(struct devi
|
||
|
qe_ic->virq_high = irq_of_parse_and_map(node, 0);
|
||
|
qe_ic->virq_low = irq_of_parse_and_map(node, 1);
|
||
|
|
||
|
- if (qe_ic->virq_low == NO_IRQ) {
|
||
|
+ if (qe_ic->virq_low == 0) {
|
||
|
pr_err("Failed to map QE_IC low IRQ\n");
|
||
|
ret = -ENOMEM;
|
||
|
goto err_domain_remove;
|
||
|
@@ -470,7 +568,7 @@ static int __init qe_ic_init(struct devi
|
||
|
irq_set_handler_data(qe_ic->virq_low, qe_ic);
|
||
|
irq_set_chained_handler(qe_ic->virq_low, qe_ic_cascade_low_mpic);
|
||
|
|
||
|
- if (qe_ic->virq_high != NO_IRQ &&
|
||
|
+ if (qe_ic->virq_high != 0 &&
|
||
|
qe_ic->virq_high != qe_ic->virq_low) {
|
||
|
irq_set_handler_data(qe_ic->virq_high, qe_ic);
|
||
|
irq_set_chained_handler(qe_ic->virq_high,
|
||
|
@@ -488,100 +586,6 @@ err_put_node:
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
-void qe_ic_set_highest_priority(unsigned int virq, int high)
|
||
|
-{
|
||
|
- struct qe_ic *qe_ic = qe_ic_from_irq(virq);
|
||
|
- unsigned int src = virq_to_hw(virq);
|
||
|
- u32 temp = 0;
|
||
|
-
|
||
|
- temp = qe_ic_read(qe_ic->regs, QEIC_CICR);
|
||
|
-
|
||
|
- temp &= ~CICR_HP_MASK;
|
||
|
- temp |= src << CICR_HP_SHIFT;
|
||
|
-
|
||
|
- temp &= ~CICR_HPIT_MASK;
|
||
|
- temp |= (high ? SIGNAL_HIGH : SIGNAL_LOW) << CICR_HPIT_SHIFT;
|
||
|
-
|
||
|
- qe_ic_write(qe_ic->regs, QEIC_CICR, temp);
|
||
|
-}
|
||
|
-
|
||
|
-/* Set Priority level within its group, from 1 to 8 */
|
||
|
-int qe_ic_set_priority(unsigned int virq, unsigned int priority)
|
||
|
-{
|
||
|
- struct qe_ic *qe_ic = qe_ic_from_irq(virq);
|
||
|
- unsigned int src = virq_to_hw(virq);
|
||
|
- u32 temp;
|
||
|
-
|
||
|
- if (priority > 8 || priority == 0)
|
||
|
- return -EINVAL;
|
||
|
- if (WARN_ONCE(src >= ARRAY_SIZE(qe_ic_info),
|
||
|
- "%s: Invalid hw irq number for QEIC\n", __func__))
|
||
|
- return -EINVAL;
|
||
|
- if (qe_ic_info[src].pri_reg == 0)
|
||
|
- return -EINVAL;
|
||
|
-
|
||
|
- temp = qe_ic_read(qe_ic->regs, qe_ic_info[src].pri_reg);
|
||
|
-
|
||
|
- if (priority < 4) {
|
||
|
- temp &= ~(0x7 << (32 - priority * 3));
|
||
|
- temp |= qe_ic_info[src].pri_code << (32 - priority * 3);
|
||
|
- } else {
|
||
|
- temp &= ~(0x7 << (24 - priority * 3));
|
||
|
- temp |= qe_ic_info[src].pri_code << (24 - priority * 3);
|
||
|
- }
|
||
|
-
|
||
|
- qe_ic_write(qe_ic->regs, qe_ic_info[src].pri_reg, temp);
|
||
|
-
|
||
|
- return 0;
|
||
|
-}
|
||
|
-
|
||
|
-/* Set a QE priority to use high irq, only priority 1~2 can use high irq */
|
||
|
-int qe_ic_set_high_priority(unsigned int virq, unsigned int priority, int high)
|
||
|
-{
|
||
|
- struct qe_ic *qe_ic = qe_ic_from_irq(virq);
|
||
|
- unsigned int src = virq_to_hw(virq);
|
||
|
- u32 temp, control_reg = QEIC_CICNR, shift = 0;
|
||
|
-
|
||
|
- if (priority > 2 || priority == 0)
|
||
|
- return -EINVAL;
|
||
|
- if (WARN_ONCE(src >= ARRAY_SIZE(qe_ic_info),
|
||
|
- "%s: Invalid hw irq number for QEIC\n", __func__))
|
||
|
- return -EINVAL;
|
||
|
-
|
||
|
- switch (qe_ic_info[src].pri_reg) {
|
||
|
- case QEIC_CIPZCC:
|
||
|
- shift = CICNR_ZCC1T_SHIFT;
|
||
|
- break;
|
||
|
- case QEIC_CIPWCC:
|
||
|
- shift = CICNR_WCC1T_SHIFT;
|
||
|
- break;
|
||
|
- case QEIC_CIPYCC:
|
||
|
- shift = CICNR_YCC1T_SHIFT;
|
||
|
- break;
|
||
|
- case QEIC_CIPXCC:
|
||
|
- shift = CICNR_XCC1T_SHIFT;
|
||
|
- break;
|
||
|
- case QEIC_CIPRTA:
|
||
|
- shift = CRICR_RTA1T_SHIFT;
|
||
|
- control_reg = QEIC_CRICR;
|
||
|
- break;
|
||
|
- case QEIC_CIPRTB:
|
||
|
- shift = CRICR_RTB1T_SHIFT;
|
||
|
- control_reg = QEIC_CRICR;
|
||
|
- break;
|
||
|
- default:
|
||
|
- return -EINVAL;
|
||
|
- }
|
||
|
-
|
||
|
- shift += (2 - priority) * 2;
|
||
|
- temp = qe_ic_read(qe_ic->regs, control_reg);
|
||
|
- temp &= ~(SIGNAL_MASK << shift);
|
||
|
- temp |= (high ? SIGNAL_HIGH : SIGNAL_LOW) << shift;
|
||
|
- qe_ic_write(qe_ic->regs, control_reg, temp);
|
||
|
-
|
||
|
- return 0;
|
||
|
-}
|
||
|
-
|
||
|
static int __init init_qe_ic(struct device_node *node,
|
||
|
struct device_node *parent)
|
||
|
{
|
||
|
--- a/include/soc/fsl/qe/qe_ic.h
|
||
|
+++ /dev/null
|
||
|
@@ -1,128 +0,0 @@
|
||
|
-/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||
|
-/*
|
||
|
- * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
|
||
|
- *
|
||
|
- * Authors: Shlomi Gridish <gridish@freescale.com>
|
||
|
- * Li Yang <leoli@freescale.com>
|
||
|
- *
|
||
|
- * Description:
|
||
|
- * QE IC external definitions and structure.
|
||
|
- */
|
||
|
-#ifndef _ASM_POWERPC_QE_IC_H
|
||
|
-#define _ASM_POWERPC_QE_IC_H
|
||
|
-
|
||
|
-#include <linux/irq.h>
|
||
|
-
|
||
|
-struct device_node;
|
||
|
-struct qe_ic;
|
||
|
-
|
||
|
-#define NUM_OF_QE_IC_GROUPS 6
|
||
|
-
|
||
|
-/* Flags when we init the QE IC */
|
||
|
-#define QE_IC_SPREADMODE_GRP_W 0x00000001
|
||
|
-#define QE_IC_SPREADMODE_GRP_X 0x00000002
|
||
|
-#define QE_IC_SPREADMODE_GRP_Y 0x00000004
|
||
|
-#define QE_IC_SPREADMODE_GRP_Z 0x00000008
|
||
|
-#define QE_IC_SPREADMODE_GRP_RISCA 0x00000010
|
||
|
-#define QE_IC_SPREADMODE_GRP_RISCB 0x00000020
|
||
|
-
|
||
|
-#define QE_IC_LOW_SIGNAL 0x00000100
|
||
|
-#define QE_IC_HIGH_SIGNAL 0x00000200
|
||
|
-
|
||
|
-#define QE_IC_GRP_W_PRI0_DEST_SIGNAL_HIGH 0x00001000
|
||
|
-#define QE_IC_GRP_W_PRI1_DEST_SIGNAL_HIGH 0x00002000
|
||
|
-#define QE_IC_GRP_X_PRI0_DEST_SIGNAL_HIGH 0x00004000
|
||
|
-#define QE_IC_GRP_X_PRI1_DEST_SIGNAL_HIGH 0x00008000
|
||
|
-#define QE_IC_GRP_Y_PRI0_DEST_SIGNAL_HIGH 0x00010000
|
||
|
-#define QE_IC_GRP_Y_PRI1_DEST_SIGNAL_HIGH 0x00020000
|
||
|
-#define QE_IC_GRP_Z_PRI0_DEST_SIGNAL_HIGH 0x00040000
|
||
|
-#define QE_IC_GRP_Z_PRI1_DEST_SIGNAL_HIGH 0x00080000
|
||
|
-#define QE_IC_GRP_RISCA_PRI0_DEST_SIGNAL_HIGH 0x00100000
|
||
|
-#define QE_IC_GRP_RISCA_PRI1_DEST_SIGNAL_HIGH 0x00200000
|
||
|
-#define QE_IC_GRP_RISCB_PRI0_DEST_SIGNAL_HIGH 0x00400000
|
||
|
-#define QE_IC_GRP_RISCB_PRI1_DEST_SIGNAL_HIGH 0x00800000
|
||
|
-#define QE_IC_GRP_W_DEST_SIGNAL_SHIFT (12)
|
||
|
-
|
||
|
-/* QE interrupt sources groups */
|
||
|
-enum qe_ic_grp_id {
|
||
|
- QE_IC_GRP_W = 0, /* QE interrupt controller group W */
|
||
|
- QE_IC_GRP_X, /* QE interrupt controller group X */
|
||
|
- QE_IC_GRP_Y, /* QE interrupt controller group Y */
|
||
|
- QE_IC_GRP_Z, /* QE interrupt controller group Z */
|
||
|
- QE_IC_GRP_RISCA, /* QE interrupt controller RISC group A */
|
||
|
- QE_IC_GRP_RISCB /* QE interrupt controller RISC group B */
|
||
|
-};
|
||
|
-
|
||
|
-#ifdef CONFIG_QUICC_ENGINE
|
||
|
-unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic);
|
||
|
-unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic);
|
||
|
-#else
|
||
|
-static inline unsigned int qe_ic_get_low_irq(struct qe_ic *qe_ic)
|
||
|
-{ return 0; }
|
||
|
-static inline unsigned int qe_ic_get_high_irq(struct qe_ic *qe_ic)
|
||
|
-{ return 0; }
|
||
|
-#endif /* CONFIG_QUICC_ENGINE */
|
||
|
-
|
||
|
-void qe_ic_set_highest_priority(unsigned int virq, int high);
|
||
|
-int qe_ic_set_priority(unsigned int virq, unsigned int priority);
|
||
|
-int qe_ic_set_high_priority(unsigned int virq, unsigned int priority, int high);
|
||
|
-
|
||
|
-static inline void qe_ic_cascade_low_ipic(struct irq_desc *desc)
|
||
|
-{
|
||
|
- struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
|
||
|
- unsigned int cascade_irq = qe_ic_get_low_irq(qe_ic);
|
||
|
-
|
||
|
- if (cascade_irq != NO_IRQ)
|
||
|
- generic_handle_irq(cascade_irq);
|
||
|
-}
|
||
|
-
|
||
|
-static inline void qe_ic_cascade_high_ipic(struct irq_desc *desc)
|
||
|
-{
|
||
|
- struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
|
||
|
- unsigned int cascade_irq = qe_ic_get_high_irq(qe_ic);
|
||
|
-
|
||
|
- if (cascade_irq != NO_IRQ)
|
||
|
- generic_handle_irq(cascade_irq);
|
||
|
-}
|
||
|
-
|
||
|
-static inline void qe_ic_cascade_low_mpic(struct irq_desc *desc)
|
||
|
-{
|
||
|
- struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
|
||
|
- unsigned int cascade_irq = qe_ic_get_low_irq(qe_ic);
|
||
|
- struct irq_chip *chip = irq_desc_get_chip(desc);
|
||
|
-
|
||
|
- if (cascade_irq != NO_IRQ)
|
||
|
- generic_handle_irq(cascade_irq);
|
||
|
-
|
||
|
- chip->irq_eoi(&desc->irq_data);
|
||
|
-}
|
||
|
-
|
||
|
-static inline void qe_ic_cascade_high_mpic(struct irq_desc *desc)
|
||
|
-{
|
||
|
- struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
|
||
|
- unsigned int cascade_irq = qe_ic_get_high_irq(qe_ic);
|
||
|
- struct irq_chip *chip = irq_desc_get_chip(desc);
|
||
|
-
|
||
|
- if (cascade_irq != NO_IRQ)
|
||
|
- generic_handle_irq(cascade_irq);
|
||
|
-
|
||
|
- chip->irq_eoi(&desc->irq_data);
|
||
|
-}
|
||
|
-
|
||
|
-static inline void qe_ic_cascade_muxed_mpic(struct irq_desc *desc)
|
||
|
-{
|
||
|
- struct qe_ic *qe_ic = irq_desc_get_handler_data(desc);
|
||
|
- unsigned int cascade_irq;
|
||
|
- struct irq_chip *chip = irq_desc_get_chip(desc);
|
||
|
-
|
||
|
- cascade_irq = qe_ic_get_high_irq(qe_ic);
|
||
|
- if (cascade_irq == NO_IRQ)
|
||
|
- cascade_irq = qe_ic_get_low_irq(qe_ic);
|
||
|
-
|
||
|
- if (cascade_irq != NO_IRQ)
|
||
|
- generic_handle_irq(cascade_irq);
|
||
|
-
|
||
|
- chip->irq_eoi(&desc->irq_data);
|
||
|
-}
|
||
|
-
|
||
|
-#endif /* _ASM_POWERPC_QE_IC_H */
|