diff options
Diffstat (limited to 'drivers/hwmon/w83627ehf.c')
-rw-r--r-- | drivers/hwmon/w83627ehf.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c index 12d79f5e4900..1affaf15beda 100644 --- a/drivers/hwmon/w83627ehf.c +++ b/drivers/hwmon/w83627ehf.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <linux/i2c-isa.h> | 43 | #include <linux/i2c-isa.h> |
44 | #include <linux/hwmon.h> | 44 | #include <linux/hwmon.h> |
45 | #include <linux/err.h> | 45 | #include <linux/err.h> |
46 | #include <linux/mutex.h> | ||
46 | #include <asm/io.h> | 47 | #include <asm/io.h> |
47 | #include "lm75.h" | 48 | #include "lm75.h" |
48 | 49 | ||
@@ -177,9 +178,9 @@ temp1_to_reg(int temp) | |||
177 | struct w83627ehf_data { | 178 | struct w83627ehf_data { |
178 | struct i2c_client client; | 179 | struct i2c_client client; |
179 | struct class_device *class_dev; | 180 | struct class_device *class_dev; |
180 | struct semaphore lock; | 181 | struct mutex lock; |
181 | 182 | ||
182 | struct semaphore update_lock; | 183 | struct mutex update_lock; |
183 | char valid; /* !=0 if following fields are valid */ | 184 | char valid; /* !=0 if following fields are valid */ |
184 | unsigned long last_updated; /* In jiffies */ | 185 | unsigned long last_updated; /* In jiffies */ |
185 | 186 | ||
@@ -230,7 +231,7 @@ static u16 w83627ehf_read_value(struct i2c_client *client, u16 reg) | |||
230 | struct w83627ehf_data *data = i2c_get_clientdata(client); | 231 | struct w83627ehf_data *data = i2c_get_clientdata(client); |
231 | int res, word_sized = is_word_sized(reg); | 232 | int res, word_sized = is_word_sized(reg); |
232 | 233 | ||
233 | down(&data->lock); | 234 | mutex_lock(&data->lock); |
234 | 235 | ||
235 | w83627ehf_set_bank(client, reg); | 236 | w83627ehf_set_bank(client, reg); |
236 | outb_p(reg & 0xff, client->addr + ADDR_REG_OFFSET); | 237 | outb_p(reg & 0xff, client->addr + ADDR_REG_OFFSET); |
@@ -242,7 +243,7 @@ static u16 w83627ehf_read_value(struct i2c_client *client, u16 reg) | |||
242 | } | 243 | } |
243 | w83627ehf_reset_bank(client, reg); | 244 | w83627ehf_reset_bank(client, reg); |
244 | 245 | ||
245 | up(&data->lock); | 246 | mutex_unlock(&data->lock); |
246 | 247 | ||
247 | return res; | 248 | return res; |
248 | } | 249 | } |
@@ -252,7 +253,7 @@ static int w83627ehf_write_value(struct i2c_client *client, u16 reg, u16 value) | |||
252 | struct w83627ehf_data *data = i2c_get_clientdata(client); | 253 | struct w83627ehf_data *data = i2c_get_clientdata(client); |
253 | int word_sized = is_word_sized(reg); | 254 | int word_sized = is_word_sized(reg); |
254 | 255 | ||
255 | down(&data->lock); | 256 | mutex_lock(&data->lock); |
256 | 257 | ||
257 | w83627ehf_set_bank(client, reg); | 258 | w83627ehf_set_bank(client, reg); |
258 | outb_p(reg & 0xff, client->addr + ADDR_REG_OFFSET); | 259 | outb_p(reg & 0xff, client->addr + ADDR_REG_OFFSET); |
@@ -264,7 +265,7 @@ static int w83627ehf_write_value(struct i2c_client *client, u16 reg, u16 value) | |||
264 | outb_p(value & 0xff, client->addr + DATA_REG_OFFSET); | 265 | outb_p(value & 0xff, client->addr + DATA_REG_OFFSET); |
265 | w83627ehf_reset_bank(client, reg); | 266 | w83627ehf_reset_bank(client, reg); |
266 | 267 | ||
267 | up(&data->lock); | 268 | mutex_unlock(&data->lock); |
268 | return 0; | 269 | return 0; |
269 | } | 270 | } |
270 | 271 | ||
@@ -322,7 +323,7 @@ static struct w83627ehf_data *w83627ehf_update_device(struct device *dev) | |||
322 | struct w83627ehf_data *data = i2c_get_clientdata(client); | 323 | struct w83627ehf_data *data = i2c_get_clientdata(client); |
323 | int i; | 324 | int i; |
324 | 325 | ||
325 | down(&data->update_lock); | 326 | mutex_lock(&data->update_lock); |
326 | 327 | ||
327 | if (time_after(jiffies, data->last_updated + HZ) | 328 | if (time_after(jiffies, data->last_updated + HZ) |
328 | || !data->valid) { | 329 | || !data->valid) { |
@@ -397,7 +398,7 @@ static struct w83627ehf_data *w83627ehf_update_device(struct device *dev) | |||
397 | data->valid = 1; | 398 | data->valid = 1; |
398 | } | 399 | } |
399 | 400 | ||
400 | up(&data->update_lock); | 401 | mutex_unlock(&data->update_lock); |
401 | return data; | 402 | return data; |
402 | } | 403 | } |
403 | 404 | ||
@@ -434,7 +435,7 @@ store_fan_min(struct device *dev, const char *buf, size_t count, int nr) | |||
434 | unsigned int reg; | 435 | unsigned int reg; |
435 | u8 new_div; | 436 | u8 new_div; |
436 | 437 | ||
437 | down(&data->update_lock); | 438 | mutex_lock(&data->update_lock); |
438 | if (!val) { | 439 | if (!val) { |
439 | /* No min limit, alarm disabled */ | 440 | /* No min limit, alarm disabled */ |
440 | data->fan_min[nr] = 255; | 441 | data->fan_min[nr] = 255; |
@@ -482,7 +483,7 @@ store_fan_min(struct device *dev, const char *buf, size_t count, int nr) | |||
482 | } | 483 | } |
483 | w83627ehf_write_value(client, W83627EHF_REG_FAN_MIN[nr], | 484 | w83627ehf_write_value(client, W83627EHF_REG_FAN_MIN[nr], |
484 | data->fan_min[nr]); | 485 | data->fan_min[nr]); |
485 | up(&data->update_lock); | 486 | mutex_unlock(&data->update_lock); |
486 | 487 | ||
487 | return count; | 488 | return count; |
488 | } | 489 | } |
@@ -561,11 +562,11 @@ store_temp1_##reg(struct device *dev, struct device_attribute *attr, \ | |||
561 | struct w83627ehf_data *data = i2c_get_clientdata(client); \ | 562 | struct w83627ehf_data *data = i2c_get_clientdata(client); \ |
562 | u32 val = simple_strtoul(buf, NULL, 10); \ | 563 | u32 val = simple_strtoul(buf, NULL, 10); \ |
563 | \ | 564 | \ |
564 | down(&data->update_lock); \ | 565 | mutex_lock(&data->update_lock); \ |
565 | data->temp1_##reg = temp1_to_reg(val); \ | 566 | data->temp1_##reg = temp1_to_reg(val); \ |
566 | w83627ehf_write_value(client, W83627EHF_REG_TEMP1_##REG, \ | 567 | w83627ehf_write_value(client, W83627EHF_REG_TEMP1_##REG, \ |
567 | data->temp1_##reg); \ | 568 | data->temp1_##reg); \ |
568 | up(&data->update_lock); \ | 569 | mutex_unlock(&data->update_lock); \ |
569 | return count; \ | 570 | return count; \ |
570 | } | 571 | } |
571 | store_temp1_reg(OVER, max); | 572 | store_temp1_reg(OVER, max); |
@@ -597,11 +598,11 @@ store_##reg (struct device *dev, const char *buf, size_t count, int nr) \ | |||
597 | struct w83627ehf_data *data = i2c_get_clientdata(client); \ | 598 | struct w83627ehf_data *data = i2c_get_clientdata(client); \ |
598 | u32 val = simple_strtoul(buf, NULL, 10); \ | 599 | u32 val = simple_strtoul(buf, NULL, 10); \ |
599 | \ | 600 | \ |
600 | down(&data->update_lock); \ | 601 | mutex_lock(&data->update_lock); \ |
601 | data->reg[nr] = LM75_TEMP_TO_REG(val); \ | 602 | data->reg[nr] = LM75_TEMP_TO_REG(val); \ |
602 | w83627ehf_write_value(client, W83627EHF_REG_TEMP_##REG[nr], \ | 603 | w83627ehf_write_value(client, W83627EHF_REG_TEMP_##REG[nr], \ |
603 | data->reg[nr]); \ | 604 | data->reg[nr]); \ |
604 | up(&data->update_lock); \ | 605 | mutex_unlock(&data->update_lock); \ |
605 | return count; \ | 606 | return count; \ |
606 | } | 607 | } |
607 | store_temp_reg(OVER, temp_max); | 608 | store_temp_reg(OVER, temp_max); |
@@ -689,14 +690,14 @@ static int w83627ehf_detect(struct i2c_adapter *adapter) | |||
689 | client = &data->client; | 690 | client = &data->client; |
690 | i2c_set_clientdata(client, data); | 691 | i2c_set_clientdata(client, data); |
691 | client->addr = address; | 692 | client->addr = address; |
692 | init_MUTEX(&data->lock); | 693 | mutex_init(&data->lock); |
693 | client->adapter = adapter; | 694 | client->adapter = adapter; |
694 | client->driver = &w83627ehf_driver; | 695 | client->driver = &w83627ehf_driver; |
695 | client->flags = 0; | 696 | client->flags = 0; |
696 | 697 | ||
697 | strlcpy(client->name, "w83627ehf", I2C_NAME_SIZE); | 698 | strlcpy(client->name, "w83627ehf", I2C_NAME_SIZE); |
698 | data->valid = 0; | 699 | data->valid = 0; |
699 | init_MUTEX(&data->update_lock); | 700 | mutex_init(&data->update_lock); |
700 | 701 | ||
701 | /* Tell the i2c layer a new client has arrived */ | 702 | /* Tell the i2c layer a new client has arrived */ |
702 | if ((err = i2c_attach_client(client))) | 703 | if ((err = i2c_attach_client(client))) |