ARM: OMAP3+: dpll: optimize noncore dpll locking logic
authorVikram Pandita <vikram.pandita@ti.com>
Wed, 4 Jul 2012 11:00:44 +0000 (05:00 -0600)
committerPaul Walmsley <paul@pwsan.com>
Wed, 4 Jul 2012 11:00:44 +0000 (05:00 -0600)
If the dpll is already locked, code can be optimized
to return much earlier than doing redundent set of lock mode
and wait on idlest.

Cc: Tony Lindgren <tony@atomide.com>
Cc: Jon Hunter <jon-hunter@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
Cc: Mike Turquette <mturquette@ti.com>
Signed-off-by: Vikram Pandita <vikram.pandita@ti.com>
Signed-off-by: Nishanth Menon <nm@ti.com>
Signed-off-by: Paul Walmsley <paul@pwsan.com>
arch/arm/mach-omap2/dpll3xxx.c

index f0f10beeffe8ec77fe8d77b9a81934e83bd92bb1..c310dc0d40b4d357a72f3fd0c5ca2ce845cfce64 100644 (file)
@@ -135,11 +135,20 @@ static u16 _omap3_dpll_compute_freqsel(struct clk *clk, u8 n)
  */
 static int _omap3_noncore_dpll_lock(struct clk *clk)
 {
+       const struct dpll_data *dd;
        u8 ai;
-       int r;
+       u8 state = 1;
+       int r = 0;
 
        pr_debug("clock: locking DPLL %s\n", clk->name);
 
+       dd = clk->dpll_data;
+       state <<= __ffs(dd->idlest_mask);
+
+       /* Check if already locked */
+       if ((__raw_readl(dd->idlest_reg) & dd->idlest_mask) == state)
+               goto done;
+
        ai = omap3_dpll_autoidle_read(clk);
 
        if (ai)
@@ -152,6 +161,7 @@ static int _omap3_noncore_dpll_lock(struct clk *clk)
        if (ai)
                omap3_dpll_allow_idle(clk);
 
+done:
        return r;
 }