>  static void ipic_ack_irq(unsigned int virq)
>  {
> -     struct ipic *ipic = ipic_from_irq(virq);
>       unsigned int src = ipic_irq_to_hw(virq);
> -     unsigned long flags;
> -     u32 temp;
>  
> -     spin_lock_irqsave(&ipic_lock, flags);
> +     /* Only external interrupts in edge mode support ACK */
> +     if (unlikely(ipic_info[src].ack &&
> +                     ((get_irq_desc(virq)->status & IRQ_TYPE_SENSE_MASK) ==
> +                     IRQ_TYPE_EDGE_FALLING))) {
> +             struct ipic *ipic = ipic_from_irq(virq);
> +             unsigned long flags;
> +             u32 temp;
>  
> -     temp = ipic_read(ipic->regs, ipic_info[src].pend);
> -     temp |= (1 << (31 - ipic_info[src].bit));
> -     ipic_write(ipic->regs, ipic_info[src].pend, temp);
> +             spin_lock_irqsave(&ipic_lock, flags);
>  
> -     spin_unlock_irqrestore(&ipic_lock, flags);
> +             temp = ipic_read(ipic->regs, ipic_info[src].ack);
> +             temp |= (1 << (31 - ipic_info[src].bit));
> +             ipic_write(ipic->regs, ipic_info[src].ack, temp);
> +
> +             spin_unlock_irqrestore(&ipic_lock, flags);
> +     }
>  }

That doesn't look right... 

That should be handled by the higher level flow handler. The generic
edge one calls ack and the level one mask_and_ack. Just make them do the
right thing, no need to test for the flow type in the low level
function.

Ben.


_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to