request_irq in I2C driver causes kernel to freeze during probe, but if done later - no problem!

Russell King - ARM Linux linux at arm.linux.org.uk
Sat Mar 27 05:17:37 EDT 2010


On Sat, Mar 27, 2010 at 01:22:54AM +0100, Ulf Samuelsson wrote:
> This is my interrupt routine, which always return IRQ_HANDLED.
> sysfs shows that "mxt->invalid_irq_counter" is never incremented
> even after I successfully enable the interrupt in sysfs.
> 
> mxt->dwork will always access the I2C bus but we dont see that.
> 
> static irqreturn_t mxt_irq_handler(int irq, void *_mxt)
> {
> 	struct	mxt_data *mxt = _mxt;
> 	unsigned long	flags;
> 	mxt->irq_counter++;
> 	spin_lock_irqsave(&mxt->lock, flags);
> 
> 	if (mxt_valid_interrupt()) {
> 		/* Macro, always returning 1  on these boards */
> 		cancel_delayed_work(&mxt->dwork);
> 		schedule_delayed_work(&mxt->dwork, 0);
> 		mxt->valid_irq_counter++;
> 	} else {
> 		mxt->invalid_irq_counter++;

The other thing is that in this case you should ultimately return
IRQ_NONE from this handler.



More information about the linux-arm-kernel mailing list