aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/it87.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon/it87.c')
-rw-r--r--drivers/hwmon/it87.c66
1 files changed, 33 insertions, 33 deletions
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c
index d7a9401600bb..06df92b3ee49 100644
--- a/drivers/hwmon/it87.c
+++ b/drivers/hwmon/it87.c
@@ -41,6 +41,7 @@
41#include <linux/hwmon-sysfs.h> 41#include <linux/hwmon-sysfs.h>
42#include <linux/hwmon-vid.h> 42#include <linux/hwmon-vid.h>
43#include <linux/err.h> 43#include <linux/err.h>
44#include <linux/mutex.h>
44#include <asm/io.h> 45#include <asm/io.h>
45 46
46 47
@@ -194,10 +195,10 @@ static int DIV_TO_REG(int val)
194struct it87_data { 195struct it87_data {
195 struct i2c_client client; 196 struct i2c_client client;
196 struct class_device *class_dev; 197 struct class_device *class_dev;
197 struct semaphore lock; 198 struct mutex lock;
198 enum chips type; 199 enum chips type;
199 200
200 struct semaphore update_lock; 201 struct mutex update_lock;
201 char valid; /* !=0 if following fields are valid */ 202 char valid; /* !=0 if following fields are valid */
202 unsigned long last_updated; /* In jiffies */ 203 unsigned long last_updated; /* In jiffies */
203 204
@@ -224,9 +225,8 @@ static int it87_isa_attach_adapter(struct i2c_adapter *adapter);
224static int it87_detect(struct i2c_adapter *adapter, int address, int kind); 225static int it87_detect(struct i2c_adapter *adapter, int address, int kind);
225static int it87_detach_client(struct i2c_client *client); 226static int it87_detach_client(struct i2c_client *client);
226 227
227static int it87_read_value(struct i2c_client *client, u8 register); 228static int it87_read_value(struct i2c_client *client, u8 reg);
228static int it87_write_value(struct i2c_client *client, u8 register, 229static int it87_write_value(struct i2c_client *client, u8 reg, u8 value);
229 u8 value);
230static struct it87_data *it87_update_device(struct device *dev); 230static struct it87_data *it87_update_device(struct device *dev);
231static int it87_check_pwm(struct i2c_client *client); 231static int it87_check_pwm(struct i2c_client *client);
232static void it87_init_client(struct i2c_client *client, struct it87_data *data); 232static void it87_init_client(struct i2c_client *client, struct it87_data *data);
@@ -290,11 +290,11 @@ static ssize_t set_in_min(struct device *dev, struct device_attribute *attr,
290 struct it87_data *data = i2c_get_clientdata(client); 290 struct it87_data *data = i2c_get_clientdata(client);
291 unsigned long val = simple_strtoul(buf, NULL, 10); 291 unsigned long val = simple_strtoul(buf, NULL, 10);
292 292
293 down(&data->update_lock); 293 mutex_lock(&data->update_lock);
294 data->in_min[nr] = IN_TO_REG(val); 294 data->in_min[nr] = IN_TO_REG(val);
295 it87_write_value(client, IT87_REG_VIN_MIN(nr), 295 it87_write_value(client, IT87_REG_VIN_MIN(nr),
296 data->in_min[nr]); 296 data->in_min[nr]);
297 up(&data->update_lock); 297 mutex_unlock(&data->update_lock);
298 return count; 298 return count;
299} 299}
300static ssize_t set_in_max(struct device *dev, struct device_attribute *attr, 300static ssize_t set_in_max(struct device *dev, struct device_attribute *attr,
@@ -307,11 +307,11 @@ static ssize_t set_in_max(struct device *dev, struct device_attribute *attr,
307 struct it87_data *data = i2c_get_clientdata(client); 307 struct it87_data *data = i2c_get_clientdata(client);
308 unsigned long val = simple_strtoul(buf, NULL, 10); 308 unsigned long val = simple_strtoul(buf, NULL, 10);
309 309
310 down(&data->update_lock); 310 mutex_lock(&data->update_lock);
311 data->in_max[nr] = IN_TO_REG(val); 311 data->in_max[nr] = IN_TO_REG(val);
312 it87_write_value(client, IT87_REG_VIN_MAX(nr), 312 it87_write_value(client, IT87_REG_VIN_MAX(nr),
313 data->in_max[nr]); 313 data->in_max[nr]);
314 up(&data->update_lock); 314 mutex_unlock(&data->update_lock);
315 return count; 315 return count;
316} 316}
317 317
@@ -381,10 +381,10 @@ static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr,
381 struct it87_data *data = i2c_get_clientdata(client); 381 struct it87_data *data = i2c_get_clientdata(client);
382 int val = simple_strtol(buf, NULL, 10); 382 int val = simple_strtol(buf, NULL, 10);
383 383
384 down(&data->update_lock); 384 mutex_lock(&data->update_lock);
385 data->temp_high[nr] = TEMP_TO_REG(val); 385 data->temp_high[nr] = TEMP_TO_REG(val);
386 it87_write_value(client, IT87_REG_TEMP_HIGH(nr), data->temp_high[nr]); 386 it87_write_value(client, IT87_REG_TEMP_HIGH(nr), data->temp_high[nr]);
387 up(&data->update_lock); 387 mutex_unlock(&data->update_lock);
388 return count; 388 return count;
389} 389}
390static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr, 390static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr,
@@ -397,10 +397,10 @@ static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr,
397 struct it87_data *data = i2c_get_clientdata(client); 397 struct it87_data *data = i2c_get_clientdata(client);
398 int val = simple_strtol(buf, NULL, 10); 398 int val = simple_strtol(buf, NULL, 10);
399 399
400 down(&data->update_lock); 400 mutex_lock(&data->update_lock);
401 data->temp_low[nr] = TEMP_TO_REG(val); 401 data->temp_low[nr] = TEMP_TO_REG(val);
402 it87_write_value(client, IT87_REG_TEMP_LOW(nr), data->temp_low[nr]); 402 it87_write_value(client, IT87_REG_TEMP_LOW(nr), data->temp_low[nr]);
403 up(&data->update_lock); 403 mutex_unlock(&data->update_lock);
404 return count; 404 return count;
405} 405}
406#define show_temp_offset(offset) \ 406#define show_temp_offset(offset) \
@@ -440,7 +440,7 @@ static ssize_t set_sensor(struct device *dev, struct device_attribute *attr,
440 struct it87_data *data = i2c_get_clientdata(client); 440 struct it87_data *data = i2c_get_clientdata(client);
441 int val = simple_strtol(buf, NULL, 10); 441 int val = simple_strtol(buf, NULL, 10);
442 442
443 down(&data->update_lock); 443 mutex_lock(&data->update_lock);
444 444
445 data->sensor &= ~(1 << nr); 445 data->sensor &= ~(1 << nr);
446 data->sensor &= ~(8 << nr); 446 data->sensor &= ~(8 << nr);
@@ -450,11 +450,11 @@ static ssize_t set_sensor(struct device *dev, struct device_attribute *attr,
450 else if (val == 2) 450 else if (val == 2)
451 data->sensor |= 8 << nr; 451 data->sensor |= 8 << nr;
452 else if (val != 0) { 452 else if (val != 0) {
453 up(&data->update_lock); 453 mutex_unlock(&data->update_lock);
454 return -EINVAL; 454 return -EINVAL;
455 } 455 }
456 it87_write_value(client, IT87_REG_TEMP_ENABLE, data->sensor); 456 it87_write_value(client, IT87_REG_TEMP_ENABLE, data->sensor);
457 up(&data->update_lock); 457 mutex_unlock(&data->update_lock);
458 return count; 458 return count;
459} 459}
460#define show_sensor_offset(offset) \ 460#define show_sensor_offset(offset) \
@@ -524,7 +524,7 @@ static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr,
524 int val = simple_strtol(buf, NULL, 10); 524 int val = simple_strtol(buf, NULL, 10);
525 u8 reg = it87_read_value(client, IT87_REG_FAN_DIV); 525 u8 reg = it87_read_value(client, IT87_REG_FAN_DIV);
526 526
527 down(&data->update_lock); 527 mutex_lock(&data->update_lock);
528 switch (nr) { 528 switch (nr) {
529 case 0: data->fan_div[nr] = reg & 0x07; break; 529 case 0: data->fan_div[nr] = reg & 0x07; break;
530 case 1: data->fan_div[nr] = (reg >> 3) & 0x07; break; 530 case 1: data->fan_div[nr] = (reg >> 3) & 0x07; break;
@@ -533,7 +533,7 @@ static ssize_t set_fan_min(struct device *dev, struct device_attribute *attr,
533 533
534 data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr])); 534 data->fan_min[nr] = FAN_TO_REG(val, DIV_FROM_REG(data->fan_div[nr]));
535 it87_write_value(client, IT87_REG_FAN_MIN(nr), data->fan_min[nr]); 535 it87_write_value(client, IT87_REG_FAN_MIN(nr), data->fan_min[nr]);
536 up(&data->update_lock); 536 mutex_unlock(&data->update_lock);
537 return count; 537 return count;
538} 538}
539static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr, 539static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
@@ -548,7 +548,7 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
548 int i, min[3]; 548 int i, min[3];
549 u8 old; 549 u8 old;
550 550
551 down(&data->update_lock); 551 mutex_lock(&data->update_lock);
552 old = it87_read_value(client, IT87_REG_FAN_DIV); 552 old = it87_read_value(client, IT87_REG_FAN_DIV);
553 553
554 for (i = 0; i < 3; i++) 554 for (i = 0; i < 3; i++)
@@ -576,7 +576,7 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
576 data->fan_min[i]=FAN_TO_REG(min[i], DIV_FROM_REG(data->fan_div[i])); 576 data->fan_min[i]=FAN_TO_REG(min[i], DIV_FROM_REG(data->fan_div[i]));
577 it87_write_value(client, IT87_REG_FAN_MIN(i), data->fan_min[i]); 577 it87_write_value(client, IT87_REG_FAN_MIN(i), data->fan_min[i]);
578 } 578 }
579 up(&data->update_lock); 579 mutex_unlock(&data->update_lock);
580 return count; 580 return count;
581} 581}
582static ssize_t set_pwm_enable(struct device *dev, 582static ssize_t set_pwm_enable(struct device *dev,
@@ -589,7 +589,7 @@ static ssize_t set_pwm_enable(struct device *dev,
589 struct it87_data *data = i2c_get_clientdata(client); 589 struct it87_data *data = i2c_get_clientdata(client);
590 int val = simple_strtol(buf, NULL, 10); 590 int val = simple_strtol(buf, NULL, 10);
591 591
592 down(&data->update_lock); 592 mutex_lock(&data->update_lock);
593 593
594 if (val == 0) { 594 if (val == 0) {
595 int tmp; 595 int tmp;
@@ -606,11 +606,11 @@ static ssize_t set_pwm_enable(struct device *dev,
606 /* set saved pwm value, clear FAN_CTLX PWM mode bit */ 606 /* set saved pwm value, clear FAN_CTLX PWM mode bit */
607 it87_write_value(client, IT87_REG_PWM(nr), PWM_TO_REG(data->manual_pwm_ctl[nr])); 607 it87_write_value(client, IT87_REG_PWM(nr), PWM_TO_REG(data->manual_pwm_ctl[nr]));
608 } else { 608 } else {
609 up(&data->update_lock); 609 mutex_unlock(&data->update_lock);
610 return -EINVAL; 610 return -EINVAL;
611 } 611 }
612 612
613 up(&data->update_lock); 613 mutex_unlock(&data->update_lock);
614 return count; 614 return count;
615} 615}
616static ssize_t set_pwm(struct device *dev, struct device_attribute *attr, 616static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
@@ -626,11 +626,11 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
626 if (val < 0 || val > 255) 626 if (val < 0 || val > 255)
627 return -EINVAL; 627 return -EINVAL;
628 628
629 down(&data->update_lock); 629 mutex_lock(&data->update_lock);
630 data->manual_pwm_ctl[nr] = val; 630 data->manual_pwm_ctl[nr] = val;
631 if (data->fan_main_ctrl & (1 << nr)) 631 if (data->fan_main_ctrl & (1 << nr))
632 it87_write_value(client, IT87_REG_PWM(nr), PWM_TO_REG(data->manual_pwm_ctl[nr])); 632 it87_write_value(client, IT87_REG_PWM(nr), PWM_TO_REG(data->manual_pwm_ctl[nr]));
633 up(&data->update_lock); 633 mutex_unlock(&data->update_lock);
634 return count; 634 return count;
635} 635}
636 636
@@ -776,7 +776,7 @@ static int it87_detect(struct i2c_adapter *adapter, int address, int kind)
776 776
777 new_client = &data->client; 777 new_client = &data->client;
778 if (is_isa) 778 if (is_isa)
779 init_MUTEX(&data->lock); 779 mutex_init(&data->lock);
780 i2c_set_clientdata(new_client, data); 780 i2c_set_clientdata(new_client, data);
781 new_client->addr = address; 781 new_client->addr = address;
782 new_client->adapter = adapter; 782 new_client->adapter = adapter;
@@ -823,7 +823,7 @@ static int it87_detect(struct i2c_adapter *adapter, int address, int kind)
823 strlcpy(new_client->name, name, I2C_NAME_SIZE); 823 strlcpy(new_client->name, name, I2C_NAME_SIZE);
824 data->type = kind; 824 data->type = kind;
825 data->valid = 0; 825 data->valid = 0;
826 init_MUTEX(&data->update_lock); 826 mutex_init(&data->update_lock);
827 827
828 /* Tell the I2C layer a new client has arrived */ 828 /* Tell the I2C layer a new client has arrived */
829 if ((err = i2c_attach_client(new_client))) 829 if ((err = i2c_attach_client(new_client)))
@@ -950,10 +950,10 @@ static int it87_read_value(struct i2c_client *client, u8 reg)
950 950
951 int res; 951 int res;
952 if (i2c_is_isa_client(client)) { 952 if (i2c_is_isa_client(client)) {
953 down(&data->lock); 953 mutex_lock(&data->lock);
954 outb_p(reg, client->addr + IT87_ADDR_REG_OFFSET); 954 outb_p(reg, client->addr + IT87_ADDR_REG_OFFSET);
955 res = inb_p(client->addr + IT87_DATA_REG_OFFSET); 955 res = inb_p(client->addr + IT87_DATA_REG_OFFSET);
956 up(&data->lock); 956 mutex_unlock(&data->lock);
957 return res; 957 return res;
958 } else 958 } else
959 return i2c_smbus_read_byte_data(client, reg); 959 return i2c_smbus_read_byte_data(client, reg);
@@ -969,10 +969,10 @@ static int it87_write_value(struct i2c_client *client, u8 reg, u8 value)
969 struct it87_data *data = i2c_get_clientdata(client); 969 struct it87_data *data = i2c_get_clientdata(client);
970 970
971 if (i2c_is_isa_client(client)) { 971 if (i2c_is_isa_client(client)) {
972 down(&data->lock); 972 mutex_lock(&data->lock);
973 outb_p(reg, client->addr + IT87_ADDR_REG_OFFSET); 973 outb_p(reg, client->addr + IT87_ADDR_REG_OFFSET);
974 outb_p(value, client->addr + IT87_DATA_REG_OFFSET); 974 outb_p(value, client->addr + IT87_DATA_REG_OFFSET);
975 up(&data->lock); 975 mutex_unlock(&data->lock);
976 return 0; 976 return 0;
977 } else 977 } else
978 return i2c_smbus_write_byte_data(client, reg, value); 978 return i2c_smbus_write_byte_data(client, reg, value);
@@ -1098,7 +1098,7 @@ static struct it87_data *it87_update_device(struct device *dev)
1098 struct it87_data *data = i2c_get_clientdata(client); 1098 struct it87_data *data = i2c_get_clientdata(client);
1099 int i; 1099 int i;
1100 1100
1101 down(&data->update_lock); 1101 mutex_lock(&data->update_lock);
1102 1102
1103 if (time_after(jiffies, data->last_updated + HZ + HZ / 2) 1103 if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
1104 || !data->valid) { 1104 || !data->valid) {
@@ -1160,7 +1160,7 @@ static struct it87_data *it87_update_device(struct device *dev)
1160 data->valid = 1; 1160 data->valid = 1;
1161 } 1161 }
1162 1162
1163 up(&data->update_lock); 1163 mutex_unlock(&data->update_lock);
1164 1164
1165 return data; 1165 return data;
1166} 1166}