ARM: OMAP: Remove __omap_dm_timer_set_source function
authorJon Hunter <jon-hunter@ti.com>
Fri, 28 Sep 2012 16:43:30 +0000 (11:43 -0500)
committerJon Hunter <jon-hunter@ti.com>
Mon, 12 Nov 2012 22:23:57 +0000 (16:23 -0600)
The __omap_dm_timer_set_source() function is only used by the system timer
(clock-events and clock-source) code for OMAP2+ devices. Therefore, we can
remove this code from the dmtimer driver and move it to the system timer
code for OMAP2+ devices.

The current __omap_dm_timer_set_source() function calls clk_disable() before
calling clk_set_parent() and clk_enable() afterwards. We can avoid these calls
to clk_disable/enable by moving the calls to omap_hwmod_setup_one() and
omap_hwmod_enable() to after the call to clk_set_parent() in
omap_dm_timer_init_one().

The function omap_hwmod_setup_one() will enable the timers functional clock
and therefore increment the use-count of the functional clock to 1.
clk_set_parent() will fail if the use-count is not 0 when called. Hence, if
omap_hwmod_setup_one() is called before clk_set_parent(), we will need to call
clk_disable() before calling clk_set_parent() to decrement the use-count.
Hence, avoid these extra calls to disable and enable the functional clock by
moving the calls to omap_hwmod_setup_one() and omap_hwmod_enable() to after
clk_set_parent().

We can also remove the delay from the __omap_dm_timer_set_source() function
because enabling the clock will now be handled via the HWMOD framework by
calling omap_hwmod_setup_one(). Therefore, by moving the calls to
omap_hwmod_setup_one() and omap_hwmod_enable() to after the call to
clk_set_parent(), we can simply replace __omap_dm_timer_set_source() with
clk_set_parent().

It should be safe to move these hwmod calls to later in the
omap_dm_timer_init_one() because other calls to the hwmod layer that occur
before are just requesting resource information.

Testing includes boot testing on OMAP2420 H4, OMAP3430 SDP and OMAP4430 Blaze
with the following configurations:
1. CONFIG_OMAP_32K_TIMER=y
2. CONFIG_OMAP_32K_TIMER=y and boot parameter "clocksource=gp_timer"
3. CONFIG_OMAP_32K_TIMER not set
4. CONFIG_OMAP_32K_TIMER not set and boot parameter "clocksource=gp_timer"

Signed-off-by: Jon Hunter <jon-hunter@ti.com>
Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
arch/arm/mach-omap2/timer.c
arch/arm/plat-omap/dmtimer.c
arch/arm/plat-omap/include/plat/dmtimer.h

index 19765bd96c8eb7325b3e335261de792265359f2d..099e4060afe988a3ebe28b4cd0235614dced9c54 100644 (file)
@@ -274,9 +274,7 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
                oh_name = name;
        }
 
-       omap_hwmod_setup_one(oh_name);
        oh = omap_hwmod_lookup(oh_name);
-
        if (!oh)
                return -ENODEV;
 
@@ -306,8 +304,6 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
        if (IS_ERR(timer->fclk))
                return -ENODEV;
 
-       omap_hwmod_enable(oh);
-
        /* FIXME: Need to remove hard-coded test on timer ID */
        if (gptimer_id != 12) {
                struct clk *src;
@@ -316,13 +312,16 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
                if (IS_ERR(src)) {
                        res = -EINVAL;
                } else {
-                       res = __omap_dm_timer_set_source(timer->fclk, src);
+                       res = clk_set_parent(timer->fclk, src);
                        if (IS_ERR_VALUE(res))
                                pr_warn("%s: %s cannot set source\n",
                                        __func__, oh->name);
                        clk_put(src);
                }
        }
+
+       omap_hwmod_setup_one(oh_name);
+       omap_hwmod_enable(oh);
        __omap_dm_timer_init_regs(timer);
 
        if (posted)
index 305faf539465c71b5e292c020a4cd5b99f75ea3a..9deeb3064d33733f57e3129be83bab343f6cd90c 100644 (file)
@@ -35,6 +35,7 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
+#include <linux/clk.h>
 #include <linux/module.h>
 #include <linux/io.h>
 #include <linux/device.h>
index 769efb6f30d5269b483d4494a1090df5efcdb88d..05a36e16f3f40a4e1d1f2ec851760c9149503376 100644 (file)
@@ -32,7 +32,6 @@
  * 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/io.h>
 #include <linux/platform_device.h>
@@ -397,24 +396,6 @@ static inline void __omap_dm_timer_override_errata(struct omap_dm_timer *timer,
        timer->errata &= ~errata;
 }
 
-static inline int __omap_dm_timer_set_source(struct clk *timer_fck,
-                                               struct clk *parent)
-{
-       int ret;
-
-       clk_disable(timer_fck);
-       ret = clk_set_parent(timer_fck, parent);
-       clk_enable(timer_fck);
-
-       /*
-        * When the functional clock disappears, too quick writes seem
-        * to cause an abort. XXX Is this still necessary?
-        */
-       __delay(300000);
-
-       return ret;
-}
-
 static inline void __omap_dm_timer_stop(struct omap_dm_timer *timer,
                                        int posted, unsigned long rate)
 {