staging: omap-thermal: switch mutex to spinlock inside omap-bandgap
authorEduardo Valentin <eduardo.valentin@ti.com>
Fri, 15 Mar 2013 13:00:35 +0000 (09:00 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 15 Mar 2013 16:02:24 +0000 (09:02 -0700)
Because there is a need to lock inside IRQ handler, this patch
changes the locking mechanism inside the omap-bandgap.[c,h] to
spinlocks. Now this lock is used to protect omap_bandgap struct
during APIs exposed (possibly used in sysfs handling functions)
and inside the ALERT IRQ handler.

Because there are registers shared among the sensors, this lock
is global, not per sensor.

Signed-off-by: Eduardo Valentin <eduardo.valentin@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/omap-thermal/TODO
drivers/staging/omap-thermal/omap-bandgap.c
drivers/staging/omap-thermal/omap-bandgap.h

index 77b761befe92b718254ffd1f356d1ad5da1043b4..0f24e9b7555b5c231861c874471837335c9af8c2 100644 (file)
@@ -1,7 +1,6 @@
 List of TODOs (by Eduardo Valentin)
 
 on omap-bandgap.c:
-- Rework locking
 - Improve driver code by adding usage of regmap-mmio
 - Test every exposed API to userland
 - Add support to hwmon
index 4b631fd20e3aa2fa7dd43a053ce1179251fe44a3..846ced66d10c0daf74729414fa1507badc5bc438 100644 (file)
@@ -33,7 +33,7 @@
 #include <linux/platform_device.h>
 #include <linux/err.h>
 #include <linux/types.h>
-#include <linux/mutex.h>
+#include <linux/spinlock.h>
 #include <linux/reboot.h>
 #include <linux/of_device.h>
 #include <linux/of_platform.h>
@@ -170,6 +170,7 @@ static irqreturn_t omap_bandgap_talert_irq_handler(int irq, void *data)
        u32 t_hot = 0, t_cold = 0, ctrl;
        int i;
 
+       spin_lock(&bg_ptr->lock);
        for (i = 0; i < bg_ptr->conf->sensor_count; i++) {
                tsr = bg_ptr->conf->sensors[i].registers;
                ctrl = omap_bandgap_readl(bg_ptr, tsr->bgap_status);
@@ -208,6 +209,7 @@ static irqreturn_t omap_bandgap_talert_irq_handler(int irq, void *data)
                if (bg_ptr->conf->report_temperature)
                        bg_ptr->conf->report_temperature(bg_ptr, i);
        }
+       spin_unlock(&bg_ptr->lock);
 
        return IRQ_HANDLED;
 }
@@ -502,9 +504,9 @@ int _omap_bandgap_write_threshold(struct omap_bandgap *bg_ptr, int id, int val,
        if (ret < 0)
                goto exit;
 
-       mutex_lock(&bg_ptr->bg_mutex);
+       spin_lock(&bg_ptr->lock);
        omap_bandgap_update_alert_threshold(bg_ptr, id, adc_val, hot);
-       mutex_unlock(&bg_ptr->bg_mutex);
+       spin_unlock(&bg_ptr->lock);
 
 exit:
        return ret;
@@ -666,9 +668,9 @@ int omap_bandgap_write_update_interval(struct omap_bandgap *bg_ptr,
                return -ENOTSUPP;
 
        interval = interval * bg_ptr->clk_rate / 1000;
-       mutex_lock(&bg_ptr->bg_mutex);
+       spin_lock(&bg_ptr->lock);
        RMW_BITS(bg_ptr, id, bgap_counter, counter_mask, interval);
-       mutex_unlock(&bg_ptr->bg_mutex);
+       spin_unlock(&bg_ptr->lock);
 
        return 0;
 }
@@ -691,9 +693,9 @@ int omap_bandgap_read_temperature(struct omap_bandgap *bg_ptr, int id,
        if (ret)
                return ret;
 
-       mutex_lock(&bg_ptr->bg_mutex);
+       spin_lock(&bg_ptr->lock);
        temp = omap_bandgap_read_temp(bg_ptr, id);
-       mutex_unlock(&bg_ptr->bg_mutex);
+       spin_unlock(&bg_ptr->lock);
 
        ret |= omap_bandgap_adc_to_mcelsius(bg_ptr, temp, &temp);
        if (ret)
@@ -1016,7 +1018,7 @@ int omap_bandgap_probe(struct platform_device *pdev)
                clk_prepare_enable(bg_ptr->fclock);
 
 
-       mutex_init(&bg_ptr->bg_mutex);
+       spin_lock_init(&bg_ptr->lock);
        bg_ptr->dev = &pdev->dev;
        platform_set_drvdata(pdev, bg_ptr);
 
index edcc9652d53f3cf98e9e3a5d74826cd403fe4df3..57005862d4f93d26ecf448b0e854048322b899eb 100644 (file)
@@ -23,7 +23,7 @@
 #ifndef __OMAP_BANDGAP_H
 #define __OMAP_BANDGAP_H
 
-#include <linux/mutex.h>
+#include <linux/spinlock.h>
 #include <linux/types.h>
 #include <linux/err.h>
 
@@ -211,7 +211,7 @@ struct omap_bandgap {
        struct omap_bandgap_data        *conf;
        struct clk                      *fclock;
        struct clk                      *div_clk;
-       struct mutex                    bg_mutex; /* shields this struct */
+       spinlock_t                      lock; /* shields this struct */
        int                             irq;
        int                             tshut_gpio;
        u32                             clk_rate;