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 | ||