diff options
author | Timo Kokkonen <timo.t.kokkonen@iki.fi> | 2012-08-12 06:45:34 -0400 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2012-08-13 09:23:16 -0400 |
commit | c5491d1ae1946d394389b83b31b87708e86dc4cf (patch) | |
tree | feca1a2cde20a65f2a41964d6559e7a962e89a5d /arch | |
parent | cf835e8d226481984f72dffc6034fe75e296511e (diff) |
ARM: OMAP: dmtimers: Fix locking issue in omap_dm_timer_request*()
Calling omap_dm_timer_prepare while the spinlock is held is not
allowed as sleeping functions are called later on during the
preparation (namely within clk_get()).
dm_timer_lock is only required for protecting the
omap_timer_list. After the timer is marked as reserved, the lock is no
longer needed and should be freed.
Signed-off-by: Timo Kokkonen <timo.t.kokkonen@iki.fi>
Cc: Tarun Kanti DebBarma <tarun.kanti@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/plat-omap/dmtimer.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index 7b6689af0cce..938b50a33439 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c | |||
@@ -189,6 +189,7 @@ struct omap_dm_timer *omap_dm_timer_request(void) | |||
189 | timer->reserved = 1; | 189 | timer->reserved = 1; |
190 | break; | 190 | break; |
191 | } | 191 | } |
192 | spin_unlock_irqrestore(&dm_timer_lock, flags); | ||
192 | 193 | ||
193 | if (timer) { | 194 | if (timer) { |
194 | ret = omap_dm_timer_prepare(timer); | 195 | ret = omap_dm_timer_prepare(timer); |
@@ -197,7 +198,6 @@ struct omap_dm_timer *omap_dm_timer_request(void) | |||
197 | timer = NULL; | 198 | timer = NULL; |
198 | } | 199 | } |
199 | } | 200 | } |
200 | spin_unlock_irqrestore(&dm_timer_lock, flags); | ||
201 | 201 | ||
202 | if (!timer) | 202 | if (!timer) |
203 | pr_debug("%s: timer request failed!\n", __func__); | 203 | pr_debug("%s: timer request failed!\n", __func__); |
@@ -220,6 +220,7 @@ struct omap_dm_timer *omap_dm_timer_request_specific(int id) | |||
220 | break; | 220 | break; |
221 | } | 221 | } |
222 | } | 222 | } |
223 | spin_unlock_irqrestore(&dm_timer_lock, flags); | ||
223 | 224 | ||
224 | if (timer) { | 225 | if (timer) { |
225 | ret = omap_dm_timer_prepare(timer); | 226 | ret = omap_dm_timer_prepare(timer); |
@@ -228,7 +229,6 @@ struct omap_dm_timer *omap_dm_timer_request_specific(int id) | |||
228 | timer = NULL; | 229 | timer = NULL; |
229 | } | 230 | } |
230 | } | 231 | } |
231 | spin_unlock_irqrestore(&dm_timer_lock, flags); | ||
232 | 232 | ||
233 | if (!timer) | 233 | if (!timer) |
234 | pr_debug("%s: timer%d request failed!\n", __func__, id); | 234 | pr_debug("%s: timer%d request failed!\n", __func__, id); |