Commit b1cbdb00da2ac00eb67fe277e563ff1f5093b4ba

Authored by Santosh Shilimkar
Committed by Paul Walmsley
1 parent c956b753e7

OMAP: clockdomain: Wait for powerdomain to be ON when using clockdomain force wakeup

While using clockdomain force wakeup method, not waiting for powerdomain
to be effectively ON may end up locking the clockdomain FSM until a
next wakeup event occurs.

One such issue was seen on OMAP4430, where L4_PER was periodically
getting stuck in in-transition state when transitioning from from OSWR to ON.

This issue was reported and investigated by Patrick Titiano <p-titiano@ti.com>

Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Reported-by: Patrick Titiano <p-titiano@ti.com>
Cc: Kevin Hilman <khilman@ti.com>
Cc: Benoit Cousson <b-cousson@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
[paul@pwsan.com: updated to apply; added transition wait on clkdm_deny_idle();
 remove two superfluous pwrdm_wait_transition() calls]
Signed-off-by: Paul Walmsley <paul@pwsan.com>

Showing 2 changed files with 2 additions and 2 deletions Side-by-side Diff

arch/arm/mach-omap2/clockdomain.c
... ... @@ -747,6 +747,7 @@
747 747 spin_lock_irqsave(&clkdm->lock, flags);
748 748 clkdm->_flags &= ~_CLKDM_FLAG_HWSUP_ENABLED;
749 749 ret = arch_clkdm->clkdm_wakeup(clkdm);
  750 + ret |= pwrdm_state_switch(clkdm->pwrdm.ptr);
750 751 spin_unlock_irqrestore(&clkdm->lock, flags);
751 752 return ret;
752 753 }
... ... @@ -818,6 +819,7 @@
818 819 spin_lock_irqsave(&clkdm->lock, flags);
819 820 clkdm->_flags &= ~_CLKDM_FLAG_HWSUP_ENABLED;
820 821 arch_clkdm->clkdm_deny_idle(clkdm);
  822 + pwrdm_state_switch(clkdm->pwrdm.ptr);
821 823 spin_unlock_irqrestore(&clkdm->lock, flags);
822 824 }
823 825  
arch/arm/mach-omap2/pm.c
... ... @@ -130,7 +130,6 @@
130 130 } else {
131 131 hwsup = clkdm_in_hwsup(pwrdm->pwrdm_clkdms[0]);
132 132 clkdm_wakeup(pwrdm->pwrdm_clkdms[0]);
133   - pwrdm_wait_transition(pwrdm);
134 133 sleep_switch = FORCEWAKEUP_SWITCH;
135 134 }
136 135 }
... ... @@ -156,7 +155,6 @@
156 155 return ret;
157 156 }
158 157  
159   - pwrdm_wait_transition(pwrdm);
160 158 pwrdm_state_switch(pwrdm);
161 159 err:
162 160 return ret;