All of lore.kernel.org
 help / color / mirror / Atom feed
From: nicolas.ferre@atmel.com (Nicolas Ferre)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 1/3] ARM: at91: fix hanged boot due to early rtc-interrupt
Date: Fri, 15 Nov 2013 12:09:45 +0100	[thread overview]
Message-ID: <528600F9.4040701@atmel.com> (raw)
In-Reply-To: <1381917376-21107-2-git-send-email-jhovold@gmail.com>

On 16/10/2013 11:56, Johan Hovold :
> Make sure the RTC-interrupts are masked at boot by adding a new helper
> function to be used at SOC-init.
>
> This fixes hanged boot on all AT91 SOCs with an RTC (but RM9200), for
> example, after a reset during an RTC-update or if an RTC-alarm goes off
> after shutdown (e.g. when using RTC wakeup).
>
> The RTC and RTT-peripherals are powered by backup power (VDDBU) (on all
> AT91 SOCs but RM9200) and are not reset on wake-up, user, watchdog or
> software reset. This means that their interrupts may be enabled during
> early boot if, for example, they where not disabled during a previous
> shutdown (e.g. due to a buggy driver or a non-clean shutdown such as a
> user reset). Furthermore, an RTC or RTT-alarm may also be active.
>
> The RTC and RTT-interrupts use the shared system-interrupt line, which
> is also used by the PIT, and if an interrupt occurs before a handler
> (e.g. RTC-driver) has been installed this leads to the system interrupt
> being disabled and prevents the system from booting.
>
> Note that when boot hangs due to an early RTC or RTT-interrupt, the only
> way to get the system to start again is to remove the backup power (e.g.
> battery) or to disable the interrupt manually from the bootloader. In
> particular, a user reset is not sufficient.
>
> Signed-off-by: Johan Hovold <jhovold@gmail.com>

Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>

and added to the at91-3.13-fixes-non-critical branch with the "stable" tag:
Cc: stable at vger.kernel.org # 3.11.x

Thanks a lot Johan.

> ---
>   arch/arm/mach-at91/Makefile                   |  2 +-
>   arch/arm/mach-at91/at91sam9g45.c              |  2 ++
>   arch/arm/mach-at91/at91sam9n12.c              |  6 ++++
>   arch/arm/mach-at91/at91sam9rl.c               |  2 ++
>   arch/arm/mach-at91/at91sam9x5.c               |  6 ++++
>   arch/arm/mach-at91/generic.h                  |  1 +
>   arch/arm/mach-at91/include/mach/at91sam9n12.h |  5 +++
>   arch/arm/mach-at91/include/mach/at91sam9x5.h  |  5 +++
>   arch/arm/mach-at91/include/mach/sama5d3.h     |  5 +++
>   arch/arm/mach-at91/sama5d3.c                  |  6 ++++
>   arch/arm/mach-at91/sysirq_mask.c              | 47 +++++++++++++++++++++++++++
>   11 files changed, 86 insertions(+), 1 deletion(-)
>   create mode 100644 arch/arm/mach-at91/sysirq_mask.c
>
> diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
> index aa33b0f..8879a41 100644
> --- a/arch/arm/mach-at91/Makefile
> +++ b/arch/arm/mach-at91/Makefile
> @@ -2,7 +2,7 @@
>   # Makefile for the linux kernel.
>   #
>
> -obj-y		:= irq.o gpio.o setup.o
> +obj-y		:= irq.o gpio.o setup.o sysirq_mask.o
>   obj-m		:=
>   obj-n		:=
>   obj-		:=
> diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c
> index b9fe138..8d4da6d 100644
> --- a/arch/arm/mach-at91/at91sam9g45.c
> +++ b/arch/arm/mach-at91/at91sam9g45.c
> @@ -379,6 +379,8 @@ static void __init at91sam9g45_initialize(void)
>   	arm_pm_idle = at91sam9_idle;
>   	arm_pm_restart = at91sam9g45_restart;
>
> +	at91_sysirq_mask_rtc(AT91SAM9G45_BASE_RTC);
> +
>   	/* Register GPIO subsystem */
>   	at91_gpio_init(at91sam9g45_gpio, 5);
>   }
> diff --git a/arch/arm/mach-at91/at91sam9n12.c b/arch/arm/mach-at91/at91sam9n12.c
> index c7d670d..4d6001c 100644
> --- a/arch/arm/mach-at91/at91sam9n12.c
> +++ b/arch/arm/mach-at91/at91sam9n12.c
> @@ -223,7 +223,13 @@ static void __init at91sam9n12_map_io(void)
>   	at91_init_sram(0, AT91SAM9N12_SRAM_BASE, AT91SAM9N12_SRAM_SIZE);
>   }
>
> +static void __init at91sam9n12_initialize(void)
> +{
> +	at91_sysirq_mask_rtc(AT91SAM9N12_BASE_RTC);
> +}
> +
>   AT91_SOC_START(at91sam9n12)
>   	.map_io = at91sam9n12_map_io,
>   	.register_clocks = at91sam9n12_register_clocks,
> +	.init = at91sam9n12_initialize,
>   AT91_SOC_END
> diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c
> index d4ec0d9..b5a8c9d 100644
> --- a/arch/arm/mach-at91/at91sam9rl.c
> +++ b/arch/arm/mach-at91/at91sam9rl.c
> @@ -294,6 +294,8 @@ static void __init at91sam9rl_initialize(void)
>   	arm_pm_idle = at91sam9_idle;
>   	arm_pm_restart = at91sam9_alt_restart;
>
> +	at91_sysirq_mask_rtc(AT91SAM9RL_BASE_RTC);
> +
>   	/* Register GPIO subsystem */
>   	at91_gpio_init(at91sam9rl_gpio, 4);
>   }
> diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c
> index 916e5a1..e8a2e07 100644
> --- a/arch/arm/mach-at91/at91sam9x5.c
> +++ b/arch/arm/mach-at91/at91sam9x5.c
> @@ -322,6 +322,11 @@ static void __init at91sam9x5_map_io(void)
>   	at91_init_sram(0, AT91SAM9X5_SRAM_BASE, AT91SAM9X5_SRAM_SIZE);
>   }
>
> +static void __init at91sam9x5_initialize(void)
> +{
> +	at91_sysirq_mask_rtc(AT91SAM9X5_BASE_RTC);
> +}
> +
>   /* --------------------------------------------------------------------
>    *  Interrupt initialization
>    * -------------------------------------------------------------------- */
> @@ -329,4 +334,5 @@ static void __init at91sam9x5_map_io(void)
>   AT91_SOC_START(at91sam9x5)
>   	.map_io = at91sam9x5_map_io,
>   	.register_clocks = at91sam9x5_register_clocks,
> +	.init = at91sam9x5_initialize,
>   AT91_SOC_END
> diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h
> index dc6e2f5..80269bd 100644
> --- a/arch/arm/mach-at91/generic.h
> +++ b/arch/arm/mach-at91/generic.h
> @@ -34,6 +34,7 @@ extern int  __init at91_aic_of_init(struct device_node *node,
>   				    struct device_node *parent);
>   extern int  __init at91_aic5_of_init(struct device_node *node,
>   				    struct device_node *parent);
> +extern void __init at91_sysirq_mask_rtc(u32 rtc_base);
>
>
>    /* Timer */
> diff --git a/arch/arm/mach-at91/include/mach/at91sam9n12.h b/arch/arm/mach-at91/include/mach/at91sam9n12.h
> index d374b87..0151bcf 100644
> --- a/arch/arm/mach-at91/include/mach/at91sam9n12.h
> +++ b/arch/arm/mach-at91/include/mach/at91sam9n12.h
> @@ -49,6 +49,11 @@
>   #define AT91SAM9N12_BASE_USART3	0xf8028000
>
>   /*
> + * System Peripherals
> + */
> +#define AT91SAM9N12_BASE_RTC	0xfffffeb0
> +
> +/*
>    * Internal Memory.
>    */
>   #define AT91SAM9N12_SRAM_BASE	0x00300000	/* Internal SRAM base address */
> diff --git a/arch/arm/mach-at91/include/mach/at91sam9x5.h b/arch/arm/mach-at91/include/mach/at91sam9x5.h
> index c75ee19..2fc76c4 100644
> --- a/arch/arm/mach-at91/include/mach/at91sam9x5.h
> +++ b/arch/arm/mach-at91/include/mach/at91sam9x5.h
> @@ -55,6 +55,11 @@
>   #define AT91SAM9X5_BASE_USART2	0xf8024000
>
>   /*
> + * System Peripherals
> + */
> +#define AT91SAM9X5_BASE_RTC	0xfffffeb0
> +
> +/*
>    * Internal Memory.
>    */
>   #define AT91SAM9X5_SRAM_BASE	0x00300000	/* Internal SRAM base address */
> diff --git a/arch/arm/mach-at91/include/mach/sama5d3.h b/arch/arm/mach-at91/include/mach/sama5d3.h
> index 31096a8..25613d8 100644
> --- a/arch/arm/mach-at91/include/mach/sama5d3.h
> +++ b/arch/arm/mach-at91/include/mach/sama5d3.h
> @@ -73,6 +73,11 @@
>   #define SAMA5D3_BASE_USART3	0xf8024000
>
>   /*
> + * System Peripherals
> + */
> +#define SAMA5D3_BASE_RTC	0xfffffeb0
> +
> +/*
>    * Internal Memory
>    */
>   #define SAMA5D3_SRAM_BASE	0x00300000	/* Internal SRAM base address */
> diff --git a/arch/arm/mach-at91/sama5d3.c b/arch/arm/mach-at91/sama5d3.c
> index 4012797..3ea8642 100644
> --- a/arch/arm/mach-at91/sama5d3.c
> +++ b/arch/arm/mach-at91/sama5d3.c
> @@ -371,7 +371,13 @@ static void __init sama5d3_map_io(void)
>   	at91_init_sram(0, SAMA5D3_SRAM_BASE, SAMA5D3_SRAM_SIZE);
>   }
>
> +static void __init sama5d3_initialize(void)
> +{
> +	at91_sysirq_mask_rtc(SAMA5D3_BASE_RTC);
> +}
> +
>   AT91_SOC_START(sama5d3)
>   	.map_io = sama5d3_map_io,
>   	.register_clocks = sama5d3_register_clocks,
> +	.init = sama5d3_initialize,
>   AT91_SOC_END
> diff --git a/arch/arm/mach-at91/sysirq_mask.c b/arch/arm/mach-at91/sysirq_mask.c
> new file mode 100644
> index 0000000..ee3e22c
> --- /dev/null
> +++ b/arch/arm/mach-at91/sysirq_mask.c
> @@ -0,0 +1,47 @@
> +/*
> + * sysirq_mask.c - System-interrupt masking
> + *
> + * Copyright (C) 2013 Johan Hovold <jhovold@gmail.com>
> + *
> + * Functions to disable system interrupts from backup-powered peripherals.
> + *
> + * The RTC and RTT-peripherals are generally powered by backup power (VDDBU)
> + * and are not reset on wake-up, user, watchdog or software reset. This means
> + * that their interrupts may be enabled during early boot (e.g. after a user
> + * reset).
> + *
> + * As the RTC and RTT share the system-interrupt line with the PIT, an
> + * interrupt occurring before a handler has been installed would lead to the
> + * system interrupt being disabled and prevent the system from booting.
> + *
> + * 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.
> + */
> +
> +#include <linux/io.h>
> +
> +#include "generic.h"
> +
> +#define AT91_RTC_IDR	0x24	/* Interrupt Disable Register */
> +#define AT91_RTC_IMR	0x28	/* Interrupt Mask Register */
> +
> +void __init at91_sysirq_mask_rtc(u32 rtc_base)
> +{
> +	void __iomem *base;
> +	u32 mask;
> +
> +	base = ioremap(rtc_base, 64);
> +	if (!base)
> +		return;
> +
> +	mask = readl_relaxed(base + AT91_RTC_IMR);
> +	if (mask) {
> +		pr_info("AT91: Disabling rtc irq\n");
> +		writel_relaxed(mask, base + AT91_RTC_IDR);
> +		(void)readl_relaxed(base + AT91_RTC_IMR);	/* flush */
> +	}
> +
> +	iounmap(base);
> +}
>


-- 
Nicolas Ferre

WARNING: multiple messages have this Message-ID (diff)
From: Nicolas Ferre <nicolas.ferre@atmel.com>
To: Johan Hovold <jhovold@gmail.com>
Cc: Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>,
	Andrew Victor <linux@maxim.org.za>,
	Alessandro Zummo <a.zummo@towertech.it>,
	<linux-arm-kernel@lists.infradead.org>,
	<linux-kernel@vger.kernel.org>, <rtc-linux@googlegroups.com>
Subject: Re: [PATCH v3 1/3] ARM: at91: fix hanged boot due to early rtc-interrupt
Date: Fri, 15 Nov 2013 12:09:45 +0100	[thread overview]
Message-ID: <528600F9.4040701@atmel.com> (raw)
In-Reply-To: <1381917376-21107-2-git-send-email-jhovold@gmail.com>

On 16/10/2013 11:56, Johan Hovold :
> Make sure the RTC-interrupts are masked at boot by adding a new helper
> function to be used at SOC-init.
>
> This fixes hanged boot on all AT91 SOCs with an RTC (but RM9200), for
> example, after a reset during an RTC-update or if an RTC-alarm goes off
> after shutdown (e.g. when using RTC wakeup).
>
> The RTC and RTT-peripherals are powered by backup power (VDDBU) (on all
> AT91 SOCs but RM9200) and are not reset on wake-up, user, watchdog or
> software reset. This means that their interrupts may be enabled during
> early boot if, for example, they where not disabled during a previous
> shutdown (e.g. due to a buggy driver or a non-clean shutdown such as a
> user reset). Furthermore, an RTC or RTT-alarm may also be active.
>
> The RTC and RTT-interrupts use the shared system-interrupt line, which
> is also used by the PIT, and if an interrupt occurs before a handler
> (e.g. RTC-driver) has been installed this leads to the system interrupt
> being disabled and prevents the system from booting.
>
> Note that when boot hangs due to an early RTC or RTT-interrupt, the only
> way to get the system to start again is to remove the backup power (e.g.
> battery) or to disable the interrupt manually from the bootloader. In
> particular, a user reset is not sufficient.
>
> Signed-off-by: Johan Hovold <jhovold@gmail.com>

Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>

and added to the at91-3.13-fixes-non-critical branch with the "stable" tag:
Cc: stable@vger.kernel.org # 3.11.x

Thanks a lot Johan.

> ---
>   arch/arm/mach-at91/Makefile                   |  2 +-
>   arch/arm/mach-at91/at91sam9g45.c              |  2 ++
>   arch/arm/mach-at91/at91sam9n12.c              |  6 ++++
>   arch/arm/mach-at91/at91sam9rl.c               |  2 ++
>   arch/arm/mach-at91/at91sam9x5.c               |  6 ++++
>   arch/arm/mach-at91/generic.h                  |  1 +
>   arch/arm/mach-at91/include/mach/at91sam9n12.h |  5 +++
>   arch/arm/mach-at91/include/mach/at91sam9x5.h  |  5 +++
>   arch/arm/mach-at91/include/mach/sama5d3.h     |  5 +++
>   arch/arm/mach-at91/sama5d3.c                  |  6 ++++
>   arch/arm/mach-at91/sysirq_mask.c              | 47 +++++++++++++++++++++++++++
>   11 files changed, 86 insertions(+), 1 deletion(-)
>   create mode 100644 arch/arm/mach-at91/sysirq_mask.c
>
> diff --git a/arch/arm/mach-at91/Makefile b/arch/arm/mach-at91/Makefile
> index aa33b0f..8879a41 100644
> --- a/arch/arm/mach-at91/Makefile
> +++ b/arch/arm/mach-at91/Makefile
> @@ -2,7 +2,7 @@
>   # Makefile for the linux kernel.
>   #
>
> -obj-y		:= irq.o gpio.o setup.o
> +obj-y		:= irq.o gpio.o setup.o sysirq_mask.o
>   obj-m		:=
>   obj-n		:=
>   obj-		:=
> diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c
> index b9fe138..8d4da6d 100644
> --- a/arch/arm/mach-at91/at91sam9g45.c
> +++ b/arch/arm/mach-at91/at91sam9g45.c
> @@ -379,6 +379,8 @@ static void __init at91sam9g45_initialize(void)
>   	arm_pm_idle = at91sam9_idle;
>   	arm_pm_restart = at91sam9g45_restart;
>
> +	at91_sysirq_mask_rtc(AT91SAM9G45_BASE_RTC);
> +
>   	/* Register GPIO subsystem */
>   	at91_gpio_init(at91sam9g45_gpio, 5);
>   }
> diff --git a/arch/arm/mach-at91/at91sam9n12.c b/arch/arm/mach-at91/at91sam9n12.c
> index c7d670d..4d6001c 100644
> --- a/arch/arm/mach-at91/at91sam9n12.c
> +++ b/arch/arm/mach-at91/at91sam9n12.c
> @@ -223,7 +223,13 @@ static void __init at91sam9n12_map_io(void)
>   	at91_init_sram(0, AT91SAM9N12_SRAM_BASE, AT91SAM9N12_SRAM_SIZE);
>   }
>
> +static void __init at91sam9n12_initialize(void)
> +{
> +	at91_sysirq_mask_rtc(AT91SAM9N12_BASE_RTC);
> +}
> +
>   AT91_SOC_START(at91sam9n12)
>   	.map_io = at91sam9n12_map_io,
>   	.register_clocks = at91sam9n12_register_clocks,
> +	.init = at91sam9n12_initialize,
>   AT91_SOC_END
> diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c
> index d4ec0d9..b5a8c9d 100644
> --- a/arch/arm/mach-at91/at91sam9rl.c
> +++ b/arch/arm/mach-at91/at91sam9rl.c
> @@ -294,6 +294,8 @@ static void __init at91sam9rl_initialize(void)
>   	arm_pm_idle = at91sam9_idle;
>   	arm_pm_restart = at91sam9_alt_restart;
>
> +	at91_sysirq_mask_rtc(AT91SAM9RL_BASE_RTC);
> +
>   	/* Register GPIO subsystem */
>   	at91_gpio_init(at91sam9rl_gpio, 4);
>   }
> diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c
> index 916e5a1..e8a2e07 100644
> --- a/arch/arm/mach-at91/at91sam9x5.c
> +++ b/arch/arm/mach-at91/at91sam9x5.c
> @@ -322,6 +322,11 @@ static void __init at91sam9x5_map_io(void)
>   	at91_init_sram(0, AT91SAM9X5_SRAM_BASE, AT91SAM9X5_SRAM_SIZE);
>   }
>
> +static void __init at91sam9x5_initialize(void)
> +{
> +	at91_sysirq_mask_rtc(AT91SAM9X5_BASE_RTC);
> +}
> +
>   /* --------------------------------------------------------------------
>    *  Interrupt initialization
>    * -------------------------------------------------------------------- */
> @@ -329,4 +334,5 @@ static void __init at91sam9x5_map_io(void)
>   AT91_SOC_START(at91sam9x5)
>   	.map_io = at91sam9x5_map_io,
>   	.register_clocks = at91sam9x5_register_clocks,
> +	.init = at91sam9x5_initialize,
>   AT91_SOC_END
> diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h
> index dc6e2f5..80269bd 100644
> --- a/arch/arm/mach-at91/generic.h
> +++ b/arch/arm/mach-at91/generic.h
> @@ -34,6 +34,7 @@ extern int  __init at91_aic_of_init(struct device_node *node,
>   				    struct device_node *parent);
>   extern int  __init at91_aic5_of_init(struct device_node *node,
>   				    struct device_node *parent);
> +extern void __init at91_sysirq_mask_rtc(u32 rtc_base);
>
>
>    /* Timer */
> diff --git a/arch/arm/mach-at91/include/mach/at91sam9n12.h b/arch/arm/mach-at91/include/mach/at91sam9n12.h
> index d374b87..0151bcf 100644
> --- a/arch/arm/mach-at91/include/mach/at91sam9n12.h
> +++ b/arch/arm/mach-at91/include/mach/at91sam9n12.h
> @@ -49,6 +49,11 @@
>   #define AT91SAM9N12_BASE_USART3	0xf8028000
>
>   /*
> + * System Peripherals
> + */
> +#define AT91SAM9N12_BASE_RTC	0xfffffeb0
> +
> +/*
>    * Internal Memory.
>    */
>   #define AT91SAM9N12_SRAM_BASE	0x00300000	/* Internal SRAM base address */
> diff --git a/arch/arm/mach-at91/include/mach/at91sam9x5.h b/arch/arm/mach-at91/include/mach/at91sam9x5.h
> index c75ee19..2fc76c4 100644
> --- a/arch/arm/mach-at91/include/mach/at91sam9x5.h
> +++ b/arch/arm/mach-at91/include/mach/at91sam9x5.h
> @@ -55,6 +55,11 @@
>   #define AT91SAM9X5_BASE_USART2	0xf8024000
>
>   /*
> + * System Peripherals
> + */
> +#define AT91SAM9X5_BASE_RTC	0xfffffeb0
> +
> +/*
>    * Internal Memory.
>    */
>   #define AT91SAM9X5_SRAM_BASE	0x00300000	/* Internal SRAM base address */
> diff --git a/arch/arm/mach-at91/include/mach/sama5d3.h b/arch/arm/mach-at91/include/mach/sama5d3.h
> index 31096a8..25613d8 100644
> --- a/arch/arm/mach-at91/include/mach/sama5d3.h
> +++ b/arch/arm/mach-at91/include/mach/sama5d3.h
> @@ -73,6 +73,11 @@
>   #define SAMA5D3_BASE_USART3	0xf8024000
>
>   /*
> + * System Peripherals
> + */
> +#define SAMA5D3_BASE_RTC	0xfffffeb0
> +
> +/*
>    * Internal Memory
>    */
>   #define SAMA5D3_SRAM_BASE	0x00300000	/* Internal SRAM base address */
> diff --git a/arch/arm/mach-at91/sama5d3.c b/arch/arm/mach-at91/sama5d3.c
> index 4012797..3ea8642 100644
> --- a/arch/arm/mach-at91/sama5d3.c
> +++ b/arch/arm/mach-at91/sama5d3.c
> @@ -371,7 +371,13 @@ static void __init sama5d3_map_io(void)
>   	at91_init_sram(0, SAMA5D3_SRAM_BASE, SAMA5D3_SRAM_SIZE);
>   }
>
> +static void __init sama5d3_initialize(void)
> +{
> +	at91_sysirq_mask_rtc(SAMA5D3_BASE_RTC);
> +}
> +
>   AT91_SOC_START(sama5d3)
>   	.map_io = sama5d3_map_io,
>   	.register_clocks = sama5d3_register_clocks,
> +	.init = sama5d3_initialize,
>   AT91_SOC_END
> diff --git a/arch/arm/mach-at91/sysirq_mask.c b/arch/arm/mach-at91/sysirq_mask.c
> new file mode 100644
> index 0000000..ee3e22c
> --- /dev/null
> +++ b/arch/arm/mach-at91/sysirq_mask.c
> @@ -0,0 +1,47 @@
> +/*
> + * sysirq_mask.c - System-interrupt masking
> + *
> + * Copyright (C) 2013 Johan Hovold <jhovold@gmail.com>
> + *
> + * Functions to disable system interrupts from backup-powered peripherals.
> + *
> + * The RTC and RTT-peripherals are generally powered by backup power (VDDBU)
> + * and are not reset on wake-up, user, watchdog or software reset. This means
> + * that their interrupts may be enabled during early boot (e.g. after a user
> + * reset).
> + *
> + * As the RTC and RTT share the system-interrupt line with the PIT, an
> + * interrupt occurring before a handler has been installed would lead to the
> + * system interrupt being disabled and prevent the system from booting.
> + *
> + * 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.
> + */
> +
> +#include <linux/io.h>
> +
> +#include "generic.h"
> +
> +#define AT91_RTC_IDR	0x24	/* Interrupt Disable Register */
> +#define AT91_RTC_IMR	0x28	/* Interrupt Mask Register */
> +
> +void __init at91_sysirq_mask_rtc(u32 rtc_base)
> +{
> +	void __iomem *base;
> +	u32 mask;
> +
> +	base = ioremap(rtc_base, 64);
> +	if (!base)
> +		return;
> +
> +	mask = readl_relaxed(base + AT91_RTC_IMR);
> +	if (mask) {
> +		pr_info("AT91: Disabling rtc irq\n");
> +		writel_relaxed(mask, base + AT91_RTC_IDR);
> +		(void)readl_relaxed(base + AT91_RTC_IMR);	/* flush */
> +	}
> +
> +	iounmap(base);
> +}
>


-- 
Nicolas Ferre

  reply	other threads:[~2013-11-15 11:09 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-08 12:51 [PATCH 0/3] ARM: at91: fix hanged boot Johan Hovold
2013-03-08 12:51 ` Johan Hovold
2013-03-08 12:51 ` [PATCH 1/3] ARM: at91/rtc: fix boot after RTC wake-up Johan Hovold
2013-03-08 12:51   ` Johan Hovold
2013-03-08 12:51 ` [PATCH 2/3] Revert "arm: at91: move at91rm9200 rtc header in drivers/rtc" Johan Hovold
2013-03-08 12:51   ` Johan Hovold
2013-03-08 12:51 ` [PATCH 3/3] ARM: at91: fix hanged boot Johan Hovold
2013-03-08 12:51   ` Johan Hovold
2013-03-08 16:02   ` [rtc-linux] " Jean-Christophe PLAGNIOL-VILLARD
2013-03-08 16:02     ` Jean-Christophe PLAGNIOL-VILLARD
2013-03-11 10:02     ` Johan Hovold
2013-03-11 10:02       ` Johan Hovold
2013-03-11 11:06       ` Jean-Christophe PLAGNIOL-VILLARD
2013-03-11 11:06         ` Jean-Christophe PLAGNIOL-VILLARD
2013-03-11 18:06         ` Johan Hovold
2013-03-11 18:06           ` Johan Hovold
2013-03-11 18:07           ` [PATCH v2 0/5] " Johan Hovold
2013-03-11 18:07             ` Johan Hovold
2013-03-11 18:07             ` [PATCH v2 1/5] ARM: at91/rtc: fix boot after RTC wake-up Johan Hovold
2013-03-11 18:07               ` Johan Hovold
2013-03-11 18:07             ` [PATCH v2 2/5] ARM: at91/dts: add RTC nodes Johan Hovold
2013-03-11 18:07               ` Johan Hovold
2013-03-11 18:07             ` [PATCH v2 3/5] ARM: at91/dts: add RTT nodes Johan Hovold
2013-03-11 18:07               ` Johan Hovold
2013-03-11 18:07             ` [PATCH v2 4/5] Revert "arm: at91: move at91rm9200 rtc header in drivers/rtc" Johan Hovold
2013-03-11 18:07               ` Johan Hovold
2013-03-11 18:07             ` [PATCH v2 5/5] ARM: at91: fix hanged boot Johan Hovold
2013-03-11 18:07               ` Johan Hovold
2013-04-11 15:55             ` [PATCH v2 0/5] " Johan Hovold
2013-04-11 15:55               ` Johan Hovold
2013-04-11 16:54               ` [rtc-linux] " Jean-Christophe PLAGNIOL-VILLARD
2013-04-11 16:54                 ` Jean-Christophe PLAGNIOL-VILLARD
2013-04-12  9:33                 ` Johan Hovold
2013-04-12  9:33                   ` Johan Hovold
2013-04-12 12:09                   ` Nicolas Ferre
2013-04-12 12:09                     ` Nicolas Ferre
2013-10-16  9:56             ` [PATCH v3 0/3] " Johan Hovold
2013-10-16  9:56               ` Johan Hovold
2013-10-16  9:56               ` [PATCH v3 1/3] ARM: at91: fix hanged boot due to early rtc-interrupt Johan Hovold
2013-10-16  9:56                 ` Johan Hovold
2013-11-15 11:09                 ` Nicolas Ferre [this message]
2013-11-15 11:09                   ` Nicolas Ferre
2013-10-16  9:56               ` [PATCH v3 2/3] ARM: at91: fix hanged boot due to early rtt-interrupt Johan Hovold
2013-10-16  9:56                 ` Johan Hovold
2013-11-15 11:10                 ` Nicolas Ferre
2013-11-15 11:10                   ` Nicolas Ferre
2013-10-16  9:56               ` [PATCH v3 3/3] ARM: at91/rtc: disable interrupts at shutdown Johan Hovold
2013-10-16  9:56                 ` Johan Hovold
2013-11-15 10:43                 ` Nicolas Ferre
2013-11-15 10:43                   ` Nicolas Ferre

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=528600F9.4040701@atmel.com \
    --to=nicolas.ferre@atmel.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.