diff options
| author | Pavel Machek <pavel@ucw.cz> | 2002-12-01 16:45:49 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-12-01 16:45:49 -0800 |
| commit | 2aceefe4f67ce4df5a23ccdba8c6b2db79226bb8 (patch) | |
| tree | 42634b4cb9619bd93d31d158d64fbfd35ff1e2c9 | |
| parent | f5b162fe86f05f5c5e94f6ab2392a83a400eb827 (diff) | |
[PATCH] devicefs support for system timer
Without this, time runs 50x too slow after resume, since nothing
knows to tell the timer to re-initialize.
| -rw-r--r-- | arch/i386/kernel/i8259.c | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/arch/i386/kernel/i8259.c b/arch/i386/kernel/i8259.c index 499b58a347c2..77a880f24e43 100644 --- a/arch/i386/kernel/i8259.c +++ b/arch/i386/kernel/i8259.c @@ -367,6 +367,45 @@ void __init init_ISA_irqs (void) } } +static void setup_timer(void) +{ + outb_p(0x34,0x43); /* binary, mode 2, LSB/MSB, ch 0 */ + udelay(10); + outb_p(LATCH & 0xff , 0x40); /* LSB */ + udelay(10); + outb(LATCH >> 8 , 0x40); /* MSB */ +} + +static int timer_resume(struct device *dev, u32 level) +{ + if (level == RESUME_POWER_ON) + setup_timer(); + return 0; +} + +static struct device_driver timer_driver = { + .name = "timer", + .bus = &system_bus_type, + .resume = timer_resume, +}; + +static struct sys_device device_timer = { + .name = "timer", + .id = 0, + .dev = { + .name = "timer", + .driver = &timer_driver, + }, +}; + +static int __init init_timer_devicefs(void) +{ + driver_register(&timer_driver); + return sys_device_register(&device_timer); +} + +device_initcall(init_timer_devicefs); + void __init init_IRQ(void) { int i; @@ -386,16 +425,15 @@ void __init init_IRQ(void) } /* setup after call gates are initialised (usually add in - * the architecture specific gates */ + * the architecture specific gates) + */ intr_init_hook(); /* * Set the clock to HZ Hz, we already have a valid * vector now: */ - outb_p(0x34,0x43); /* binary, mode 2, LSB/MSB, ch 0 */ - outb_p(LATCH & 0xff , 0x40); /* LSB */ - outb(LATCH >> 8 , 0x40); /* MSB */ + setup_timer(); /* * External FPU? Set up irq13 if so, for |
