diff options
Diffstat (limited to 'drivers/hwmon/fscher.c')
| -rw-r--r-- | drivers/hwmon/fscher.c | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/drivers/hwmon/fscher.c b/drivers/hwmon/fscher.c index 25409181d1eb..6bc76b407636 100644 --- a/drivers/hwmon/fscher.c +++ b/drivers/hwmon/fscher.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <linux/i2c.h> | 33 | #include <linux/i2c.h> |
| 34 | #include <linux/hwmon.h> | 34 | #include <linux/hwmon.h> |
| 35 | #include <linux/err.h> | 35 | #include <linux/err.h> |
| 36 | #include <linux/mutex.h> | ||
| 36 | 37 | ||
| 37 | /* | 38 | /* |
| 38 | * Addresses to scan | 39 | * Addresses to scan |
| @@ -133,7 +134,7 @@ static struct i2c_driver fscher_driver = { | |||
| 133 | struct fscher_data { | 134 | struct fscher_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 | ||
| @@ -332,7 +333,7 @@ static int fscher_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 332 | * global list */ | 333 | * global list */ |
| 333 | strlcpy(new_client->name, "fscher", I2C_NAME_SIZE); | 334 | strlcpy(new_client->name, "fscher", I2C_NAME_SIZE); |
| 334 | data->valid = 0; | 335 | data->valid = 0; |
| 335 | init_MUTEX(&data->update_lock); | 336 | mutex_init(&data->update_lock); |
| 336 | 337 | ||
| 337 | /* Tell the I2C layer a new client has arrived */ | 338 | /* Tell the I2C layer a new client has arrived */ |
| 338 | if ((err = i2c_attach_client(new_client))) | 339 | if ((err = i2c_attach_client(new_client))) |
| @@ -417,7 +418,7 @@ static struct fscher_data *fscher_update_device(struct device *dev) | |||
| 417 | struct i2c_client *client = to_i2c_client(dev); | 418 | struct i2c_client *client = to_i2c_client(dev); |
| 418 | struct fscher_data *data = i2c_get_clientdata(client); | 419 | struct fscher_data *data = i2c_get_clientdata(client); |
| 419 | 420 | ||
| 420 | down(&data->update_lock); | 421 | mutex_lock(&data->update_lock); |
| 421 | 422 | ||
| 422 | if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) { | 423 | if (time_after(jiffies, data->last_updated + 2 * HZ) || !data->valid) { |
| 423 | 424 | ||
| @@ -457,7 +458,7 @@ static struct fscher_data *fscher_update_device(struct device *dev) | |||
| 457 | data->valid = 1; | 458 | data->valid = 1; |
| 458 | } | 459 | } |
| 459 | 460 | ||
| 460 | up(&data->update_lock); | 461 | mutex_unlock(&data->update_lock); |
| 461 | 462 | ||
| 462 | return data; | 463 | return data; |
| 463 | } | 464 | } |
| @@ -472,10 +473,10 @@ static ssize_t set_fan_status(struct i2c_client *client, struct fscher_data *dat | |||
| 472 | /* bits 0..1, 3..7 reserved => mask with 0x04 */ | 473 | /* bits 0..1, 3..7 reserved => mask with 0x04 */ |
| 473 | unsigned long v = simple_strtoul(buf, NULL, 10) & 0x04; | 474 | unsigned long v = simple_strtoul(buf, NULL, 10) & 0x04; |
| 474 | 475 | ||
| 475 | down(&data->update_lock); | 476 | mutex_lock(&data->update_lock); |
| 476 | data->fan_status[FAN_INDEX_FROM_NUM(nr)] &= ~v; | 477 | data->fan_status[FAN_INDEX_FROM_NUM(nr)] &= ~v; |
| 477 | fscher_write_value(client, reg, v); | 478 | fscher_write_value(client, reg, v); |
| 478 | up(&data->update_lock); | 479 | mutex_unlock(&data->update_lock); |
| 479 | return count; | 480 | return count; |
| 480 | } | 481 | } |
| 481 | 482 | ||
| @@ -490,10 +491,10 @@ static ssize_t set_pwm(struct i2c_client *client, struct fscher_data *data, | |||
| 490 | { | 491 | { |
| 491 | unsigned long v = simple_strtoul(buf, NULL, 10); | 492 | unsigned long v = simple_strtoul(buf, NULL, 10); |
| 492 | 493 | ||
| 493 | down(&data->update_lock); | 494 | mutex_lock(&data->update_lock); |
| 494 | data->fan_min[FAN_INDEX_FROM_NUM(nr)] = v > 0xff ? 0xff : v; | 495 | data->fan_min[FAN_INDEX_FROM_NUM(nr)] = v > 0xff ? 0xff : v; |
| 495 | fscher_write_value(client, reg, data->fan_min[FAN_INDEX_FROM_NUM(nr)]); | 496 | fscher_write_value(client, reg, data->fan_min[FAN_INDEX_FROM_NUM(nr)]); |
| 496 | up(&data->update_lock); | 497 | mutex_unlock(&data->update_lock); |
| 497 | return count; | 498 | return count; |
| 498 | } | 499 | } |
| 499 | 500 | ||
| @@ -518,14 +519,14 @@ static ssize_t set_fan_div(struct i2c_client *client, struct fscher_data *data, | |||
| 518 | return -EINVAL; | 519 | return -EINVAL; |
| 519 | } | 520 | } |
| 520 | 521 | ||
| 521 | down(&data->update_lock); | 522 | mutex_lock(&data->update_lock); |
| 522 | 523 | ||
| 523 | /* bits 2..7 reserved => mask with 0x03 */ | 524 | /* bits 2..7 reserved => mask with 0x03 */ |
| 524 | data->fan_ripple[FAN_INDEX_FROM_NUM(nr)] &= ~0x03; | 525 | data->fan_ripple[FAN_INDEX_FROM_NUM(nr)] &= ~0x03; |
| 525 | data->fan_ripple[FAN_INDEX_FROM_NUM(nr)] |= v; | 526 | data->fan_ripple[FAN_INDEX_FROM_NUM(nr)] |= v; |
| 526 | 527 | ||
| 527 | fscher_write_value(client, reg, data->fan_ripple[FAN_INDEX_FROM_NUM(nr)]); | 528 | fscher_write_value(client, reg, data->fan_ripple[FAN_INDEX_FROM_NUM(nr)]); |
| 528 | up(&data->update_lock); | 529 | mutex_unlock(&data->update_lock); |
| 529 | return count; | 530 | return count; |
| 530 | } | 531 | } |
| 531 | 532 | ||
| @@ -552,10 +553,10 @@ static ssize_t set_temp_status(struct i2c_client *client, struct fscher_data *da | |||
| 552 | /* bits 2..7 reserved, 0 read only => mask with 0x02 */ | 553 | /* bits 2..7 reserved, 0 read only => mask with 0x02 */ |
| 553 | unsigned long v = simple_strtoul(buf, NULL, 10) & 0x02; | 554 | unsigned long v = simple_strtoul(buf, NULL, 10) & 0x02; |
| 554 | 555 | ||
| 555 | down(&data->update_lock); | 556 | mutex_lock(&data->update_lock); |
| 556 | data->temp_status[TEMP_INDEX_FROM_NUM(nr)] &= ~v; | 557 | data->temp_status[TEMP_INDEX_FROM_NUM(nr)] &= ~v; |
| 557 | fscher_write_value(client, reg, v); | 558 | fscher_write_value(client, reg, v); |
| 558 | up(&data->update_lock); | 559 | mutex_unlock(&data->update_lock); |
| 559 | return count; | 560 | return count; |
| 560 | } | 561 | } |
| 561 | 562 | ||
| @@ -609,10 +610,10 @@ static ssize_t set_control(struct i2c_client *client, struct fscher_data *data, | |||
| 609 | /* bits 1..7 reserved => mask with 0x01 */ | 610 | /* bits 1..7 reserved => mask with 0x01 */ |
| 610 | unsigned long v = simple_strtoul(buf, NULL, 10) & 0x01; | 611 | unsigned long v = simple_strtoul(buf, NULL, 10) & 0x01; |
| 611 | 612 | ||
| 612 | down(&data->update_lock); | 613 | mutex_lock(&data->update_lock); |
| 613 | data->global_control &= ~v; | 614 | data->global_control &= ~v; |
| 614 | fscher_write_value(client, reg, v); | 615 | fscher_write_value(client, reg, v); |
| 615 | up(&data->update_lock); | 616 | mutex_unlock(&data->update_lock); |
| 616 | return count; | 617 | return count; |
| 617 | } | 618 | } |
| 618 | 619 | ||
| @@ -631,11 +632,11 @@ static ssize_t set_watchdog_control(struct i2c_client *client, struct | |||
| 631 | /* bits 0..3 reserved => mask with 0xf0 */ | 632 | /* bits 0..3 reserved => mask with 0xf0 */ |
| 632 | unsigned long v = simple_strtoul(buf, NULL, 10) & 0xf0; | 633 | unsigned long v = simple_strtoul(buf, NULL, 10) & 0xf0; |
| 633 | 634 | ||
| 634 | down(&data->update_lock); | 635 | mutex_lock(&data->update_lock); |
| 635 | data->watchdog[2] &= ~0xf0; | 636 | data->watchdog[2] &= ~0xf0; |
| 636 | data->watchdog[2] |= v; | 637 | data->watchdog[2] |= v; |
| 637 | fscher_write_value(client, reg, data->watchdog[2]); | 638 | fscher_write_value(client, reg, data->watchdog[2]); |
| 638 | up(&data->update_lock); | 639 | mutex_unlock(&data->update_lock); |
| 639 | return count; | 640 | return count; |
| 640 | } | 641 | } |
| 641 | 642 | ||
| @@ -651,10 +652,10 @@ static ssize_t set_watchdog_status(struct i2c_client *client, struct fscher_data | |||
| 651 | /* bits 0, 2..7 reserved => mask with 0x02 */ | 652 | /* bits 0, 2..7 reserved => mask with 0x02 */ |
| 652 | unsigned long v = simple_strtoul(buf, NULL, 10) & 0x02; | 653 | unsigned long v = simple_strtoul(buf, NULL, 10) & 0x02; |
| 653 | 654 | ||
| 654 | down(&data->update_lock); | 655 | mutex_lock(&data->update_lock); |
| 655 | data->watchdog[1] &= ~v; | 656 | data->watchdog[1] &= ~v; |
| 656 | fscher_write_value(client, reg, v); | 657 | fscher_write_value(client, reg, v); |
| 657 | up(&data->update_lock); | 658 | mutex_unlock(&data->update_lock); |
| 658 | return count; | 659 | return count; |
| 659 | } | 660 | } |
| 660 | 661 | ||
| @@ -669,10 +670,10 @@ static ssize_t set_watchdog_preset(struct i2c_client *client, struct fscher_data | |||
| 669 | { | 670 | { |
| 670 | unsigned long v = simple_strtoul(buf, NULL, 10) & 0xff; | 671 | unsigned long v = simple_strtoul(buf, NULL, 10) & 0xff; |
| 671 | 672 | ||
| 672 | down(&data->update_lock); | 673 | mutex_lock(&data->update_lock); |
| 673 | data->watchdog[0] = v; | 674 | data->watchdog[0] = v; |
| 674 | fscher_write_value(client, reg, data->watchdog[0]); | 675 | fscher_write_value(client, reg, data->watchdog[0]); |
| 675 | up(&data->update_lock); | 676 | mutex_unlock(&data->update_lock); |
| 676 | return count; | 677 | return count; |
| 677 | } | 678 | } |
| 678 | 679 | ||
