[U-Boot] [PATCH] at91: Add arch_preboot_os which disables PIT in a faster way

When disabled the PIT runs until it reaches the CPIV value. The Linux PIT driver stops the PIT and waits until it stopped. This can take over 100ms. Simply stopping in u-boot isn't sufficient as the PIT will still be running when Linux is waiting until it stopped. So, we stop it in u-boot by setting the compare value to a value slightly greater than the current running counter to make the PIT stopped in short time.
Signed-off-by: Alexander Stein alexander.stein@systec-electronic.com --- arch/arm/cpu/arm926ejs/at91/cpu.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-)
diff --git a/arch/arm/cpu/arm926ejs/at91/cpu.c b/arch/arm/cpu/arm926ejs/at91/cpu.c index 141a7d1..af86ee2 100644 --- a/arch/arm/cpu/arm926ejs/at91/cpu.c +++ b/arch/arm/cpu/arm926ejs/at91/cpu.c @@ -28,6 +28,7 @@
#include <asm/arch/hardware.h> #include <asm/arch/at91_pmc.h> +#include <asm/arch/at91_pit.h> #include <asm/arch/clk.h> #include <asm/arch/io.h>
@@ -47,6 +48,20 @@ int arch_cpu_init(void) return at91_clock_init(CONFIG_SYS_AT91_MAIN_CLOCK); }
+void arch_preboot_os(void) +{ + ulong cpiv; + at91_pit_t *pit = (at91_pit_t *) AT91_PIT_BASE; + + cpiv = AT91_PIT_MR_PIV_MASK(readl(&pit->piir)); + + /* Disble PITC + * Add 0x1000 to current counter to stop it faster + * without waiting for wrapping back to 0 + */ + writel(cpiv + 0x1000, &pit->mr); +} + #if defined(CONFIG_DISPLAY_CPUINFO) int print_cpuinfo(void) {

Dear Alexander Stein,
...
Signed-off-by: Alexander Stein alexander.stein@systec-electronic.com ...
- /* Disble PITC
* Add 0x1000 to current counter to stop it faster
* without waiting for wrapping back to 0
*/
- writel(cpiv + 0x1000, &pit->mr);
...
Please fix the multi-line comment.
Thanks, Reinhard

When disabled the PIT runs until it reaches the CPIV value. The Linux PIT driver stops the PIT and waits until it stopped. This can take over 100ms. Simply stopping in u-boot isn't sufficient as the PIT will still be running when Linux is waiting until it stopped. So, we stop it in u-boot by setting the compare value to a value slightly greater than the current running counter to make the PIT stopped in short time.
Signed-off-by: Alexander Stein alexander.stein@systec-electronic.com ---
Changes in v2: * Fix comment
arch/arm/cpu/arm926ejs/at91/cpu.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-)
diff --git a/arch/arm/cpu/arm926ejs/at91/cpu.c b/arch/arm/cpu/arm926ejs/at91/cpu.c index 141a7d1..62e7678 100644 --- a/arch/arm/cpu/arm926ejs/at91/cpu.c +++ b/arch/arm/cpu/arm926ejs/at91/cpu.c @@ -28,6 +28,7 @@
#include <asm/arch/hardware.h> #include <asm/arch/at91_pmc.h> +#include <asm/arch/at91_pit.h> #include <asm/arch/clk.h> #include <asm/arch/io.h>
@@ -47,6 +48,20 @@ int arch_cpu_init(void) return at91_clock_init(CONFIG_SYS_AT91_MAIN_CLOCK); }
+void arch_preboot_os(void) +{ + ulong cpiv; + at91_pit_t *pit = (at91_pit_t *) AT91_PIT_BASE; + + cpiv = AT91_PIT_MR_PIV_MASK(readl(&pit->piir)); + + /* Disable PITC + * Add 0x1000 to current counter to stop it faster + * without waiting for wrapping back to 0 + */ + writel(cpiv + 0x1000, &pit->mr); +} + #if defined(CONFIG_DISPLAY_CPUINFO) int print_cpuinfo(void) {

Dear Alexander Stein,
- /* Disable PITC
* Add 0x1000 to current counter to stop it faster
* without waiting for wrapping back to 0
*/
Sorry, a multiline comment goes like this: /* * 1st line * ... * last line */ Best Regards, Reinhard

When disabled the PIT runs until it reaches the CPIV value. The Linux PIT driver stops the PIT and waits until it stopped. This can take over 100ms. Simply stopping in u-boot isn't sufficient as the PIT will still be running when Linux is waiting until it stopped. So, we stop it in u-boot by setting the compare value to a value slightly greater than the current running counter to make the PIT stopped in short time.
Signed-off-by: Alexander Stein alexander.stein@systec-electronic.com ---
Changes in v3: * Really fix comment
arch/arm/cpu/arm926ejs/at91/cpu.c | 16 ++++++++++++++++ 1 files changed, 16 insertions(+), 0 deletions(-)
diff --git a/arch/arm/cpu/arm926ejs/at91/cpu.c b/arch/arm/cpu/arm926ejs/at91/cpu.c index 141a7d1..110c361 100644 --- a/arch/arm/cpu/arm926ejs/at91/cpu.c +++ b/arch/arm/cpu/arm926ejs/at91/cpu.c @@ -28,6 +28,7 @@
#include <asm/arch/hardware.h> #include <asm/arch/at91_pmc.h> +#include <asm/arch/at91_pit.h> #include <asm/arch/clk.h> #include <asm/arch/io.h>
@@ -47,6 +48,21 @@ int arch_cpu_init(void) return at91_clock_init(CONFIG_SYS_AT91_MAIN_CLOCK); }
+void arch_preboot_os(void) +{ + ulong cpiv; + at91_pit_t *pit = (at91_pit_t *) AT91_PIT_BASE; + + cpiv = AT91_PIT_MR_PIV_MASK(readl(&pit->piir)); + + /* + * Disable PITC + * Add 0x1000 to current counter to stop it faster + * without waiting for wrapping back to 0 + */ + writel(cpiv + 0x1000, &pit->mr); +} + #if defined(CONFIG_DISPLAY_CPUINFO) int print_cpuinfo(void) {

Dear Alexander Stein,
When disabled the PIT runs until it reaches the CPIV value. The Linux PIT driver stops the PIT and waits until it stopped. This can take over 100ms. Simply stopping in u-boot isn't sufficient as the PIT will still be running when Linux is waiting until it stopped. So, we stop it in u-boot by setting the compare value to a value slightly greater than the current running counter to make the PIT stopped in short time.
Signed-off-by: Alexander Stein alexander.stein@systec-electronic.com
Changes in v3:
- Really fix comment
Applied to u-boot-atmel/at91.
Thanks, Reinhard
participants (3)
-
Alexander Stein
-
Reinhard Meyer
-
Reinhard Meyer