diff options
Diffstat (limited to 'arch/arm/mach-omap2/timer.c')
| -rw-r--r-- | arch/arm/mach-omap2/timer.c | 93 | 
1 files changed, 14 insertions, 79 deletions
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 840929bd9da..13d20c8a283 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c @@ -69,11 +69,6 @@  #define OMAP3_SECURE_TIMER	1  #endif -/* MAX_GPTIMER_ID: number of GPTIMERs on the chip */ -#define MAX_GPTIMER_ID		12 - -static u32 sys_timer_reserved; -  /* Clockevent code */  static struct omap_dm_timer clkev; @@ -173,14 +168,14 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,  		return -ENXIO;  	/* After the dmtimer is using hwmod these clocks won't be needed */ -	sprintf(name, "gpt%d_fck", gptimer_id); -	timer->fclk = clk_get(NULL, name); +	timer->fclk = clk_get(NULL, omap_hwmod_get_main_clk(oh));  	if (IS_ERR(timer->fclk))  		return -ENODEV;  	omap_hwmod_enable(oh); -	sys_timer_reserved |= (1 << (gptimer_id - 1)); +	if (omap_dm_timer_reserve_systimer(gptimer_id)) +		return -ENODEV;  	if (gptimer_id != 12) {  		struct clk *src; @@ -368,6 +363,11 @@ OMAP_SYS_TIMER_INIT(3_secure, OMAP3_SECURE_TIMER, OMAP3_CLKEV_SOURCE,  OMAP_SYS_TIMER(3_secure)  #endif +#ifdef CONFIG_SOC_AM33XX +OMAP_SYS_TIMER_INIT(3_am33xx, 1, OMAP4_MPU_SOURCE, 2, OMAP4_MPU_SOURCE) +OMAP_SYS_TIMER(3_am33xx) +#endif +  #ifdef CONFIG_ARCH_OMAP4  #ifdef CONFIG_LOCAL_TIMERS  static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, @@ -393,65 +393,10 @@ static void __init omap4_timer_init(void)  OMAP_SYS_TIMER(4)  #endif -/** - * omap2_dm_timer_set_src - change the timer input clock source - * @pdev:	timer platform device pointer - * @source:	array index of parent clock source - */ -static int omap2_dm_timer_set_src(struct platform_device *pdev, int source) -{ -	int ret; -	struct dmtimer_platform_data *pdata = pdev->dev.platform_data; -	struct clk *fclk, *parent; -	char *parent_name = NULL; - -	fclk = clk_get(&pdev->dev, "fck"); -	if (IS_ERR_OR_NULL(fclk)) { -		dev_err(&pdev->dev, "%s: %d: clk_get() FAILED\n", -				__func__, __LINE__); -		return -EINVAL; -	} - -	switch (source) { -	case OMAP_TIMER_SRC_SYS_CLK: -		parent_name = "sys_ck"; -		break; - -	case OMAP_TIMER_SRC_32_KHZ: -		parent_name = "32k_ck"; -		break; - -	case OMAP_TIMER_SRC_EXT_CLK: -		if (pdata->timer_ip_version == OMAP_TIMER_IP_VERSION_1) { -			parent_name = "alt_ck"; -			break; -		} -		dev_err(&pdev->dev, "%s: %d: invalid clk src.\n", -			__func__, __LINE__); -		clk_put(fclk); -		return -EINVAL; -	} - -	parent = clk_get(&pdev->dev, parent_name); -	if (IS_ERR_OR_NULL(parent)) { -		dev_err(&pdev->dev, "%s: %d: clk_get() %s FAILED\n", -			__func__, __LINE__, parent_name); -		clk_put(fclk); -		return -EINVAL; -	} - -	ret = clk_set_parent(fclk, parent); -	if (IS_ERR_VALUE(ret)) { -		dev_err(&pdev->dev, "%s: clk_set_parent() to %s FAILED\n", -			__func__, parent_name); -		ret = -EINVAL; -	} - -	clk_put(parent); -	clk_put(fclk); - -	return ret; -} +#ifdef CONFIG_SOC_OMAP5 +OMAP_SYS_TIMER_INIT(5, 1, OMAP4_CLKEV_SOURCE, 2, OMAP4_MPU_SOURCE) +OMAP_SYS_TIMER(5) +#endif  /**   * omap_timer_init - build and register timer device with an @@ -473,7 +418,6 @@ static int __init omap_timer_init(struct omap_hwmod *oh, void *unused)  	struct dmtimer_platform_data *pdata;  	struct platform_device *pdev;  	struct omap_timer_capability_dev_attr *timer_dev_attr; -	struct powerdomain *pwrdm;  	pr_debug("%s: %s\n", __func__, oh->name); @@ -501,18 +445,9 @@ static int __init omap_timer_init(struct omap_hwmod *oh, void *unused)  	 */  	sscanf(oh->name, "timer%2d", &id); -	pdata->set_timer_src = omap2_dm_timer_set_src; -	pdata->timer_ip_version = oh->class->rev; +	if (timer_dev_attr) +		pdata->timer_capability = timer_dev_attr->timer_capability; -	/* Mark clocksource and clockevent timers as reserved */ -	if ((sys_timer_reserved >> (id - 1)) & 0x1) -		pdata->reserved = 1; - -	pwrdm = omap_hwmod_get_pwrdm(oh); -	pdata->loses_context = pwrdm_can_ever_lose_context(pwrdm); -#ifdef CONFIG_PM -	pdata->get_context_loss_count = omap_pm_get_dev_context_loss_count; -#endif  	pdev = omap_device_build(name, id, oh, pdata, sizeof(*pdata),  				 NULL, 0, 0);  |