diff options
author | Tony Lindgren <tony@atomide.com> | 2009-04-24 12:56:16 -0400 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2009-04-24 12:56:16 -0400 |
commit | 535ff672e3589a38f60567314bc2ae15b9ab2604 (patch) | |
tree | f0401090f244d06b6749e6b8f6cd0b94054dbf53 /arch/arm/plat-omap | |
parent | 846c29f109fc27bd93817271689a752afc9168f8 (diff) | |
parent | f248076c0dad45b7e50f27096e1aac6a617665db (diff) |
Merge branch 'omap-clock-fixes' into omap-fixes
Diffstat (limited to 'arch/arm/plat-omap')
-rw-r--r-- | arch/arm/plat-omap/clock.c | 7 | ||||
-rw-r--r-- | arch/arm/plat-omap/dmtimer.c | 28 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/mach/dmtimer.h | 2 | ||||
-rw-r--r-- | arch/arm/plat-omap/include/mach/timer-gp.h | 17 |
4 files changed, 42 insertions, 12 deletions
diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c index 2e0614552ac8..29efc279287a 100644 --- a/arch/arm/plat-omap/clock.c +++ b/arch/arm/plat-omap/clock.c | |||
@@ -239,6 +239,13 @@ void recalculate_root_clocks(void) | |||
239 | } | 239 | } |
240 | } | 240 | } |
241 | 241 | ||
242 | /** | ||
243 | * clk_init_one - initialize any fields in the struct clk before clk init | ||
244 | * @clk: struct clk * to initialize | ||
245 | * | ||
246 | * Initialize any struct clk fields needed before normal clk initialization | ||
247 | * can run. No return value. | ||
248 | */ | ||
242 | void clk_init_one(struct clk *clk) | 249 | void clk_init_one(struct clk *clk) |
243 | { | 250 | { |
244 | INIT_LIST_HEAD(&clk->children); | 251 | INIT_LIST_HEAD(&clk->children); |
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index bfd47570cc91..55bb99631292 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c | |||
@@ -238,7 +238,7 @@ static struct omap_dm_timer omap3_dm_timers[] = { | |||
238 | { .phys_base = 0x49040000, .irq = INT_24XX_GPTIMER9 }, | 238 | { .phys_base = 0x49040000, .irq = INT_24XX_GPTIMER9 }, |
239 | { .phys_base = 0x48086000, .irq = INT_24XX_GPTIMER10 }, | 239 | { .phys_base = 0x48086000, .irq = INT_24XX_GPTIMER10 }, |
240 | { .phys_base = 0x48088000, .irq = INT_24XX_GPTIMER11 }, | 240 | { .phys_base = 0x48088000, .irq = INT_24XX_GPTIMER11 }, |
241 | { .phys_base = 0x48304000, .irq = INT_24XX_GPTIMER12 }, | 241 | { .phys_base = 0x48304000, .irq = INT_34XX_GPT12_IRQ }, |
242 | }; | 242 | }; |
243 | 243 | ||
244 | static const char *omap3_dm_source_names[] __initdata = { | 244 | static const char *omap3_dm_source_names[] __initdata = { |
@@ -321,11 +321,9 @@ static void omap_dm_timer_reset(struct omap_dm_timer *timer) | |||
321 | l |= 0x2 << 8; /* Set clock activity to perserve f-clock on idle */ | 321 | l |= 0x2 << 8; /* Set clock activity to perserve f-clock on idle */ |
322 | 322 | ||
323 | /* | 323 | /* |
324 | * Enable wake-up only for GPT1 on OMAP2 CPUs. | 324 | * Enable wake-up on OMAP2 CPUs. |
325 | * FIXME: All timers should have wake-up enabled and clear | ||
326 | * PRCM status. | ||
327 | */ | 325 | */ |
328 | if (cpu_class_is_omap2() && (timer == &dm_timers[0])) | 326 | if (cpu_class_is_omap2()) |
329 | l |= 1 << 2; | 327 | l |= 1 << 2; |
330 | omap_dm_timer_write_reg(timer, OMAP_TIMER_OCP_CFG_REG, l); | 328 | omap_dm_timer_write_reg(timer, OMAP_TIMER_OCP_CFG_REG, l); |
331 | 329 | ||
@@ -511,7 +509,7 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_stop); | |||
511 | 509 | ||
512 | #ifdef CONFIG_ARCH_OMAP1 | 510 | #ifdef CONFIG_ARCH_OMAP1 |
513 | 511 | ||
514 | void omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) | 512 | int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) |
515 | { | 513 | { |
516 | int n = (timer - dm_timers) << 1; | 514 | int n = (timer - dm_timers) << 1; |
517 | u32 l; | 515 | u32 l; |
@@ -519,23 +517,31 @@ void omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) | |||
519 | l = omap_readl(MOD_CONF_CTRL_1) & ~(0x03 << n); | 517 | l = omap_readl(MOD_CONF_CTRL_1) & ~(0x03 << n); |
520 | l |= source << n; | 518 | l |= source << n; |
521 | omap_writel(l, MOD_CONF_CTRL_1); | 519 | omap_writel(l, MOD_CONF_CTRL_1); |
520 | |||
521 | return 0; | ||
522 | } | 522 | } |
523 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_source); | 523 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_source); |
524 | 524 | ||
525 | #else | 525 | #else |
526 | 526 | ||
527 | void omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) | 527 | int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source) |
528 | { | 528 | { |
529 | int ret = -EINVAL; | ||
530 | |||
529 | if (source < 0 || source >= 3) | 531 | if (source < 0 || source >= 3) |
530 | return; | 532 | return -EINVAL; |
531 | 533 | ||
532 | clk_disable(timer->fclk); | 534 | clk_disable(timer->fclk); |
533 | clk_set_parent(timer->fclk, dm_source_clocks[source]); | 535 | ret = clk_set_parent(timer->fclk, dm_source_clocks[source]); |
534 | clk_enable(timer->fclk); | 536 | clk_enable(timer->fclk); |
535 | 537 | ||
536 | /* When the functional clock disappears, too quick writes seem to | 538 | /* |
537 | * cause an abort. */ | 539 | * When the functional clock disappears, too quick writes seem |
540 | * to cause an abort. XXX Is this still necessary? | ||
541 | */ | ||
538 | __delay(150000); | 542 | __delay(150000); |
543 | |||
544 | return ret; | ||
539 | } | 545 | } |
540 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_source); | 546 | EXPORT_SYMBOL_GPL(omap_dm_timer_set_source); |
541 | 547 | ||
diff --git a/arch/arm/plat-omap/include/mach/dmtimer.h b/arch/arm/plat-omap/include/mach/dmtimer.h index 6dc703138210..20f1054c0a80 100644 --- a/arch/arm/plat-omap/include/mach/dmtimer.h +++ b/arch/arm/plat-omap/include/mach/dmtimer.h | |||
@@ -64,7 +64,7 @@ void omap_dm_timer_trigger(struct omap_dm_timer *timer); | |||
64 | void omap_dm_timer_start(struct omap_dm_timer *timer); | 64 | void omap_dm_timer_start(struct omap_dm_timer *timer); |
65 | void omap_dm_timer_stop(struct omap_dm_timer *timer); | 65 | void omap_dm_timer_stop(struct omap_dm_timer *timer); |
66 | 66 | ||
67 | void omap_dm_timer_set_source(struct omap_dm_timer *timer, int source); | 67 | int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source); |
68 | void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, unsigned int value); | 68 | void omap_dm_timer_set_load(struct omap_dm_timer *timer, int autoreload, unsigned int value); |
69 | void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, unsigned int value); | 69 | void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload, unsigned int value); |
70 | void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, unsigned int match); | 70 | void omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable, unsigned int match); |
diff --git a/arch/arm/plat-omap/include/mach/timer-gp.h b/arch/arm/plat-omap/include/mach/timer-gp.h new file mode 100644 index 000000000000..c88d346b59d9 --- /dev/null +++ b/arch/arm/plat-omap/include/mach/timer-gp.h | |||
@@ -0,0 +1,17 @@ | |||
1 | /* | ||
2 | * OMAP2/3 GPTIMER support.headers | ||
3 | * | ||
4 | * Copyright (C) 2009 Nokia Corporation | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | |||
11 | #ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_TIMER_GP_H | ||
12 | #define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_TIMER_GP_H | ||
13 | |||
14 | int __init omap2_gp_clockevent_set_gptimer(u8 id); | ||
15 | |||
16 | #endif | ||
17 | |||