@@ -43,7 +43,7 @@
#include <plat/dmtimer.h>
static LIST_HEAD(omap_timer_list);
-static DEFINE_SPINLOCK(dm_timer_lock);
+static DEFINE_MUTEX(dm_timer_mutex);
/**
* omap_dm_timer_read_reg - read timer registers in posted and non-posted mode
@@ -136,9 +136,8 @@ void omap_dm_timer_prepare(struct omap_dm_timer *timer)
struct omap_dm_timer *omap_dm_timer_request(void)
{
struct omap_dm_timer *timer = NULL, *t;
- unsigned long flags;
- spin_lock_irqsave(&dm_timer_lock, flags);
+ mutex_lock(&dm_timer_mutex);
list_for_each_entry(t, &omap_timer_list, node) {
if (t->reserved)
continue;
@@ -147,7 +146,7 @@ struct omap_dm_timer *omap_dm_timer_request(void)
timer->reserved = 1;
break;
}
- spin_unlock_irqrestore(&dm_timer_lock, flags);
+ mutex_unlock(&dm_timer_mutex);
if (timer)
omap_dm_timer_prepare(timer);
@@ -161,9 +160,8 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_request);
struct omap_dm_timer *omap_dm_timer_request_specific(int id)
{
struct omap_dm_timer *timer = NULL, *t;
- unsigned long flags;
- spin_lock_irqsave(&dm_timer_lock, flags);
+ mutex_lock(&dm_timer_mutex);
list_for_each_entry(t, &omap_timer_list, node) {
if (t->pdev->id == id && !t->reserved) {
timer = t;
@@ -171,7 +169,7 @@ struct omap_dm_timer *omap_dm_timer_request_specific(int id)
break;
}
}
- spin_unlock_irqrestore(&dm_timer_lock, flags);
+ mutex_unlock(&dm_timer_mutex);
if (timer)
omap_dm_timer_prepare(timer);
@@ -220,14 +218,13 @@ __u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask)
{
int i = 0;
struct omap_dm_timer *timer = NULL;
- unsigned long flags;
/* If ARMXOR cannot be idled this function call is unnecessary */
if (!(inputmask & (1 << 1)))
return inputmask;
/* If any active timer is using ARMXOR return modified mask */
- spin_lock_irqsave(&dm_timer_lock, flags);
+ mutex_lock(&dm_timer_mutex);
list_for_each_entry(timer, &omap_timer_list, node) {
u32 l;
@@ -240,7 +237,7 @@ __u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask)
}
i++;
}
- spin_unlock_irqrestore(&dm_timer_lock, flags);
+ mutex_unlock(&dm_timer_mutex);
return inputmask;
}
@@ -464,7 +461,6 @@ EXPORT_SYMBOL_GPL(omap_dm_timers_active);
static int __devinit omap_dm_timer_probe(struct platform_device *pdev)
{
int ret;
- unsigned long flags;
struct omap_dm_timer *timer;
struct resource *mem, *irq, *ioarea;
struct dmtimer_platform_data *pdata = pdev->dev.platform_data;
@@ -522,9 +518,9 @@ static int __devinit omap_dm_timer_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev);
/* add the timer element to the list */
- spin_lock_irqsave(&dm_timer_lock, flags);
+ mutex_lock(&dm_timer_mutex);
list_add_tail(&timer->node, &omap_timer_list);
- spin_unlock_irqrestore(&dm_timer_lock, flags);
+ mutex_unlock(&dm_timer_mutex);
dev_dbg(&pdev->dev, "Device Probed.\n");
@@ -550,10 +546,9 @@ err_free_ioregion:
static int __devexit omap_dm_timer_remove(struct platform_device *pdev)
{
struct omap_dm_timer *timer;
- unsigned long flags;
int ret = -EINVAL;
- spin_lock_irqsave(&dm_timer_lock, flags);
+ mutex_lock(&dm_timer_mutex);
list_for_each_entry(timer, &omap_timer_list, node)
if (timer->pdev->id == pdev->id) {
list_del(&timer->node);
@@ -561,7 +556,7 @@ static int __devexit omap_dm_timer_remove(struct platform_device *pdev)
ret = 0;
break;
}
- spin_unlock_irqrestore(&dm_timer_lock, flags);
+ mutex_unlock(&dm_timer_mutex);
return ret;
}
Since the spinlock is not used in any interrupt context we can replace it with mutex instead. Signed-off-by: Tarun Kanti DebBarma <tarun.kanti@ti.com> --- arch/arm/plat-omap/dmtimer.c | 27 +++++++++++---------------- 1 files changed, 11 insertions(+), 16 deletions(-)