Skip to content

Commit

Permalink
staging: omap-thermal: switch mutex to spinlock inside omap-bandgap
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Eduardo Valentin authored and Greg Kroah-Hartman committed Mar 15, 2013
1 parent 1b46f2a commit ebf0bd5
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 11 deletions.
1 change: 0 additions & 1 deletion drivers/staging/omap-thermal/TODO
Original file line number Diff line number Diff line change
@@ -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
Expand Down
18 changes: 10 additions & 8 deletions drivers/staging/omap-thermal/omap-bandgap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand All @@ -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)
Expand Down Expand Up @@ -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);

Expand Down
4 changes: 2 additions & 2 deletions drivers/staging/omap-thermal/omap-bandgap.h
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit ebf0bd5

Please sign in to comment.