From 4dd3065fcd30a607596c237206e48acde68bc2c7 Mon Sep 17 00:00:00 2001 From: Russell King Date: Sat, 9 Oct 2004 19:32:04 +0100 Subject: [PATCH] [ARM] Convert system ticker timer to sysdev model. Machine support files are now expected to provide a sys_timer structure which encapsulates everything to do with the kernels system timer, and provides elegant with the system device model. In addition, it provides the relevant power management hooks. --- arch/arm/common/time-acorn.c | 32 ++++- arch/arm/kernel/setup.c | 2 +- arch/arm/kernel/time.c | 59 ++++++-- arch/arm/mach-clps711x/autcpu12.c | 6 +- arch/arm/mach-clps711x/cdb89712.c | 14 +- arch/arm/mach-clps711x/ceiva.c | 5 +- arch/arm/mach-clps711x/clep7312.c | 6 +- arch/arm/mach-clps711x/common.h | 11 ++ arch/arm/mach-clps711x/edb7211-arch.c | 6 +- arch/arm/mach-clps711x/fortunet.c | 6 +- arch/arm/mach-clps711x/p720t.c | 6 +- arch/arm/mach-clps711x/time.c | 8 +- arch/arm/mach-clps7500/core.c | 10 +- arch/arm/mach-ebsa110/core.c | 11 +- arch/arm/mach-epxa10db/arch.c | 4 +- arch/arm/mach-epxa10db/time.c | 5 +- arch/arm/mach-footbridge/arch.c | 13 +- arch/arm/mach-footbridge/time.c | 16 ++- arch/arm/mach-imx/generic.h | 4 +- arch/arm/mach-imx/mx1ads.c | 2 +- arch/arm/mach-imx/time.c | 10 +- arch/arm/mach-integrator/common.h | 2 + arch/arm/mach-integrator/core.c | 5 +- arch/arm/mach-integrator/integrator_ap.c | 10 +- arch/arm/mach-integrator/integrator_cp.c | 10 +- arch/arm/mach-iop3xx/arch.c | 50 ------- arch/arm/mach-iop3xx/iop321-setup.c | 8 +- arch/arm/mach-iop3xx/iop321-time.c | 10 +- arch/arm/mach-iop3xx/iop331-setup.c | 4 +- arch/arm/mach-iop3xx/iop331-time.c | 10 +- arch/arm/mach-ixp2000/core.c | 4 +- arch/arm/mach-ixp2000/enp2611.c | 9 +- arch/arm/mach-ixp2000/ixdp2400.c | 9 +- arch/arm/mach-ixp2000/ixdp2800.c | 9 +- arch/arm/mach-ixp2000/ixdp2x01.c | 11 +- arch/arm/mach-ixp4xx/common.c | 9 +- arch/arm/mach-ixp4xx/coyote-setup.c | 2 +- arch/arm/mach-ixp4xx/ixdp425-setup.c | 6 +- arch/arm/mach-ixp4xx/prpmc1100-setup.c | 2 +- arch/arm/mach-lh7a40x/arch-kev7a400.c | 7 +- arch/arm/mach-lh7a40x/arch-lpd7a40x.c | 13 +- arch/arm/mach-lh7a40x/common.h | 9 ++ arch/arm/mach-lh7a40x/time.c | 6 +- arch/arm/mach-omap/board-generic.c | 4 +- arch/arm/mach-omap/board-h2.c | 4 +- arch/arm/mach-omap/board-h3.c | 4 +- arch/arm/mach-omap/board-innovator.c | 4 +- arch/arm/mach-omap/board-osk.c | 4 +- arch/arm/mach-omap/board-perseus2.c | 4 +- arch/arm/mach-omap/common.h | 5 +- arch/arm/mach-omap/time.c | 8 +- arch/arm/mach-pxa/generic.h | 4 +- arch/arm/mach-pxa/idp.c | 2 +- arch/arm/mach-pxa/lubbock.c | 4 +- arch/arm/mach-pxa/mainstone.c | 2 +- arch/arm/mach-pxa/time.c | 22 ++- arch/arm/mach-rpc/riscpc.c | 28 +--- arch/arm/mach-s3c2410/mach-bast.c | 7 +- arch/arm/mach-s3c2410/mach-h1940.c | 7 +- arch/arm/mach-s3c2410/mach-smdk2410.c | 7 +- arch/arm/mach-s3c2410/mach-vr1000.c | 7 +- arch/arm/mach-s3c2410/s3c2410.h | 3 +- arch/arm/mach-s3c2410/time.c | 10 +- arch/arm/mach-sa1100/adsbitsy.c | 2 +- arch/arm/mach-sa1100/assabet.c | 2 +- arch/arm/mach-sa1100/badge4.c | 2 +- arch/arm/mach-sa1100/brutus.c | 2 +- arch/arm/mach-sa1100/cerf.c | 2 +- arch/arm/mach-sa1100/collie.c | 2 +- arch/arm/mach-sa1100/empeg.c | 2 +- arch/arm/mach-sa1100/flexanet.c | 2 +- arch/arm/mach-sa1100/freebird.c | 2 +- arch/arm/mach-sa1100/generic.h | 4 +- arch/arm/mach-sa1100/graphicsclient.c | 2 +- arch/arm/mach-sa1100/graphicsmaster.c | 2 +- arch/arm/mach-sa1100/h3600.c | 6 +- arch/arm/mach-sa1100/hackkit.c | 2 +- arch/arm/mach-sa1100/huw_webpanel.c | 2 +- arch/arm/mach-sa1100/itsy.c | 2 +- arch/arm/mach-sa1100/jornada720.c | 2 +- arch/arm/mach-sa1100/lart.c | 2 +- arch/arm/mach-sa1100/nanoengine.c | 2 +- arch/arm/mach-sa1100/omnimeter.c | 2 +- arch/arm/mach-sa1100/pangolin.c | 2 +- arch/arm/mach-sa1100/pfs168.c | 2 +- arch/arm/mach-sa1100/pleb.c | 2 +- arch/arm/mach-sa1100/shannon.c | 2 +- arch/arm/mach-sa1100/sherman.c | 2 +- arch/arm/mach-sa1100/simpad.c | 2 +- arch/arm/mach-sa1100/stork.c | 2 +- arch/arm/mach-sa1100/system3.c | 2 +- arch/arm/mach-sa1100/time.c | 22 ++- arch/arm/mach-sa1100/trizeps.c | 2 +- arch/arm/mach-sa1100/xp860.c | 2 +- arch/arm/mach-sa1100/yopy.c | 2 +- arch/arm/mach-shark/core.c | 7 +- arch/arm/mach-versatile/core.c | 12 +- include/asm-arm/arch-integrator/platform.h | 4 - include/asm-arm/arch-integrator/time.h | 156 --------------------- include/asm-arm/arch-ixp2000/platform.h | 1 + include/asm-arm/arch-ixp4xx/platform.h | 4 +- include/asm-arm/mach/arch.h | 6 +- include/asm-arm/mach/time.h | 16 ++- 103 files changed, 401 insertions(+), 476 deletions(-) create mode 100644 arch/arm/mach-clps711x/common.h create mode 100644 arch/arm/mach-integrator/common.h create mode 100644 arch/arm/mach-lh7a40x/common.h diff --git a/arch/arm/common/time-acorn.c b/arch/arm/common/time-acorn.c index eb06282962eb9..0482fc635f748 100644 --- a/arch/arm/common/time-acorn.c +++ b/arch/arm/common/time-acorn.c @@ -15,6 +15,7 @@ */ #include #include +#include #include #include @@ -22,7 +23,7 @@ #include -static unsigned long ioctime_gettimeoffset(void) +unsigned long ioc_timer_gettimeoffset(void) { unsigned int count1, count2, status; long offset; @@ -62,6 +63,33 @@ void __init ioctime_init(void) ioc_writeb(LATCH & 255, IOC_T0LTCHL); ioc_writeb(LATCH >> 8, IOC_T0LTCHH); ioc_writeb(0, IOC_T0GO); +} + +static irqreturn_t +ioc_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) +{ + timer_tick(regs); - gettimeoffset = ioctime_gettimeoffset; + return IRQ_HANDLED; } + +static struct irqaction ioc_timer_irq = { + .name = "timer", + .flags = SA_INTERRUPT, + .handler = ioc_timer_interrupt +}; + +/* + * Set up timer interrupt. + */ +static void __init ioc_timer_init(void) +{ + ioctime_init(); + setup_irq(IRQ_TIMER, &ioc_timer_irq); +} + +struct sys_timer ioc_timer = { + .init = ioc_timer_init, + .offset = ioc_timer_gettimeoffset, +}; + diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 550cb831aa885..35ca99adb33dd 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -726,7 +726,7 @@ void __init setup_arch(char **cmdline_p) * Set up various architecture-specific pointers */ init_arch_irq = mdesc->init_irq; - init_arch_time = mdesc->init_time; + system_timer = mdesc->timer; init_machine = mdesc->init_machine; #ifdef CONFIG_VT diff --git a/arch/arm/kernel/time.c b/arch/arm/kernel/time.c index 3043e6de75d99..f80a89de33c3b 100644 --- a/arch/arm/kernel/time.c +++ b/arch/arm/kernel/time.c @@ -40,6 +40,11 @@ u64 jiffies_64 = INITIAL_JIFFIES; EXPORT_SYMBOL(jiffies_64); +/* + * Our system timer. + */ +struct sys_timer *system_timer; + extern unsigned long wall_jiffies; /* this needs a better home */ @@ -77,12 +82,6 @@ static unsigned long dummy_gettimeoffset(void) return 0; } -/* - * hook for getting the time offset. Note that it is - * always called with interrupts disabled. - */ -unsigned long (*gettimeoffset)(void) = dummy_gettimeoffset; - /* * Scheduler clock - returns current time in nanosec units. * This is the default implementation. Sub-architecture @@ -247,7 +246,7 @@ void do_gettimeofday(struct timeval *tv) do { seq = read_seqbegin_irqsave(&xtime_lock, flags); - usec = gettimeoffset(); + usec = system_timer->offset(); lost = jiffies - wall_jiffies; if (lost) @@ -284,7 +283,7 @@ int do_settimeofday(struct timespec *tv) * wall time. Discover what correction gettimeofday() would have * done, and then undo it! */ - nsec -= gettimeoffset() * NSEC_PER_USEC; + nsec -= system_timer->offset() * NSEC_PER_USEC; nsec -= (jiffies - wall_jiffies) * TICK_NSEC; wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec); @@ -337,6 +336,9 @@ void restore_time_delta(struct timespec *delta, struct timespec *rtc) } EXPORT_SYMBOL(restore_time_delta); +/* + * Kernel system timer support. + */ void timer_tick(struct pt_regs *regs) { profile_tick(CPU_PROFILING, regs); @@ -345,10 +347,47 @@ void timer_tick(struct pt_regs *regs) do_timer(regs); } -void (*init_arch_time)(void); +#ifdef CONFIG_PM +static int timer_suspend(struct sys_device *dev, u32 state) +{ + struct sys_timer *timer = container_of(dev, struct sys_timer, dev); + timer->suspend(); + return 0; +} + +static int timer_resume(struct sys_device *dev) +{ + struct sys_timer *timer = container_of(dev, struct sys_timer, dev); + timer->resume(); + return 0; +} +#else +#define timer_suspend NULL +#define timer_resume NULL +#endif + +static struct sysdev_class timer_sysclass = { + set_kset_name("timer"), + .suspend = timer_suspend, + .resume = timer_resume, +}; + +static int __init timer_init_sysfs(void) +{ + int ret = sysdev_class_register(&timer_sysclass); + if (ret == 0) { + system_timer->dev.cls = &timer_sysclass; + ret = sysdev_register(&system_timer->dev); + } + return ret; +} + +device_initcall(timer_init_sysfs); void __init time_init(void) { - init_arch_time(); + if (system_timer->offset == NULL) + system_timer->offset = dummy_gettimeoffset; + system_timer->init(); } diff --git a/arch/arm/mach-clps711x/autcpu12.c b/arch/arm/mach-clps711x/autcpu12.c index e8a4d998b85db..c106704a2c34c 100644 --- a/arch/arm/mach-clps711x/autcpu12.c +++ b/arch/arm/mach-clps711x/autcpu12.c @@ -35,9 +35,7 @@ #include #include -extern void clps711x_map_io(void); -extern void clps711x_init_irq(void); -extern void clps711x_init_time(void); +#include "common.h" /* * The on-chip registers are given a size of 1MB so that a section can @@ -66,6 +64,6 @@ MACHINE_START(AUTCPU12, "autronix autcpu12") BOOT_PARAMS(0xc0020000) MAPIO(autcpu12_map_io) INITIRQ(clps711x_init_irq) - INITTIME(clps711x_init_time) + .timer = &clps711x_timer, MACHINE_END diff --git a/arch/arm/mach-clps711x/cdb89712.c b/arch/arm/mach-clps711x/cdb89712.c index 870d4e4e8b576..7664f9cf83b84 100644 --- a/arch/arm/mach-clps711x/cdb89712.c +++ b/arch/arm/mach-clps711x/cdb89712.c @@ -32,9 +32,7 @@ #include #include -extern void clps711x_init_irq(void); -extern void clps711x_map_io(void); -extern void clps711x_init_time(void); +#include "common.h" /* * Map the CS89712 Ethernet port. That should be moved to the @@ -56,13 +54,5 @@ MACHINE_START(CDB89712, "Cirrus-CDB89712") BOOT_PARAMS(0xc0000100) MAPIO(cdb89712_map_io) INITIRQ(clps711x_init_irq) - INITTIME(clps711x_init_time) + .timer = &clps711x_timer, MACHINE_END - -static int cdb89712_hw_init(void) -{ - return 0; -} - -__initcall(cdb89712_hw_init); - diff --git a/arch/arm/mach-clps711x/ceiva.c b/arch/arm/mach-clps711x/ceiva.c index 44d4e5b8d04bf..e4093be3c4cb5 100644 --- a/arch/arm/mach-clps711x/ceiva.c +++ b/arch/arm/mach-clps711x/ceiva.c @@ -34,8 +34,7 @@ #include -extern void clps711x_init_irq(void); -extern void clps711x_init_time(void); +#include "common.h" static struct map_desc ceiva_io_desc[] __initdata = { /* virtual, physical, length, type */ @@ -59,5 +58,5 @@ MACHINE_START(CEIVA, "CEIVA/Polaroid Photo MAX Digital Picture Frame") BOOT_PARAMS(0xc0000100) MAPIO(ceiva_map_io) INITIRQ(clps711x_init_irq) - INITTIME(clps711x_init_time) + .timer = &clps711x_timer, MACHINE_END diff --git a/arch/arm/mach-clps711x/clep7312.c b/arch/arm/mach-clps711x/clep7312.c index 14fb9788cdd1d..9ca21cb481baa 100644 --- a/arch/arm/mach-clps711x/clep7312.c +++ b/arch/arm/mach-clps711x/clep7312.c @@ -23,9 +23,7 @@ #include #include -extern void clps711x_init_irq(void); -extern void clps711x_map_io(void); -extern void clps711x_init_time(void); +#include "common.h" static void __init fixup_clep7312(struct machine_desc *desc, struct tag *tags, @@ -45,6 +43,6 @@ MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312") FIXUP(fixup_clep7312) MAPIO(clps711x_map_io) INITIRQ(clps711x_init_irq) - INITTIME(clps711x_init_time) + .timer = &clps711x_timer, MACHINE_END diff --git a/arch/arm/mach-clps711x/common.h b/arch/arm/mach-clps711x/common.h new file mode 100644 index 0000000000000..2b8b801f1dc31 --- /dev/null +++ b/arch/arm/mach-clps711x/common.h @@ -0,0 +1,11 @@ +/* + * linux/arch/arm/mach-clps711x/common.h + * + * Common bits. + */ + +struct sys_timer; + +extern void clps711x_map_io(void); +extern void clps711x_init_irq(void); +extern struct sys_timer clps711x_timer; diff --git a/arch/arm/mach-clps711x/edb7211-arch.c b/arch/arm/mach-clps711x/edb7211-arch.c index 11aa05c24924e..c6c46324a2e33 100644 --- a/arch/arm/mach-clps711x/edb7211-arch.c +++ b/arch/arm/mach-clps711x/edb7211-arch.c @@ -25,9 +25,9 @@ #include #include -extern void clps711x_init_irq(void); +#include "common.h" + extern void edb7211_map_io(void); -extern void clps711x_init_time(void); static void __init fixup_edb7211(struct machine_desc *desc, struct tag *tags, @@ -57,5 +57,5 @@ MACHINE_START(EDB7211, "CL-EDB7211 (EP7211 eval board)") FIXUP(fixup_edb7211) MAPIO(edb7211_map_io) INITIRQ(clps711x_init_irq) - INITTIME(clps711x_init_time) + .timer = &clps711x_timer, MACHINE_END diff --git a/arch/arm/mach-clps711x/fortunet.c b/arch/arm/mach-clps711x/fortunet.c index 7a4ba27df7b82..c1c5b8e015494 100644 --- a/arch/arm/mach-clps711x/fortunet.c +++ b/arch/arm/mach-clps711x/fortunet.c @@ -31,9 +31,7 @@ #include -extern void clps711x_map_io(void); -extern void clps711x_init_irq(void); -extern void clps711x_init_time(void); +#include "common.h" struct meminfo memmap = { .nr_banks = 1, @@ -83,5 +81,5 @@ MACHINE_START(FORTUNET, "ARM-FortuNet") FIXUP(fortunet_fixup) MAPIO(clps711x_map_io) INITIRQ(clps711x_init_irq) - INITTIME(clps711x_init_time) + .timer = &clps711x_timer, MACHINE_END diff --git a/arch/arm/mach-clps711x/p720t.c b/arch/arm/mach-clps711x/p720t.c index eb75ae6678efb..29269df054f55 100644 --- a/arch/arm/mach-clps711x/p720t.c +++ b/arch/arm/mach-clps711x/p720t.c @@ -34,9 +34,7 @@ #include #include -extern void clps711x_init_irq(void); -extern void clps711x_map_io(void); -extern void clps711x_init_time(void); +#include "common.h" /* * Map the P720T system PLD. It occupies two address spaces: @@ -87,7 +85,7 @@ MACHINE_START(P720T, "ARM-Prospector720T") FIXUP(fixup_p720t) MAPIO(p720t_map_io) INITIRQ(clps711x_init_irq) - INITTIME(clps711x_init_time) + .timer = &clps711x_timer, MACHINE_END static int p720t_hw_init(void) diff --git a/arch/arm/mach-clps711x/time.c b/arch/arm/mach-clps711x/time.c index 58da84effd5e6..aa255f81c74db 100644 --- a/arch/arm/mach-clps711x/time.c +++ b/arch/arm/mach-clps711x/time.c @@ -59,7 +59,7 @@ static struct irqaction clps711x_timer_irq = { .handler = p720t_timer_interrupt }; -void __init clps711x_init_time(void) +static void __init clps711x_timer_init(void) { struct timespec tv; unsigned int syscon; @@ -71,9 +71,13 @@ void __init clps711x_init_time(void) clps_writel(LATCH-1, TC2D); /* 512kHz / 100Hz - 1 */ setup_irq(IRQ_TC2OI, &clps711x_timer_irq); - gettimeoffset = clps711x_gettimeoffset; tv.tv_nsec = 0; tv.tv_sec = clps_readl(RTCDR); do_settimeofday(&tv); } + +struct sys_timer clps711x_timer = { + .init = clps711x_timer_init, + .offset = clps711x_gettimeoffset, +}; diff --git a/arch/arm/mach-clps7500/core.c b/arch/arm/mach-clps7500/core.c index 11fa530af3ba3..dff6eab9b004b 100644 --- a/arch/arm/mach-clps7500/core.c +++ b/arch/arm/mach-clps7500/core.c @@ -267,6 +267,7 @@ static void __init clps7500_map_io(void) } extern void ioctime_init(void); +extern unsigned long ioc_timer_gettimeoffset(void); static irqreturn_t clps7500_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) @@ -295,18 +296,23 @@ static struct irqaction clps7500_timer_irq = { /* * Set up timer interrupt. */ -void __init clps7500_init_time(void) +static void __init clps7500_timer_init(void) { ioctime_init(); setup_irq(IRQ_TIMER, &clps7500_timer_irq); } +static struct clps7500_timer = { + .init = clps7500_timer_init, + .offset = ioc_timer_gettimeoffset, +}; + MACHINE_START(CLPS7500, "CL-PS7500") MAINTAINER("Philip Blundell") BOOT_MEM(0x10000000, 0x03000000, 0xe0000000) MAPIO(clps7500_map_io) INITIRQ(clps7500_init_irq) - INITTIME(clps7500_init_time) + .timer = &clps7500_timer, MACHINE_END diff --git a/arch/arm/mach-ebsa110/core.c b/arch/arm/mach-ebsa110/core.c index 07c556392a034..9e49143037afb 100644 --- a/arch/arm/mach-ebsa110/core.c +++ b/arch/arm/mach-ebsa110/core.c @@ -175,7 +175,7 @@ static struct irqaction ebsa110_timer_irq = { /* * Set up timer interrupt. */ -static void __init ebsa110_init_time(void) +static void __init ebsa110_timer_init(void) { /* * Timer 1, mode 2, LSB/MSB @@ -184,11 +184,14 @@ static void __init ebsa110_init_time(void) __raw_writeb(COUNT & 0xff, PIT_T1); __raw_writeb(COUNT >> 8, PIT_T1); - gettimeoffset = ebsa110_gettimeoffset; - setup_irq(IRQ_EBSA110_TIMER0, &ebsa110_timer_irq); } +static struct sys_timer ebsa110_timer = { + .init = ebsa110_timer_init, + .offset = ebsa110_gettimeoffset, +}; + MACHINE_START(EBSA110, "EBSA110") MAINTAINER("Russell King") BOOT_MEM(0x00000000, 0xe0000000, 0xe0000000) @@ -198,5 +201,5 @@ MACHINE_START(EBSA110, "EBSA110") SOFT_REBOOT MAPIO(ebsa110_map_io) INITIRQ(ebsa110_init_irq) - INITTIME(ebsa110_init_time) + .timer = &ebsa110_timer, MACHINE_END diff --git a/arch/arm/mach-epxa10db/arch.c b/arch/arm/mach-epxa10db/arch.c index ae9f7c864b45a..ddbd6f71266ba 100644 --- a/arch/arm/mach-epxa10db/arch.c +++ b/arch/arm/mach-epxa10db/arch.c @@ -29,13 +29,13 @@ extern void epxa10db_map_io(void); extern void epxa10db_init_irq(void); -extern void epxa10db_init_time(void); +extern struct sys_timer epxa10db_timer; MACHINE_START(CAMELOT, "Altera Epxa10db") MAINTAINER("Altera Corporation") BOOT_MEM(0x00000000, 0x7fffc000, 0xffffc000) MAPIO(epxa10db_map_io) INITIRQ(epxa10db_init_irq) - INITTIME(epxa10db_init_time) + .timer = &epxa10db_timer, MACHINE_END diff --git a/arch/arm/mach-epxa10db/time.c b/arch/arm/mach-epxa10db/time.c index 7d72a433dad79..61b1ca306b98b 100644 --- a/arch/arm/mach-epxa10db/time.c +++ b/arch/arm/mach-epxa10db/time.c @@ -61,7 +61,7 @@ static struct irqaction epxa10db_timer_irq = { /* * Set up timer interrupt, and return the current time in seconds. */ -void __init epxa10db_init_time(void) +static void __init epxa10db_timer_init(void) { /* Start the timer */ *TIMER0_LIMIT(IO_ADDRESS(EXC_TIMER00_BASE))=(unsigned int)(EXC_AHB2_CLK_FREQUENCY/200); @@ -71,3 +71,6 @@ void __init epxa10db_init_time(void) setup_irq(IRQ_TIMER0, &epxa10db_timer_irq); } +struct sys_timer epxa10db_timer = { + .init = epxa10db_timer_init, +}; diff --git a/arch/arm/mach-footbridge/arch.c b/arch/arm/mach-footbridge/arch.c index 76119883661e2..56ae195945f4c 100644 --- a/arch/arm/mach-footbridge/arch.c +++ b/arch/arm/mach-footbridge/arch.c @@ -22,7 +22,8 @@ extern void footbridge_map_io(void); extern void footbridge_init_irq(void); -extern void footbridge_init_time(void); +extern struct sys_timer footbridge_timer; +extern struct sys_timer isa_timer; unsigned int mem_fclk_21285 = 50000000; @@ -44,7 +45,7 @@ MACHINE_START(EBSA285, "EBSA285") VIDEO(0x000a0000, 0x000bffff) MAPIO(footbridge_map_io) INITIRQ(footbridge_init_irq) - INITTIME(footbridge_init_time) + .timer = &footbridge_timer, MACHINE_END #endif @@ -80,7 +81,7 @@ MACHINE_START(NETWINDER, "Rebel-NetWinder") FIXUP(fixup_netwinder) MAPIO(footbridge_map_io) INITIRQ(footbridge_init_irq) - INITTIME(footbridge_init_time) + .timer = &isa_timer, MACHINE_END #endif @@ -106,7 +107,7 @@ MACHINE_START(CATS, "Chalice-CATS") FIXUP(fixup_cats) MAPIO(footbridge_map_io) INITIRQ(footbridge_init_irq) - INITTIME(footbridge_init_time) + .timer = &isa_timer, MACHINE_END #endif @@ -133,7 +134,7 @@ MACHINE_START(CO285, "co-EBSA285") FIXUP(fixup_coebsa285) MAPIO(footbridge_map_io) INITIRQ(footbridge_init_irq) - INITTIME(footbridge_init_time) + .timer = &footbridge_timer, MACHINE_END #endif @@ -144,6 +145,6 @@ MACHINE_START(PERSONAL_SERVER, "Compaq-PersonalServer") BOOT_PARAMS(0x00000100) MAPIO(footbridge_map_io) INITIRQ(footbridge_init_irq) - INITTIME(footbridge_init_time) + .timer = &footbridge_timer, MACHINE_END #endif diff --git a/arch/arm/mach-footbridge/time.c b/arch/arm/mach-footbridge/time.c index e9f5708b44218..645755ed4b203 100644 --- a/arch/arm/mach-footbridge/time.c +++ b/arch/arm/mach-footbridge/time.c @@ -213,7 +213,7 @@ static struct irqaction footbridge_timer_irq = { /* * Set up timer interrupt. */ -void __init footbridge_init_time(void) +static void __init footbridge_timer_init(void) { if (machine_is_co285() || machine_is_personal_server()) @@ -266,8 +266,6 @@ void __init footbridge_init_time(void) if (machine_is_ebsa285() || machine_is_co285() || machine_is_personal_server()) { - gettimeoffset = timer1_gettimeoffset; - timer1_latch = (mem_fclk_21285 + 8 * HZ) / (16 * HZ); *CSR_TIMER1_CLR = 0; @@ -286,11 +284,19 @@ void __init footbridge_init_time(void) outb((mSEC_10_from_14/6) & 0xFF, 0x40); outb((mSEC_10_from_14/6) >> 8, 0x40); - gettimeoffset = isa_gettimeoffset; - footbridge_timer_irq.name = "ISA Timer Tick"; footbridge_timer_irq.handler = isa_timer_interrupt; setup_irq(IRQ_ISA_TIMER, &footbridge_timer_irq); } } + +struct sys_timer footbridge_timer = { + .init = footbridge_timer_init, + .offset = timer1_gettimeoffset, +}; + +struct sys_timer isa_timer = { + .init = footbridge_timer_init, + .offset = isa_gettimeoffset, +}; diff --git a/arch/arm/mach-imx/generic.h b/arch/arm/mach-imx/generic.h index 31e1911b12e54..e91003e4bef32 100644 --- a/arch/arm/mach-imx/generic.h +++ b/arch/arm/mach-imx/generic.h @@ -11,4 +11,6 @@ extern void __init imx_map_io(void); extern void __init imx_init_irq(void); -extern void __init imx_init_time(void); + +struct sys_timer; +extern struct sys_timer imx_timer; diff --git a/arch/arm/mach-imx/mx1ads.c b/arch/arm/mach-imx/mx1ads.c index bd92b909a7734..625dd01c25781 100644 --- a/arch/arm/mach-imx/mx1ads.c +++ b/arch/arm/mach-imx/mx1ads.c @@ -83,6 +83,6 @@ MACHINE_START(MX1ADS, "Motorola MX1ADS") BOOT_PARAMS(0x08000100) MAPIO(mx1ads_map_io) INITIRQ(imx_init_irq) - INITTIME(imx_init_time) + .timer = &imx_timer, INIT_MACHINE(mx1ads_init) MACHINE_END diff --git a/arch/arm/mach-imx/time.c b/arch/arm/mach-imx/time.c index ac7cab9b00cfd..221b2e7e23a78 100644 --- a/arch/arm/mach-imx/time.c +++ b/arch/arm/mach-imx/time.c @@ -76,8 +76,8 @@ static struct irqaction imx_timer_irq = { /* * Set up timer interrupt, and return the current time in seconds. */ -void __init -imx_init_time(void) +static void __init +imx_timer_init(void) { /* * Initialise to a known state (all timers off, and timing reset) @@ -91,5 +91,9 @@ imx_init_time(void) * Make irqs happen for the system timer */ setup_irq(TIM1_INT, &imx_timer_irq); - gettimeoffset = imx_gettimeoffset; } + +struct imx_timer = { + .init = imx_timer_init, + .offset = imx_gettimeoffset, +}; diff --git a/arch/arm/mach-integrator/common.h b/arch/arm/mach-integrator/common.h new file mode 100644 index 0000000000000..609c49de3d47e --- /dev/null +++ b/arch/arm/mach-integrator/common.h @@ -0,0 +1,2 @@ +extern void integrator_time_init(unsigned long, unsigned int); +extern unsigned long integrator_gettimeoffset(void); diff --git a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/core.c index 7f6df02cf7ed4..2255fe7bdc930 100644 --- a/arch/arm/mach-integrator/core.c +++ b/arch/arm/mach-integrator/core.c @@ -24,6 +24,8 @@ #include #include +#include "common.h" + static struct amba_device rtc_device = { .dev = { .bus_id = "mb:15", @@ -163,8 +165,6 @@ typedef struct TimerStruct { unsigned long TimerClear; } TimerStruct_t; -extern unsigned long (*gettimeoffset)(void); - static unsigned long timer_reload; /* @@ -264,5 +264,4 @@ void __init integrator_time_init(unsigned long reload, unsigned int ctrl) * Make irqs happen for the system timer */ setup_irq(IRQ_TIMERINT1, &integrator_timer_irq); - gettimeoffset = integrator_gettimeoffset; } diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c index b07e39d21cdf3..9036a228e0d13 100644 --- a/arch/arm/mach-integrator/integrator_ap.c +++ b/arch/arm/mach-integrator/integrator_ap.c @@ -41,6 +41,7 @@ #include #include +#include "common.h" /* * All IO addresses are mapped onto VA 0xFFFx.xxxx, where x.xxxx @@ -281,17 +282,22 @@ static void __init ap_init(void) } } -static void ap_time_init(void) +static void __init ap_init_timer(void) { integrator_time_init(1000000 * TICKS_PER_uSEC / HZ, 0); } +static struct sys_timer ap_timer = { + .init = ap_init_timer, + .offset = integrator_gettimeoffset, +}; + MACHINE_START(INTEGRATOR, "ARM-Integrator") MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd") BOOT_MEM(0x00000000, 0x16000000, 0xf1600000) BOOT_PARAMS(0x00000100) MAPIO(ap_map_io) INITIRQ(ap_init_irq) - INITTIME(ap_time_init) + .timer = &ap_timer, INIT_MACHINE(ap_init) MACHINE_END diff --git a/arch/arm/mach-integrator/integrator_cp.c b/arch/arm/mach-integrator/integrator_cp.c index 0f5fc786167b6..0af09b5acc93e 100644 --- a/arch/arm/mach-integrator/integrator_cp.c +++ b/arch/arm/mach-integrator/integrator_cp.c @@ -36,6 +36,7 @@ #include #include +#include "common.h" #include "clock.h" #define INTCP_PA_MMC_BASE 0x1c000000 @@ -496,17 +497,22 @@ static void __init intcp_init(void) #define TIMER_CTRL_IE (1 << 5) /* Interrupt Enable */ -static void __init intcp_init_time(void) +static void __init intcp_timer_init(void) { integrator_time_init(1000000 / HZ, TIMER_CTRL_IE); } +static struct sys_timer cp_timer = { + .init = intcp_timer_init, + .offset = integrator_gettimeoffset, +}; + MACHINE_START(CINTEGRATOR, "ARM-IntegratorCP") MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd") BOOT_MEM(0x00000000, 0x16000000, 0xf1600000) BOOT_PARAMS(0x00000100) MAPIO(intcp_map_io) INITIRQ(intcp_init_irq) - INITTIME(intcp_init_time) + .timer = &cp_timer, INIT_MACHINE(intcp_init) MACHINE_END diff --git a/arch/arm/mach-iop3xx/arch.c b/arch/arm/mach-iop3xx/arch.c index 3aca6671f4c03..e69de29bb2d1d 100644 --- a/arch/arm/mach-iop3xx/arch.c +++ b/arch/arm/mach-iop3xx/arch.c @@ -1,50 +0,0 @@ -/* - * linux/arch/arm/mach-iop3xx/arch.c - * - * Author: Nicolas Pitre - * Copyright (C) 2001 MontaVista Software, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - */ -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#ifdef CONFIG_ARCH_IQ80331 -extern void iq80331_map_io(void); -extern void iop331_init_irq(void); -extern void iop331_init_time(void); -#endif - -#ifdef CONFIG_ARCH_IQ80331 -static void __init -fixup_iop331(struct machine_desc *desc, struct tag *tags, - char **cmdline, struct meminfo *mi) -{ -} -#endif - -#if defined(CONFIG_ARCH_IQ80331) -MACHINE_START(IQ80331, "Intel IQ80331") - MAINTAINER("Intel Corp.") - BOOT_MEM(PHYS_OFFSET, 0xfff01000, 0xfffff000) // virtual, physical -// BOOT_MEM(PHYS_OFFSET, IQ80331_UART0_VIRT, IQ80331_UART0_PHYS) - MAPIO(iq80331_map_io) - INITIRQ(iop331_init_irq) - INITTIME(iop331_init_time) - BOOT_PARAMS(0x0100) -MACHINE_END -#else -#error No machine descriptor defined for this IOP3xx implementation -#endif diff --git a/arch/arm/mach-iop3xx/iop321-setup.c b/arch/arm/mach-iop3xx/iop321-setup.c index e92f77fbbf317..eb50597155c89 100644 --- a/arch/arm/mach-iop3xx/iop321-setup.c +++ b/arch/arm/mach-iop3xx/iop321-setup.c @@ -23,13 +23,13 @@ #ifdef CONFIG_ARCH_IQ80321 extern void iq80321_map_io(void); -extern void iop321_init_irq(void); +extern struct sys_timer iop321_timer; extern void iop321_init_time(void); #endif #ifdef CONFIG_ARCH_IQ31244 extern void iq31244_map_io(void); -extern void iop321_init_irq(void); +extern struct sys_timer iop321_timer; extern void iop321_init_time(void); #endif @@ -46,7 +46,7 @@ MACHINE_START(IQ80321, "Intel IQ80321") FIXUP(fixup_iop321) MAPIO(iq80321_map_io) INITIRQ(iop321_init_irq) - INITTIME(iop321_init_time) + .timer = &iop331_timer, BOOT_PARAMS(0xa0000100) MACHINE_END #elif defined(CONFIG_ARCH_IQ31244) @@ -55,7 +55,7 @@ MACHINE_END BOOT_MEM(PHYS_OFFSET, IQ31244_UART, IQ31244_UART) MAPIO(iq31244_map_io) INITIRQ(iop321_init_irq) - INITTIME(iop321_init_time) + .timer = &iop331_timer, BOOT_PARAMS(0xa0000100) MACHINE_END #else diff --git a/arch/arm/mach-iop3xx/iop321-time.c b/arch/arm/mach-iop3xx/iop321-time.c index b2135e18e1962..7e43256911509 100644 --- a/arch/arm/mach-iop3xx/iop321-time.c +++ b/arch/arm/mach-iop3xx/iop321-time.c @@ -110,14 +110,11 @@ static struct irqaction iop321_timer_irq = { .flags = SA_INTERRUPT }; -extern int setup_arm_irq(int, struct irqaction*); - -void __init iop321_init_time(void) +static void __init iop321_timer_init(void) { u32 timer_ctl; iop321_latch = (CLOCK_TICK_RATE + HZ / 2) / HZ; - gettimeoffset = iop321_gettimeoffset; setup_irq(IRQ_IOP321_TIMER0, &iop321_timer_irq); timer_ctl = IOP321_TMR_EN | IOP321_TMR_PRIVILEGED | IOP321_TMR_RELOAD | @@ -138,4 +135,7 @@ void __init iop321_init_time(void) #endif } - +struct sys_timer iop321_timer = { + .init = &iop321_timer_init, + .offset = iop321_gettimeoffset, +}; diff --git a/arch/arm/mach-iop3xx/iop331-setup.c b/arch/arm/mach-iop3xx/iop331-setup.c index 681e1ce78442e..6d761a221b7f8 100644 --- a/arch/arm/mach-iop3xx/iop331-setup.c +++ b/arch/arm/mach-iop3xx/iop331-setup.c @@ -81,7 +81,7 @@ void __init iop331_map_io(void) #ifdef CONFIG_ARCH_IQ80331 extern void iop331_init_irq(void); -extern void iop331_init_time(void); +extern struct sys_timer iop331_timer; extern void iq80331_map_io(void); #endif @@ -92,7 +92,7 @@ MACHINE_START(IQ80331, "Intel IQ80331") //BOOT_MEM(PHYS_OFFSET, IQ80331_UART0_VIRT, IQ80331_UART0_PHYS) MAPIO(iq80331_map_io) INITIRQ(iop331_init_irq) - INITTIME(iop331_init_time) + .timer = &iop331_timer, BOOT_PARAMS(0x0100) MACHINE_END #else diff --git a/arch/arm/mach-iop3xx/iop331-time.c b/arch/arm/mach-iop3xx/iop331-time.c index c90a0c9bd3dd2..b26589676613f 100644 --- a/arch/arm/mach-iop3xx/iop331-time.c +++ b/arch/arm/mach-iop3xx/iop331-time.c @@ -110,14 +110,11 @@ static struct irqaction iop331_timer_irq = { .flags = SA_INTERRUPT }; -extern int setup_arm_irq(int, struct irqaction*); - -void __init iop331_init_time(void) +static void __init iop331_timer_init(void) { u32 timer_ctl; iop331_latch = (CLOCK_TICK_RATE + HZ / 2) / HZ; - gettimeoffset = iop331_gettimeoffset; setup_irq(IRQ_IOP331_TIMER0, &iop331_timer_irq); timer_ctl = IOP331_TMR_EN | IOP331_TMR_PRIVILEGED | IOP331_TMR_RELOAD | @@ -138,4 +135,7 @@ void __init iop331_init_time(void) #endif } - +struct sys_timer iop331_timer = { + .init = iop331_timer_init, + .offset = iop331_gettimeoffset, +}; diff --git a/arch/arm/mach-ixp2000/core.c b/arch/arm/mach-ixp2000/core.c index 2d6633751d1ab..aba6cf81f5580 100644 --- a/arch/arm/mach-ixp2000/core.c +++ b/arch/arm/mach-ixp2000/core.c @@ -170,7 +170,7 @@ void __init ixp2000_map_io(void) static unsigned ticks_per_jiffy; static unsigned ticks_per_usec; -static unsigned long ixp2000_gettimeoffset (void) +unsigned long ixp2000_gettimeoffset (void) { unsigned long elapsed; @@ -198,8 +198,6 @@ static struct irqaction ixp2000_timer_irq = { void __init ixp2000_init_time(unsigned long tick_rate) { - gettimeoffset = ixp2000_gettimeoffset; - ixp2000_reg_write(IXP2000_T1_CLR, 0); ixp2000_reg_write(IXP2000_T2_CLR, 0); diff --git a/arch/arm/mach-ixp2000/enp2611.c b/arch/arm/mach-ixp2000/enp2611.c index a6e30d079e210..7f2b100a66715 100644 --- a/arch/arm/mach-ixp2000/enp2611.c +++ b/arch/arm/mach-ixp2000/enp2611.c @@ -55,11 +55,16 @@ /************************************************************************* * ENP-2611 timer tick configuration *************************************************************************/ -static void __init enp2611_init_time(void) +static void __init enp2611_timer_init(void) { ixp2000_init_time(50 * 1000 * 1000); } +static struct enp2611_timer = { + .init = enp2611_timer_init, + .offset = ixp2000_gettimeoffset, +}; + /************************************************************************* * ENP-2611 PCI @@ -202,7 +207,7 @@ MACHINE_START(ENP2611, "Radisys ENP-2611 PCI network processor board") BOOT_PARAMS(0x00000100) MAPIO(ixp2000_map_io) INITIRQ(ixp2000_init_irq) - INITTIME(enp2611_init_time) + .timer = &enp2611_timer, INIT_MACHINE(enp2611_init_machine) MACHINE_END #endif diff --git a/arch/arm/mach-ixp2000/ixdp2400.c b/arch/arm/mach-ixp2000/ixdp2400.c index 39ef558df6692..22c4d77779f1f 100644 --- a/arch/arm/mach-ixp2000/ixdp2400.c +++ b/arch/arm/mach-ixp2000/ixdp2400.c @@ -48,7 +48,7 @@ /************************************************************************* * IXDP2400 timer tick *************************************************************************/ -static void __init ixdp2400_init_time(void) +static void __init ixdp2400_timer_init(void) { int numerator, denominator; int denom_array[] = {2, 4, 8, 16, 1, 2, 4, 8}; @@ -59,6 +59,11 @@ static void __init ixdp2400_init_time(void) ixp2000_init_time(((3125000 * numerator) / (denominator)) / 2); } +static struct timer ixdp2400_timer = { + .init = ixdp2400_timer_init, + .offset = ixp2000_gettimeoffset, +}; + /************************************************************************* * IXDP2400 PCI *************************************************************************/ @@ -171,7 +176,7 @@ MACHINE_START(IXDP2400, "Intel IXDP2400 Development Platform") BOOT_PARAMS(0x00000100) MAPIO(ixdp2x00_map_io) INITIRQ(ixdp2400_init_irq) - INITTIME(ixdp2400_init_time) + .timer = &ixdp2400_timer, INIT_MACHINE(ixdp2x00_init_machine) MACHINE_END diff --git a/arch/arm/mach-ixp2000/ixdp2800.c b/arch/arm/mach-ixp2000/ixdp2800.c index 285eaf016be5b..b01328a3fd342 100644 --- a/arch/arm/mach-ixp2000/ixdp2800.c +++ b/arch/arm/mach-ixp2000/ixdp2800.c @@ -55,11 +55,16 @@ void ixdp2400_init_irq(void) * IXDP2800 timer tick *************************************************************************/ -static void __init ixdp2800_init_time(void) +static void __init ixdp2800_timer_init(void) { ixp2000_init_time(50000000); } +static struct sys_timer ixdp2800_timer = { + .init = ixdp2800_timer_init, + .offset = ixp2000_gettimeoffset, +}; + /************************************************************************* * IXDP2800 PCI *************************************************************************/ @@ -172,7 +177,7 @@ MACHINE_START(IXDP2800, "Intel IXDP2800 Development Platform") BOOT_PARAMS(0x00000100) MAPIO(ixdp2x00_map_io) INITIRQ(ixdp2800_init_irq) - INITTIME(ixdp2800_init_time) + .timer = &ixdp2800_timer, INIT_MACHINE(ixdp2x00_init_machine) MACHINE_END diff --git a/arch/arm/mach-ixp2000/ixdp2x01.c b/arch/arm/mach-ixp2000/ixdp2x01.c index 176114aad5746..2ee38c352b1e6 100644 --- a/arch/arm/mach-ixp2000/ixdp2x01.c +++ b/arch/arm/mach-ixp2000/ixdp2x01.c @@ -193,7 +193,7 @@ static int __init ixdp2x01_clock_setup(char *str) __setup("ixdp2x01_clock=", ixdp2x01_clock_setup); -static void __init ixdp2x01_init_time(void) +static void __init ixdp2x01_timer_init(void) { if (!ixdp2x01_clock) ixdp2x01_clock = 50000000; @@ -201,6 +201,11 @@ static void __init ixdp2x01_init_time(void) ixp2000_init_time(ixdp2x01_clock); } +static struct sys_timer ixdp2x01_timer = { + .init = ixdp2x01_timer_init, + .offset = ixp2000_gettimeoffset, +}; + /************************************************************************* * IXDP2x01 PCI *************************************************************************/ @@ -361,7 +366,7 @@ MACHINE_START(IXDP2401, "Intel IXDP2401 Development Platform") BOOT_PARAMS(0x00000100) MAPIO(ixdp2x01_map_io) INITIRQ(ixdp2x01_init_irq) - INITTIME(ixdp2x01_init_time) + .timer = &ixdp2x01_timer, INIT_MACHINE(ixdp2x01_init_machine) MACHINE_END #endif @@ -373,7 +378,7 @@ MACHINE_START(IXDP2801, "Intel IXDP2801 Development Platform") BOOT_PARAMS(0x00000100) MAPIO(ixdp2x01_map_io) INITIRQ(ixdp2x01_init_irq) - INITTIME(ixdp2x01_init_time) + .timer = &ixdp2x01_timer, INIT_MACHINE(ixdp2x01_init_machine) MACHINE_END #endif diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c index 24ffa323895c0..9c6a01e6be5a5 100644 --- a/arch/arm/mach-ixp4xx/common.c +++ b/arch/arm/mach-ixp4xx/common.c @@ -241,10 +241,8 @@ static struct irqaction ixp4xx_timer_irq = { .handler = ixp4xx_timer_interrupt }; -void __init ixp4xx_init_time(void) +static void __init ixp4xx_timer_init(void) { - gettimeoffset = ixp4xx_gettimeoffset; - /* Clear Pending Interrupt by writing '1' to it */ *IXP4XX_OSST = IXP4XX_OSST_TIMER_1_PEND; @@ -259,4 +257,7 @@ void __init ixp4xx_init_time(void) setup_irq(IRQ_IXP4XX_TIMER1, &ixp4xx_timer_irq); } - +struct ixp4xx_timer = { + .init = ixp4xx_timer_init, + .offset = ixp4xx_gettimeoffset, +}; diff --git a/arch/arm/mach-ixp4xx/coyote-setup.c b/arch/arm/mach-ixp4xx/coyote-setup.c index 03ad0b71824cb..8fde6b9d55cc8 100644 --- a/arch/arm/mach-ixp4xx/coyote-setup.c +++ b/arch/arm/mach-ixp4xx/coyote-setup.c @@ -88,7 +88,7 @@ MACHINE_START(ADI_COYOTE, "ADI Engineering IXP4XX Coyote Development Platform") IXP4XX_PERIPHERAL_BASE_VIRT) MAPIO(coyote_map_io) INITIRQ(ixp4xx_init_irq) - INITTIME(ixp4xx_init_time) + .timer = &ixp4xx_timer, BOOT_PARAMS(0x0100) INIT_MACHINE(coyote_init) MACHINE_END diff --git a/arch/arm/mach-ixp4xx/ixdp425-setup.c b/arch/arm/mach-ixp4xx/ixdp425-setup.c index dbcaa464ba9c8..9c299f92ad45c 100644 --- a/arch/arm/mach-ixp4xx/ixdp425-setup.c +++ b/arch/arm/mach-ixp4xx/ixdp425-setup.c @@ -117,7 +117,7 @@ MACHINE_START(IXDP425, "Intel IXDP425 Development Platform") IXP4XX_PERIPHERAL_BASE_VIRT) MAPIO(ixdp425_map_io) INITIRQ(ixp4xx_init_irq) - INITTIME(ixp4xx_init_time) + .timer = &ixp4xx_timer, BOOT_PARAMS(0x0100) INIT_MACHINE(ixdp425_init) MACHINE_END @@ -128,7 +128,7 @@ MACHINE_START(IXCDP1100, "Intel IXCDP1100 Development Platform") IXP4XX_PERIPHERAL_BASE_VIRT) MAPIO(ixdp425_map_io) INITIRQ(ixp4xx_init_irq) - INITTIME(ixp4xx_init_time) + .timer = &ixp4xx_timer, BOOT_PARAMS(0x0100) INIT_MACHINE(ixdp425_init) MACHINE_END @@ -146,7 +146,7 @@ MACHINE_START(AVILA, "Gateworks Avila Network Platform") IXP4XX_PERIPHERAL_BASE_VIRT) MAPIO(ixdp425_map_io) INITIRQ(ixp4xx_init_irq) - INITTIME(ixp4xx_init_time) + .timer = &ixp4xx_timer, BOOT_PARAMS(0x0100) INIT_MACHINE(ixdp425_init) MACHINE_END diff --git a/arch/arm/mach-ixp4xx/prpmc1100-setup.c b/arch/arm/mach-ixp4xx/prpmc1100-setup.c index 01e98fda04dc4..199e454d1d3fd 100644 --- a/arch/arm/mach-ixp4xx/prpmc1100-setup.c +++ b/arch/arm/mach-ixp4xx/prpmc1100-setup.c @@ -88,7 +88,7 @@ MACHINE_START(PRPMC1100, "Motorola PrPMC1100") IXP4XX_PERIPHERAL_BASE_VIRT) MAPIO(prpmc1100_map_io) INITIRQ(ixp4xx_init_irq) - INITTIME(ixp4xx_init_time) + .timer = &ixp4xx_timer, BOOT_PARAMS(0x0100) INIT_MACHINE(prpmc1100_init) MACHINE_END diff --git a/arch/arm/mach-lh7a40x/arch-kev7a400.c b/arch/arm/mach-lh7a40x/arch-kev7a400.c index 6fa2a981ee805..e256ef81bd9e0 100644 --- a/arch/arm/mach-lh7a40x/arch-kev7a400.c +++ b/arch/arm/mach-lh7a40x/arch-kev7a400.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -21,11 +22,9 @@ #include #include -#include +#include "common.h" /* This function calls the board specific IRQ initialization function. */ -extern void lh7a400_init_irq (void); -extern void lh7a40x_init_time (void); static struct map_desc kev7a400_io_desc[] __initdata = { { IO_VIRT, IO_PHYS, IO_SIZE, MT_DEVICE }, @@ -109,5 +108,5 @@ MACHINE_START (KEV7A400, "Sharp KEV7a400") BOOT_PARAMS (0xc0000100) MAPIO (kev7a400_map_io) INITIRQ (lh7a400_init_irq) - INITTIME (lh7a40x_init_time) + .timer = &lh7a40x_timer, MACHINE_END diff --git a/arch/arm/mach-lh7a40x/arch-lpd7a40x.c b/arch/arm/mach-lh7a40x/arch-lpd7a40x.c index bd82bebce5cf5..f165a613fe236 100644 --- a/arch/arm/mach-lh7a40x/arch-lpd7a40x.c +++ b/arch/arm/mach-lh7a40x/arch-lpd7a40x.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -21,7 +22,7 @@ #include #include -#include +#include "common.h" static struct resource smc91x_resources[] = { [0] = { @@ -261,16 +262,13 @@ lpd7a400_map_io(void) #ifdef CONFIG_MACH_LPD7A400 -extern void lh7a400_init_irq (void); -extern void lh7a40x_init_time (void); - MACHINE_START (LPD7A400, "Logic Product Development LPD7A400-10") MAINTAINER ("Marc Singer") BOOT_MEM (0xc0000000, 0x80000000, io_p2v (0x80000000)) BOOT_PARAMS (0xc0000100) MAPIO (lpd7a400_map_io) INITIRQ (lh7a400_init_irq) - INITTIME (lh7a40x_init_time) + .timer = &lpd7a40x_timer, INIT_MACHINE (lpd7a40x_init) MACHINE_END @@ -278,16 +276,13 @@ MACHINE_END #ifdef CONFIG_MACH_LPD7A404 -extern void lh7a404_init_irq (void); -extern void lh7a40x_init_time (void); - MACHINE_START (LPD7A404, "Logic Product Development LPD7A404-10") MAINTAINER ("Marc Singer") BOOT_MEM (0xc0000000, 0x80000000, io_p2v (0x80000000)) BOOT_PARAMS (0xc0000100) MAPIO (lpd7a400_map_io) INITIRQ (lh7a404_init_irq) - INITTIME (lh7a40x_init_time) + .timer = &lpd7a40x_timer, INIT_MACHINE (lpd7a40x_init) MACHINE_END diff --git a/arch/arm/mach-lh7a40x/common.h b/arch/arm/mach-lh7a40x/common.h new file mode 100644 index 0000000000000..46df8131c0a39 --- /dev/null +++ b/arch/arm/mach-lh7a40x/common.h @@ -0,0 +1,9 @@ +/* + * linux/arch/arm/mach-lh7a40x/common.h + * + * Header file for common stuff. + */ +struct sys_timer; +extern struct sys_timer lh7a40x_timer; + +extern void lh7a400_init_irq (void); diff --git a/arch/arm/mach-lh7a40x/time.c b/arch/arm/mach-lh7a40x/time.c index f4943cacbaca4..bf7e0d53e3d01 100644 --- a/arch/arm/mach-lh7a40x/time.c +++ b/arch/arm/mach-lh7a40x/time.c @@ -20,6 +20,7 @@ #include #include +#include "common.h" #if HZ < 100 # define TIMER_CONTROL TIMER_CONTROL2 @@ -52,7 +53,7 @@ static struct irqaction lh7a40x_timer_irq = { .handler = lh7a40x_timer_interrupt }; -void __init lh7a40x_init_time(void) +static void __init lh7a40x_timer_init(void) { /* Stop/disable all timers */ TIMER_CONTROL1 = 0; @@ -65,3 +66,6 @@ void __init lh7a40x_init_time(void) TIMER_CONTROL = TIMER_MODE; } +struct sys_timer lh7a40x_timer = { + .init = &lh7a40x_timer, +}; diff --git a/arch/arm/mach-omap/board-generic.c b/arch/arm/mach-omap/board-generic.c index 03da924c77867..9a4ebc37060dc 100644 --- a/arch/arm/mach-omap/board-generic.c +++ b/arch/arm/mach-omap/board-generic.c @@ -30,8 +30,6 @@ #include "common.h" -extern void __init omap_init_time(void); - static void __init omap_generic_init_irq(void) { omap_init_irq(); @@ -118,5 +116,5 @@ MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710") MAPIO(omap_generic_map_io) INITIRQ(omap_generic_init_irq) INIT_MACHINE(omap_generic_init) - INITTIME(omap_init_time) + .timer = &omap_timer, MACHINE_END diff --git a/arch/arm/mach-omap/board-h2.c b/arch/arm/mach-omap/board-h2.c index 1441089d94fa0..04f0c347e3a30 100644 --- a/arch/arm/mach-omap/board-h2.c +++ b/arch/arm/mach-omap/board-h2.c @@ -35,8 +35,6 @@ #include "common.h" -extern void __init omap_init_time(void); - static struct map_desc h2_io_desc[] __initdata = { { OMAP1610_ETHR_BASE, OMAP1610_ETHR_START, OMAP1610_ETHR_SIZE,MT_DEVICE }, { OMAP1610_NOR_FLASH_BASE, OMAP1610_NOR_FLASH_START, OMAP1610_NOR_FLASH_SIZE, @@ -111,5 +109,5 @@ MACHINE_START(OMAP_H2, "TI-H2") MAPIO(h2_map_io) INITIRQ(h2_init_irq) INIT_MACHINE(h2_init) - INITTIME(omap_init_time) + .timer = &omap_timer, MACHINE_END diff --git a/arch/arm/mach-omap/board-h3.c b/arch/arm/mach-omap/board-h3.c index d573b0cdf4bb3..67145ea3d5417 100644 --- a/arch/arm/mach-omap/board-h3.c +++ b/arch/arm/mach-omap/board-h3.c @@ -32,8 +32,6 @@ #include #include "common.h" -extern void __init omap_init_time(void); - void h3_init_irq(void) { omap_init_irq(); @@ -86,5 +84,5 @@ MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board") MAPIO(h3_map_io) INITIRQ(h3_init_irq) INIT_MACHINE(h3_init) - INITTIME(omap_init_time) + .timer = &omap_timer, MACHINE_END diff --git a/arch/arm/mach-omap/board-innovator.c b/arch/arm/mach-omap/board-innovator.c index 8fd97e7af5497..4599bf428b1c5 100644 --- a/arch/arm/mach-omap/board-innovator.c +++ b/arch/arm/mach-omap/board-innovator.c @@ -33,8 +33,6 @@ #include "common.h" -extern void __init omap_init_time(void); - #ifdef CONFIG_ARCH_OMAP1510 extern int omap_gpio_init(void); @@ -203,5 +201,5 @@ MACHINE_START(OMAP_INNOVATOR, "TI-Innovator") MAPIO(innovator_map_io) INITIRQ(innovator_init_irq) INIT_MACHINE(innovator_init) - INITTIME(omap_init_time) + .timer = &omap_timer, MACHINE_END diff --git a/arch/arm/mach-omap/board-osk.c b/arch/arm/mach-omap/board-osk.c index 85d9a0ac33e32..d1679a26a0ece 100644 --- a/arch/arm/mach-omap/board-osk.c +++ b/arch/arm/mach-omap/board-osk.c @@ -41,8 +41,6 @@ #include "common.h" -extern void __init omap_init_time(void); - static struct map_desc osk5912_io_desc[] __initdata = { { OMAP_OSK_ETHR_BASE, OMAP_OSK_ETHR_START, OMAP_OSK_ETHR_SIZE,MT_DEVICE }, { OMAP_OSK_NOR_FLASH_BASE, OMAP_OSK_NOR_FLASH_START, OMAP_OSK_NOR_FLASH_SIZE, @@ -97,5 +95,5 @@ MACHINE_START(OMAP_OSK, "TI-OSK") MAPIO(osk_map_io) INITIRQ(osk_init_irq) INIT_MACHINE(osk_init) - INITTIME(omap_init_time) + .timer = &omap_timer, MACHINE_END diff --git a/arch/arm/mach-omap/board-perseus2.c b/arch/arm/mach-omap/board-perseus2.c index 95833f3b94232..e3e2f212a8a59 100644 --- a/arch/arm/mach-omap/board-perseus2.c +++ b/arch/arm/mach-omap/board-perseus2.c @@ -27,8 +27,6 @@ #include "common.h" -extern void __init omap_init_time(void); - void omap_perseus2_init_irq(void) { omap_init_irq(); @@ -115,5 +113,5 @@ MACHINE_START(OMAP_PERSEUS2, "OMAP730 Perseus2") MAPIO(omap_perseus2_map_io) INITIRQ(omap_perseus2_init_irq) INIT_MACHINE(omap_perseus2_init) - INITTIME(omap_init_time) + .timer = &omap_timer, MACHINE_END diff --git a/arch/arm/mach-omap/common.h b/arch/arm/mach-omap/common.h index 1cc559dd2f817..20fc6a79dd196 100644 --- a/arch/arm/mach-omap/common.h +++ b/arch/arm/mach-omap/common.h @@ -27,8 +27,9 @@ #ifndef __ARCH_ARM_MACH_OMAP_COMMON_H #define __ARCH_ARM_MACH_OMAP_COMMON_H +struct sys_timer; + extern void omap_map_io(void); +extern struct sys_timer omap_timer; #endif /* __ARCH_ARM_MACH_OMAP_COMMON_H */ - - diff --git a/arch/arm/mach-omap/time.c b/arch/arm/mach-omap/time.c index cb3c5d6f7be60..e960ee97fadd6 100644 --- a/arch/arm/mach-omap/time.c +++ b/arch/arm/mach-omap/time.c @@ -199,11 +199,9 @@ static struct irqaction omap_timer_irq = { .handler = omap_timer_interrupt }; -void __init omap_init_time(void) +static void __init omap_timer_init(void) { /* Since we don't call request_irq, we must init the structure */ - gettimeoffset = omap_gettimeoffset; - #ifdef OMAP1510_USE_32KHZ_TIMER timer32k_write(TIMER32k_CR, 0x0); timer32k_write(TIMER32k_TVR,TIMER32k_PERIOD); @@ -215,3 +213,7 @@ void __init omap_init_time(void) #endif } +struct sys_timer omap_timer = { + .init = omap_timer_init, + .offset = omap_gettimeoffset, +}; diff --git a/arch/arm/mach-pxa/generic.h b/arch/arm/mach-pxa/generic.h index f542ef4e7e383..e54a8dd63c17d 100644 --- a/arch/arm/mach-pxa/generic.h +++ b/arch/arm/mach-pxa/generic.h @@ -9,9 +9,11 @@ * published by the Free Software Foundation. */ +struct sys_timer; + +extern struct sys_timer pxa_timer; extern void __init pxa_map_io(void); extern void __init pxa_init_irq(void); -extern void __init pxa_init_time(void); extern unsigned int get_clk_frequency_khz(int info); diff --git a/arch/arm/mach-pxa/idp.c b/arch/arm/mach-pxa/idp.c index 6f8b4873e788c..4333a0f19b327 100644 --- a/arch/arm/mach-pxa/idp.c +++ b/arch/arm/mach-pxa/idp.c @@ -119,6 +119,6 @@ MACHINE_START(PXA_IDP, "Accelent Xscale IDP") BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000)) MAPIO(idp_map_io) INITIRQ(idp_init_irq) - INITTIME(pxa_init_time) + .timer = &pxa_timer, INIT_MACHINE(idp_init) MACHINE_END diff --git a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c index a09d4c11b4cb4..dac8de8d3b6ac 100644 --- a/arch/arm/mach-pxa/lubbock.c +++ b/arch/arm/mach-pxa/lubbock.c @@ -38,6 +38,8 @@ #include "generic.h" +#define LUB_MISC_WR __LUB_REG(LUBBOCK_FPGA_PHYS + 0x080) + void lubbock_set_misc_wr(unsigned int mask, unsigned int set) { unsigned long flags; @@ -221,6 +223,6 @@ MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform (aka Lubbock)") BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000)) MAPIO(lubbock_map_io) INITIRQ(lubbock_init_irq) - INITTIME(pxa_init_time) + .timer = &pxa_timer, INIT_MACHINE(lubbock_init) MACHINE_END diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c index 219fd4ecdb629..d57920f58d699 100644 --- a/arch/arm/mach-pxa/mainstone.c +++ b/arch/arm/mach-pxa/mainstone.c @@ -198,6 +198,6 @@ MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)") BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000)) MAPIO(mainstone_map_io) INITIRQ(mainstone_init_irq) - INITTIME(pxa_init_time) + .timer = &pxa_timer, INIT_MACHINE(mainstone_init) MACHINE_END diff --git a/arch/arm/mach-pxa/time.c b/arch/arm/mach-pxa/time.c index a49fc02994795..45a5c10246675 100644 --- a/arch/arm/mach-pxa/time.c +++ b/arch/arm/mach-pxa/time.c @@ -105,11 +105,10 @@ static struct irqaction pxa_timer_irq = { .handler = pxa_timer_interrupt }; -void __init pxa_init_time(void) +static void __init pxa_timer_init(void) { struct timespec tv; - gettimeoffset = pxa_gettimeoffset; set_rtc = pxa_set_rtc; tv.tv_nsec = 0; @@ -123,3 +122,22 @@ void __init pxa_init_time(void) OSCR = 0; /* initialize free-running timer, force first match */ } +#ifdef CONFIG_PM +static void pxa_timer_suspend(void) +{ +} + +static void pxa_timer_resume(void) +{ +} +#else +#define pxa_timer_suspend NULL +#define pxa_timer_resume NULL +#endif + +struct sys_timer pxa_timer = { + .init = pxa_timer_init, + .suspend = pxa_timer_suspend, + .resume = pxa_timer_resume, + .offset = pxa_gettimeoffset, +}; diff --git a/arch/arm/mach-rpc/riscpc.c b/arch/arm/mach-rpc/riscpc.c index d5a1a3af216c6..65714769b02d6 100644 --- a/arch/arm/mach-rpc/riscpc.c +++ b/arch/arm/mach-rpc/riscpc.c @@ -15,7 +15,6 @@ #include #include #include -#include #include #include @@ -85,30 +84,7 @@ void __init rpc_map_io(void) elf_hwcap &= ~HWCAP_HALF; } -static irqreturn_t -rpc_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) -{ - timer_tick(regs); - - return IRQ_HANDLED; -} - -static struct irqaction rpc_timer_irq = { - .name = "RiscPC Timer Tick", - .flags = SA_INTERRUPT, - .handler = rpc_timer_interrupt -}; - -/* - * Set up timer interrupt. - */ -void __init rpc_init_time(void) -{ - extern void ioctime_init(void); - ioctime_init(); - - setup_irq(IRQ_TIMER, &rpc_timer_irq); -} +extern struct sys_timer ioc_timer; MACHINE_START(RISCPC, "Acorn-RiscPC") MAINTAINER("Russell King") @@ -118,5 +94,5 @@ MACHINE_START(RISCPC, "Acorn-RiscPC") DISABLE_PARPORT(1) MAPIO(rpc_map_io) INITIRQ(rpc_init_irq) - INITTIME(rpc_init_time) + .timer = &ioc_timer, MACHINE_END diff --git a/arch/arm/mach-s3c2410/mach-bast.c b/arch/arm/mach-s3c2410/mach-bast.c index f7526690751e0..0a5a1a340755e 100644 --- a/arch/arm/mach-s3c2410/mach-bast.c +++ b/arch/arm/mach-s3c2410/mach-bast.c @@ -225,16 +225,11 @@ void __init bast_init_irq(void) s3c2410_init_irq(); } -void __init bast_init_time(void) -{ - s3c2410_init_time(); -} - MACHINE_START(BAST, "Simtec-BAST") MAINTAINER("Ben Dooks ") BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, S3C2410_VA_UART) BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100) MAPIO(bast_map_io) INITIRQ(bast_init_irq) - INITTIME(bast_init_time) + .timer = &s3c2410_timer, MACHINE_END diff --git a/arch/arm/mach-s3c2410/mach-h1940.c b/arch/arm/mach-s3c2410/mach-h1940.c index 397c546b7c6a1..0549019aff82e 100644 --- a/arch/arm/mach-s3c2410/mach-h1940.c +++ b/arch/arm/mach-s3c2410/mach-h1940.c @@ -109,16 +109,11 @@ void __init h1940_init_irq(void) } -void __init h1940_init_time(void) -{ - s3c2410_init_time(); -} - MACHINE_START(H1940, "IPAQ-H1940") MAINTAINER("Ben Dooks ") BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, S3C2410_VA_UART) BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100) MAPIO(h1940_map_io) INITIRQ(h1940_init_irq) - INITTIME(h1940_init_time) + .timer = &s3c2410_timer, MACHINE_END diff --git a/arch/arm/mach-s3c2410/mach-smdk2410.c b/arch/arm/mach-s3c2410/mach-smdk2410.c index 9f4286569cddc..81d2d0aff5118 100644 --- a/arch/arm/mach-s3c2410/mach-smdk2410.c +++ b/arch/arm/mach-s3c2410/mach-smdk2410.c @@ -113,11 +113,6 @@ void __init smdk2410_init_irq(void) s3c2410_init_irq(); } -void __init smdk2410_init_time(void) -{ - s3c2410_init_time(); -} - MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch * to SMDK2410 */ MAINTAINER("Jonas Dietsche") @@ -125,7 +120,7 @@ MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switc BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100) MAPIO(smdk2410_map_io) INITIRQ(smdk2410_init_irq) - INITTIME(smdk2410_init_time) + .timer = &s3c2410_timer, MACHINE_END diff --git a/arch/arm/mach-s3c2410/mach-vr1000.c b/arch/arm/mach-s3c2410/mach-vr1000.c index 4a07a40cce85c..dc5824635d995 100644 --- a/arch/arm/mach-s3c2410/mach-vr1000.c +++ b/arch/arm/mach-s3c2410/mach-vr1000.c @@ -170,16 +170,11 @@ void __init vr1000_init_irq(void) s3c2410_init_irq(); } -void __init vr1000_init_time(void) -{ - s3c2410_init_time(); -} - MACHINE_START(VR1000, "Thorcom-VR1000") MAINTAINER("Ben Dooks ") BOOT_MEM(S3C2410_SDRAM_PA, S3C2410_PA_UART, S3C2410_VA_UART) BOOT_PARAMS(S3C2410_SDRAM_PA + 0x100) MAPIO(vr1000_map_io) INITIRQ(vr1000_init_irq) - INITTIME(vr1000_init_time) + .timer = &s3c2410_timer, MACHINE_END diff --git a/arch/arm/mach-s3c2410/s3c2410.h b/arch/arm/mach-s3c2410/s3c2410.h index 09742c9bc5b49..55234af680948 100644 --- a/arch/arm/mach-s3c2410/s3c2410.h +++ b/arch/arm/mach-s3c2410/s3c2410.h @@ -19,7 +19,8 @@ extern void s3c2410_map_io(struct map_desc *, int count); extern void s3c2410_init_irq(void); -extern void s3c2410_init_time(void); +struct sys_timer; +extern struct sys_timer s3c2410_timer; /* the board structure is used at first initialsation time * to get info such as the devices to register for this diff --git a/arch/arm/mach-s3c2410/time.c b/arch/arm/mach-s3c2410/time.c index 04ba5dfe02d07..262228a52c7b3 100644 --- a/arch/arm/mach-s3c2410/time.c +++ b/arch/arm/mach-s3c2410/time.c @@ -104,15 +104,13 @@ static struct irqaction s3c2410_timer_irq = { * Currently we only use timer4, as it is the only timer which has no * other function that can be exploited externally */ -void __init s3c2410_init_time (void) +static void __init s3c2410_timer_init (void) { unsigned long tcon; unsigned long tcnt; unsigned long tcfg1; unsigned long tcfg0; - gettimeoffset = s3c2410_gettimeoffset; - tcnt = 0xffff; /* default value for tcnt */ /* read the current timer configuration bits */ @@ -185,5 +183,7 @@ void __init s3c2410_init_time (void) __raw_writel(tcon, S3C2410_TCON); } - - +struct sys_timer s3c2410_timer = { + .init = s3c2410_timer_init, + .offset = s3c2410_gettimeoffset, +}; diff --git a/arch/arm/mach-sa1100/adsbitsy.c b/arch/arm/mach-sa1100/adsbitsy.c index 53f990e7d6158..2cb5af8d6101c 100644 --- a/arch/arm/mach-sa1100/adsbitsy.c +++ b/arch/arm/mach-sa1100/adsbitsy.c @@ -147,5 +147,5 @@ MACHINE_START(ADSBITSY, "ADS Bitsy") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) MAPIO(adsbitsy_map_io) INITIRQ(adsbitsy_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c index e5098cf9c2e99..426ef6edaadec 100644 --- a/arch/arm/mach-sa1100/assabet.c +++ b/arch/arm/mach-sa1100/assabet.c @@ -324,6 +324,6 @@ MACHINE_START(ASSABET, "Intel-Assabet") FIXUP(fixup_assabet) MAPIO(assabet_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, INIT_MACHINE(assabet_init) MACHINE_END diff --git a/arch/arm/mach-sa1100/badge4.c b/arch/arm/mach-sa1100/badge4.c index cef71047ccb77..4a1198efe22d5 100644 --- a/arch/arm/mach-sa1100/badge4.c +++ b/arch/arm/mach-sa1100/badge4.c @@ -245,5 +245,5 @@ MACHINE_START(BADGE4, "Hewlett-Packard Laboratories BadgePAD 4") BOOT_PARAMS(0xc0000100) MAPIO(badge4_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/brutus.c b/arch/arm/mach-sa1100/brutus.c index 925bf0e59fe88..b081a21333f26 100644 --- a/arch/arm/mach-sa1100/brutus.c +++ b/arch/arm/mach-sa1100/brutus.c @@ -37,5 +37,5 @@ MACHINE_START(BRUTUS, "Intel Brutus (SA1100 eval board)") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) MAPIO(brutus_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/cerf.c b/arch/arm/mach-sa1100/cerf.c index 2c4c05013cc9f..6e8fcaaa95589 100644 --- a/arch/arm/mach-sa1100/cerf.c +++ b/arch/arm/mach-sa1100/cerf.c @@ -92,5 +92,5 @@ MACHINE_START(CERF, "Intrinsyc CerfBoard/CerfCube") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) MAPIO(cerf_map_io) INITIRQ(cerf_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/collie.c b/arch/arm/mach-sa1100/collie.c index 23bf73ef8efee..0fc15bd376f76 100644 --- a/arch/arm/mach-sa1100/collie.c +++ b/arch/arm/mach-sa1100/collie.c @@ -141,5 +141,5 @@ MACHINE_START(COLLIE, "Sharp-Collie") MAPIO(collie_map_io) INITIRQ(sa1100_init_irq) INIT_MACHINE(collie_init) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/empeg.c b/arch/arm/mach-sa1100/empeg.c index 6ab57cdb01821..817beb781eec8 100644 --- a/arch/arm/mach-sa1100/empeg.c +++ b/arch/arm/mach-sa1100/empeg.c @@ -35,5 +35,5 @@ MACHINE_START(EMPEG, "empeg MP3 Car Audio Player") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) MAPIO(empeg_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/flexanet.c b/arch/arm/mach-sa1100/flexanet.c index 370df9f773cf6..167e76d0fec6e 100644 --- a/arch/arm/mach-sa1100/flexanet.c +++ b/arch/arm/mach-sa1100/flexanet.c @@ -183,6 +183,6 @@ MACHINE_START(FLEXANET, "FlexaNet") BOOT_PARAMS(0xc0000100) MAPIO(flexanet_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/freebird.c b/arch/arm/mach-sa1100/freebird.c index abd27aef72f90..39bd2956f8796 100644 --- a/arch/arm/mach-sa1100/freebird.c +++ b/arch/arm/mach-sa1100/freebird.c @@ -77,5 +77,5 @@ MACHINE_START(FREEBIRD, "Freebird-HPC-1.1") #endif MAPIO(freebird_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/generic.h b/arch/arm/mach-sa1100/generic.h index 04bcfeb3b8a12..ccbef3be58395 100644 --- a/arch/arm/mach-sa1100/generic.h +++ b/arch/arm/mach-sa1100/generic.h @@ -4,9 +4,11 @@ * Author: Nicolas Pitre */ +struct sys_timer; + +extern struct sys_timer sa1100_timer; extern void __init sa1100_map_io(void); extern void __init sa1100_init_irq(void); -extern void __init sa1100_init_time(void); #define SET_BANK(__nr,__start,__size) \ mi->bank[__nr].start = (__start), \ diff --git a/arch/arm/mach-sa1100/graphicsclient.c b/arch/arm/mach-sa1100/graphicsclient.c index 2f628adbda2cf..78b2070cd1a44 100644 --- a/arch/arm/mach-sa1100/graphicsclient.c +++ b/arch/arm/mach-sa1100/graphicsclient.c @@ -198,5 +198,5 @@ MACHINE_START(GRAPHICSCLIENT, "ADS GraphicsClient") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) MAPIO(graphicsclient_map_io) INITIRQ(graphicsclient_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/graphicsmaster.c b/arch/arm/mach-sa1100/graphicsmaster.c index 7f1cfd18eacac..c5635f2f04784 100644 --- a/arch/arm/mach-sa1100/graphicsmaster.c +++ b/arch/arm/mach-sa1100/graphicsmaster.c @@ -287,5 +287,5 @@ MACHINE_START(GRAPHICSMASTER, "ADS GraphicsMaster") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) MAPIO(graphicsmaster_map_io) INITIRQ(graphicsmaster_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/h3600.c b/arch/arm/mach-sa1100/h3600.c index 54ab444524018..93c103bd51065 100644 --- a/arch/arm/mach-sa1100/h3600.c +++ b/arch/arm/mach-sa1100/h3600.c @@ -286,7 +286,7 @@ MACHINE_START(H3100, "Compaq iPAQ H3100") BOOT_PARAMS(0xc0000100) MAPIO(h3100_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END #endif /* CONFIG_SA1100_H3100 */ @@ -401,7 +401,7 @@ MACHINE_START(H3600, "Compaq iPAQ H3600") BOOT_PARAMS(0xc0000100) MAPIO(h3600_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END #endif /* CONFIG_SA1100_H3600 */ @@ -785,7 +785,7 @@ MACHINE_START(H3800, "Compaq iPAQ H3800") BOOT_PARAMS(0xc0000100) MAPIO(h3800_map_io) INITIRQ(h3800_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END #endif /* CONFIG_SA1100_H3800 */ diff --git a/arch/arm/mach-sa1100/hackkit.c b/arch/arm/mach-sa1100/hackkit.c index e24be9716ba48..82024e64ae02d 100644 --- a/arch/arm/mach-sa1100/hackkit.c +++ b/arch/arm/mach-sa1100/hackkit.c @@ -174,5 +174,5 @@ MACHINE_START(HACKKIT, "HackKit Cpu Board") BOOT_PARAMS(0xc0000100) MAPIO(hackkit_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/huw_webpanel.c b/arch/arm/mach-sa1100/huw_webpanel.c index 771b106202496..d33be4fb31930 100644 --- a/arch/arm/mach-sa1100/huw_webpanel.c +++ b/arch/arm/mach-sa1100/huw_webpanel.c @@ -81,5 +81,5 @@ MACHINE_START(HUW_WEBPANEL, "HuW-Webpanel") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) MAPIO(huw_webpanel_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/itsy.c b/arch/arm/mach-sa1100/itsy.c index a4af8d58867d8..6692ae2a2039d 100644 --- a/arch/arm/mach-sa1100/itsy.c +++ b/arch/arm/mach-sa1100/itsy.c @@ -37,5 +37,5 @@ MACHINE_START(ITSY, "Compaq Itsy") BOOT_PARAMS(0xc0000100) MAPIO(itsy_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/jornada720.c b/arch/arm/mach-sa1100/jornada720.c index 8943e816a1806..6be78291a8783 100644 --- a/arch/arm/mach-sa1100/jornada720.c +++ b/arch/arm/mach-sa1100/jornada720.c @@ -101,5 +101,5 @@ MACHINE_START(JORNADA720, "HP Jornada 720") BOOT_PARAMS(0xc0000100) MAPIO(jornada720_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/lart.c b/arch/arm/mach-sa1100/lart.c index 34ab20118c706..34cc31b38ca1b 100644 --- a/arch/arm/mach-sa1100/lart.c +++ b/arch/arm/mach-sa1100/lart.c @@ -43,5 +43,5 @@ MACHINE_START(LART, "LART") BOOT_PARAMS(0xc0000100) MAPIO(lart_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/nanoengine.c b/arch/arm/mach-sa1100/nanoengine.c index 84c870c3de498..2d737337b1c73 100644 --- a/arch/arm/mach-sa1100/nanoengine.c +++ b/arch/arm/mach-sa1100/nanoengine.c @@ -49,5 +49,5 @@ MACHINE_START(NANOENGINE, "BSE nanoEngine") FIXUP(fixup_nanoengine) MAPIO(nanoengine_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/omnimeter.c b/arch/arm/mach-sa1100/omnimeter.c index 1533fc0ff51cc..69c0aba731050 100644 --- a/arch/arm/mach-sa1100/omnimeter.c +++ b/arch/arm/mach-sa1100/omnimeter.c @@ -59,5 +59,5 @@ MACHINE_START(OMNIMETER, "OmniMeter") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) MAPIO(omnimeter_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/pangolin.c b/arch/arm/mach-sa1100/pangolin.c index 29922dd70e412..c8dd1f2b9295e 100644 --- a/arch/arm/mach-sa1100/pangolin.c +++ b/arch/arm/mach-sa1100/pangolin.c @@ -40,5 +40,5 @@ MACHINE_START(PANGOLIN, "Dialogue-Pangolin") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) MAPIO(pangolin_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/pfs168.c b/arch/arm/mach-sa1100/pfs168.c index 04088629f4c70..3bef620ed95a4 100644 --- a/arch/arm/mach-sa1100/pfs168.c +++ b/arch/arm/mach-sa1100/pfs168.c @@ -112,5 +112,5 @@ MACHINE_START(PFS168, "Tulsa") BOOT_PARAMS(0xc0000100) MAPIO(pfs168_map_io) INITIRQ(pfs168_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/pleb.c b/arch/arm/mach-sa1100/pleb.c index 2cdfef622c258..52b965e755725 100644 --- a/arch/arm/mach-sa1100/pleb.c +++ b/arch/arm/mach-sa1100/pleb.c @@ -31,5 +31,5 @@ MACHINE_START(PLEB, "PLEB") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) MAPIO(pleb_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/shannon.c b/arch/arm/mach-sa1100/shannon.c index 8bec82676a3b1..fb98b4606c858 100644 --- a/arch/arm/mach-sa1100/shannon.c +++ b/arch/arm/mach-sa1100/shannon.c @@ -41,5 +41,5 @@ MACHINE_START(SHANNON, "Shannon (AKA: Tuxscreen)") BOOT_PARAMS(0xc0000100) MAPIO(shannon_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/sherman.c b/arch/arm/mach-sa1100/sherman.c index 2e66fbadf16fd..10fc0fdfe2fc3 100644 --- a/arch/arm/mach-sa1100/sherman.c +++ b/arch/arm/mach-sa1100/sherman.c @@ -27,5 +27,5 @@ MACHINE_START(SHERMAN, "Blazie Engineering Sherman") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) MAPIO(sherman_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/simpad.c b/arch/arm/mach-sa1100/simpad.c index b73ec2e18eb00..8a88d2887588f 100644 --- a/arch/arm/mach-sa1100/simpad.c +++ b/arch/arm/mach-sa1100/simpad.c @@ -231,5 +231,5 @@ MACHINE_START(SIMPAD, "Simpad") BOOT_PARAMS(0xc0000100) MAPIO(simpad_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/stork.c b/arch/arm/mach-sa1100/stork.c index f3b3a6eb8c09d..8584f3fa5f602 100644 --- a/arch/arm/mach-sa1100/stork.c +++ b/arch/arm/mach-sa1100/stork.c @@ -331,7 +331,7 @@ MACHINE_START(STORK, "Stork Technologies prototype") BOOT_PARAMS(0xc0000100) MAPIO(stork_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/system3.c b/arch/arm/mach-sa1100/system3.c index 76e7d36e71bcb..bccc1aa685332 100644 --- a/arch/arm/mach-sa1100/system3.c +++ b/arch/arm/mach-sa1100/system3.c @@ -470,5 +470,5 @@ MACHINE_START(PT_SYSTEM3, "PT System 3") BOOT_PARAMS(0xc0000100) MAPIO(system3_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/time.c b/arch/arm/mach-sa1100/time.c index 1c3d082f8d491..4137e0c4682c3 100644 --- a/arch/arm/mach-sa1100/time.c +++ b/arch/arm/mach-sa1100/time.c @@ -99,11 +99,10 @@ static struct irqaction sa1100_timer_irq = { .handler = sa1100_timer_interrupt }; -void __init sa1100_init_time(void) +static void __init sa1100_timer_init(void) { struct timespec tv; - gettimeoffset = sa1100_gettimeoffset; set_rtc = sa1100_set_rtc; tv.tv_nsec = 0; @@ -117,3 +116,22 @@ void __init sa1100_init_time(void) OSCR = 0; /* initialize free-running timer, force first match */ } +#ifdef CONFIG_PM +static void sa1100_timer_suspend(void) +{ +} + +static void sa1100_timer_resume(void) +{ +} +#else +#define sa1100_timer_suspend NULL +#define sa1100_timer_resume NULL +#endif + +struct sys_timer sa1100_timer = { + .init = sa1100_timer_init, + .suspend = sa1100_timer_suspend, + .resume = sa1100_timer_resume, + .offset = sa1100_gettimeoffset, +}; diff --git a/arch/arm/mach-sa1100/trizeps.c b/arch/arm/mach-sa1100/trizeps.c index f3f1682ecd34a..8012c554b09a4 100644 --- a/arch/arm/mach-sa1100/trizeps.c +++ b/arch/arm/mach-sa1100/trizeps.c @@ -228,5 +228,5 @@ MACHINE_START(TRIZEPS, "TRIZEPS") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) MAPIO(trizeps_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/xp860.c b/arch/arm/mach-sa1100/xp860.c index ab2a523c3b146..8347ad2931b35 100644 --- a/arch/arm/mach-sa1100/xp860.c +++ b/arch/arm/mach-sa1100/xp860.c @@ -89,5 +89,5 @@ MACHINE_START(XP860, "XP860") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) MAPIO(xp860_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-sa1100/yopy.c b/arch/arm/mach-sa1100/yopy.c index 46e447fc87d9b..ec17aa0bdf169 100644 --- a/arch/arm/mach-sa1100/yopy.c +++ b/arch/arm/mach-sa1100/yopy.c @@ -91,5 +91,5 @@ MACHINE_START(YOPY, "Yopy") BOOT_PARAMS(0xc0000100) MAPIO(yopy_map_io) INITIRQ(sa1100_init_irq) - INITTIME(sa1100_init_time) + .timer = &sa1100_timer, MACHINE_END diff --git a/arch/arm/mach-shark/core.c b/arch/arm/mach-shark/core.c index e4ae688899c12..e18f47addbf7e 100644 --- a/arch/arm/mach-shark/core.c +++ b/arch/arm/mach-shark/core.c @@ -49,7 +49,7 @@ static struct irqaction shark_timer_irq = { /* * Set up timer interrupt, and return the current time in seconds. */ -void __init shark_init_time(void) +static void __init shark_timer_init(void) { unsigned long flags; @@ -60,6 +60,9 @@ void __init shark_init_time(void) setup_irq(IRQ_TIMER, &shark_timer_irq); } +static struct sys_timer shark_timer = { + .init = shark_timer_init, +}; MACHINE_START(SHARK, "Shark") MAINTAINER("Alexander Schulz") @@ -67,5 +70,5 @@ MACHINE_START(SHARK, "Shark") BOOT_PARAMS(0x08003000) MAPIO(shark_map_io) INITIRQ(shark_init_irq) - INITTIME(shark_init_time) + .timer = &shark_timer, MACHINE_END diff --git a/arch/arm/mach-versatile/core.c b/arch/arm/mach-versatile/core.c index 239d9897d6745..e83b1be80e3e1 100644 --- a/arch/arm/mach-versatile/core.c +++ b/arch/arm/mach-versatile/core.c @@ -760,8 +760,6 @@ typedef struct TimerStruct { unsigned long TimerClear; } TimerStruct_t; -extern unsigned long (*gettimeoffset)(void); - /* * Returns number of ms since last clock interrupt. Note that interrupts * will have been disabled by do_gettimeoffset() @@ -827,7 +825,7 @@ static struct irqaction versatile_timer_irq = { /* * Set up timer interrupt, and return the current time in seconds. */ -void __init versatile_init_time(void) +static void __init versatile_timer_init(void) { volatile TimerStruct_t *timer0 = (volatile TimerStruct_t *)TIMER0_VA_BASE; volatile TimerStruct_t *timer1 = (volatile TimerStruct_t *)TIMER1_VA_BASE; @@ -859,15 +857,19 @@ void __init versatile_init_time(void) * Make irqs happen for the system timer */ setup_irq(IRQ_TIMERINT0_1, &versatile_timer_irq); - gettimeoffset = versatile_gettimeoffset; } +static struct sys_timer versatile_timer = { + .init = versatile_timer_init, + .offset = versatile_gettimeoffset, +}; + MACHINE_START(VERSATILE_PB, "ARM-Versatile PB") MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd") BOOT_MEM(0x00000000, 0x101f1000, 0xf11f1000) BOOT_PARAMS(0x00000100) MAPIO(versatile_map_io) INITIRQ(versatile_init_irq) - INITTIME(versatile_init_time) + .timer = &versatile_timer, INIT_MACHINE(versatile_init) MACHINE_END diff --git a/include/asm-arm/arch-integrator/platform.h b/include/asm-arm/arch-integrator/platform.h index 09ec7902f4bfe..6b67e41669f4d 100644 --- a/include/asm-arm/arch-integrator/platform.h +++ b/include/asm-arm/arch-integrator/platform.h @@ -457,10 +457,6 @@ #define mSEC_25 (mSEC_1 * 25) #define SEC_1 (mSEC_1 * 1000) -#ifndef __ASSEMBLY__ -extern void integrator_time_init(unsigned long, unsigned int); -#endif - #define INTEGRATOR_CSR_BASE 0x10000000 #define INTEGRATOR_CSR_SIZE 0x10000000 diff --git a/include/asm-arm/arch-integrator/time.h b/include/asm-arm/arch-integrator/time.h index 2ecbfa7f12597..e69de29bb2d1d 100644 --- a/include/asm-arm/arch-integrator/time.h +++ b/include/asm-arm/arch-integrator/time.h @@ -1,156 +0,0 @@ -/* - * linux/include/asm-arm/arch-integrator/time.h - * - * 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#include - -/* - * Where is the timer (VA)? - */ -#define TIMER0_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000000) -#define TIMER1_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000100) -#define TIMER2_VA_BASE (IO_ADDRESS(INTEGRATOR_CT_BASE)+0x00000200) -#define VA_IC_BASE IO_ADDRESS(INTEGRATOR_IC_BASE) - -/* - * How long is the timer interval? - */ -#define TIMER_INTERVAL (TICKS_PER_uSEC * mSEC_10) -#if TIMER_INTERVAL >= 0x100000 -#define TICKS2USECS(x) (256 * (x) / TICKS_PER_uSEC) -#elif TIMER_INTERVAL >= 0x10000 -#define TICKS2USECS(x) (16 * (x) / TICKS_PER_uSEC) -#else -#define TICKS2USECS(x) ((x) / TICKS_PER_uSEC) -#endif - -#define TIMER_CTRL_IE (1 << 5) /* Interrupt Enable */ - -/* - * What does it look like? - */ -typedef struct TimerStruct { - unsigned long TimerLoad; - unsigned long TimerValue; - unsigned long TimerControl; - unsigned long TimerClear; -} TimerStruct_t; - -extern unsigned long (*gettimeoffset)(void); - -static unsigned long timer_reload; - -/* - * Returns number of ms since last clock interrupt. Note that interrupts - * will have been disabled by do_gettimeoffset() - */ -static unsigned long integrator_gettimeoffset(void) -{ - volatile TimerStruct_t *timer1 = (TimerStruct_t *)TIMER1_VA_BASE; - unsigned long ticks1, ticks2, status; - - /* - * Get the current number of ticks. Note that there is a race - * condition between us reading the timer and checking for - * an interrupt. We get around this by ensuring that the - * counter has not reloaded between our two reads. - */ - ticks2 = timer1->TimerValue & 0xffff; - do { - ticks1 = ticks2; - status = __raw_readl(VA_IC_BASE + IRQ_RAW_STATUS); - ticks2 = timer1->TimerValue & 0xffff; - } while (ticks2 > ticks1); - - /* - * Number of ticks since last interrupt. - */ - ticks1 = timer_reload - ticks2; - - /* - * Interrupt pending? If so, we've reloaded once already. - */ - if (status & (1 << IRQ_TIMERINT1)) - ticks1 += timer_reload; - - /* - * Convert the ticks to usecs - */ - return TICKS2USECS(ticks1); -} - -/* - * IRQ handler for the timer - */ -static irqreturn_t -integrator_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) -{ - volatile TimerStruct_t *timer1 = (volatile TimerStruct_t *)TIMER1_VA_BASE; - - // ...clear the interrupt - timer1->TimerClear = 1; - - do_leds(); - do_timer(regs); - do_profile(regs); - - return IRQ_HANDLED; -} - -/* - * Set up timer interrupt, and return the current time in seconds. - */ -void __init time_init(void) -{ - volatile TimerStruct_t *timer0 = (volatile TimerStruct_t *)TIMER0_VA_BASE; - volatile TimerStruct_t *timer1 = (volatile TimerStruct_t *)TIMER1_VA_BASE; - volatile TimerStruct_t *timer2 = (volatile TimerStruct_t *)TIMER2_VA_BASE; - unsigned int timer_ctrl = 0x80 | 0x40; /* periodic */ - - if (machine_is_integrator()) { - timer_reload = 1000000 * TICKS_PER_uSEC / HZ; - } else if (machine_is_cintegrator()) { - timer_reload = 1000000 / HZ; - timer_ctrl |= TIMER_CTRL_IE; - } - if (timer_reload > 0x100000) { - timer_reload >>= 8; - timer_ctrl |= 0x08; /* /256 */ - } else if (timer_reload > 0x010000) { - timer_reload >>= 4; - timer_ctrl |= 0x04; /* /16 */ - } - - /* - * Initialise to a known state (all timers off) - */ - timer0->TimerControl = 0; - timer1->TimerControl = 0; - timer2->TimerControl = 0; - - timer1->TimerLoad = timer_reload; - timer1->TimerValue = timer_reload; - timer1->TimerControl = timer_ctrl; - - /* - * Make irqs happen for the system timer - */ - timer_irq.handler = integrator_timer_interrupt; - setup_irq(IRQ_TIMERINT1, &timer_irq); - gettimeoffset = integrator_gettimeoffset; -} diff --git a/include/asm-arm/arch-ixp2000/platform.h b/include/asm-arm/arch-ixp2000/platform.h index 9f4e315d5f1c3..7a24461841b79 100644 --- a/include/asm-arm/arch-ixp2000/platform.h +++ b/include/asm-arm/arch-ixp2000/platform.h @@ -117,6 +117,7 @@ static inline unsigned int ixp2000_is_pcimaster(void) void ixp2000_map_io(void); void ixp2000_init_irq(void); void ixp2000_init_time(unsigned long); +unsigned long ixp2000_gettimeoffset(void); struct pci_sys_data; diff --git a/include/asm-arm/arch-ixp4xx/platform.h b/include/asm-arm/arch-ixp4xx/platform.h index b8ea57968d4a7..fc9d710184f39 100644 --- a/include/asm-arm/arch-ixp4xx/platform.h +++ b/include/asm-arm/arch-ixp4xx/platform.h @@ -53,12 +53,14 @@ struct ixp4xx_i2c_pins { }; +struct sys_timer; + /* * Functions used by platform-level setup code */ extern void ixp4xx_map_io(void); extern void ixp4xx_init_irq(void); -extern void ixp4xx_init_time(void); +extern struct sys_timer ixp4xx_timer; extern void ixp4xx_pci_preinit(void); struct pci_sys_data; extern int ixp4xx_setup(int nr, struct pci_sys_data *sys); diff --git a/include/asm-arm/mach/arch.h b/include/asm-arm/mach/arch.h index 5c37b709fe9f4..993467c37b5bd 100644 --- a/include/asm-arm/mach/arch.h +++ b/include/asm-arm/mach/arch.h @@ -12,6 +12,7 @@ struct tag; struct meminfo; +struct sys_timer; struct machine_desc { /* @@ -39,7 +40,7 @@ struct machine_desc { struct meminfo *); void (*map_io)(void);/* IO mapping function */ void (*init_irq)(void); - void (*init_time)(void); + struct sys_timer *timer; /* system tick timer */ void (*init_machine)(void); }; @@ -82,9 +83,6 @@ const struct machine_desc __mach_desc_##_type \ #define INITIRQ(_func) \ .init_irq = _func, -#define INITTIME(_func) \ - .init_time = _func, - #define INIT_MACHINE(_func) \ .init_machine = _func, diff --git a/include/asm-arm/mach/time.h b/include/asm-arm/mach/time.h index 51728edf7ba4a..852d8158c45fe 100644 --- a/include/asm-arm/mach/time.h +++ b/include/asm-arm/mach/time.h @@ -10,10 +10,22 @@ #ifndef __ASM_ARM_MACH_TIME_H #define __ASM_ARM_MACH_TIME_H -extern void (*init_arch_time)(void); +#include + +/* + * This is our kernel timer structure. + */ +struct sys_timer { + struct sys_device dev; + void (*init)(void); + void (*suspend)(void); + void (*resume)(void); + unsigned long (*offset)(void); +}; + +extern struct sys_timer *system_timer; extern int (*set_rtc)(void); -extern unsigned long (*gettimeoffset)(void); extern void timer_tick(struct pt_regs *); -- 2.53.0