diff options
Diffstat (limited to 'arch/arm/mach-integrator')
-rw-r--r-- | arch/arm/mach-integrator/core.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-integrator/include/mach/platform.h | 12 | ||||
-rw-r--r-- | arch/arm/mach-integrator/integrator_ap.c | 37 |
3 files changed, 27 insertions, 26 deletions
diff --git a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/core.c index 77315b995681..82ebc8d772d3 100644 --- a/arch/arm/mach-integrator/core.c +++ b/arch/arm/mach-integrator/core.c | |||
@@ -126,6 +126,10 @@ static struct clk_lookup lookups[] = { | |||
126 | { /* Bus clock */ | 126 | { /* Bus clock */ |
127 | .con_id = "apb_pclk", | 127 | .con_id = "apb_pclk", |
128 | .clk = &dummy_apb_pclk, | 128 | .clk = &dummy_apb_pclk, |
129 | }, { | ||
130 | /* Integrator/AP timer frequency */ | ||
131 | .dev_id = "ap_timer", | ||
132 | .clk = &clk24mhz, | ||
129 | }, { /* UART0 */ | 133 | }, { /* UART0 */ |
130 | .dev_id = "mb:16", | 134 | .dev_id = "mb:16", |
131 | .clk = &uartclk, | 135 | .clk = &uartclk, |
diff --git a/arch/arm/mach-integrator/include/mach/platform.h b/arch/arm/mach-integrator/include/mach/platform.h index 5e6ea5cfea6e..ec467baade09 100644 --- a/arch/arm/mach-integrator/include/mach/platform.h +++ b/arch/arm/mach-integrator/include/mach/platform.h | |||
@@ -13,9 +13,6 @@ | |||
13 | * along with this program; if not, write to the Free Software | 13 | * along with this program; if not, write to the Free Software |
14 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 14 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
15 | */ | 15 | */ |
16 | /* DO NOT EDIT!! - this file automatically generated | ||
17 | * from .s file by awk -f s2h.awk | ||
18 | */ | ||
19 | /************************************************************************** | 16 | /************************************************************************** |
20 | * * Copyright © ARM Limited 1998. All rights reserved. | 17 | * * Copyright © ARM Limited 1998. All rights reserved. |
21 | * ***********************************************************************/ | 18 | * ***********************************************************************/ |
@@ -399,15 +396,6 @@ | |||
399 | #define INTEGRATOR_TIMER1_BASE (INTEGRATOR_CT_BASE + 0x100) | 396 | #define INTEGRATOR_TIMER1_BASE (INTEGRATOR_CT_BASE + 0x100) |
400 | #define INTEGRATOR_TIMER2_BASE (INTEGRATOR_CT_BASE + 0x200) | 397 | #define INTEGRATOR_TIMER2_BASE (INTEGRATOR_CT_BASE + 0x200) |
401 | 398 | ||
402 | #define TICKS_PER_uSEC 24 | ||
403 | |||
404 | /* | ||
405 | * These are useconds NOT ticks. | ||
406 | * | ||
407 | */ | ||
408 | #define mSEC_1 1000 | ||
409 | #define mSEC_10 (mSEC_1 * 10) | ||
410 | |||
411 | #define INTEGRATOR_CSR_BASE 0x10000000 | 399 | #define INTEGRATOR_CSR_BASE 0x10000000 |
412 | #define INTEGRATOR_CSR_SIZE 0x10000000 | 400 | #define INTEGRATOR_CSR_SIZE 0x10000000 |
413 | 401 | ||
diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c index 0a6f397f1222..8dca5a7ab370 100644 --- a/arch/arm/mach-integrator/integrator_ap.c +++ b/arch/arm/mach-integrator/integrator_ap.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/interrupt.h> | 32 | #include <linux/interrupt.h> |
33 | #include <linux/io.h> | 33 | #include <linux/io.h> |
34 | #include <linux/mtd/physmap.h> | 34 | #include <linux/mtd/physmap.h> |
35 | #include <linux/clk.h> | ||
35 | 36 | ||
36 | #include <mach/hardware.h> | 37 | #include <mach/hardware.h> |
37 | #include <mach/platform.h> | 38 | #include <mach/platform.h> |
@@ -322,13 +323,14 @@ static void __init ap_init(void) | |||
322 | 323 | ||
323 | static unsigned long timer_reload; | 324 | static unsigned long timer_reload; |
324 | 325 | ||
325 | static void integrator_clocksource_init(u32 khz) | 326 | static void integrator_clocksource_init(unsigned long inrate) |
326 | { | 327 | { |
327 | void __iomem *base = (void __iomem *)TIMER2_VA_BASE; | 328 | void __iomem *base = (void __iomem *)TIMER2_VA_BASE; |
328 | u32 ctrl = TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC; | 329 | u32 ctrl = TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC; |
330 | unsigned long rate = inrate; | ||
329 | 331 | ||
330 | if (khz >= 1500) { | 332 | if (rate >= 1500000) { |
331 | khz /= 16; | 333 | rate /= 16; |
332 | ctrl |= TIMER_CTRL_DIV16; | 334 | ctrl |= TIMER_CTRL_DIV16; |
333 | } | 335 | } |
334 | 336 | ||
@@ -336,7 +338,7 @@ static void integrator_clocksource_init(u32 khz) | |||
336 | writel(ctrl, base + TIMER_CTRL); | 338 | writel(ctrl, base + TIMER_CTRL); |
337 | 339 | ||
338 | clocksource_mmio_init(base + TIMER_VALUE, "timer2", | 340 | clocksource_mmio_init(base + TIMER_VALUE, "timer2", |
339 | khz * 1000, 200, 16, clocksource_mmio_readl_down); | 341 | rate, 200, 16, clocksource_mmio_readl_down); |
340 | } | 342 | } |
341 | 343 | ||
342 | static void __iomem * const clkevt_base = (void __iomem *)TIMER1_VA_BASE; | 344 | static void __iomem * const clkevt_base = (void __iomem *)TIMER1_VA_BASE; |
@@ -411,24 +413,25 @@ static struct irqaction integrator_timer_irq = { | |||
411 | .dev_id = &integrator_clockevent, | 413 | .dev_id = &integrator_clockevent, |
412 | }; | 414 | }; |
413 | 415 | ||
414 | static void integrator_clockevent_init(u32 khz) | 416 | static void integrator_clockevent_init(unsigned long inrate) |
415 | { | 417 | { |
418 | unsigned long rate = inrate; | ||
416 | unsigned int ctrl = 0; | 419 | unsigned int ctrl = 0; |
417 | 420 | ||
418 | /* Calculate and program a divisor */ | 421 | /* Calculate and program a divisor */ |
419 | if (khz * 1000 > 0x100000 * HZ) { | 422 | if (rate > 0x100000 * HZ) { |
420 | khz /= 256; | 423 | rate /= 256; |
421 | ctrl |= TIMER_CTRL_DIV256; | 424 | ctrl |= TIMER_CTRL_DIV256; |
422 | } else if (khz * 1000 > 0x10000 * HZ) { | 425 | } else if (rate > 0x10000 * HZ) { |
423 | khz /= 16; | 426 | rate /= 16; |
424 | ctrl |= TIMER_CTRL_DIV16; | 427 | ctrl |= TIMER_CTRL_DIV16; |
425 | } | 428 | } |
426 | timer_reload = khz * 1000 / HZ; | 429 | timer_reload = rate / HZ; |
427 | writel(ctrl, clkevt_base + TIMER_CTRL); | 430 | writel(ctrl, clkevt_base + TIMER_CTRL); |
428 | 431 | ||
429 | setup_irq(IRQ_TIMERINT1, &integrator_timer_irq); | 432 | setup_irq(IRQ_TIMERINT1, &integrator_timer_irq); |
430 | clockevents_config_and_register(&integrator_clockevent, | 433 | clockevents_config_and_register(&integrator_clockevent, |
431 | khz * 1000, | 434 | rate, |
432 | 1, | 435 | 1, |
433 | 0xffffU); | 436 | 0xffffU); |
434 | } | 437 | } |
@@ -438,14 +441,20 @@ static void integrator_clockevent_init(u32 khz) | |||
438 | */ | 441 | */ |
439 | static void __init ap_init_timer(void) | 442 | static void __init ap_init_timer(void) |
440 | { | 443 | { |
441 | u32 khz = TICKS_PER_uSEC * 1000; | 444 | struct clk *clk; |
445 | unsigned long rate; | ||
446 | |||
447 | clk = clk_get_sys("ap_timer", NULL); | ||
448 | BUG_ON(IS_ERR(clk)); | ||
449 | clk_enable(clk); | ||
450 | rate = clk_get_rate(clk); | ||
442 | 451 | ||
443 | writel(0, TIMER0_VA_BASE + TIMER_CTRL); | 452 | writel(0, TIMER0_VA_BASE + TIMER_CTRL); |
444 | writel(0, TIMER1_VA_BASE + TIMER_CTRL); | 453 | writel(0, TIMER1_VA_BASE + TIMER_CTRL); |
445 | writel(0, TIMER2_VA_BASE + TIMER_CTRL); | 454 | writel(0, TIMER2_VA_BASE + TIMER_CTRL); |
446 | 455 | ||
447 | integrator_clocksource_init(khz); | 456 | integrator_clocksource_init(rate); |
448 | integrator_clockevent_init(khz); | 457 | integrator_clockevent_init(rate); |
449 | } | 458 | } |
450 | 459 | ||
451 | static struct sys_timer ap_timer = { | 460 | static struct sys_timer ap_timer = { |