Commit 30c730f8 authored by Sascha Hauer's avatar Sascha Hauer

[ARM] MXC: rework timer/clock initialisation

- rename mxc_clocks_init to architecture specific versions. This
  allows us to have more than one architecture compiled in.
- call mxc_timer_init from clock initialisation instead from board
  code
Signed-off-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
parent a2865197
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <mach/clock.h> #include <mach/clock.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/common.h>
#include "crm_regs.h" #include "crm_regs.h"
static int _clk_enable(struct clk *clk) static int _clk_enable(struct clk *clk)
...@@ -594,7 +595,7 @@ static struct clk *mxc_clks[] = { ...@@ -594,7 +595,7 @@ static struct clk *mxc_clks[] = {
&rtc_clk, &rtc_clk,
}; };
int __init mxc_clocks_init(unsigned long fref) int __init mx1_clocks_init(unsigned long fref)
{ {
struct clk **clkp; struct clk **clkp;
unsigned int reg; unsigned int reg;
...@@ -625,5 +626,7 @@ int __init mxc_clocks_init(unsigned long fref) ...@@ -625,5 +626,7 @@ int __init mxc_clocks_init(unsigned long fref)
clk_enable(&hclk); clk_enable(&hclk);
clk_enable(&fclk); clk_enable(&fclk);
mxc_timer_init(&gpt_clk);
return 0; return 0;
} }
...@@ -118,8 +118,7 @@ static void __init mx1ads_init(void) ...@@ -118,8 +118,7 @@ static void __init mx1ads_init(void)
static void __init mx1ads_timer_init(void) static void __init mx1ads_timer_init(void)
{ {
mxc_clocks_init(32000); mx1_clocks_init(32000);
mxc_timer_init("gpt_clk");
} }
struct sys_timer mx1ads_timer = { struct sys_timer mx1ads_timer = {
......
...@@ -1551,7 +1551,7 @@ static void __init probe_mxc_clocks(void) ...@@ -1551,7 +1551,7 @@ static void __init probe_mxc_clocks(void)
* must be called very early to get information about the * must be called very early to get information about the
* available clock rate when the timer framework starts * available clock rate when the timer framework starts
*/ */
int __init mxc_clocks_init(unsigned long fref) int __init mx27_clocks_init(unsigned long fref)
{ {
u32 cscr; u32 cscr;
struct clk **clkp; struct clk **clkp;
...@@ -1593,5 +1593,8 @@ int __init mxc_clocks_init(unsigned long fref) ...@@ -1593,5 +1593,8 @@ int __init mxc_clocks_init(unsigned long fref)
#ifdef CONFIG_DEBUG_LL_CONSOLE #ifdef CONFIG_DEBUG_LL_CONSOLE
clk_enable(&uart1_clk[0]); clk_enable(&uart1_clk[0]);
#endif #endif
mxc_timer_init(&gpt1_clk[0]);
return 0; return 0;
} }
...@@ -263,8 +263,7 @@ static void __init mx27ads_timer_init(void) ...@@ -263,8 +263,7 @@ static void __init mx27ads_timer_init(void)
if ((__raw_readw(PBC_VERSION_REG) & CKIH_27MHZ_BIT_SET) == 0) if ((__raw_readw(PBC_VERSION_REG) & CKIH_27MHZ_BIT_SET) == 0)
fref = 27000000; fref = 27000000;
mxc_clocks_init(fref); mx27_clocks_init(fref);
mxc_timer_init("gpt_clk.0");
} }
struct sys_timer mx27ads_timer = { struct sys_timer mx27ads_timer = {
......
...@@ -230,8 +230,7 @@ static void __init pcm038_init(void) ...@@ -230,8 +230,7 @@ static void __init pcm038_init(void)
static void __init pcm038_timer_init(void) static void __init pcm038_timer_init(void)
{ {
mxc_clocks_init(26000000); mx27_clocks_init(26000000);
mxc_timer_init("gpt_clk.0");
} }
struct sys_timer pcm038_timer = { struct sys_timer pcm038_timer = {
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <mach/clock.h> #include <mach/clock.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/common.h>
#include <asm/div64.h> #include <asm/div64.h>
#include "crm_regs.h" #include "crm_regs.h"
...@@ -1071,7 +1072,7 @@ static struct clk *mxc_clks[] = { ...@@ -1071,7 +1072,7 @@ static struct clk *mxc_clks[] = {
&iim_clk, &iim_clk,
}; };
int __init mxc_clocks_init(unsigned long fref) int __init mx31_clocks_init(unsigned long fref)
{ {
u32 reg; u32 reg;
struct clk **clkp; struct clk **clkp;
...@@ -1121,6 +1122,8 @@ int __init mxc_clocks_init(unsigned long fref) ...@@ -1121,6 +1122,8 @@ int __init mxc_clocks_init(unsigned long fref)
__raw_writel(reg, MXC_CCM_PMCR1); __raw_writel(reg, MXC_CCM_PMCR1);
} }
mxc_timer_init(&ipg_clk);
return 0; return 0;
} }
...@@ -244,8 +244,7 @@ static void __init mxc_board_init(void) ...@@ -244,8 +244,7 @@ static void __init mxc_board_init(void)
static void __init mx31ads_timer_init(void) static void __init mx31ads_timer_init(void)
{ {
mxc_clocks_init(26000000); mx31_clocks_init(26000000);
mxc_timer_init("ipg_clk.0");
} }
struct sys_timer mx31ads_timer = { struct sys_timer mx31ads_timer = {
......
...@@ -82,8 +82,7 @@ static void __init mxc_board_init(void) ...@@ -82,8 +82,7 @@ static void __init mxc_board_init(void)
static void __init mx31lite_timer_init(void) static void __init mx31lite_timer_init(void)
{ {
mxc_clocks_init(26000000); mx31_clocks_init(26000000);
mxc_timer_init("ipg_clk.0");
} }
struct sys_timer mx31lite_timer = { struct sys_timer mx31lite_timer = {
......
...@@ -120,8 +120,7 @@ void __init mx31moboard_map_io(void) ...@@ -120,8 +120,7 @@ void __init mx31moboard_map_io(void)
static void __init mx31moboard_timer_init(void) static void __init mx31moboard_timer_init(void)
{ {
mxc_clocks_init(26000000); mx31_clocks_init(26000000);
mxc_timer_init("ipg_clk.0");
} }
struct sys_timer mx31moboard_timer = { struct sys_timer mx31moboard_timer = {
......
...@@ -91,8 +91,7 @@ static void __init mxc_board_init(void) ...@@ -91,8 +91,7 @@ static void __init mxc_board_init(void)
static void __init mx31pdk_timer_init(void) static void __init mx31pdk_timer_init(void)
{ {
mxc_clocks_init(26000000); mx31_clocks_init(26000000);
mxc_timer_init("ipg_clk.0");
} }
static struct sys_timer mx31pdk_timer = { static struct sys_timer mx31pdk_timer = {
......
...@@ -181,8 +181,7 @@ void __init pcm037_map_io(void) ...@@ -181,8 +181,7 @@ void __init pcm037_map_io(void)
static void __init pcm037_timer_init(void) static void __init pcm037_timer_init(void)
{ {
mxc_clocks_init(26000000); mx31_clocks_init(26000000);
mxc_timer_init("ipg_clk.0");
} }
struct sys_timer pcm037_timer = { struct sys_timer pcm037_timer = {
......
...@@ -12,11 +12,14 @@ ...@@ -12,11 +12,14 @@
#define __ASM_ARCH_MXC_COMMON_H__ #define __ASM_ARCH_MXC_COMMON_H__
struct platform_device; struct platform_device;
struct clk;
extern void mxc_map_io(void); extern void mxc_map_io(void);
extern void mxc_init_irq(void); extern void mxc_init_irq(void);
extern void mxc_timer_init(const char *clk_timer); extern void mxc_timer_init(struct clk *timer_clk);
extern int mxc_clocks_init(unsigned long fref); extern int mx1_clocks_init(unsigned long fref);
extern int mx27_clocks_init(unsigned long fref);
extern int mx31_clocks_init(unsigned long fref);
extern int mxc_register_gpios(void); extern int mxc_register_gpios(void);
extern int mxc_register_device(struct platform_device *pdev, void *data); extern int mxc_register_device(struct platform_device *pdev, void *data);
......
...@@ -34,9 +34,6 @@ ...@@ -34,9 +34,6 @@
static struct clock_event_device clockevent_mxc; static struct clock_event_device clockevent_mxc;
static enum clock_event_mode clockevent_mode = CLOCK_EVT_MODE_UNUSED; static enum clock_event_mode clockevent_mode = CLOCK_EVT_MODE_UNUSED;
/* clock source for the timer */
static struct clk *timer_clk;
/* clock source */ /* clock source */
static cycle_t mxc_get_cycles(void) static cycle_t mxc_get_cycles(void)
...@@ -53,7 +50,7 @@ static struct clocksource clocksource_mxc = { ...@@ -53,7 +50,7 @@ static struct clocksource clocksource_mxc = {
.flags = CLOCK_SOURCE_IS_CONTINUOUS, .flags = CLOCK_SOURCE_IS_CONTINUOUS,
}; };
static int __init mxc_clocksource_init(void) static int __init mxc_clocksource_init(struct clk *timer_clk)
{ {
unsigned int clock; unsigned int clock;
...@@ -177,7 +174,7 @@ static struct clock_event_device clockevent_mxc = { ...@@ -177,7 +174,7 @@ static struct clock_event_device clockevent_mxc = {
.rating = 200, .rating = 200,
}; };
static int __init mxc_clockevent_init(void) static int __init mxc_clockevent_init(struct clk *timer_clk)
{ {
unsigned int clock; unsigned int clock;
...@@ -197,14 +194,8 @@ static int __init mxc_clockevent_init(void) ...@@ -197,14 +194,8 @@ static int __init mxc_clockevent_init(void)
return 0; return 0;
} }
void __init mxc_timer_init(const char *clk_timer) void __init mxc_timer_init(struct clk *timer_clk)
{ {
timer_clk = clk_get(NULL, clk_timer);
if (!timer_clk) {
printk(KERN_ERR"Cannot determine timer clock. Giving up.\n");
return;
}
clk_enable(timer_clk); clk_enable(timer_clk);
/* /*
...@@ -219,10 +210,9 @@ void __init mxc_timer_init(const char *clk_timer) ...@@ -219,10 +210,9 @@ void __init mxc_timer_init(const char *clk_timer)
TIMER_BASE + MXC_TCTL); TIMER_BASE + MXC_TCTL);
/* init and register the timer to the framework */ /* init and register the timer to the framework */
mxc_clocksource_init(); mxc_clocksource_init(timer_clk);
mxc_clockevent_init(); mxc_clockevent_init(timer_clk);
/* Make irqs happen */ /* Make irqs happen */
setup_irq(TIMER_INTERRUPT, &mxc_timer_irq); setup_irq(TIMER_INTERRUPT, &mxc_timer_irq);
} }
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