diff options
Diffstat (limited to 'drivers/hwmon/adm1025.c')
-rw-r--r-- | drivers/hwmon/adm1025.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/drivers/hwmon/adm1025.c b/drivers/hwmon/adm1025.c index 9331c56d2ba6..a4c859c9fbf8 100644 --- a/drivers/hwmon/adm1025.c +++ b/drivers/hwmon/adm1025.c | |||
@@ -53,6 +53,7 @@ | |||
53 | #include <linux/hwmon.h> | 53 | #include <linux/hwmon.h> |
54 | #include <linux/hwmon-vid.h> | 54 | #include <linux/hwmon-vid.h> |
55 | #include <linux/err.h> | 55 | #include <linux/err.h> |
56 | #include <linux/mutex.h> | ||
56 | 57 | ||
57 | /* | 58 | /* |
58 | * Addresses to scan | 59 | * Addresses to scan |
@@ -133,7 +134,7 @@ static struct i2c_driver adm1025_driver = { | |||
133 | struct adm1025_data { | 134 | struct adm1025_data { |
134 | struct i2c_client client; | 135 | struct i2c_client client; |
135 | struct class_device *class_dev; | 136 | struct class_device *class_dev; |
136 | struct semaphore update_lock; | 137 | struct mutex update_lock; |
137 | char valid; /* zero until following fields are valid */ | 138 | char valid; /* zero until following fields are valid */ |
138 | unsigned long last_updated; /* in jiffies */ | 139 | unsigned long last_updated; /* in jiffies */ |
139 | 140 | ||
@@ -207,11 +208,11 @@ static ssize_t set_in##offset##_min(struct device *dev, struct device_attribute | |||
207 | struct adm1025_data *data = i2c_get_clientdata(client); \ | 208 | struct adm1025_data *data = i2c_get_clientdata(client); \ |
208 | long val = simple_strtol(buf, NULL, 10); \ | 209 | long val = simple_strtol(buf, NULL, 10); \ |
209 | \ | 210 | \ |
210 | down(&data->update_lock); \ | 211 | mutex_lock(&data->update_lock); \ |
211 | data->in_min[offset] = IN_TO_REG(val, in_scale[offset]); \ | 212 | data->in_min[offset] = IN_TO_REG(val, in_scale[offset]); \ |
212 | i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MIN(offset), \ | 213 | i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MIN(offset), \ |
213 | data->in_min[offset]); \ | 214 | data->in_min[offset]); \ |
214 | up(&data->update_lock); \ | 215 | mutex_unlock(&data->update_lock); \ |
215 | return count; \ | 216 | return count; \ |
216 | } \ | 217 | } \ |
217 | static ssize_t set_in##offset##_max(struct device *dev, struct device_attribute *attr, const char *buf, \ | 218 | static ssize_t set_in##offset##_max(struct device *dev, struct device_attribute *attr, const char *buf, \ |
@@ -221,11 +222,11 @@ static ssize_t set_in##offset##_max(struct device *dev, struct device_attribute | |||
221 | struct adm1025_data *data = i2c_get_clientdata(client); \ | 222 | struct adm1025_data *data = i2c_get_clientdata(client); \ |
222 | long val = simple_strtol(buf, NULL, 10); \ | 223 | long val = simple_strtol(buf, NULL, 10); \ |
223 | \ | 224 | \ |
224 | down(&data->update_lock); \ | 225 | mutex_lock(&data->update_lock); \ |
225 | data->in_max[offset] = IN_TO_REG(val, in_scale[offset]); \ | 226 | data->in_max[offset] = IN_TO_REG(val, in_scale[offset]); \ |
226 | i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MAX(offset), \ | 227 | i2c_smbus_write_byte_data(client, ADM1025_REG_IN_MAX(offset), \ |
227 | data->in_max[offset]); \ | 228 | data->in_max[offset]); \ |
228 | up(&data->update_lock); \ | 229 | mutex_unlock(&data->update_lock); \ |
229 | return count; \ | 230 | return count; \ |
230 | } \ | 231 | } \ |
231 | static DEVICE_ATTR(in##offset##_min, S_IWUSR | S_IRUGO, \ | 232 | static DEVICE_ATTR(in##offset##_min, S_IWUSR | S_IRUGO, \ |
@@ -247,11 +248,11 @@ static ssize_t set_temp##offset##_min(struct device *dev, struct device_attribut | |||
247 | struct adm1025_data *data = i2c_get_clientdata(client); \ | 248 | struct adm1025_data *data = i2c_get_clientdata(client); \ |
248 | long val = simple_strtol(buf, NULL, 10); \ | 249 | long val = simple_strtol(buf, NULL, 10); \ |
249 | \ | 250 | \ |
250 | down(&data->update_lock); \ | 251 | mutex_lock(&data->update_lock); \ |
251 | data->temp_min[offset-1] = TEMP_TO_REG(val); \ | 252 | data->temp_min[offset-1] = TEMP_TO_REG(val); \ |
252 | i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_LOW(offset-1), \ | 253 | i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_LOW(offset-1), \ |
253 | data->temp_min[offset-1]); \ | 254 | data->temp_min[offset-1]); \ |
254 | up(&data->update_lock); \ | 255 | mutex_unlock(&data->update_lock); \ |
255 | return count; \ | 256 | return count; \ |
256 | } \ | 257 | } \ |
257 | static ssize_t set_temp##offset##_max(struct device *dev, struct device_attribute *attr, const char *buf, \ | 258 | static ssize_t set_temp##offset##_max(struct device *dev, struct device_attribute *attr, const char *buf, \ |
@@ -261,11 +262,11 @@ static ssize_t set_temp##offset##_max(struct device *dev, struct device_attribut | |||
261 | struct adm1025_data *data = i2c_get_clientdata(client); \ | 262 | struct adm1025_data *data = i2c_get_clientdata(client); \ |
262 | long val = simple_strtol(buf, NULL, 10); \ | 263 | long val = simple_strtol(buf, NULL, 10); \ |
263 | \ | 264 | \ |
264 | down(&data->update_lock); \ | 265 | mutex_lock(&data->update_lock); \ |
265 | data->temp_max[offset-1] = TEMP_TO_REG(val); \ | 266 | data->temp_max[offset-1] = TEMP_TO_REG(val); \ |
266 | i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_HIGH(offset-1), \ | 267 | i2c_smbus_write_byte_data(client, ADM1025_REG_TEMP_HIGH(offset-1), \ |
267 | data->temp_max[offset-1]); \ | 268 | data->temp_max[offset-1]); \ |
268 | up(&data->update_lock); \ | 269 | mutex_unlock(&data->update_lock); \ |
269 | return count; \ | 270 | return count; \ |
270 | } \ | 271 | } \ |
271 | static DEVICE_ATTR(temp##offset##_min, S_IWUSR | S_IRUGO, \ | 272 | static DEVICE_ATTR(temp##offset##_min, S_IWUSR | S_IRUGO, \ |
@@ -404,7 +405,7 @@ static int adm1025_detect(struct i2c_adapter *adapter, int address, int kind) | |||
404 | /* We can fill in the remaining client fields */ | 405 | /* We can fill in the remaining client fields */ |
405 | strlcpy(new_client->name, name, I2C_NAME_SIZE); | 406 | strlcpy(new_client->name, name, I2C_NAME_SIZE); |
406 | data->valid = 0; | 407 | data->valid = 0; |
407 | init_MUTEX(&data->update_lock); | 408 | mutex_init(&data->update_lock); |
408 | 409 | ||
409 | /* Tell the I2C layer a new client has arrived */ | 410 | /* Tell the I2C layer a new client has arrived */ |
410 | if ((err = i2c_attach_client(new_client))) | 411 | if ((err = i2c_attach_client(new_client))) |
@@ -523,7 +524,7 @@ static struct adm1025_data *adm1025_update_device(struct device *dev) | |||
523 | struct i2c_client *client = to_i2c_client(dev); | 524 | struct i2c_client *client = to_i2c_client(dev); |
524 | struct adm1025_data *data = i2c_get_clientdata(client); | 525 | struct adm1025_data *data = i2c_get_clientdata(client); |
525 | 526 | ||
526 | down(&data->update_lock); | 527 | mutex_lock(&data->update_lock); |
527 | 528 | ||
528 | if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) { | 529 | if (time_after(jiffies, data->last_updated + HZ * 2) || !data->valid) { |
529 | int i; | 530 | int i; |
@@ -558,7 +559,7 @@ static struct adm1025_data *adm1025_update_device(struct device *dev) | |||
558 | data->valid = 1; | 559 | data->valid = 1; |
559 | } | 560 | } |
560 | 561 | ||
561 | up(&data->update_lock); | 562 | mutex_unlock(&data->update_lock); |
562 | 563 | ||
563 | return data; | 564 | return data; |
564 | } | 565 | } |