vserver 1.9.3
[linux-2.6.git] / arch / i386 / kernel / timers / timer_pit.c
index 7ddbf1c..a433cb0 100644 (file)
@@ -7,6 +7,9 @@
 #include <linux/module.h>
 #include <linux/device.h>
 #include <linux/irq.h>
+#include <linux/sysdev.h>
+#include <linux/timex.h>
+#include <asm/delay.h>
 #include <asm/mpspec.h>
 #include <asm/timer.h>
 #include <asm/smp.h>
@@ -156,3 +159,44 @@ struct timer_opts timer_pit = {
        .monotonic_clock = monotonic_clock_pit,
        .delay = delay_pit,
 };
+
+void setup_pit_timer(void)
+{
+       extern spinlock_t i8253_lock;
+       unsigned long flags;
+
+       spin_lock_irqsave(&i8253_lock, flags);
+       outb_p(0x34,PIT_MODE);          /* binary, mode 2, LSB/MSB, ch 0 */
+       udelay(10);
+       outb_p(LATCH & 0xff , PIT_CH0); /* LSB */
+       udelay(10);
+       outb(LATCH >> 8 , PIT_CH0);     /* MSB */
+       spin_unlock_irqrestore(&i8253_lock, flags);
+}
+
+static int timer_resume(struct sys_device *dev)
+{
+       setup_pit_timer();
+       return 0;
+}
+
+static struct sysdev_class timer_sysclass = {
+       set_kset_name("timer"),
+       .resume = timer_resume,
+};
+
+static struct sys_device device_timer = {
+       .id     = 0,
+       .cls    = &timer_sysclass,
+};
+
+static int __init init_timer_sysfs(void)
+{
+       int error = sysdev_class_register(&timer_sysclass);
+       if (!error)
+               error = sysdev_register(&device_timer);
+       return error;
+}
+
+device_initcall(init_timer_sysfs);
+