[PATCH] mx51: add support for FIQ on TZIC

Sascha Hauer s.hauer at pengutronix.de
Mon Dec 6 02:43:59 EST 2010


On Fri, Dec 03, 2010 at 04:16:26PM +0000, Peter Horton wrote:
> Add support for FIQ on mx51 TZIC
> 
> TZIC changes tested with FIQ audio on an mx51 board
> 
> AVIC changes build with mx3_defconfig, not tested
> 
> Signed-off-by: Peter Horton <phorton at bitbox.co.uk>
> 
> ---
> 
> Patch is against Sascha's "for-next" tree
> 
>  arch/arm/plat-mxc/Makefile                   |    2 +-
>  arch/arm/plat-mxc/avic.c                     |   32 ++++++++------
>  arch/arm/plat-mxc/include/mach/entry-macro.S |   11 +++++
>  arch/arm/plat-mxc/irq-common.c               |   60 ++++++++++++++++++++++++++
>  arch/arm/plat-mxc/irq-common.h               |   29 ++++++++++++
>  arch/arm/plat-mxc/tzic.c                     |   46 +++++++++++++++++---
>  6 files changed, 159 insertions(+), 21 deletions(-)
>  create mode 100644 arch/arm/plat-mxc/irq-common.c
>  create mode 100644 arch/arm/plat-mxc/irq-common.h
> 
> diff --git a/arch/arm/plat-mxc/Makefile b/arch/arm/plat-mxc/Makefile
> index 6aee27e..2f1b990 100644
> --- a/arch/arm/plat-mxc/Makefile
> +++ b/arch/arm/plat-mxc/Makefile
> @@ -3,7 +3,7 @@
>  #
>  
>  # Common support
> -obj-y := clock.o gpio.o time.o devices.o cpu.o system.o
> +obj-y := clock.o gpio.o time.o devices.o cpu.o system.o irq-common.o
>  
>  # MX51 uses the TZIC interrupt controller, older platforms use AVIC
>  obj-$(CONFIG_MXC_TZIC) += tzic.o
> diff --git a/arch/arm/plat-mxc/avic.c b/arch/arm/plat-mxc/avic.c
> index 7331f2a..9a4e8a2 100644
> --- a/arch/arm/plat-mxc/avic.c
> +++ b/arch/arm/plat-mxc/avic.c
> @@ -24,6 +24,8 @@
>  #include <asm/mach/irq.h>
>  #include <mach/hardware.h>
>  
> +#include "irq-common.h"
> +
>  #define AVIC_INTCNTL		0x00	/* int control reg */
>  #define AVIC_NIMASK		0x04	/* int mask reg */
>  #define AVIC_INTENNUM		0x08	/* int enable number reg */
> @@ -46,9 +48,9 @@
>  
>  void __iomem *avic_base;
>  
> -int imx_irq_set_priority(unsigned char irq, unsigned char prio)
> -{
>  #ifdef CONFIG_MXC_IRQ_PRIOR
> +static int avic_irq_set_priority(unsigned char irq, unsigned char prio)
> +{
>  	unsigned int temp;
>  	unsigned int mask = 0x0F << irq % 8 * 4;
>  
> @@ -62,14 +64,11 @@ int imx_irq_set_priority(unsigned char irq, unsigned char prio)
>  	__raw_writel(temp, avic_base + AVIC_NIPRIORITY(irq / 8));
>  
>  	return 0;
> -#else
> -	return -ENOSYS;
> -#endif
>  }
> -EXPORT_SYMBOL(imx_irq_set_priority);
> +#endif
>  
>  #ifdef CONFIG_FIQ
> -int mxc_set_irq_fiq(unsigned int irq, unsigned int type)
> +static int avic_set_irq_fiq(unsigned int irq, unsigned int type)
>  {
>  	unsigned int irqt;
>  
> @@ -87,7 +86,6 @@ int mxc_set_irq_fiq(unsigned int irq, unsigned int type)
>  
>  	return 0;
>  }
> -EXPORT_SYMBOL(mxc_set_irq_fiq);
>  #endif /* CONFIG_FIQ */
>  
>  /* Disable interrupt number "irq" in the AVIC */
> @@ -102,10 +100,18 @@ static void mxc_unmask_irq(unsigned int irq)
>  	__raw_writel(irq, avic_base + AVIC_INTENNUM);
>  }
>  
> -static struct irq_chip mxc_avic_chip = {
> -	.ack = mxc_mask_irq,
> -	.mask = mxc_mask_irq,
> -	.unmask = mxc_unmask_irq,
> +static struct mxc_irq_chip mxc_avic_chip = {
> +	.base = {
> +		.ack = mxc_mask_irq,
> +		.mask = mxc_mask_irq,
> +		.unmask = mxc_unmask_irq,
> +	},
> +#ifdef CONFIG_MXC_IRQ_PRIOR
> +	.set_priority = avic_irq_set_priority,
> +#endif
> +#ifdef CONFIG_FIQ
> +	.set_irq_fiq = avic_set_irq_fiq,
> +#endif
>  };
>  
>  /*
> @@ -133,7 +139,7 @@ void __init mxc_init_irq(void __iomem *irqbase)
>  	__raw_writel(0, avic_base + AVIC_INTTYPEH);
>  	__raw_writel(0, avic_base + AVIC_INTTYPEL);
>  	for (i = 0; i < MXC_INTERNAL_IRQS; i++) {
> -		set_irq_chip(i, &mxc_avic_chip);
> +		set_irq_chip(i, &mxc_avic_chip.base);
>  		set_irq_handler(i, handle_level_irq);
>  		set_irq_flags(i, IRQF_VALID);
>  	}
> diff --git a/arch/arm/plat-mxc/include/mach/entry-macro.S b/arch/arm/plat-mxc/include/mach/entry-macro.S
> index aeb0869..c7dd4a9 100644
> --- a/arch/arm/plat-mxc/include/mach/entry-macro.S
> +++ b/arch/arm/plat-mxc/include/mach/entry-macro.S
> @@ -54,8 +54,18 @@
>  #elif defined CONFIG_MXC_TZIC
>  	@ Load offset & priority of the highest priority
>  	@ interrupt pending.
> +	@ 0x080 is INTSEC0 register
>  	@ 0xD80 is HIPND0 register
>  	mov     \irqnr, #0
> +#ifdef CONFIG_FIQ
> +1000:
> +	add	\irqstat, \base, \irqnr, lsr #3
> +	ldr	\tmp, [\irqstat, #0xd80]
> +	ldr	\irqstat, [\irqstat, #0x080]
> +	ands	\tmp, \tmp, \irqstat
> +	bne	1001f
> +	add	\irqnr, \irqnr, #32
> +#else
>  	mov     \irqstat, #0x0D80
>  1000:
>  	ldr     \tmp,   [\irqstat, \base]
> @@ -63,6 +73,7 @@
>  	bne     1001f
>  	addeq   \irqnr, \irqnr, #32
>  	addeq   \irqstat, \irqstat, #4
> +#endif

Can't we skip the #ifdef? The CONFIG_FIQ path should also work without FIQs
enabled, right?

>  	cmp     \irqnr, #128
>  	blo     1000b
>  	b       2001f

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



More information about the linux-arm-kernel mailing list