diff options
Diffstat (limited to 'drivers/hwmon/smsc47m192.c')
| -rw-r--r-- | drivers/hwmon/smsc47m192.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/drivers/hwmon/smsc47m192.c b/drivers/hwmon/smsc47m192.c index a012f396f354..d3a3ba04cb0f 100644 --- a/drivers/hwmon/smsc47m192.c +++ b/drivers/hwmon/smsc47m192.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <linux/hwmon-vid.h> | 31 | #include <linux/hwmon-vid.h> |
| 32 | #include <linux/err.h> | 32 | #include <linux/err.h> |
| 33 | #include <linux/sysfs.h> | 33 | #include <linux/sysfs.h> |
| 34 | #include <linux/mutex.h> | ||
| 34 | 35 | ||
| 35 | /* Addresses to scan */ | 36 | /* Addresses to scan */ |
| 36 | static unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END }; | 37 | static unsigned short normal_i2c[] = { 0x2c, 0x2d, I2C_CLIENT_END }; |
| @@ -97,7 +98,7 @@ static inline int TEMP_FROM_REG(s8 val) | |||
| 97 | struct smsc47m192_data { | 98 | struct smsc47m192_data { |
| 98 | struct i2c_client client; | 99 | struct i2c_client client; |
| 99 | struct class_device *class_dev; | 100 | struct class_device *class_dev; |
| 100 | struct semaphore update_lock; | 101 | struct mutex update_lock; |
| 101 | char valid; /* !=0 if following fields are valid */ | 102 | char valid; /* !=0 if following fields are valid */ |
| 102 | unsigned long last_updated; /* In jiffies */ | 103 | unsigned long last_updated; /* In jiffies */ |
| 103 | 104 | ||
| @@ -164,11 +165,11 @@ static ssize_t set_in_min(struct device *dev, struct device_attribute *attr, | |||
| 164 | struct smsc47m192_data *data = i2c_get_clientdata(client); | 165 | struct smsc47m192_data *data = i2c_get_clientdata(client); |
| 165 | unsigned long val = simple_strtoul(buf, NULL, 10); | 166 | unsigned long val = simple_strtoul(buf, NULL, 10); |
| 166 | 167 | ||
| 167 | down(&data->update_lock); | 168 | mutex_lock(&data->update_lock); |
| 168 | data->in_min[nr] = IN_TO_REG(val, nr); | 169 | data->in_min[nr] = IN_TO_REG(val, nr); |
| 169 | i2c_smbus_write_byte_data(client, SMSC47M192_REG_IN_MIN(nr), | 170 | i2c_smbus_write_byte_data(client, SMSC47M192_REG_IN_MIN(nr), |
| 170 | data->in_min[nr]); | 171 | data->in_min[nr]); |
| 171 | up(&data->update_lock); | 172 | mutex_unlock(&data->update_lock); |
| 172 | return count; | 173 | return count; |
| 173 | } | 174 | } |
| 174 | 175 | ||
| @@ -181,11 +182,11 @@ static ssize_t set_in_max(struct device *dev, struct device_attribute *attr, | |||
| 181 | struct smsc47m192_data *data = i2c_get_clientdata(client); | 182 | struct smsc47m192_data *data = i2c_get_clientdata(client); |
| 182 | unsigned long val = simple_strtoul(buf, NULL, 10); | 183 | unsigned long val = simple_strtoul(buf, NULL, 10); |
| 183 | 184 | ||
| 184 | down(&data->update_lock); | 185 | mutex_lock(&data->update_lock); |
| 185 | data->in_max[nr] = IN_TO_REG(val, nr); | 186 | data->in_max[nr] = IN_TO_REG(val, nr); |
| 186 | i2c_smbus_write_byte_data(client, SMSC47M192_REG_IN_MAX(nr), | 187 | i2c_smbus_write_byte_data(client, SMSC47M192_REG_IN_MAX(nr), |
| 187 | data->in_max[nr]); | 188 | data->in_max[nr]); |
| 188 | up(&data->update_lock); | 189 | mutex_unlock(&data->update_lock); |
| 189 | return count; | 190 | return count; |
| 190 | } | 191 | } |
| 191 | 192 | ||
| @@ -243,11 +244,11 @@ static ssize_t set_temp_min(struct device *dev, struct device_attribute *attr, | |||
| 243 | struct smsc47m192_data *data = i2c_get_clientdata(client); | 244 | struct smsc47m192_data *data = i2c_get_clientdata(client); |
| 244 | long val = simple_strtol(buf, NULL, 10); | 245 | long val = simple_strtol(buf, NULL, 10); |
| 245 | 246 | ||
| 246 | down(&data->update_lock); | 247 | mutex_lock(&data->update_lock); |
| 247 | data->temp_min[nr] = TEMP_TO_REG(val); | 248 | data->temp_min[nr] = TEMP_TO_REG(val); |
| 248 | i2c_smbus_write_byte_data(client, SMSC47M192_REG_TEMP_MIN[nr], | 249 | i2c_smbus_write_byte_data(client, SMSC47M192_REG_TEMP_MIN[nr], |
| 249 | data->temp_min[nr]); | 250 | data->temp_min[nr]); |
| 250 | up(&data->update_lock); | 251 | mutex_unlock(&data->update_lock); |
| 251 | return count; | 252 | return count; |
| 252 | } | 253 | } |
| 253 | 254 | ||
| @@ -260,11 +261,11 @@ static ssize_t set_temp_max(struct device *dev, struct device_attribute *attr, | |||
| 260 | struct smsc47m192_data *data = i2c_get_clientdata(client); | 261 | struct smsc47m192_data *data = i2c_get_clientdata(client); |
| 261 | long val = simple_strtol(buf, NULL, 10); | 262 | long val = simple_strtol(buf, NULL, 10); |
| 262 | 263 | ||
| 263 | down(&data->update_lock); | 264 | mutex_lock(&data->update_lock); |
| 264 | data->temp_max[nr] = TEMP_TO_REG(val); | 265 | data->temp_max[nr] = TEMP_TO_REG(val); |
| 265 | i2c_smbus_write_byte_data(client, SMSC47M192_REG_TEMP_MAX[nr], | 266 | i2c_smbus_write_byte_data(client, SMSC47M192_REG_TEMP_MAX[nr], |
| 266 | data->temp_max[nr]); | 267 | data->temp_max[nr]); |
| 267 | up(&data->update_lock); | 268 | mutex_unlock(&data->update_lock); |
| 268 | return count; | 269 | return count; |
| 269 | } | 270 | } |
| 270 | 271 | ||
| @@ -287,7 +288,7 @@ static ssize_t set_temp_offset(struct device *dev, struct device_attribute | |||
| 287 | u8 sfr = i2c_smbus_read_byte_data(client, SMSC47M192_REG_SFR); | 288 | u8 sfr = i2c_smbus_read_byte_data(client, SMSC47M192_REG_SFR); |
| 288 | long val = simple_strtol(buf, NULL, 10); | 289 | long val = simple_strtol(buf, NULL, 10); |
| 289 | 290 | ||
| 290 | down(&data->update_lock); | 291 | mutex_lock(&data->update_lock); |
| 291 | data->temp_offset[nr] = TEMP_TO_REG(val); | 292 | data->temp_offset[nr] = TEMP_TO_REG(val); |
| 292 | if (nr>1) | 293 | if (nr>1) |
| 293 | i2c_smbus_write_byte_data(client, | 294 | i2c_smbus_write_byte_data(client, |
| @@ -303,7 +304,7 @@ static ssize_t set_temp_offset(struct device *dev, struct device_attribute | |||
| 303 | } else if ((sfr & 0x10) == (nr==0 ? 0x10 : 0)) | 304 | } else if ((sfr & 0x10) == (nr==0 ? 0x10 : 0)) |
| 304 | i2c_smbus_write_byte_data(client, | 305 | i2c_smbus_write_byte_data(client, |
| 305 | SMSC47M192_REG_TEMP_OFFSET(nr), 0); | 306 | SMSC47M192_REG_TEMP_OFFSET(nr), 0); |
| 306 | up(&data->update_lock); | 307 | mutex_unlock(&data->update_lock); |
| 307 | return count; | 308 | return count; |
| 308 | } | 309 | } |
| 309 | 310 | ||
| @@ -360,8 +361,8 @@ static ssize_t show_alarm(struct device *dev, struct device_attribute *attr, | |||
| 360 | static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 0x0010); | 361 | static SENSOR_DEVICE_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 0x0010); |
| 361 | static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 0x0020); | 362 | static SENSOR_DEVICE_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 0x0020); |
| 362 | static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 0x0040); | 363 | static SENSOR_DEVICE_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 0x0040); |
| 363 | static SENSOR_DEVICE_ATTR(temp2_input_fault, S_IRUGO, show_alarm, NULL, 0x4000); | 364 | static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_alarm, NULL, 0x4000); |
| 364 | static SENSOR_DEVICE_ATTR(temp3_input_fault, S_IRUGO, show_alarm, NULL, 0x8000); | 365 | static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO, show_alarm, NULL, 0x8000); |
| 365 | static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0x0001); | 366 | static SENSOR_DEVICE_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0x0001); |
| 366 | static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 0x0002); | 367 | static SENSOR_DEVICE_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 0x0002); |
| 367 | static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 0x0004); | 368 | static SENSOR_DEVICE_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 0x0004); |
| @@ -411,13 +412,13 @@ static struct attribute *smsc47m192_attributes[] = { | |||
| 411 | &sensor_dev_attr_temp2_min.dev_attr.attr, | 412 | &sensor_dev_attr_temp2_min.dev_attr.attr, |
| 412 | &sensor_dev_attr_temp2_offset.dev_attr.attr, | 413 | &sensor_dev_attr_temp2_offset.dev_attr.attr, |
| 413 | &sensor_dev_attr_temp2_alarm.dev_attr.attr, | 414 | &sensor_dev_attr_temp2_alarm.dev_attr.attr, |
| 414 | &sensor_dev_attr_temp2_input_fault.dev_attr.attr, | 415 | &sensor_dev_attr_temp2_fault.dev_attr.attr, |
| 415 | &sensor_dev_attr_temp3_input.dev_attr.attr, | 416 | &sensor_dev_attr_temp3_input.dev_attr.attr, |
| 416 | &sensor_dev_attr_temp3_max.dev_attr.attr, | 417 | &sensor_dev_attr_temp3_max.dev_attr.attr, |
| 417 | &sensor_dev_attr_temp3_min.dev_attr.attr, | 418 | &sensor_dev_attr_temp3_min.dev_attr.attr, |
| 418 | &sensor_dev_attr_temp3_offset.dev_attr.attr, | 419 | &sensor_dev_attr_temp3_offset.dev_attr.attr, |
| 419 | &sensor_dev_attr_temp3_alarm.dev_attr.attr, | 420 | &sensor_dev_attr_temp3_alarm.dev_attr.attr, |
| 420 | &sensor_dev_attr_temp3_input_fault.dev_attr.attr, | 421 | &sensor_dev_attr_temp3_fault.dev_attr.attr, |
| 421 | 422 | ||
| 422 | &dev_attr_cpu0_vid.attr, | 423 | &dev_attr_cpu0_vid.attr, |
| 423 | &dev_attr_vrm.attr, | 424 | &dev_attr_vrm.attr, |
| @@ -531,7 +532,7 @@ static int smsc47m192_detect(struct i2c_adapter *adapter, int address, | |||
| 531 | /* Fill in the remaining client fields and put into the global list */ | 532 | /* Fill in the remaining client fields and put into the global list */ |
| 532 | strlcpy(client->name, "smsc47m192", I2C_NAME_SIZE); | 533 | strlcpy(client->name, "smsc47m192", I2C_NAME_SIZE); |
| 533 | data->vrm = vid_which_vrm(); | 534 | data->vrm = vid_which_vrm(); |
| 534 | init_MUTEX(&data->update_lock); | 535 | mutex_init(&data->update_lock); |
| 535 | 536 | ||
| 536 | /* Tell the I2C layer a new client has arrived */ | 537 | /* Tell the I2C layer a new client has arrived */ |
| 537 | if ((err = i2c_attach_client(client))) | 538 | if ((err = i2c_attach_client(client))) |
| @@ -594,7 +595,7 @@ static struct smsc47m192_data *smsc47m192_update_device(struct device *dev) | |||
| 594 | struct smsc47m192_data *data = i2c_get_clientdata(client); | 595 | struct smsc47m192_data *data = i2c_get_clientdata(client); |
| 595 | int i, config; | 596 | int i, config; |
| 596 | 597 | ||
| 597 | down(&data->update_lock); | 598 | mutex_lock(&data->update_lock); |
| 598 | 599 | ||
| 599 | if (time_after(jiffies, data->last_updated + HZ + HZ / 2) | 600 | if (time_after(jiffies, data->last_updated + HZ + HZ / 2) |
| 600 | || !data->valid) { | 601 | || !data->valid) { |
| @@ -645,7 +646,7 @@ static struct smsc47m192_data *smsc47m192_update_device(struct device *dev) | |||
| 645 | data->valid = 1; | 646 | data->valid = 1; |
| 646 | } | 647 | } |
| 647 | 648 | ||
| 648 | up(&data->update_lock); | 649 | mutex_unlock(&data->update_lock); |
| 649 | 650 | ||
| 650 | return data; | 651 | return data; |
| 651 | } | 652 | } |
