diff options
Diffstat (limited to 'drivers/hwmon/adt7470.c')
-rw-r--r-- | drivers/hwmon/adt7470.c | 56 |
1 files changed, 48 insertions, 8 deletions
diff --git a/drivers/hwmon/adt7470.c b/drivers/hwmon/adt7470.c index b7a442a80bde..ab8d5ebc9f75 100644 --- a/drivers/hwmon/adt7470.c +++ b/drivers/hwmon/adt7470.c | |||
@@ -129,8 +129,8 @@ I2C_CLIENT_INSMOD_1(adt7470); | |||
129 | /* How often do we reread sensor limit values? (In jiffies) */ | 129 | /* How often do we reread sensor limit values? (In jiffies) */ |
130 | #define LIMIT_REFRESH_INTERVAL (60 * HZ) | 130 | #define LIMIT_REFRESH_INTERVAL (60 * HZ) |
131 | 131 | ||
132 | /* sleep 1s while gathering temperature data */ | 132 | /* Wait at least 200ms per sensor for 10 sensors */ |
133 | #define TEMP_COLLECTION_TIME 1000 | 133 | #define TEMP_COLLECTION_TIME 2000 |
134 | 134 | ||
135 | /* datasheet says to divide this number by the fan reading to get fan rpm */ | 135 | /* datasheet says to divide this number by the fan reading to get fan rpm */ |
136 | #define FAN_PERIOD_TO_RPM(x) ((90000 * 60) / (x)) | 136 | #define FAN_PERIOD_TO_RPM(x) ((90000 * 60) / (x)) |
@@ -147,6 +147,8 @@ struct adt7470_data { | |||
147 | unsigned long sensors_last_updated; /* In jiffies */ | 147 | unsigned long sensors_last_updated; /* In jiffies */ |
148 | unsigned long limits_last_updated; /* In jiffies */ | 148 | unsigned long limits_last_updated; /* In jiffies */ |
149 | 149 | ||
150 | int num_temp_sensors; /* -1 = probe */ | ||
151 | |||
150 | s8 temp[ADT7470_TEMP_COUNT]; | 152 | s8 temp[ADT7470_TEMP_COUNT]; |
151 | s8 temp_min[ADT7470_TEMP_COUNT]; | 153 | s8 temp_min[ADT7470_TEMP_COUNT]; |
152 | s8 temp_max[ADT7470_TEMP_COUNT]; | 154 | s8 temp_max[ADT7470_TEMP_COUNT]; |
@@ -256,12 +258,10 @@ static struct adt7470_data *adt7470_update_device(struct device *dev) | |||
256 | cfg |= 0x80; | 258 | cfg |= 0x80; |
257 | i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, cfg); | 259 | i2c_smbus_write_byte_data(client, ADT7470_REG_CFG, cfg); |
258 | 260 | ||
259 | /* | 261 | /* Delay is 200ms * number of temp sensors. */ |
260 | * Delay is 200ms * number of tmp05 sensors. Too bad | 262 | msleep((data->num_temp_sensors >= 0 ? |
261 | * there's no way to figure out how many are connected. | 263 | data->num_temp_sensors * 200 : |
262 | * For now, assume 1s will work. | 264 | TEMP_COLLECTION_TIME)); |
263 | */ | ||
264 | msleep(TEMP_COLLECTION_TIME); | ||
265 | 265 | ||
266 | /* done reading temperature sensors */ | 266 | /* done reading temperature sensors */ |
267 | cfg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG); | 267 | cfg = i2c_smbus_read_byte_data(client, ADT7470_REG_CFG); |
@@ -276,6 +276,12 @@ static struct adt7470_data *adt7470_update_device(struct device *dev) | |||
276 | data->temp[i] = i2c_smbus_read_byte_data(client, | 276 | data->temp[i] = i2c_smbus_read_byte_data(client, |
277 | ADT7470_TEMP_REG(i)); | 277 | ADT7470_TEMP_REG(i)); |
278 | 278 | ||
279 | /* Figure out the number of temp sensors */ | ||
280 | if (data->num_temp_sensors < 0) | ||
281 | for (i = 0; i < ADT7470_TEMP_COUNT; i++) | ||
282 | if (data->temp[i]) | ||
283 | data->num_temp_sensors = i + 1; | ||
284 | |||
279 | for (i = 0; i < ADT7470_FAN_COUNT; i++) | 285 | for (i = 0; i < ADT7470_FAN_COUNT; i++) |
280 | data->fan[i] = adt7470_read_word_data(client, | 286 | data->fan[i] = adt7470_read_word_data(client, |
281 | ADT7470_REG_FAN(i)); | 287 | ADT7470_REG_FAN(i)); |
@@ -359,6 +365,35 @@ out: | |||
359 | return data; | 365 | return data; |
360 | } | 366 | } |
361 | 367 | ||
368 | static ssize_t show_num_temp_sensors(struct device *dev, | ||
369 | struct device_attribute *devattr, | ||
370 | char *buf) | ||
371 | { | ||
372 | struct adt7470_data *data = adt7470_update_device(dev); | ||
373 | return sprintf(buf, "%d\n", data->num_temp_sensors); | ||
374 | } | ||
375 | |||
376 | static ssize_t set_num_temp_sensors(struct device *dev, | ||
377 | struct device_attribute *devattr, | ||
378 | const char *buf, | ||
379 | size_t count) | ||
380 | { | ||
381 | struct i2c_client *client = to_i2c_client(dev); | ||
382 | struct adt7470_data *data = i2c_get_clientdata(client); | ||
383 | long temp; | ||
384 | |||
385 | if (strict_strtol(buf, 10, &temp)) | ||
386 | return -EINVAL; | ||
387 | |||
388 | temp = SENSORS_LIMIT(temp, -1, 10); | ||
389 | |||
390 | mutex_lock(&data->lock); | ||
391 | data->num_temp_sensors = temp; | ||
392 | mutex_unlock(&data->lock); | ||
393 | |||
394 | return count; | ||
395 | } | ||
396 | |||
362 | static ssize_t show_temp_min(struct device *dev, | 397 | static ssize_t show_temp_min(struct device *dev, |
363 | struct device_attribute *devattr, | 398 | struct device_attribute *devattr, |
364 | char *buf) | 399 | char *buf) |
@@ -825,6 +860,8 @@ static ssize_t show_alarm(struct device *dev, | |||
825 | } | 860 | } |
826 | 861 | ||
827 | static DEVICE_ATTR(alarm_mask, S_IRUGO, show_alarm_mask, NULL); | 862 | static DEVICE_ATTR(alarm_mask, S_IRUGO, show_alarm_mask, NULL); |
863 | static DEVICE_ATTR(num_temp_sensors, S_IWUSR | S_IRUGO, show_num_temp_sensors, | ||
864 | set_num_temp_sensors); | ||
828 | 865 | ||
829 | static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, | 866 | static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, |
830 | set_temp_max, 0); | 867 | set_temp_max, 0); |
@@ -997,6 +1034,7 @@ static SENSOR_DEVICE_ATTR(pwm4_auto_channels_temp, S_IWUSR | S_IRUGO, | |||
997 | static struct attribute *adt7470_attr[] = | 1034 | static struct attribute *adt7470_attr[] = |
998 | { | 1035 | { |
999 | &dev_attr_alarm_mask.attr, | 1036 | &dev_attr_alarm_mask.attr, |
1037 | &dev_attr_num_temp_sensors.attr, | ||
1000 | &sensor_dev_attr_temp1_max.dev_attr.attr, | 1038 | &sensor_dev_attr_temp1_max.dev_attr.attr, |
1001 | &sensor_dev_attr_temp2_max.dev_attr.attr, | 1039 | &sensor_dev_attr_temp2_max.dev_attr.attr, |
1002 | &sensor_dev_attr_temp3_max.dev_attr.attr, | 1040 | &sensor_dev_attr_temp3_max.dev_attr.attr, |
@@ -1129,6 +1167,8 @@ static int adt7470_probe(struct i2c_client *client, | |||
1129 | goto exit; | 1167 | goto exit; |
1130 | } | 1168 | } |
1131 | 1169 | ||
1170 | data->num_temp_sensors = -1; | ||
1171 | |||
1132 | i2c_set_clientdata(client, data); | 1172 | i2c_set_clientdata(client, data); |
1133 | mutex_init(&data->lock); | 1173 | mutex_init(&data->lock); |
1134 | 1174 | ||