|
@@ -107,10 +107,20 @@ static int pmc_suspend(void)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static bool pmc_ready(unsigned int mask)
|
|
|
+{
|
|
|
+ unsigned int status;
|
|
|
+
|
|
|
+ regmap_read(pmcreg, AT91_PMC_SR, &status);
|
|
|
+
|
|
|
+ return ((status & mask) == mask) ? 1 : 0;
|
|
|
+}
|
|
|
+
|
|
|
static void pmc_resume(void)
|
|
|
{
|
|
|
- int i, ret = 0;
|
|
|
+ int i;
|
|
|
u32 tmp;
|
|
|
+ u32 mask = AT91_PMC_MCKRDY | AT91_PMC_LOCKA;
|
|
|
|
|
|
regmap_read(pmcreg, AT91_PMC_MCKR, &tmp);
|
|
|
if (pmc_cache.mckr != tmp)
|
|
@@ -134,13 +144,11 @@ static void pmc_resume(void)
|
|
|
AT91_PMC_PCR_CMD);
|
|
|
}
|
|
|
|
|
|
- if (pmc_cache.uckr & AT91_PMC_UPLLEN) {
|
|
|
- ret = regmap_read_poll_timeout(pmcreg, AT91_PMC_SR, tmp,
|
|
|
- !(tmp & AT91_PMC_LOCKU),
|
|
|
- 10, 5000);
|
|
|
- if (ret)
|
|
|
- pr_crit("USB PLL didn't lock when resuming\n");
|
|
|
- }
|
|
|
+ if (pmc_cache.uckr & AT91_PMC_UPLLEN)
|
|
|
+ mask |= AT91_PMC_LOCKU;
|
|
|
+
|
|
|
+ while (!pmc_ready(mask))
|
|
|
+ cpu_relax();
|
|
|
}
|
|
|
|
|
|
static struct syscore_ops pmc_syscore_ops = {
|