[PATCH] ARM: SAMSUNG: use spin_lock_irqsave() in clk_{enable, disable}
From: Kukjin Kim <hidden>
Date: 2012-01-27 05:17:23
Also in:
linux-samsung-soc
Subsystem:
arm port, the rest · Maintainers:
Russell King, Linus Torvalds
From: Minho Ban <redacted> The clk_enable()and clk_disable() can be called in process and ISR either. Actually that is used for real product and other platforms now. So it's time to use spin_lock_irqsave() instead. Signed-off-by: Minho Ban <redacted> Signed-off-by: Jaecheol Lee <redacted> Signed-off-by: Sunyoung Kang <redacted> Cc: Ben Dooks <ben-linux@fluff.org> Cc: Russell King <redacted> Signed-off-by: Kukjin Kim <redacted> --- Note: There were discussion about this before. http://lists.infradead.org/pipermail/linux-arm-kernel/2010-October/028788.html As we discussed, actually that is used for real product and other platforms now. Plus, we don't need to change the PLL during kernel so the latency doesn't matter. I think it's time to use spin_lock_irqsave() instead. arch/arm/plat-samsung/clock.c | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/arch/arm/plat-samsung/clock.c b/arch/arm/plat-samsung/clock.c
index 10f7117..65c5eca 100644
--- a/arch/arm/plat-samsung/clock.c
+++ b/arch/arm/plat-samsung/clock.c@@ -84,31 +84,35 @@ static int clk_null_enable(struct clk *clk, int enable) int clk_enable(struct clk *clk) { + unsigned long flags; + if (IS_ERR(clk) || clk == NULL) return -EINVAL; clk_enable(clk->parent); - spin_lock(&clocks_lock); + spin_lock_irqsave(&clocks_lock, flags); if ((clk->usage++) == 0) (clk->enable)(clk, 1); - spin_unlock(&clocks_lock); + spin_unlock_irqrestore(&clocks_lock, flags); return 0; } void clk_disable(struct clk *clk) { + unsigned long flags; + if (IS_ERR(clk) || clk == NULL) return; - spin_lock(&clocks_lock); + spin_lock_irqsave(&clocks_lock, flags); if ((--clk->usage) == 0) (clk->enable)(clk, 0); - spin_unlock(&clocks_lock); + spin_unlock_irqrestore(&clocks_lock, flags); clk_disable(clk->parent); }
--
1.7.1