[PATCH] time: rename clocksource functions
[powerpc.git] / arch / i386 / kernel / i8253.c
1 /*
2  * i8253.c  8253/PIT functions
3  *
4  */
5 #include <linux/clocksource.h>
6 #include <linux/spinlock.h>
7 #include <linux/jiffies.h>
8 #include <linux/sysdev.h>
9 #include <linux/module.h>
10 #include <linux/init.h>
11
12 #include <asm/smp.h>
13 #include <asm/delay.h>
14 #include <asm/i8253.h>
15 #include <asm/io.h>
16
17 #include "io_ports.h"
18
19 DEFINE_SPINLOCK(i8253_lock);
20 EXPORT_SYMBOL(i8253_lock);
21
22 void setup_pit_timer(void)
23 {
24         unsigned long flags;
25
26         spin_lock_irqsave(&i8253_lock, flags);
27         outb_p(0x34,PIT_MODE);          /* binary, mode 2, LSB/MSB, ch 0 */
28         udelay(10);
29         outb_p(LATCH & 0xff , PIT_CH0); /* LSB */
30         udelay(10);
31         outb(LATCH >> 8 , PIT_CH0);     /* MSB */
32         spin_unlock_irqrestore(&i8253_lock, flags);
33 }
34
35 /*
36  * Since the PIT overflows every tick, its not very useful
37  * to just read by itself. So use jiffies to emulate a free
38  * running counter:
39  */
40 static cycle_t pit_read(void)
41 {
42         unsigned long flags;
43         int count;
44         u64 jifs;
45
46         spin_lock_irqsave(&i8253_lock, flags);
47         outb_p(0x00, PIT_MODE); /* latch the count ASAP */
48         count = inb_p(PIT_CH0); /* read the latched count */
49         count |= inb_p(PIT_CH0) << 8;
50
51         /* VIA686a test code... reset the latch if count > max + 1 */
52         if (count > LATCH) {
53                 outb_p(0x34, PIT_MODE);
54                 outb_p(LATCH & 0xff, PIT_CH0);
55                 outb(LATCH >> 8, PIT_CH0);
56                 count = LATCH - 1;
57         }
58         spin_unlock_irqrestore(&i8253_lock, flags);
59
60         jifs = jiffies_64;
61
62         jifs -= INITIAL_JIFFIES;
63         count = (LATCH-1) - count;
64
65         return (cycle_t)(jifs * LATCH) + count;
66 }
67
68 static struct clocksource clocksource_pit = {
69         .name   = "pit",
70         .rating = 110,
71         .read   = pit_read,
72         .mask   = (cycle_t)-1,
73         .mult   = 0,
74         .shift  = 20,
75 };
76
77 static int __init init_pit_clocksource(void)
78 {
79         if (num_possible_cpus() > 4) /* PIT does not scale! */
80                 return 0;
81
82         clocksource_pit.mult = clocksource_hz2mult(CLOCK_TICK_RATE, 20);
83         return clocksource_register(&clocksource_pit);
84 }
85 module_init(init_pit_clocksource);