aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/fscpos.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon/fscpos.c')
-rw-r--r--drivers/hwmon/fscpos.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/drivers/hwmon/fscpos.c b/drivers/hwmon/fscpos.c
index 6d0146b57020..758978e1bfe0 100644
--- a/drivers/hwmon/fscpos.c
+++ b/drivers/hwmon/fscpos.c
@@ -37,6 +37,7 @@
37#include <linux/init.h> 37#include <linux/init.h>
38#include <linux/hwmon.h> 38#include <linux/hwmon.h>
39#include <linux/err.h> 39#include <linux/err.h>
40#include <linux/mutex.h>
40 41
41/* 42/*
42 * Addresses to scan 43 * Addresses to scan
@@ -114,7 +115,7 @@ static struct i2c_driver fscpos_driver = {
114struct fscpos_data { 115struct fscpos_data {
115 struct i2c_client client; 116 struct i2c_client client;
116 struct class_device *class_dev; 117 struct class_device *class_dev;
117 struct semaphore update_lock; 118 struct mutex update_lock;
118 char valid; /* 0 until following fields are valid */ 119 char valid; /* 0 until following fields are valid */
119 unsigned long last_updated; /* In jiffies */ 120 unsigned long last_updated; /* In jiffies */
120 121
@@ -208,13 +209,13 @@ static ssize_t set_fan_ripple(struct i2c_client *client, struct fscpos_data
208 return -EINVAL; 209 return -EINVAL;
209 } 210 }
210 211
211 down(&data->update_lock); 212 mutex_lock(&data->update_lock);
212 /* bits 2..7 reserved => mask with 0x03 */ 213 /* bits 2..7 reserved => mask with 0x03 */
213 data->fan_ripple[nr - 1] &= ~0x03; 214 data->fan_ripple[nr - 1] &= ~0x03;
214 data->fan_ripple[nr - 1] |= v; 215 data->fan_ripple[nr - 1] |= v;
215 216
216 fscpos_write_value(client, reg, data->fan_ripple[nr - 1]); 217 fscpos_write_value(client, reg, data->fan_ripple[nr - 1]);
217 up(&data->update_lock); 218 mutex_unlock(&data->update_lock);
218 return count; 219 return count;
219} 220}
220 221
@@ -232,10 +233,10 @@ static ssize_t set_pwm(struct i2c_client *client, struct fscpos_data *data,
232 if (v < 0) v = 0; 233 if (v < 0) v = 0;
233 if (v > 255) v = 255; 234 if (v > 255) v = 255;
234 235
235 down(&data->update_lock); 236 mutex_lock(&data->update_lock);
236 data->pwm[nr - 1] = v; 237 data->pwm[nr - 1] = v;
237 fscpos_write_value(client, reg, data->pwm[nr - 1]); 238 fscpos_write_value(client, reg, data->pwm[nr - 1]);
238 up(&data->update_lock); 239 mutex_unlock(&data->update_lock);
239 return count; 240 return count;
240} 241}
241 242
@@ -278,11 +279,11 @@ static ssize_t set_wdog_control(struct i2c_client *client, struct fscpos_data
278 /* bits 0..3 reserved => mask with 0xf0 */ 279 /* bits 0..3 reserved => mask with 0xf0 */
279 unsigned long v = simple_strtoul(buf, NULL, 10) & 0xf0; 280 unsigned long v = simple_strtoul(buf, NULL, 10) & 0xf0;
280 281
281 down(&data->update_lock); 282 mutex_lock(&data->update_lock);
282 data->wdog_control &= ~0xf0; 283 data->wdog_control &= ~0xf0;
283 data->wdog_control |= v; 284 data->wdog_control |= v;
284 fscpos_write_value(client, reg, data->wdog_control); 285 fscpos_write_value(client, reg, data->wdog_control);
285 up(&data->update_lock); 286 mutex_unlock(&data->update_lock);
286 return count; 287 return count;
287} 288}
288 289
@@ -304,10 +305,10 @@ static ssize_t set_wdog_state(struct i2c_client *client, struct fscpos_data
304 return -EINVAL; 305 return -EINVAL;
305 } 306 }
306 307
307 down(&data->update_lock); 308 mutex_lock(&data->update_lock);
308 data->wdog_state &= ~v; 309 data->wdog_state &= ~v;
309 fscpos_write_value(client, reg, v); 310 fscpos_write_value(client, reg, v);
310 up(&data->update_lock); 311 mutex_unlock(&data->update_lock);
311 return count; 312 return count;
312} 313}
313 314
@@ -321,10 +322,10 @@ static ssize_t set_wdog_preset(struct i2c_client *client, struct fscpos_data
321{ 322{
322 unsigned long v = simple_strtoul(buf, NULL, 10) & 0xff; 323 unsigned long v = simple_strtoul(buf, NULL, 10) & 0xff;
323 324
324 down(&data->update_lock); 325 mutex_lock(&data->update_lock);
325 data->wdog_preset = v; 326 data->wdog_preset = v;
326 fscpos_write_value(client, reg, data->wdog_preset); 327 fscpos_write_value(client, reg, data->wdog_preset);
327 up(&data->update_lock); 328 mutex_unlock(&data->update_lock);
328 return count; 329 return count;
329} 330}
330 331
@@ -483,7 +484,7 @@ static int fscpos_detect(struct i2c_adapter *adapter, int address, int kind)
483 strlcpy(new_client->name, "fscpos", I2C_NAME_SIZE); 484 strlcpy(new_client->name, "fscpos", I2C_NAME_SIZE);
484 485
485 data->valid = 0; 486 data->valid = 0;
486 init_MUTEX(&data->update_lock); 487 mutex_init(&data->update_lock);
487 488
488 /* Tell the I2C layer a new client has arrived */ 489 /* Tell the I2C layer a new client has arrived */
489 if ((err = i2c_attach_client(new_client))) 490 if ((err = i2c_attach_client(new_client)))
@@ -579,7 +580,7 @@ static struct fscpos_data *fscpos_update_device(struct device *dev)
579 struct i2c_client *client = to_i2c_client(dev); 580 struct i2c_client *client = to_i2c_client(dev);
580 struct fscpos_data *data = i2c_get_clientdata(client); 581 struct fscpos_data *data = i2c_get_clientdata(client);
581 582
582 down(&data->update_lock); 583 mutex_lock(&data->update_lock);
583 584
584 if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) { 585 if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) {
585 int i; 586 int i;
@@ -625,7 +626,7 @@ static struct fscpos_data *fscpos_update_device(struct device *dev)
625 data->last_updated = jiffies; 626 data->last_updated = jiffies;
626 data->valid = 1; 627 data->valid = 1;
627 } 628 }
628 up(&data->update_lock); 629 mutex_unlock(&data->update_lock);
629 return data; 630 return data;
630} 631}
631 632