summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Machek <pavel@ucw.cz>2002-12-01 16:45:49 -0800
committerLinus Torvalds <torvalds@home.transmeta.com>2002-12-01 16:45:49 -0800
commit2aceefe4f67ce4df5a23ccdba8c6b2db79226bb8 (patch)
tree42634b4cb9619bd93d31d158d64fbfd35ff1e2c9
parentf5b162fe86f05f5c5e94f6ab2392a83a400eb827 (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.c46
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