Loading arch/arm/mach-omap2/board-cm-t3517.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -324,6 +324,6 @@ MACHINE_START(CM_T3517, "Compulab CM-T3517") .handle_irq = omap3_intc_handle_irq, .handle_irq = omap3_intc_handle_irq, .init_machine = cm_t3517_init, .init_machine = cm_t3517_init, .init_late = am35xx_init_late, .init_late = am35xx_init_late, .init_time = omap3_gp_gptimer_timer_init, .init_time = omap3_gptimer_timer_init, .restart = omap3xxx_restart, .restart = omap3xxx_restart, MACHINE_END MACHINE_END arch/arm/mach-omap2/board-generic.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -140,7 +140,7 @@ DT_MACHINE_START(AM33XX_DT, "Generic AM33XX (Flattened Device Tree)") .init_irq = omap_intc_of_init, .init_irq = omap_intc_of_init, .handle_irq = omap3_intc_handle_irq, .handle_irq = omap3_intc_handle_irq, .init_machine = omap_generic_init, .init_machine = omap_generic_init, .init_time = omap3_am33xx_gptimer_timer_init, .init_time = omap3_gptimer_timer_init, .dt_compat = am33xx_boards_compat, .dt_compat = am33xx_boards_compat, .restart = am33xx_restart, .restart = am33xx_restart, MACHINE_END MACHINE_END Loading arch/arm/mach-omap2/common.h +1 −2 Original line number Original line Diff line number Diff line Loading @@ -82,8 +82,7 @@ extern void omap2_init_common_infrastructure(void); extern void omap2_sync32k_timer_init(void); extern void omap2_sync32k_timer_init(void); extern void omap3_sync32k_timer_init(void); extern void omap3_sync32k_timer_init(void); extern void omap3_secure_sync32k_timer_init(void); extern void omap3_secure_sync32k_timer_init(void); extern void omap3_gp_gptimer_timer_init(void); extern void omap3_gptimer_timer_init(void); extern void omap3_am33xx_gptimer_timer_init(void); extern void omap4_local_timer_init(void); extern void omap4_local_timer_init(void); extern void omap5_realtime_timer_init(void); extern void omap5_realtime_timer_init(void); Loading arch/arm/mach-omap2/timer.c +63 −61 Original line number Original line Diff line number Diff line Loading @@ -57,16 +57,6 @@ #include "common.h" #include "common.h" #include "powerdomain.h" #include "powerdomain.h" /* Parent clocks, eventually these will come from the clock framework */ #define OMAP2_MPU_SOURCE "sys_ck" #define OMAP3_MPU_SOURCE OMAP2_MPU_SOURCE #define OMAP4_MPU_SOURCE "sys_clkin_ck" #define OMAP5_MPU_SOURCE "sys_clkin" #define OMAP2_32K_SOURCE "func_32k_ck" #define OMAP3_32K_SOURCE "omap_32k_fck" #define OMAP4_32K_SOURCE "sys_32k_ck" #define REALTIME_COUNTER_BASE 0x48243200 #define REALTIME_COUNTER_BASE 0x48243200 #define INCREMENTER_NUMERATOR_OFFSET 0x10 #define INCREMENTER_NUMERATOR_OFFSET 0x10 #define INCREMENTER_DENUMERATOR_RELOAD_OFFSET 0x14 #define INCREMENTER_DENUMERATOR_RELOAD_OFFSET 0x14 Loading Loading @@ -130,7 +120,6 @@ static void omap2_gp_timer_set_mode(enum clock_event_mode mode, } } static struct clock_event_device clockevent_gpt = { static struct clock_event_device clockevent_gpt = { .name = "gp_timer", .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, .rating = 300, .rating = 300, .set_next_event = omap2_gp_timer_set_next_event, .set_next_event = omap2_gp_timer_set_next_event, Loading Loading @@ -171,6 +160,12 @@ static struct device_node * __init omap_get_timer_dt(struct of_device_id *match, if (property && !of_get_property(np, property, NULL)) if (property && !of_get_property(np, property, NULL)) continue; continue; if (!property && (of_get_property(np, "ti,timer-alwon", NULL) || of_get_property(np, "ti,timer-dsp", NULL) || of_get_property(np, "ti,timer-pwm", NULL) || of_get_property(np, "ti,timer-secure", NULL))) continue; of_add_property(np, &device_disabled); of_add_property(np, &device_disabled); return np; return np; } } Loading Loading @@ -215,9 +210,9 @@ static u32 __init omap_dm_timer_get_errata(void) } } static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, int gptimer_id, const char *fck_source, const char *fck_source, const char *property, const char *property, const char **timer_name, int posted) int posted) { { char name[10]; /* 10 = sizeof("gptXX_Xck0") */ char name[10]; /* 10 = sizeof("gptXX_Xck0") */ Loading @@ -225,6 +220,7 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, struct device_node *np; struct device_node *np; struct omap_hwmod *oh; struct omap_hwmod *oh; struct resource irq, mem; struct resource irq, mem; struct clk *src; int r = 0; int r = 0; if (of_have_populated_dt()) { if (of_have_populated_dt()) { Loading @@ -244,10 +240,10 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, of_node_put(np); of_node_put(np); } else { } else { if (omap_dm_timer_reserve_systimer(gptimer_id)) if (omap_dm_timer_reserve_systimer(timer->id)) return -ENODEV; return -ENODEV; sprintf(name, "timer%d", gptimer_id); sprintf(name, "timer%d", timer->id); oh_name = name; oh_name = name; } } Loading @@ -255,6 +251,8 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, if (!oh) if (!oh) return -ENODEV; return -ENODEV; *timer_name = oh->name; if (!of_have_populated_dt()) { if (!of_have_populated_dt()) { r = omap_hwmod_get_resource_byname(oh, IORESOURCE_IRQ, NULL, r = omap_hwmod_get_resource_byname(oh, IORESOURCE_IRQ, NULL, &irq); &irq); Loading @@ -277,24 +275,24 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, /* After the dmtimer is using hwmod these clocks won't be needed */ /* After the dmtimer is using hwmod these clocks won't be needed */ timer->fclk = clk_get(NULL, omap_hwmod_get_main_clk(oh)); timer->fclk = clk_get(NULL, omap_hwmod_get_main_clk(oh)); if (IS_ERR(timer->fclk)) if (IS_ERR(timer->fclk)) return -ENODEV; return PTR_ERR(timer->fclk); /* FIXME: Need to remove hard-coded test on timer ID */ if (gptimer_id != 12) { struct clk *src; src = clk_get(NULL, fck_source); src = clk_get(NULL, fck_source); if (IS_ERR(src)) { if (IS_ERR(src)) r = -EINVAL; return PTR_ERR(src); } else { if (clk_get_parent(timer->fclk) != src) { r = clk_set_parent(timer->fclk, src); r = clk_set_parent(timer->fclk, src); if (r < 0) if (r < 0) { pr_warn("%s: %s cannot set source\n", pr_warn("%s: %s cannot set source\n", __func__, __func__, oh->name); oh->name); clk_put(src); clk_put(src); return r; } } } } clk_put(src); omap_hwmod_setup_one(oh_name); omap_hwmod_setup_one(oh_name); omap_hwmod_enable(oh); omap_hwmod_enable(oh); __omap_dm_timer_init_regs(timer); __omap_dm_timer_init_regs(timer); Loading @@ -318,6 +316,7 @@ static void __init omap2_gp_clockevent_init(int gptimer_id, { { int res; int res; clkev.id = gptimer_id; clkev.errata = omap_dm_timer_get_errata(); clkev.errata = omap_dm_timer_get_errata(); /* /* Loading @@ -327,8 +326,8 @@ static void __init omap2_gp_clockevent_init(int gptimer_id, */ */ __omap_dm_timer_override_errata(&clkev, OMAP_TIMER_ERRATA_I103_I767); __omap_dm_timer_override_errata(&clkev, OMAP_TIMER_ERRATA_I103_I767); res = omap_dm_timer_init_one(&clkev, gptimer_id, fck_source, property, res = omap_dm_timer_init_one(&clkev, fck_source, property, OMAP_TIMER_POSTED); &clockevent_gpt.name, OMAP_TIMER_POSTED); BUG_ON(res); BUG_ON(res); omap2_gp_timer_irq.dev_id = &clkev; omap2_gp_timer_irq.dev_id = &clkev; Loading @@ -342,8 +341,8 @@ static void __init omap2_gp_clockevent_init(int gptimer_id, 3, /* Timer internal resynch latency */ 3, /* Timer internal resynch latency */ 0xffffffff); 0xffffffff); pr_info("OMAP clockevent source: GPTIMER%d at %lu Hz\n", pr_info("OMAP clockevent source: %s at %lu Hz\n", clockevent_gpt.name, gptimer_id, clkev.rate); clkev.rate); } } /* Clocksource code */ /* Clocksource code */ Loading @@ -360,7 +359,6 @@ static cycle_t clocksource_read_cycles(struct clocksource *cs) } } static struct clocksource clocksource_gpt = { static struct clocksource clocksource_gpt = { .name = "gp_timer", .rating = 300, .rating = 300, .read = clocksource_read_cycles, .read = clocksource_read_cycles, .mask = CLOCKSOURCE_MASK(32), .mask = CLOCKSOURCE_MASK(32), Loading Loading @@ -443,13 +441,16 @@ static int __init __maybe_unused omap2_sync32k_clocksource_init(void) } } static void __init omap2_gptimer_clocksource_init(int gptimer_id, static void __init omap2_gptimer_clocksource_init(int gptimer_id, const char *fck_source) const char *fck_source, const char *property) { { int res; int res; clksrc.id = gptimer_id; clksrc.errata = omap_dm_timer_get_errata(); clksrc.errata = omap_dm_timer_get_errata(); res = omap_dm_timer_init_one(&clksrc, gptimer_id, fck_source, NULL, res = omap_dm_timer_init_one(&clksrc, fck_source, property, &clocksource_gpt.name, OMAP_TIMER_NONPOSTED); OMAP_TIMER_NONPOSTED); BUG_ON(res); BUG_ON(res); Loading @@ -462,8 +463,8 @@ static void __init omap2_gptimer_clocksource_init(int gptimer_id, pr_err("Could not register clocksource %s\n", pr_err("Could not register clocksource %s\n", clocksource_gpt.name); clocksource_gpt.name); else else pr_info("OMAP clocksource: GPTIMER%d at %lu Hz\n", pr_info("OMAP clocksource: %s at %lu Hz\n", gptimer_id, clksrc.rate); clocksource_gpt.name, clksrc.rate); } } #ifdef CONFIG_SOC_HAS_REALTIME_COUNTER #ifdef CONFIG_SOC_HAS_REALTIME_COUNTER Loading @@ -488,7 +489,7 @@ static void __init realtime_counter_init(void) pr_err("%s: ioremap failed\n", __func__); pr_err("%s: ioremap failed\n", __func__); return; return; } } sys_clk = clk_get(NULL, OMAP5_MPU_SOURCE); sys_clk = clk_get(NULL, "sys_clkin"); if (IS_ERR(sys_clk)) { if (IS_ERR(sys_clk)) { pr_err("%s: failed to get system clock handle\n", __func__); pr_err("%s: failed to get system clock handle\n", __func__); iounmap(base); iounmap(base); Loading Loading @@ -545,49 +546,52 @@ static inline void __init realtime_counter_init(void) #endif #endif #define OMAP_SYS_GP_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \ #define OMAP_SYS_GP_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \ clksrc_nr, clksrc_src) \ clksrc_nr, clksrc_src, clksrc_prop) \ void __init omap##name##_gptimer_timer_init(void) \ void __init omap##name##_gptimer_timer_init(void) \ { \ { \ omap_dmtimer_init(); \ omap_dmtimer_init(); \ omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src); \ omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src, \ clksrc_prop); \ } } #define OMAP_SYS_32K_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \ #define OMAP_SYS_32K_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \ clksrc_nr, clksrc_src) \ clksrc_nr, clksrc_src, clksrc_prop) \ void __init omap##name##_sync32k_timer_init(void) \ void __init omap##name##_sync32k_timer_init(void) \ { \ { \ omap_dmtimer_init(); \ omap_dmtimer_init(); \ omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ /* Enable the use of clocksource="gp_timer" kernel parameter */ \ /* Enable the use of clocksource="gp_timer" kernel parameter */ \ if (use_gptimer_clksrc) \ if (use_gptimer_clksrc) \ omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src);\ omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src, \ clksrc_prop); \ else \ else \ omap2_sync32k_clocksource_init(); \ omap2_sync32k_clocksource_init(); \ } } #ifdef CONFIG_ARCH_OMAP2 #ifdef CONFIG_ARCH_OMAP2 OMAP_SYS_32K_TIMER_INIT(2, 1, OMAP2_32K_SOURCE, "ti,timer-alwon", OMAP_SYS_32K_TIMER_INIT(2, 1, "timer_32k_ck", "ti,timer-alwon", 2, OMAP2_MPU_SOURCE); 2, "timer_sys_ck", NULL); #endif /* CONFIG_ARCH_OMAP2 */ #endif /* CONFIG_ARCH_OMAP2 */ #ifdef CONFIG_ARCH_OMAP3 #ifdef CONFIG_ARCH_OMAP3 OMAP_SYS_32K_TIMER_INIT(3, 1, OMAP3_32K_SOURCE, "ti,timer-alwon", OMAP_SYS_32K_TIMER_INIT(3, 1, "timer_32k_ck", "ti,timer-alwon", 2, OMAP3_MPU_SOURCE); 2, "timer_sys_ck", NULL); OMAP_SYS_32K_TIMER_INIT(3_secure, 12, OMAP3_32K_SOURCE, "ti,timer-secure", OMAP_SYS_32K_TIMER_INIT(3_secure, 12, "secure_32k_fck", "ti,timer-secure", 2, OMAP3_MPU_SOURCE); 2, "timer_sys_ck", NULL); OMAP_SYS_GP_TIMER_INIT(3_gp, 1, OMAP3_MPU_SOURCE, "ti,timer-alwon", 2, OMAP3_MPU_SOURCE); #endif /* CONFIG_ARCH_OMAP3 */ #endif /* CONFIG_ARCH_OMAP3 */ #ifdef CONFIG_SOC_AM33XX #if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_SOC_AM33XX) OMAP_SYS_GP_TIMER_INIT(3_am33xx, 1, OMAP4_MPU_SOURCE, "ti,timer-alwon", OMAP_SYS_GP_TIMER_INIT(3, 2, "timer_sys_ck", NULL, 2, OMAP4_MPU_SOURCE); 1, "timer_sys_ck", "ti,timer-alwon"); #endif /* CONFIG_SOC_AM33XX */ #endif #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) static OMAP_SYS_32K_TIMER_INIT(4, 1, "timer_32k_ck", "ti,timer-alwon", 2, "sys_clkin_ck", NULL); #endif #ifdef CONFIG_ARCH_OMAP4 #ifdef CONFIG_ARCH_OMAP4 OMAP_SYS_32K_TIMER_INIT(4, 1, OMAP4_32K_SOURCE, "ti,timer-alwon", 2, OMAP4_MPU_SOURCE); #ifdef CONFIG_LOCAL_TIMERS #ifdef CONFIG_LOCAL_TIMERS static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, OMAP44XX_LOCAL_TWD_BASE, 29); static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, OMAP44XX_LOCAL_TWD_BASE, 29); void __init omap4_local_timer_init(void) void __init omap4_local_timer_init(void) Loading Loading @@ -616,13 +620,11 @@ void __init omap4_local_timer_init(void) #endif /* CONFIG_ARCH_OMAP4 */ #endif /* CONFIG_ARCH_OMAP4 */ #ifdef CONFIG_SOC_OMAP5 #ifdef CONFIG_SOC_OMAP5 OMAP_SYS_32K_TIMER_INIT(5, 1, OMAP4_32K_SOURCE, "ti,timer-alwon", 2, OMAP5_MPU_SOURCE); void __init omap5_realtime_timer_init(void) void __init omap5_realtime_timer_init(void) { { int err; int err; omap5_sync32k_timer_init(); omap4_sync32k_timer_init(); realtime_counter_init(); realtime_counter_init(); err = arch_timer_of_register(); err = arch_timer_of_register(); Loading Loading
arch/arm/mach-omap2/board-cm-t3517.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -324,6 +324,6 @@ MACHINE_START(CM_T3517, "Compulab CM-T3517") .handle_irq = omap3_intc_handle_irq, .handle_irq = omap3_intc_handle_irq, .init_machine = cm_t3517_init, .init_machine = cm_t3517_init, .init_late = am35xx_init_late, .init_late = am35xx_init_late, .init_time = omap3_gp_gptimer_timer_init, .init_time = omap3_gptimer_timer_init, .restart = omap3xxx_restart, .restart = omap3xxx_restart, MACHINE_END MACHINE_END
arch/arm/mach-omap2/board-generic.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -140,7 +140,7 @@ DT_MACHINE_START(AM33XX_DT, "Generic AM33XX (Flattened Device Tree)") .init_irq = omap_intc_of_init, .init_irq = omap_intc_of_init, .handle_irq = omap3_intc_handle_irq, .handle_irq = omap3_intc_handle_irq, .init_machine = omap_generic_init, .init_machine = omap_generic_init, .init_time = omap3_am33xx_gptimer_timer_init, .init_time = omap3_gptimer_timer_init, .dt_compat = am33xx_boards_compat, .dt_compat = am33xx_boards_compat, .restart = am33xx_restart, .restart = am33xx_restart, MACHINE_END MACHINE_END Loading
arch/arm/mach-omap2/common.h +1 −2 Original line number Original line Diff line number Diff line Loading @@ -82,8 +82,7 @@ extern void omap2_init_common_infrastructure(void); extern void omap2_sync32k_timer_init(void); extern void omap2_sync32k_timer_init(void); extern void omap3_sync32k_timer_init(void); extern void omap3_sync32k_timer_init(void); extern void omap3_secure_sync32k_timer_init(void); extern void omap3_secure_sync32k_timer_init(void); extern void omap3_gp_gptimer_timer_init(void); extern void omap3_gptimer_timer_init(void); extern void omap3_am33xx_gptimer_timer_init(void); extern void omap4_local_timer_init(void); extern void omap4_local_timer_init(void); extern void omap5_realtime_timer_init(void); extern void omap5_realtime_timer_init(void); Loading
arch/arm/mach-omap2/timer.c +63 −61 Original line number Original line Diff line number Diff line Loading @@ -57,16 +57,6 @@ #include "common.h" #include "common.h" #include "powerdomain.h" #include "powerdomain.h" /* Parent clocks, eventually these will come from the clock framework */ #define OMAP2_MPU_SOURCE "sys_ck" #define OMAP3_MPU_SOURCE OMAP2_MPU_SOURCE #define OMAP4_MPU_SOURCE "sys_clkin_ck" #define OMAP5_MPU_SOURCE "sys_clkin" #define OMAP2_32K_SOURCE "func_32k_ck" #define OMAP3_32K_SOURCE "omap_32k_fck" #define OMAP4_32K_SOURCE "sys_32k_ck" #define REALTIME_COUNTER_BASE 0x48243200 #define REALTIME_COUNTER_BASE 0x48243200 #define INCREMENTER_NUMERATOR_OFFSET 0x10 #define INCREMENTER_NUMERATOR_OFFSET 0x10 #define INCREMENTER_DENUMERATOR_RELOAD_OFFSET 0x14 #define INCREMENTER_DENUMERATOR_RELOAD_OFFSET 0x14 Loading Loading @@ -130,7 +120,6 @@ static void omap2_gp_timer_set_mode(enum clock_event_mode mode, } } static struct clock_event_device clockevent_gpt = { static struct clock_event_device clockevent_gpt = { .name = "gp_timer", .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, .rating = 300, .rating = 300, .set_next_event = omap2_gp_timer_set_next_event, .set_next_event = omap2_gp_timer_set_next_event, Loading Loading @@ -171,6 +160,12 @@ static struct device_node * __init omap_get_timer_dt(struct of_device_id *match, if (property && !of_get_property(np, property, NULL)) if (property && !of_get_property(np, property, NULL)) continue; continue; if (!property && (of_get_property(np, "ti,timer-alwon", NULL) || of_get_property(np, "ti,timer-dsp", NULL) || of_get_property(np, "ti,timer-pwm", NULL) || of_get_property(np, "ti,timer-secure", NULL))) continue; of_add_property(np, &device_disabled); of_add_property(np, &device_disabled); return np; return np; } } Loading Loading @@ -215,9 +210,9 @@ static u32 __init omap_dm_timer_get_errata(void) } } static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, int gptimer_id, const char *fck_source, const char *fck_source, const char *property, const char *property, const char **timer_name, int posted) int posted) { { char name[10]; /* 10 = sizeof("gptXX_Xck0") */ char name[10]; /* 10 = sizeof("gptXX_Xck0") */ Loading @@ -225,6 +220,7 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, struct device_node *np; struct device_node *np; struct omap_hwmod *oh; struct omap_hwmod *oh; struct resource irq, mem; struct resource irq, mem; struct clk *src; int r = 0; int r = 0; if (of_have_populated_dt()) { if (of_have_populated_dt()) { Loading @@ -244,10 +240,10 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, of_node_put(np); of_node_put(np); } else { } else { if (omap_dm_timer_reserve_systimer(gptimer_id)) if (omap_dm_timer_reserve_systimer(timer->id)) return -ENODEV; return -ENODEV; sprintf(name, "timer%d", gptimer_id); sprintf(name, "timer%d", timer->id); oh_name = name; oh_name = name; } } Loading @@ -255,6 +251,8 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, if (!oh) if (!oh) return -ENODEV; return -ENODEV; *timer_name = oh->name; if (!of_have_populated_dt()) { if (!of_have_populated_dt()) { r = omap_hwmod_get_resource_byname(oh, IORESOURCE_IRQ, NULL, r = omap_hwmod_get_resource_byname(oh, IORESOURCE_IRQ, NULL, &irq); &irq); Loading @@ -277,24 +275,24 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, /* After the dmtimer is using hwmod these clocks won't be needed */ /* After the dmtimer is using hwmod these clocks won't be needed */ timer->fclk = clk_get(NULL, omap_hwmod_get_main_clk(oh)); timer->fclk = clk_get(NULL, omap_hwmod_get_main_clk(oh)); if (IS_ERR(timer->fclk)) if (IS_ERR(timer->fclk)) return -ENODEV; return PTR_ERR(timer->fclk); /* FIXME: Need to remove hard-coded test on timer ID */ if (gptimer_id != 12) { struct clk *src; src = clk_get(NULL, fck_source); src = clk_get(NULL, fck_source); if (IS_ERR(src)) { if (IS_ERR(src)) r = -EINVAL; return PTR_ERR(src); } else { if (clk_get_parent(timer->fclk) != src) { r = clk_set_parent(timer->fclk, src); r = clk_set_parent(timer->fclk, src); if (r < 0) if (r < 0) { pr_warn("%s: %s cannot set source\n", pr_warn("%s: %s cannot set source\n", __func__, __func__, oh->name); oh->name); clk_put(src); clk_put(src); return r; } } } } clk_put(src); omap_hwmod_setup_one(oh_name); omap_hwmod_setup_one(oh_name); omap_hwmod_enable(oh); omap_hwmod_enable(oh); __omap_dm_timer_init_regs(timer); __omap_dm_timer_init_regs(timer); Loading @@ -318,6 +316,7 @@ static void __init omap2_gp_clockevent_init(int gptimer_id, { { int res; int res; clkev.id = gptimer_id; clkev.errata = omap_dm_timer_get_errata(); clkev.errata = omap_dm_timer_get_errata(); /* /* Loading @@ -327,8 +326,8 @@ static void __init omap2_gp_clockevent_init(int gptimer_id, */ */ __omap_dm_timer_override_errata(&clkev, OMAP_TIMER_ERRATA_I103_I767); __omap_dm_timer_override_errata(&clkev, OMAP_TIMER_ERRATA_I103_I767); res = omap_dm_timer_init_one(&clkev, gptimer_id, fck_source, property, res = omap_dm_timer_init_one(&clkev, fck_source, property, OMAP_TIMER_POSTED); &clockevent_gpt.name, OMAP_TIMER_POSTED); BUG_ON(res); BUG_ON(res); omap2_gp_timer_irq.dev_id = &clkev; omap2_gp_timer_irq.dev_id = &clkev; Loading @@ -342,8 +341,8 @@ static void __init omap2_gp_clockevent_init(int gptimer_id, 3, /* Timer internal resynch latency */ 3, /* Timer internal resynch latency */ 0xffffffff); 0xffffffff); pr_info("OMAP clockevent source: GPTIMER%d at %lu Hz\n", pr_info("OMAP clockevent source: %s at %lu Hz\n", clockevent_gpt.name, gptimer_id, clkev.rate); clkev.rate); } } /* Clocksource code */ /* Clocksource code */ Loading @@ -360,7 +359,6 @@ static cycle_t clocksource_read_cycles(struct clocksource *cs) } } static struct clocksource clocksource_gpt = { static struct clocksource clocksource_gpt = { .name = "gp_timer", .rating = 300, .rating = 300, .read = clocksource_read_cycles, .read = clocksource_read_cycles, .mask = CLOCKSOURCE_MASK(32), .mask = CLOCKSOURCE_MASK(32), Loading Loading @@ -443,13 +441,16 @@ static int __init __maybe_unused omap2_sync32k_clocksource_init(void) } } static void __init omap2_gptimer_clocksource_init(int gptimer_id, static void __init omap2_gptimer_clocksource_init(int gptimer_id, const char *fck_source) const char *fck_source, const char *property) { { int res; int res; clksrc.id = gptimer_id; clksrc.errata = omap_dm_timer_get_errata(); clksrc.errata = omap_dm_timer_get_errata(); res = omap_dm_timer_init_one(&clksrc, gptimer_id, fck_source, NULL, res = omap_dm_timer_init_one(&clksrc, fck_source, property, &clocksource_gpt.name, OMAP_TIMER_NONPOSTED); OMAP_TIMER_NONPOSTED); BUG_ON(res); BUG_ON(res); Loading @@ -462,8 +463,8 @@ static void __init omap2_gptimer_clocksource_init(int gptimer_id, pr_err("Could not register clocksource %s\n", pr_err("Could not register clocksource %s\n", clocksource_gpt.name); clocksource_gpt.name); else else pr_info("OMAP clocksource: GPTIMER%d at %lu Hz\n", pr_info("OMAP clocksource: %s at %lu Hz\n", gptimer_id, clksrc.rate); clocksource_gpt.name, clksrc.rate); } } #ifdef CONFIG_SOC_HAS_REALTIME_COUNTER #ifdef CONFIG_SOC_HAS_REALTIME_COUNTER Loading @@ -488,7 +489,7 @@ static void __init realtime_counter_init(void) pr_err("%s: ioremap failed\n", __func__); pr_err("%s: ioremap failed\n", __func__); return; return; } } sys_clk = clk_get(NULL, OMAP5_MPU_SOURCE); sys_clk = clk_get(NULL, "sys_clkin"); if (IS_ERR(sys_clk)) { if (IS_ERR(sys_clk)) { pr_err("%s: failed to get system clock handle\n", __func__); pr_err("%s: failed to get system clock handle\n", __func__); iounmap(base); iounmap(base); Loading Loading @@ -545,49 +546,52 @@ static inline void __init realtime_counter_init(void) #endif #endif #define OMAP_SYS_GP_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \ #define OMAP_SYS_GP_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \ clksrc_nr, clksrc_src) \ clksrc_nr, clksrc_src, clksrc_prop) \ void __init omap##name##_gptimer_timer_init(void) \ void __init omap##name##_gptimer_timer_init(void) \ { \ { \ omap_dmtimer_init(); \ omap_dmtimer_init(); \ omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src); \ omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src, \ clksrc_prop); \ } } #define OMAP_SYS_32K_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \ #define OMAP_SYS_32K_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \ clksrc_nr, clksrc_src) \ clksrc_nr, clksrc_src, clksrc_prop) \ void __init omap##name##_sync32k_timer_init(void) \ void __init omap##name##_sync32k_timer_init(void) \ { \ { \ omap_dmtimer_init(); \ omap_dmtimer_init(); \ omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ /* Enable the use of clocksource="gp_timer" kernel parameter */ \ /* Enable the use of clocksource="gp_timer" kernel parameter */ \ if (use_gptimer_clksrc) \ if (use_gptimer_clksrc) \ omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src);\ omap2_gptimer_clocksource_init((clksrc_nr), clksrc_src, \ clksrc_prop); \ else \ else \ omap2_sync32k_clocksource_init(); \ omap2_sync32k_clocksource_init(); \ } } #ifdef CONFIG_ARCH_OMAP2 #ifdef CONFIG_ARCH_OMAP2 OMAP_SYS_32K_TIMER_INIT(2, 1, OMAP2_32K_SOURCE, "ti,timer-alwon", OMAP_SYS_32K_TIMER_INIT(2, 1, "timer_32k_ck", "ti,timer-alwon", 2, OMAP2_MPU_SOURCE); 2, "timer_sys_ck", NULL); #endif /* CONFIG_ARCH_OMAP2 */ #endif /* CONFIG_ARCH_OMAP2 */ #ifdef CONFIG_ARCH_OMAP3 #ifdef CONFIG_ARCH_OMAP3 OMAP_SYS_32K_TIMER_INIT(3, 1, OMAP3_32K_SOURCE, "ti,timer-alwon", OMAP_SYS_32K_TIMER_INIT(3, 1, "timer_32k_ck", "ti,timer-alwon", 2, OMAP3_MPU_SOURCE); 2, "timer_sys_ck", NULL); OMAP_SYS_32K_TIMER_INIT(3_secure, 12, OMAP3_32K_SOURCE, "ti,timer-secure", OMAP_SYS_32K_TIMER_INIT(3_secure, 12, "secure_32k_fck", "ti,timer-secure", 2, OMAP3_MPU_SOURCE); 2, "timer_sys_ck", NULL); OMAP_SYS_GP_TIMER_INIT(3_gp, 1, OMAP3_MPU_SOURCE, "ti,timer-alwon", 2, OMAP3_MPU_SOURCE); #endif /* CONFIG_ARCH_OMAP3 */ #endif /* CONFIG_ARCH_OMAP3 */ #ifdef CONFIG_SOC_AM33XX #if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_SOC_AM33XX) OMAP_SYS_GP_TIMER_INIT(3_am33xx, 1, OMAP4_MPU_SOURCE, "ti,timer-alwon", OMAP_SYS_GP_TIMER_INIT(3, 2, "timer_sys_ck", NULL, 2, OMAP4_MPU_SOURCE); 1, "timer_sys_ck", "ti,timer-alwon"); #endif /* CONFIG_SOC_AM33XX */ #endif #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5) static OMAP_SYS_32K_TIMER_INIT(4, 1, "timer_32k_ck", "ti,timer-alwon", 2, "sys_clkin_ck", NULL); #endif #ifdef CONFIG_ARCH_OMAP4 #ifdef CONFIG_ARCH_OMAP4 OMAP_SYS_32K_TIMER_INIT(4, 1, OMAP4_32K_SOURCE, "ti,timer-alwon", 2, OMAP4_MPU_SOURCE); #ifdef CONFIG_LOCAL_TIMERS #ifdef CONFIG_LOCAL_TIMERS static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, OMAP44XX_LOCAL_TWD_BASE, 29); static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, OMAP44XX_LOCAL_TWD_BASE, 29); void __init omap4_local_timer_init(void) void __init omap4_local_timer_init(void) Loading Loading @@ -616,13 +620,11 @@ void __init omap4_local_timer_init(void) #endif /* CONFIG_ARCH_OMAP4 */ #endif /* CONFIG_ARCH_OMAP4 */ #ifdef CONFIG_SOC_OMAP5 #ifdef CONFIG_SOC_OMAP5 OMAP_SYS_32K_TIMER_INIT(5, 1, OMAP4_32K_SOURCE, "ti,timer-alwon", 2, OMAP5_MPU_SOURCE); void __init omap5_realtime_timer_init(void) void __init omap5_realtime_timer_init(void) { { int err; int err; omap5_sync32k_timer_init(); omap4_sync32k_timer_init(); realtime_counter_init(); realtime_counter_init(); err = arch_timer_of_register(); err = arch_timer_of_register(); Loading