ARM: OMAP2+: Fix external clock support for dmtimers
[linux-2.6-block.git] / arch / arm / mach-omap2 / timer.c
index 840929bd9daecce4ef8e1ee95c2d404a2536c9c4..8c046d9d8ae899374f3dd8d67270f5945fb59631 100644 (file)
 #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;
@@ -180,7 +175,8 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
 
        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;
@@ -401,7 +397,6 @@ OMAP_SYS_TIMER(4)
 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;
 
@@ -422,14 +417,8 @@ static int omap2_dm_timer_set_src(struct platform_device *pdev, int source)
                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_name = "alt_ck";
+               break;
        }
 
        parent = clk_get(&pdev->dev, parent_name);
@@ -502,11 +491,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;
 
-       /* Mark clocksource and clockevent timers as reserved */
-       if ((sys_timer_reserved >> (id - 1)) & 0x1)
-               pdata->reserved = 1;
+       if (timer_dev_attr)
+               pdata->timer_capability = timer_dev_attr->timer_capability;
 
        pwrdm = omap_hwmod_get_pwrdm(oh);
        pdata->loses_context = pwrdm_can_ever_lose_context(pwrdm);