#include <linux/slab.h>
#include <linux/random.h>
#include <linux/irq.h>
-#include <asm/bitops.h>
+#include <linux/bitops.h>
#include <asm/bootinfo.h>
#include <asm/io.h>
#include <asm/irq.h>
/*
* DEBUG
*/
-#define TX4927_IRQ_CHECK_CP0
-#define TX4927_IRQ_CHECK_PIC
#undef TX4927_IRQ_DEBUG
* Kernel structs for all pic's
*/
-static spinlock_t tx4927_cp0_lock = SPIN_LOCK_UNLOCKED;
-static spinlock_t tx4927_pic_lock = SPIN_LOCK_UNLOCKED;
+static DEFINE_SPINLOCK(tx4927_cp0_lock);
+static DEFINE_SPINLOCK(tx4927_pic_lock);
#define TX4927_CP0_NAME "TX4927-CP0"
static struct hw_interrupt_type tx4927_irq_cp0_type = {
.set_affinity = NULL
};
-#define TX4927_PIC_ACTION(s) { no_action, 0, 0, s, NULL, NULL }
+#define TX4927_PIC_ACTION(s) { no_action, 0, CPU_MASK_NONE, s, NULL, NULL }
static struct irqaction tx4927_irq_pic_action =
TX4927_PIC_ACTION(TX4927_PIC_NAME);
{
TX4927_IRQ_DPRINTK(TX4927_IRQ_CP0_STARTUP, "irq=%d \n", irq);
-#ifdef TX4927_IRQ_CHECK_CP0
- {
- if (irq < TX4927_IRQ_CP0_BEG || irq > TX4927_IRQ_CP0_END) {
- TX4927_IRQ_DPRINTK(TX4927_IRQ_EROR,
- "bad irq=%d \n", irq);
- panic("\n");
- }
- }
-#endif
-
tx4927_irq_cp0_enable(irq);
return (0);
{
TX4927_IRQ_DPRINTK(TX4927_IRQ_CP0_SHUTDOWN, "irq=%d \n", irq);
-#ifdef TX4927_IRQ_CHECK_CP0
- {
- if (irq < TX4927_IRQ_CP0_BEG || irq > TX4927_IRQ_CP0_END) {
- TX4927_IRQ_DPRINTK(TX4927_IRQ_EROR,
- "bad irq=%d \n", irq);
- panic("\n");
- }
- }
-#endif
-
tx4927_irq_cp0_disable(irq);
return;
TX4927_IRQ_DPRINTK(TX4927_IRQ_CP0_ENABLE, "irq=%d \n", irq);
-#ifdef TX4927_IRQ_CHECK_CP0
- {
- if (irq < TX4927_IRQ_CP0_BEG || irq > TX4927_IRQ_CP0_END) {
- TX4927_IRQ_DPRINTK(TX4927_IRQ_EROR,
- "bad irq=%d \n", irq);
- panic("\n");
- }
- }
-#endif
-
spin_lock_irqsave(&tx4927_cp0_lock, flags);
tx4927_irq_cp0_modify(CCP0_STATUS, 0, tx4927_irq_cp0_mask(irq));
TX4927_IRQ_DPRINTK(TX4927_IRQ_CP0_DISABLE, "irq=%d \n", irq);
-#ifdef TX4927_IRQ_CHECK_CP0
- {
- if (irq < TX4927_IRQ_CP0_BEG || irq > TX4927_IRQ_CP0_END) {
- TX4927_IRQ_DPRINTK(TX4927_IRQ_EROR,
- "bad irq=%d \n", irq);
- panic("\n");
- }
- }
-#endif
-
spin_lock_irqsave(&tx4927_cp0_lock, flags);
tx4927_irq_cp0_modify(CCP0_STATUS, tx4927_irq_cp0_mask(irq), 0);
{
TX4927_IRQ_DPRINTK(TX4927_IRQ_CP0_MASK, "irq=%d \n", irq);
-#ifdef TX4927_IRQ_CHECK_CP0
- {
- if (irq < TX4927_IRQ_CP0_BEG || irq > TX4927_IRQ_CP0_END) {
- TX4927_IRQ_DPRINTK(TX4927_IRQ_EROR,
- "bad irq=%d \n", irq);
- panic("\n");
- }
- }
-#endif
-
tx4927_irq_cp0_disable(irq);
return;
{
TX4927_IRQ_DPRINTK(TX4927_IRQ_CP0_ENDIRQ, "irq=%d \n", irq);
-#ifdef TX4927_IRQ_CHECK_CP0
- {
- if (irq < TX4927_IRQ_CP0_BEG || irq > TX4927_IRQ_CP0_END) {
- TX4927_IRQ_DPRINTK(TX4927_IRQ_EROR,
- "bad irq=%d \n", irq);
- panic("\n");
- }
- }
-#endif
-
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
tx4927_irq_cp0_enable(irq);
}
{
TX4927_IRQ_DPRINTK(TX4927_IRQ_PIC_STARTUP, "irq=%d\n", irq);
-#ifdef TX4927_IRQ_CHECK_PIC
- {
- if (irq < TX4927_IRQ_PIC_BEG || irq > TX4927_IRQ_PIC_END) {
- TX4927_IRQ_DPRINTK(TX4927_IRQ_EROR,
- "bad irq=%d \n", irq);
- panic("\n");
- }
- }
-#endif
-
tx4927_irq_pic_enable(irq);
return (0);
{
TX4927_IRQ_DPRINTK(TX4927_IRQ_PIC_SHUTDOWN, "irq=%d\n", irq);
-#ifdef TX4927_IRQ_CHECK_PIC
- {
- if (irq < TX4927_IRQ_PIC_BEG || irq > TX4927_IRQ_PIC_END) {
- TX4927_IRQ_DPRINTK(TX4927_IRQ_EROR,
- "bad irq=%d \n", irq);
- panic("\n");
- }
- }
-#endif
-
tx4927_irq_pic_disable(irq);
return;
TX4927_IRQ_DPRINTK(TX4927_IRQ_PIC_ENABLE, "irq=%d\n", irq);
-#ifdef TX4927_IRQ_CHECK_PIC
- {
- if (irq < TX4927_IRQ_PIC_BEG || irq > TX4927_IRQ_PIC_END) {
- TX4927_IRQ_DPRINTK(TX4927_IRQ_EROR,
- "bad irq=%d \n", irq);
- panic("\n");
- }
- }
-#endif
-
spin_lock_irqsave(&tx4927_pic_lock, flags);
tx4927_irq_pic_modify(tx4927_irq_pic_addr(irq), 0,
TX4927_IRQ_DPRINTK(TX4927_IRQ_PIC_DISABLE, "irq=%d\n", irq);
-#ifdef TX4927_IRQ_CHECK_PIC
- {
- if (irq < TX4927_IRQ_PIC_BEG || irq > TX4927_IRQ_PIC_END) {
- TX4927_IRQ_DPRINTK(TX4927_IRQ_EROR,
- "bad irq=%d \n", irq);
- panic("\n");
- }
- }
-#endif
-
spin_lock_irqsave(&tx4927_pic_lock, flags);
tx4927_irq_pic_modify(tx4927_irq_pic_addr(irq),
{
TX4927_IRQ_DPRINTK(TX4927_IRQ_PIC_MASK, "irq=%d\n", irq);
-#ifdef TX4927_IRQ_CHECK_PIC
- {
- if (irq < TX4927_IRQ_PIC_BEG || irq > TX4927_IRQ_PIC_END) {
- TX4927_IRQ_DPRINTK(TX4927_IRQ_EROR,
- "bad irq=%d \n", irq);
- panic("\n");
- }
- }
-#endif
-
tx4927_irq_pic_disable(irq);
return;
{
TX4927_IRQ_DPRINTK(TX4927_IRQ_PIC_ENDIRQ, "irq=%d\n", irq);
-#ifdef TX4927_IRQ_CHECK_PIC
- {
- if (irq < TX4927_IRQ_PIC_BEG || irq > TX4927_IRQ_PIC_END) {
- TX4927_IRQ_DPRINTK(TX4927_IRQ_EROR,
- "bad irq=%d \n", irq);
- panic("\n");
- }
- }
-#endif
-
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
tx4927_irq_pic_enable(irq);
}
*/
void __init tx4927_irq_init(void)
{
- extern asmlinkage void tx4927_irq_handler(void);
-
TX4927_IRQ_DPRINTK(TX4927_IRQ_INIT, "-\n");
TX4927_IRQ_DPRINTK(TX4927_IRQ_INIT, "=Calling tx4927_irq_cp0_init()\n");
TX4927_IRQ_DPRINTK(TX4927_IRQ_INIT, "=Calling tx4927_irq_pic_init()\n");
tx4927_irq_pic_init();
- TX4927_IRQ_DPRINTK(TX4927_IRQ_INIT,
- "=Calling set_except_vector(tx4927_irq_handler)\n");
- set_except_vector(0, tx4927_irq_handler);
-
TX4927_IRQ_DPRINTK(TX4927_IRQ_INIT, "+\n");
return;
}
-int tx4927_irq_nested(void)
+static int tx4927_irq_nested(void)
{
int sw_irq = 0;
u32 level2;
return (sw_irq);
}
+
+asmlinkage void plat_irq_dispatch(struct pt_regs *regs)
+{
+ unsigned int pending = read_c0_status() & read_c0_cause();
+
+ if (pending & STATUSF_IP7) /* cpu timer */
+ do_IRQ(TX4927_IRQ_CPU_TIMER, regs);
+ else if (pending & STATUSF_IP2) { /* tx4927 pic */
+ unsigned int irq = tx4927_irq_nested();
+
+ if (unlikely(irq == 0)) {
+ spurious_interrupt(regs);
+ return;
+ }
+ do_IRQ(irq, regs);
+ } else if (pending & STATUSF_IP0) /* user line 0 */
+ do_IRQ(TX4927_IRQ_USER0, regs);
+ else if (pending & STATUSF_IP1) /* user line 1 */
+ do_IRQ(TX4927_IRQ_USER1, regs);
+ else
+ spurious_interrupt(regs);
+}