msm: clock-local2: Move lock from rcg_clk_set_rate to lower level ops

The local_clock_reg_lock is used to protect registers accesses. Move
the acquiring and releasing of this lock from rcg_clk_set_rate to
set_rate_mnd and set_rate_hid to allow overriding of the RCG set rate
op with ops that dont require the lock.

Signed-off-by: Vikram Mulukutla <markivx@codeaurora.org>
(cherry picked from commit 8c26055e822312da17d93e2a252bf522e08c3965)

Conflicts:

	arch/arm/mach-msm/clock-local2.c

Change-Id: Ibb67a921f6b1c53573b864ce1bd05b13492b92f5
Signed-off-by: Sudhir Sharma <sudsha@codeaurora.org>
(cherry picked from commit 33ce43fe3edf79bbc8ab6948d96c463696237d3d)
diff --git a/arch/arm/mach-msm/clock-local2.c b/arch/arm/mach-msm/clock-local2.c
index 0383f1d..96f4379 100644
--- a/arch/arm/mach-msm/clock-local2.c
+++ b/arch/arm/mach-msm/clock-local2.c
@@ -110,20 +110,26 @@
 void set_rate_hid(struct rcg_clk *rcg, struct clk_freq_tbl *nf)
 {
 	u32 cfg_regval;
+	unsigned long flags;
 
+	spin_lock_irqsave(&local_clock_reg_lock, flags);
 	cfg_regval = readl_relaxed(CFG_RCGR_REG(rcg));
 	cfg_regval &= ~(CFG_RCGR_DIV_MASK | CFG_RCGR_SRC_SEL_MASK);
 	cfg_regval |= nf->div_src_val;
 	writel_relaxed(cfg_regval, CFG_RCGR_REG(rcg));
 
 	rcg_update_config(rcg);
+	spin_unlock_irqrestore(&local_clock_reg_lock, flags);
 }
 
 /* RCG set rate function for clocks with MND & Half Integer Dividers. */
 void set_rate_mnd(struct rcg_clk *rcg, struct clk_freq_tbl *nf)
 {
 	u32 cfg_regval;
+	unsigned long flags;
 
+	spin_lock_irqsave(&local_clock_reg_lock, flags);
+	cfg_regval = readl_relaxed(CFG_RCGR_REG(rcg));
 	writel_relaxed(nf->m_val, M_REG(rcg));
 	writel_relaxed(nf->n_val, N_REG(rcg));
 	writel_relaxed(nf->d_val, D_REG(rcg));
@@ -139,6 +145,7 @@
 	writel_relaxed(cfg_regval, CFG_RCGR_REG(rcg));
 
 	rcg_update_config(rcg);
+	spin_unlock_irqrestore(&local_clock_reg_lock, flags);
 }
 
 static int rcg_clk_prepare(struct clk *c)
@@ -156,8 +163,7 @@
 {
 	struct clk_freq_tbl *cf, *nf;
 	struct rcg_clk *rcg = to_rcg_clk(c);
-	int rc;
-	unsigned long flags;
+	int rc = 0;
 
 	for (nf = rcg->freq_tbl; nf->freq_hz != FREQ_END
 			&& nf->freq_hz != rate; nf++)
@@ -187,13 +193,9 @@
 
 	BUG_ON(!rcg->set_rate);
 
-	spin_lock_irqsave(&local_clock_reg_lock, flags);
-
 	/* Perform clock-specific frequency switch operations. */
 	rcg->set_rate(rcg, nf);
 
-	spin_unlock_irqrestore(&local_clock_reg_lock, flags);
-
 	/* Release source requirements of the old freq. */
 	if (c->count)
 		clk_disable(cf->src_clk);