aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-integrator
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-integrator')
-rw-r--r--arch/arm/mach-integrator/core.c4
-rw-r--r--arch/arm/mach-integrator/include/mach/platform.h12
-rw-r--r--arch/arm/mach-integrator/integrator_ap.c37
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
323static unsigned long timer_reload; 324static unsigned long timer_reload;
324 325
325static void integrator_clocksource_init(u32 khz) 326static 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
342static void __iomem * const clkevt_base = (void __iomem *)TIMER1_VA_BASE; 344static 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
414static void integrator_clockevent_init(u32 khz) 416static 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 */
439static void __init ap_init_timer(void) 442static 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
451static struct sys_timer ap_timer = { 460static struct sys_timer ap_timer = {