Skip to content

Commit

Permalink
ARM: OMAP: dmtimers: Fix locking issue in omap_dm_timer_request*()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Timo Kokkonen authored and Tony Lindgren committed Aug 13, 2012
1 parent cf835e8 commit c5491d1
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions arch/arm/plat-omap/dmtimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ struct omap_dm_timer *omap_dm_timer_request(void)
timer->reserved = 1;
break;
}
spin_unlock_irqrestore(&dm_timer_lock, flags);

if (timer) {
ret = omap_dm_timer_prepare(timer);
Expand All @@ -197,7 +198,6 @@ struct omap_dm_timer *omap_dm_timer_request(void)
timer = NULL;
}
}
spin_unlock_irqrestore(&dm_timer_lock, flags);

if (!timer)
pr_debug("%s: timer request failed!\n", __func__);
Expand All @@ -220,6 +220,7 @@ struct omap_dm_timer *omap_dm_timer_request_specific(int id)
break;
}
}
spin_unlock_irqrestore(&dm_timer_lock, flags);

if (timer) {
ret = omap_dm_timer_prepare(timer);
Expand All @@ -228,7 +229,6 @@ struct omap_dm_timer *omap_dm_timer_request_specific(int id)
timer = NULL;
}
}
spin_unlock_irqrestore(&dm_timer_lock, flags);

if (!timer)
pr_debug("%s: timer%d request failed!\n", __func__, id);
Expand Down

0 comments on commit c5491d1

Please sign in to comment.