|
@@ -11,7 +11,6 @@
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
* option) any later version.
|
|
* option) any later version.
|
|
*/
|
|
*/
|
|
-#include <linux/clocksource.h>
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/types.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
#include <linux/init.h>
|
|
@@ -83,7 +82,7 @@ static void null_timer_ack(void) { /* nothing */ }
|
|
/*
|
|
/*
|
|
* Null high precision timer functions for systems lacking one.
|
|
* Null high precision timer functions for systems lacking one.
|
|
*/
|
|
*/
|
|
-static unsigned int null_hpt_read(void)
|
|
|
|
|
|
+static cycle_t null_hpt_read(void)
|
|
{
|
|
{
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -112,7 +111,7 @@ static void c0_timer_ack(void)
|
|
/*
|
|
/*
|
|
* High precision timer functions for a R4k-compatible timer.
|
|
* High precision timer functions for a R4k-compatible timer.
|
|
*/
|
|
*/
|
|
-static unsigned int c0_hpt_read(void)
|
|
|
|
|
|
+static cycle_t c0_hpt_read(void)
|
|
{
|
|
{
|
|
return read_c0_count();
|
|
return read_c0_count();
|
|
}
|
|
}
|
|
@@ -126,8 +125,6 @@ static void __init c0_hpt_timer_init(void)
|
|
|
|
|
|
int (*mips_timer_state)(void);
|
|
int (*mips_timer_state)(void);
|
|
void (*mips_timer_ack)(void);
|
|
void (*mips_timer_ack)(void);
|
|
-unsigned int (*mips_hpt_read)(void);
|
|
|
|
-unsigned int mips_hpt_mask = 0xffffffff;
|
|
|
|
|
|
|
|
/* last time when xtime and rtc are sync'ed up */
|
|
/* last time when xtime and rtc are sync'ed up */
|
|
static long last_rtc_update;
|
|
static long last_rtc_update;
|
|
@@ -269,8 +266,7 @@ static struct irqaction timer_irqaction = {
|
|
|
|
|
|
static unsigned int __init calibrate_hpt(void)
|
|
static unsigned int __init calibrate_hpt(void)
|
|
{
|
|
{
|
|
- u64 frequency;
|
|
|
|
- u32 hpt_start, hpt_end, hpt_count, hz;
|
|
|
|
|
|
+ cycle_t frequency, hpt_start, hpt_end, hpt_count, hz;
|
|
|
|
|
|
const int loops = HZ / 10;
|
|
const int loops = HZ / 10;
|
|
int log_2_loops = 0;
|
|
int log_2_loops = 0;
|
|
@@ -296,28 +292,23 @@ static unsigned int __init calibrate_hpt(void)
|
|
* during the calculated number of periods between timer
|
|
* during the calculated number of periods between timer
|
|
* interrupts.
|
|
* interrupts.
|
|
*/
|
|
*/
|
|
- hpt_start = mips_hpt_read();
|
|
|
|
|
|
+ hpt_start = clocksource_mips.read();
|
|
do {
|
|
do {
|
|
while (mips_timer_state());
|
|
while (mips_timer_state());
|
|
while (!mips_timer_state());
|
|
while (!mips_timer_state());
|
|
} while (--i);
|
|
} while (--i);
|
|
- hpt_end = mips_hpt_read();
|
|
|
|
|
|
+ hpt_end = clocksource_mips.read();
|
|
|
|
|
|
- hpt_count = (hpt_end - hpt_start) & mips_hpt_mask;
|
|
|
|
|
|
+ hpt_count = (hpt_end - hpt_start) & clocksource_mips.mask;
|
|
hz = HZ;
|
|
hz = HZ;
|
|
- frequency = (u64)hpt_count * (u64)hz;
|
|
|
|
|
|
+ frequency = hpt_count * hz;
|
|
|
|
|
|
return frequency >> log_2_loops;
|
|
return frequency >> log_2_loops;
|
|
}
|
|
}
|
|
|
|
|
|
-static cycle_t read_mips_hpt(void)
|
|
|
|
-{
|
|
|
|
- return (cycle_t)mips_hpt_read();
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static struct clocksource clocksource_mips = {
|
|
|
|
|
|
+struct clocksource clocksource_mips = {
|
|
.name = "MIPS",
|
|
.name = "MIPS",
|
|
- .read = read_mips_hpt,
|
|
|
|
|
|
+ .mask = 0xffffffff,
|
|
.is_continuous = 1,
|
|
.is_continuous = 1,
|
|
};
|
|
};
|
|
|
|
|
|
@@ -326,7 +317,7 @@ static void __init init_mips_clocksource(void)
|
|
u64 temp;
|
|
u64 temp;
|
|
u32 shift;
|
|
u32 shift;
|
|
|
|
|
|
- if (!mips_hpt_frequency || mips_hpt_read == null_hpt_read)
|
|
|
|
|
|
+ if (!mips_hpt_frequency || clocksource_mips.read == null_hpt_read)
|
|
return;
|
|
return;
|
|
|
|
|
|
/* Calclate a somewhat reasonable rating value */
|
|
/* Calclate a somewhat reasonable rating value */
|
|
@@ -340,7 +331,6 @@ static void __init init_mips_clocksource(void)
|
|
}
|
|
}
|
|
clocksource_mips.shift = shift;
|
|
clocksource_mips.shift = shift;
|
|
clocksource_mips.mult = (u32)temp;
|
|
clocksource_mips.mult = (u32)temp;
|
|
- clocksource_mips.mask = mips_hpt_mask;
|
|
|
|
|
|
|
|
clocksource_register(&clocksource_mips);
|
|
clocksource_register(&clocksource_mips);
|
|
}
|
|
}
|
|
@@ -360,19 +350,19 @@ void __init time_init(void)
|
|
-xtime.tv_sec, -xtime.tv_nsec);
|
|
-xtime.tv_sec, -xtime.tv_nsec);
|
|
|
|
|
|
/* Choose appropriate high precision timer routines. */
|
|
/* Choose appropriate high precision timer routines. */
|
|
- if (!cpu_has_counter && !mips_hpt_read)
|
|
|
|
|
|
+ if (!cpu_has_counter && !clocksource_mips.read)
|
|
/* No high precision timer -- sorry. */
|
|
/* No high precision timer -- sorry. */
|
|
- mips_hpt_read = null_hpt_read;
|
|
|
|
|
|
+ clocksource_mips.read = null_hpt_read;
|
|
else if (!mips_hpt_frequency && !mips_timer_state) {
|
|
else if (!mips_hpt_frequency && !mips_timer_state) {
|
|
/* A high precision timer of unknown frequency. */
|
|
/* A high precision timer of unknown frequency. */
|
|
- if (!mips_hpt_read)
|
|
|
|
|
|
+ if (!clocksource_mips.read)
|
|
/* No external high precision timer -- use R4k. */
|
|
/* No external high precision timer -- use R4k. */
|
|
- mips_hpt_read = c0_hpt_read;
|
|
|
|
|
|
+ clocksource_mips.read = c0_hpt_read;
|
|
} else {
|
|
} else {
|
|
/* We know counter frequency. Or we can get it. */
|
|
/* We know counter frequency. Or we can get it. */
|
|
- if (!mips_hpt_read) {
|
|
|
|
|
|
+ if (!clocksource_mips.read) {
|
|
/* No external high precision timer -- use R4k. */
|
|
/* No external high precision timer -- use R4k. */
|
|
- mips_hpt_read = c0_hpt_read;
|
|
|
|
|
|
+ clocksource_mips.read = c0_hpt_read;
|
|
|
|
|
|
if (!mips_timer_state) {
|
|
if (!mips_timer_state) {
|
|
/* No external timer interrupt -- use R4k. */
|
|
/* No external timer interrupt -- use R4k. */
|