Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7f585bbf authored by Tony Lindgren's avatar Tony Lindgren
Browse files

Merge branch 'omap-timer-for-v3.10' of git://github.com/jonhunter/linux into omap-for-v3.10/timer

Conflicts:
	arch/arm/mach-omap2/timer.c
parents 43231b5b 4615943c
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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
+1 −1
Original line number Original line Diff line number Diff line
@@ -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
+1 −2
Original line number Original line Diff line number Diff line
@@ -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);


+63 −61
Original line number Original line Diff line number Diff line
@@ -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
@@ -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,
@@ -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;
	}
	}
@@ -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") */
@@ -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()) {
@@ -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;
	}
	}


@@ -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);
@@ -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);
@@ -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();


	/*
	/*
@@ -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;
@@ -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 */
@@ -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),
@@ -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);


@@ -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
@@ -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);
@@ -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)
@@ -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();