[PATCH 1/1] at91: add irq fixup

Sascha Hauer s.hauer at pengutronix.de
Wed Sep 18 02:43:28 EDT 2013


On Tue, Sep 17, 2013 at 07:14:04AM +0200, Jean-Christophe PLAGNIOL-VILLARD wrote:
> Some of the irq can still be on after a reset or power on as the IP are
> powered by the backup power. This could lead to an interrupt dead lock
> when the kernel boot. So disable them before booting.
> 
> Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> Cc: Nicolas Ferre <nicolas.ferre at atmel.com>

Applied, thanks

Sascha

> ---
>  arch/arm/mach-at91/Makefile                |  2 +-
>  arch/arm/mach-at91/at91sam9260_devices.c   |  8 +++++++
>  arch/arm/mach-at91/at91sam9261_devices.c   |  8 +++++++
>  arch/arm/mach-at91/at91sam9263_devices.c   |  8 +++++++
>  arch/arm/mach-at91/at91sam9g45_devices.c   |  7 ++++++
>  arch/arm/mach-at91/generic.h               |  2 ++
>  arch/arm/mach-at91/include/mach/at91_rtt.h | 35 ++++++++++++++++++++++++++++++
>  arch/arm/mach-at91/irq_fixup.c             | 22 +++++++++++++++++++
>  8 files changed, 91 insertions(+), 1 deletion(-)
>  create mode 100644 arch/arm/mach-at91/include/mach/at91_rtt.h
>  create mode 100644 arch/arm/mach-at91/irq_fixup.c
> 
> diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
> index f098e0e..ab80e5f 100644
> --- a/arch/arm/mach-at91/Makefile
> +++ b/arch/arm/mach-at91/Makefile
> @@ -1,4 +1,4 @@
> -obj-y += setup.o clock.o gpio.o
> +obj-y += setup.o clock.o gpio.o irq_fixup.o
>  obj-$(CONFIG_CMD_AT91_BOOT_TEST) += boot_test_cmd.o
>  
>  obj-$(CONFIG_AT91_BOOTSTRAP) += bootstrap.o
> diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
> index 84a0329..bf2b5b7 100644
> --- a/arch/arm/mach-at91/at91sam9260_devices.c
> +++ b/arch/arm/mach-at91/at91sam9260_devices.c
> @@ -10,6 +10,7 @@
>   *
>   */
>  #include <common.h>
> +#include <init.h>
>  #include <sizes.h>
>  #include <gpio.h>
>  #include <asm/armlinux.h>
> @@ -398,3 +399,10 @@ void at91_add_device_mci(short mmc_id, struct atmel_mci_platform_data *data)
>  #else
>  void at91_add_device_mci(short mmc_id, struct atmel_mci_platform_data *data) {}
>  #endif
> +
> +static int at91_fixup_device(void)
> +{
> +	at91_rtt_irq_fixup(IOMEM(AT91SAM9260_BASE_RTT));
> +	return 0;
> +}
> +late_initcall(at91_fixup_device);
> diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c
> index b522afb..9ac9f20 100644
> --- a/arch/arm/mach-at91/at91sam9261_devices.c
> +++ b/arch/arm/mach-at91/at91sam9261_devices.c
> @@ -10,6 +10,7 @@
>   *
>   */
>  #include <common.h>
> +#include <init.h>
>  #include <sizes.h>
>  #include <gpio.h>
>  #include <asm/armlinux.h>
> @@ -351,3 +352,10 @@ void at91_add_device_mci(short mmc_id, struct atmel_mci_platform_data *data)
>  #else
>  void at91_add_device_mci(short mmc_id, struct atmel_mci_platform_data *data) {}
>  #endif
> +
> +static int at91_fixup_device(void)
> +{
> +	at91_rtt_irq_fixup(IOMEM(AT91SAM9261_BASE_RTT));
> +	return 0;
> +}
> +late_initcall(at91_fixup_device);
> diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c
> index 9d8bc32..6860ad0 100644
> --- a/arch/arm/mach-at91/at91sam9263_devices.c
> +++ b/arch/arm/mach-at91/at91sam9263_devices.c
> @@ -10,6 +10,7 @@
>   *
>   */
>  #include <common.h>
> +#include <init.h>
>  #include <sizes.h>
>  #include <gpio.h>
>  #include <asm/armlinux.h>
> @@ -426,3 +427,10 @@ void at91_add_device_mci(short mmc_id, struct atmel_mci_platform_data *data)
>  void at91_add_device_mci(short mmc_id, struct atmel_mci_platform_data *data) {}
>  #endif
>  
> +static int at91_fixup_device(void)
> +{
> +	at91_rtt_irq_fixup(IOMEM(AT91SAM9263_BASE_RTT0));
> +	at91_rtt_irq_fixup(IOMEM(AT91SAM9263_BASE_RTT1));
> +	return 0;
> +}
> +late_initcall(at91_fixup_device);
> diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
> index 3e0bc10..bd7ab93 100644
> --- a/arch/arm/mach-at91/at91sam9g45_devices.c
> +++ b/arch/arm/mach-at91/at91sam9g45_devices.c
> @@ -10,6 +10,7 @@
>   *
>   */
>  #include <common.h>
> +#include <init.h>
>  #include <sizes.h>
>  #include <gpio.h>
>  #include <asm/armlinux.h>
> @@ -451,3 +452,9 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_platform_data *data)
>  void __init at91_add_device_lcdc(struct atmel_lcdfb_platform_data *data) {}
>  #endif
>  
> +static int at91_fixup_device(void)
> +{
> +	at91_rtt_irq_fixup(IOMEM(AT91SAM9G45_BASE_RTT));
> +	return 0;
> +}
> +late_initcall(at91_fixup_device);
> diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h
> index deba019..a47bcb2 100644
> --- a/arch/arm/mach-at91/generic.h
> +++ b/arch/arm/mach-at91/generic.h
> @@ -35,3 +35,5 @@ static inline struct device_d *at91_add_sam9_smc(int id, resource_size_t start,
>  	return add_generic_device("at91sam9-smc", id, NULL, start, size,
>  				  IORESOURCE_MEM, NULL);
>  }
> +
> +void at91_rtt_irq_fixup(void *base);
> diff --git a/arch/arm/mach-at91/include/mach/at91_rtt.h b/arch/arm/mach-at91/include/mach/at91_rtt.h
> new file mode 100644
> index 0000000..7ec75de
> --- /dev/null
> +++ b/arch/arm/mach-at91/include/mach/at91_rtt.h
> @@ -0,0 +1,35 @@
> +/*
> + * arch/arm/mach-at91/include/mach/at91_rtt.h
> + *
> + * Copyright (C) 2007 Andrew Victor
> + * Copyright (C) 2007 Atmel Corporation.
> + *
> + * Real-time Timer (RTT) - System peripherals regsters.
> + * Based on AT91SAM9261 datasheet revision D.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + */
> +
> +#ifndef AT91_RTT_H
> +#define AT91_RTT_H
> +
> +#define AT91_RTT_MR		0x00			/* Real-time Mode Register */
> +#define		AT91_RTT_RTPRES		(0xffff << 0)		/* Real-time Timer Prescaler Value */
> +#define		AT91_RTT_ALMIEN		(1 << 16)		/* Alarm Interrupt Enable */
> +#define		AT91_RTT_RTTINCIEN	(1 << 17)		/* Real Time Timer Increment Interrupt Enable */
> +#define		AT91_RTT_RTTRST		(1 << 18)		/* Real Time Timer Restart */
> +
> +#define AT91_RTT_AR		0x04			/* Real-time Alarm Register */
> +#define		AT91_RTT_ALMV		(0xffffffff)		/* Alarm Value */
> +
> +#define AT91_RTT_VR		0x08			/* Real-time Value Register */
> +#define		AT91_RTT_CRTV		(0xffffffff)		/* Current Real-time Value */
> +
> +#define AT91_RTT_SR		0x0c			/* Real-time Status Register */
> +#define		AT91_RTT_ALMS		(1 << 0)		/* Real-time Alarm Status */
> +#define		AT91_RTT_RTTINC		(1 << 1)		/* Real-time Timer Increment */
> +
> +#endif
> diff --git a/arch/arm/mach-at91/irq_fixup.c b/arch/arm/mach-at91/irq_fixup.c
> new file mode 100644
> index 0000000..a9eebd7
> --- /dev/null
> +++ b/arch/arm/mach-at91/irq_fixup.c
> @@ -0,0 +1,22 @@
> +/*
> + * Copyright (C) 2013 Jean-Christophe PLAGNIOL-VILLARD <plagnioj at jcrosoft.com>
> + *
> + * Under GPLv2 only
> + */
> +
> +#include <io.h>
> +#include <mach/at91_rtt.h>
> +
> +/*
> + * As the RTT is powered by the backup power so if the interrupt
> + * is still on when the kernel start, the kernel will end up with
> + * dead lock interrupt that it can not clear. Because the interrupt line is
> + * shared with the basic timer (PIT) on AT91_ID_SYS.
> + */
> +void at91_rtt_irq_fixup(void *base)
> +{
> +	void *reg = base + AT91_RTT_MR;
> +	u32 mr = readl(reg);
> +
> +	writel(mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN), reg);
> +}
> -- 
> 1.8.4.rc1
> 
> 
> _______________________________________________
> barebox mailing list
> barebox at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
> 

-- 
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 barebox mailing list