|
@@ -125,9 +125,10 @@ int clk_set_rate(struct clk *clk, unsigned long rate)
|
|
|
if (clk == NULL || IS_ERR(clk))
|
|
|
return ret;
|
|
|
|
|
|
- spin_lock_irqsave(&clockfw_lock, flags);
|
|
|
if (clk->set_rate)
|
|
|
ret = clk->set_rate(clk, rate);
|
|
|
+
|
|
|
+ spin_lock_irqsave(&clockfw_lock, flags);
|
|
|
if (ret == 0) {
|
|
|
if (clk->recalc)
|
|
|
clk->rate = clk->recalc(clk);
|
|
@@ -364,6 +365,7 @@ int davinci_set_pllrate(struct pll_data *pll, unsigned int prediv,
|
|
|
{
|
|
|
u32 ctrl;
|
|
|
unsigned int locktime;
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
if (pll->base == NULL)
|
|
|
return -EINVAL;
|
|
@@ -384,6 +386,9 @@ int davinci_set_pllrate(struct pll_data *pll, unsigned int prediv,
|
|
|
if (mult)
|
|
|
mult = mult - 1;
|
|
|
|
|
|
+ /* Protect against simultaneous calls to PLL setting seqeunce */
|
|
|
+ spin_lock_irqsave(&clockfw_lock, flags);
|
|
|
+
|
|
|
ctrl = __raw_readl(pll->base + PLLCTL);
|
|
|
|
|
|
/* Switch the PLL to bypass mode */
|
|
@@ -416,6 +421,8 @@ int davinci_set_pllrate(struct pll_data *pll, unsigned int prediv,
|
|
|
ctrl |= PLLCTL_PLLEN;
|
|
|
__raw_writel(ctrl, pll->base + PLLCTL);
|
|
|
|
|
|
+ spin_unlock_irqrestore(&clockfw_lock, flags);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
EXPORT_SYMBOL(davinci_set_pllrate);
|