On 9/11/07, S. Fricke <[EMAIL PROTECTED]> wrote: > > Dear Linux-enthusiasts, > > I'm still at the same problem. > > I have now implemented a irq_chip for the hardwired IRQ2. Now I have: > > > --==> > volatile static struct mpc52xx_intr __iomem *intr; > unsigned long flags; > static DEFINE_SPINLOCK(my_irq_controller_lock); > > /* > * HELPER-Function > */ > static inline void io_be_setbit(u32 __iomem *addr, int bitno) > { > out_be32(addr, in_be32(addr) | (1 << bitno)); > } > > static inline void io_be_clrbit(u32 __iomem *addr, int bitno) > { > out_be32(addr, in_be32(addr) & ~(1 << bitno)); > } > > /* > * IRQ-Zeugs > */ > static void my_irq_ack(unsigned int irq) > { > printk("%s(%s/%d):\n", __FILE__, __FUNCTION__, __LINE__); > spin_lock_irqsave(&my_irq_controller_lock, flags); > if(intr) > io_be_setbit(&intr->ctrl, 25); > spin_unlock_irqrestore(&my_irq_controller_lock, flags); > printk("%s(%s/%d):\n", __FILE__, __FUNCTION__, __LINE__); > } > > /* irq - disabled */ > static void my_irq_mask(unsigned int irq) > { > printk("%s(%s/%d):\n", __FILE__, __FUNCTION__, __LINE__); > spin_lock_irqsave(&my_irq_controller_lock, flags); > if(intr) > io_be_clrbit(&intr->ctrl, 9); > spin_unlock_irqrestore(&my_irq_controller_lock, flags); > printk("%s(%s/%d):\n", __FILE__, __FUNCTION__, __LINE__); > } > > /* irq - enable */ > static void my_irq_unmask(unsigned int irq) > { > printk("%s(%s/%d):\n", __FILE__, __FUNCTION__, __LINE__); > spin_lock_irqsave(&my_irq_controller_lock, flags); > if(intr) > io_be_setbit(&intr->ctrl, 9); > spin_unlock_irqrestore(&my_irq_controller_lock, flags); > printk("%s(%s/%d):\n", __FILE__, __FUNCTION__, __LINE__); > } > > static struct irq_chip my_irq_chip = { > .typename = "MY_IRQ_TEST", > .ack = my_irq_ack, > .mask = my_irq_mask, > .unmask = my_irq_unmask, > }; > > static int __init mod_init( void ) > { > // ... > > intr = mpc52xx_find_and_map("mpc52xx-pic"); > if(!intr) { > panic(__FILE__ ": mpc52xx-pic - MAP failed"); > } > > set_irq_chip(MPC52xx_IRQ2, &my_irq_chip);
You probably don't want to do this (unless you are cascading IRQs to custom external hardware). All you should need is the call to request_irq() to register your irq handler, and code in your ISR handler to clear the interrupt condition. You do *NOT* want to program the interrupt controller directly. The mpc5200 interrupt controller already has a driver. Don't go twiddling the registers manually. Cheers, g. -- Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd. [EMAIL PROTECTED] (403) 399-0195 _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@ozlabs.org https://ozlabs.org/mailman/listinfo/linuxppc-dev