[RFC PATCH 11/19] powerpc: gamecube/wii: flipper interrupt controller support

Segher Boessenkool segher at kernel.crashing.org
Wed Nov 25 08:30:22 EST 2009


>  config GAMECUBE_COMMON
>  	bool
>  	select NOT_COHERENT_CACHE
> +	select FLIPPER_PIC

Maybe using FLIPPER (or GAMECUBE_FLIPPER) instead of GAMECUBE_COMMON
is a good name?

> +#define pr_fmt(fmt) DRV_MODULE_NAME ": " fmt

Unused

> +/*
> + * Each interrupt has a corresponding bit in both
> + * the Interrupt Cause (ICR) and Interrupt Mask (IMR) registers.
> + *
> + * Enabling/disabling an interrupt line involves asserting/clearing
> + * the corresponding bit in IMR. ACK'ing a request simply involves
> + * asserting the corresponding bit in ICR.
> + */

> +static void flipper_pic_ack(unsigned int virq)
> +{
> +	int irq = virq_to_hw(virq);
> +	void __iomem *io_base = get_irq_chip_data(virq);
> +
> +	set_bit(irq, io_base + FLIPPER_ICR);
> +}

So it should be a simple write instead of an RMW here, right?
As it is you are ACKing _all_ IRQs as far as I can see.

> +unsigned int flipper_pic_get_irq(void)
> +{
> +	void __iomem *io_base = flipper_irq_host->host_data;
> +	int irq;
> +	u32 irq_status;
> +
> +	irq_status = in_be32(io_base + FLIPPER_ICR) &
> +		     in_be32(io_base + FLIPPER_IMR);
> +	if (irq_status == 0)
> +		return -1;	/* no more IRQs pending */
> +
> +	__asm__ __volatile__("cntlzw %0,%1" : "=r"(irq) : "r"(irq_status));
> +	return irq_linear_revmap(flipper_irq_host, 31 - irq);
> +}

There are generic macros for this kind of thing, no need for asm.  ffs()
or something.


Segher



More information about the Linuxppc-dev mailing list