Re: [PATCH v2 1/2] irqchip: sun4i: Use handle_fasteoi_irq for all interrupts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Sat, Mar 15, 2014 at 04:04:53PM +0100, Hans de Goede wrote:
> Since the sun4i irq chip does not require any action and clears the interrupt
> when the level goes back to inactive, we don't need to mask / unmask for
> non oneshot IRQs, to achieve this we make sun4i_irq_ack a nop for all irqs
> except irq 0 and use handle_fasteoi_irq for all interrupts.
> 
> Now there might be a case when the device reactivates the interrupt
> before the RETI. But that does not matter as we run the primary
> interrupt handlers with interrupts disabled.
> 
> This also allows us to get rid of needing to use 2 irq_chip structs, this
> means that the IRQCHIP_EOI_THREADED | IRQCHIP_EOI_IF_HANDLED will now influence
> all interrupts rather then just irq 0, but that does not matter as the eoi
> is now a nop anyways for all interrupts but irq 0.
> 
> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
> ---
>  drivers/irqchip/irq-sun4i.c | 18 ++++--------------
>  1 file changed, 4 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/irqchip/irq-sun4i.c b/drivers/irqchip/irq-sun4i.c
> index a0ed1ea..6a8c88d 100644
> --- a/drivers/irqchip/irq-sun4i.c
> +++ b/drivers/irqchip/irq-sun4i.c
> @@ -45,6 +45,9 @@ static void sun4i_irq_ack(struct irq_data *irqd)
>  	int reg = irq / 32;
>  	u32 val;
>  
> +	if (irq != 0)
> +		return; /* Only IRQ 0 / the ENMI needs to be acked */
> +
>  	val = readl(sun4i_irq_base + SUN4I_IRQ_PENDING_REG(reg));
>  	writel(val | (1 << irq_off),
>  	       sun4i_irq_base + SUN4I_IRQ_PENDING_REG(reg));
> @@ -76,13 +79,6 @@ static void sun4i_irq_unmask(struct irq_data *irqd)
>  
>  static struct irq_chip sun4i_irq_chip = {
>  	.name		= "sun4i_irq",
> -	.irq_mask	= sun4i_irq_mask,
> -	.irq_unmask	= sun4i_irq_unmask,
> -};
> -
> -/* IRQ 0 / the ENMI needs a late eoi call */
> -static struct irq_chip sun4i_irq_chip_enmi = {
> -	.name		= "sun4i_irq",
>  	.irq_eoi	= sun4i_irq_ack,
>  	.irq_mask	= sun4i_irq_mask,
>  	.irq_unmask	= sun4i_irq_unmask,
> @@ -92,13 +88,7 @@ static struct irq_chip sun4i_irq_chip_enmi = {
>  static int sun4i_irq_map(struct irq_domain *d, unsigned int virq,
>  			 irq_hw_number_t hw)
>  {
> -	if (hw == 0)
> -		irq_set_chip_and_handler(virq, &sun4i_irq_chip_enmi,
> -					 handle_fasteoi_irq);
> -	else
> -		irq_set_chip_and_handler(virq, &sun4i_irq_chip,
> -					 handle_level_irq);
> -
> +	irq_set_chip_and_handler(virq, &sun4i_irq_chip, handle_fasteoi_irq);
>  	set_irq_flags(virq, IRQF_VALID | IRQF_PROBE);

Oh.. And you just did. Nevermind then.

Acked-by: Maxime Ripard <maxime.ripard@xxxxxxxxxxxxxxxxxx>

-- 
Maxime Ripard, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

Attachment: signature.asc
Description: Digital signature


[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]
  Powered by Linux