Commit 84904d0e authored by Kevin Hilman's avatar Kevin Hilman Committed by Russell King

[ARM] 3856/1: Add clocksource for Intel IXP4xx platforms

Enables the ixp4xx platforms to use Generic time-of-day.
Signed-off-by: default avatarKevin Hilman <khilman@mvista.com>
Acked-by: default avatarJohn Stultz <johnstul@us.ibm.com>
Signed-off-by: default avatarDeepak Saxena <dsaxena@plexity.net>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 746140c7
...@@ -226,6 +226,7 @@ config ARCH_IOP33X ...@@ -226,6 +226,7 @@ config ARCH_IOP33X
config ARCH_IXP4XX config ARCH_IXP4XX
bool "IXP4xx-based" bool "IXP4xx-based"
depends on MMU depends on MMU
select GENERIC_TIME
help help
Support for Intel's IXP4XX (XScale) family of processors. Support for Intel's IXP4XX (XScale) family of processors.
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/time.h> #include <linux/time.h>
#include <linux/timex.h> #include <linux/timex.h>
#include <linux/clocksource.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
...@@ -255,16 +256,6 @@ static unsigned volatile last_jiffy_time; ...@@ -255,16 +256,6 @@ static unsigned volatile last_jiffy_time;
#define CLOCK_TICKS_PER_USEC ((CLOCK_TICK_RATE + USEC_PER_SEC/2) / USEC_PER_SEC) #define CLOCK_TICKS_PER_USEC ((CLOCK_TICK_RATE + USEC_PER_SEC/2) / USEC_PER_SEC)
/* IRQs are disabled before entering here from do_gettimeofday() */
static unsigned long ixp4xx_gettimeoffset(void)
{
u32 elapsed;
elapsed = *IXP4XX_OSTS - last_jiffy_time;
return elapsed / CLOCK_TICKS_PER_USEC;
}
static irqreturn_t ixp4xx_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) static irqreturn_t ixp4xx_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{ {
write_seqlock(&xtime_lock); write_seqlock(&xtime_lock);
...@@ -309,7 +300,6 @@ static void __init ixp4xx_timer_init(void) ...@@ -309,7 +300,6 @@ static void __init ixp4xx_timer_init(void)
struct sys_timer ixp4xx_timer = { struct sys_timer ixp4xx_timer = {
.init = ixp4xx_timer_init, .init = ixp4xx_timer_init,
.offset = ixp4xx_gettimeoffset,
}; };
static struct resource ixp46x_i2c_resources[] = { static struct resource ixp46x_i2c_resources[] = {
...@@ -365,3 +355,29 @@ void __init ixp4xx_sys_init(void) ...@@ -365,3 +355,29 @@ void __init ixp4xx_sys_init(void)
ixp4xx_exp_bus_size >> 20); ixp4xx_exp_bus_size >> 20);
} }
cycle_t ixp4xx_get_cycles(void)
{
return *IXP4XX_OSTS;
}
static struct clocksource clocksource_ixp4xx = {
.name = "OSTS",
.rating = 200,
.read = ixp4xx_get_cycles,
.mask = CLOCKSOURCE_MASK(32),
.shift = 20,
.is_continuous = 1,
};
unsigned long ixp4xx_timer_freq = FREQ;
static int __init ixp4xx_clocksource_init(void)
{
clocksource_ixp4xx.mult =
clocksource_hz2mult(ixp4xx_timer_freq,
clocksource_ixp4xx.shift);
clocksource_register(&clocksource_ixp4xx);
return 0;
}
device_initcall(ixp4xx_clocksource_init);
...@@ -159,6 +159,8 @@ static void nslu2_power_off(void) ...@@ -159,6 +159,8 @@ static void nslu2_power_off(void)
static void __init nslu2_init(void) static void __init nslu2_init(void)
{ {
ixp4xx_timer_freq = NSLU2_FREQ;
ixp4xx_sys_init(); ixp4xx_sys_init();
nslu2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0); nslu2_flash_resource.start = IXP4XX_EXP_BUS_BASE(0);
......
...@@ -89,6 +89,11 @@ struct ixp4xx_i2c_pins { ...@@ -89,6 +89,11 @@ struct ixp4xx_i2c_pins {
struct sys_timer; struct sys_timer;
/*
* Frequency of clock used for primary clocksource
*/
extern unsigned long ixp4xx_timer_freq;
/* /*
* Functions used by platform-level setup code * Functions used by platform-level setup code
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment