From 0bd623decdc02ddc2718898bc82464b76abf5d3b Mon Sep 17 00:00:00 2001 From: Ben Dooks Date: Tue, 21 Oct 2008 14:06:37 +0100 Subject: [PATCH] --- yaml --- r: 123811 b: refs/heads/master c: c3391e36d697c997b6afeb045071e0be95219a3e h: refs/heads/master i: 123809: be0e1e5ff4cd9877a6c27e7d94a4bc7670c74191 123807: f338592fe7624a176fa84d427aa5f5dde5b52528 v: v3 --- [refs] | 2 +- trunk/arch/arm/plat-s3c24xx/clock.c | 32 +++++++++++-------- .../arm/plat-s3c24xx/include/plat/clock.h | 4 ++- trunk/arch/arm/plat-s3c24xx/s3c244x-clock.c | 5 ++- 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/[refs] b/[refs] index c844d3b71479..2124610fbec3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 305554768011707f33f437b96f999f812ba2a7e4 +refs/heads/master: c3391e36d697c997b6afeb045071e0be95219a3e diff --git a/trunk/arch/arm/plat-s3c24xx/clock.c b/trunk/arch/arm/plat-s3c24xx/clock.c index 1ff1b9836042..334e696200be 100644 --- a/trunk/arch/arm/plat-s3c24xx/clock.c +++ b/trunk/arch/arm/plat-s3c24xx/clock.c @@ -37,7 +37,7 @@ #include #include #include -#include +#include #include #include @@ -55,7 +55,11 @@ static LIST_HEAD(clocks); -DEFINE_MUTEX(clocks_mutex); +/* We originally used an mutex here, but some contexts (see resume) + * are calling functions such as clk_set_parent() with IRQs disabled + * causing an BUG to be triggered. + */ +DEFINE_SPINLOCK(clocks_lock); /* enable and disable calls for use with the clk struct */ @@ -77,7 +81,7 @@ struct clk *clk_get(struct device *dev, const char *id) else idno = to_platform_device(dev)->id; - mutex_lock(&clocks_mutex); + spin_lock(&clocks_lock); list_for_each_entry(p, &clocks, list) { if (p->id == idno && @@ -101,7 +105,7 @@ struct clk *clk_get(struct device *dev, const char *id) } } - mutex_unlock(&clocks_mutex); + spin_unlock(&clocks_lock); return clk; } @@ -117,12 +121,12 @@ int clk_enable(struct clk *clk) clk_enable(clk->parent); - mutex_lock(&clocks_mutex); + spin_lock(&clocks_lock); if ((clk->usage++) == 0) (clk->enable)(clk, 1); - mutex_unlock(&clocks_mutex); + spin_unlock(&clocks_lock); return 0; } @@ -131,12 +135,12 @@ void clk_disable(struct clk *clk) if (IS_ERR(clk) || clk == NULL) return; - mutex_lock(&clocks_mutex); + spin_lock(&clocks_lock); if ((--clk->usage) == 0) (clk->enable)(clk, 0); - mutex_unlock(&clocks_mutex); + spin_unlock(&clocks_lock); clk_disable(clk->parent); } @@ -182,9 +186,9 @@ int clk_set_rate(struct clk *clk, unsigned long rate) if (clk->set_rate == NULL) return -EINVAL; - mutex_lock(&clocks_mutex); + spin_lock(&clocks_lock); ret = (clk->set_rate)(clk, rate); - mutex_unlock(&clocks_mutex); + spin_unlock(&clocks_lock); return ret; } @@ -201,12 +205,12 @@ int clk_set_parent(struct clk *clk, struct clk *parent) if (IS_ERR(clk)) return -EINVAL; - mutex_lock(&clocks_mutex); + spin_lock(&clocks_lock); if (clk->set_parent) ret = (clk->set_parent)(clk, parent); - mutex_unlock(&clocks_mutex); + spin_unlock(&clocks_lock); return ret; } @@ -302,9 +306,9 @@ int s3c24xx_register_clock(struct clk *clk) /* add to the list of available clocks */ - mutex_lock(&clocks_mutex); + spin_lock(&clocks_lock); list_add(&clk->list, &clocks); - mutex_unlock(&clocks_mutex); + spin_unlock(&clocks_lock); return 0; } diff --git a/trunk/arch/arm/plat-s3c24xx/include/plat/clock.h b/trunk/arch/arm/plat-s3c24xx/include/plat/clock.h index 235b753cd877..88a00c35b685 100644 --- a/trunk/arch/arm/plat-s3c24xx/include/plat/clock.h +++ b/trunk/arch/arm/plat-s3c24xx/include/plat/clock.h @@ -10,6 +10,8 @@ * published by the Free Software Foundation. */ +#include + struct clk { struct list_head list; struct module *owner; @@ -51,7 +53,7 @@ extern struct clk clk_xtal; * Please DO NOT use these outside of arch/arm/mach-s3c2410 */ -extern struct mutex clocks_mutex; +extern spinlock_t clocks_lock; extern int s3c2410_clkcon_enable(struct clk *clk, int enable); diff --git a/trunk/arch/arm/plat-s3c24xx/s3c244x-clock.c b/trunk/arch/arm/plat-s3c24xx/s3c244x-clock.c index 7c09773ff9fc..dde41f171aff 100644 --- a/trunk/arch/arm/plat-s3c24xx/s3c244x-clock.c +++ b/trunk/arch/arm/plat-s3c24xx/s3c244x-clock.c @@ -31,7 +31,6 @@ #include #include #include -#include #include #include @@ -102,13 +101,13 @@ static int s3c244x_clk_add(struct sys_device *sysdev) if (clk_get_rate(clock_upll) > (94 * MHZ)) { clk_usb_bus.rate = clk_get_rate(clock_upll) / 2; - mutex_lock(&clocks_mutex); + spin_lock(&clocks_lock); clkdivn = __raw_readl(S3C2410_CLKDIVN); clkdivn |= S3C2440_CLKDIVN_UCLK; __raw_writel(clkdivn, S3C2410_CLKDIVN); - mutex_unlock(&clocks_mutex); + spin_unlock(&clocks_lock); } return 0;