aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hwmon/adt7470.c56
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
368static 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
376static 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
362static ssize_t show_temp_min(struct device *dev, 397static 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
827static DEVICE_ATTR(alarm_mask, S_IRUGO, show_alarm_mask, NULL); 862static DEVICE_ATTR(alarm_mask, S_IRUGO, show_alarm_mask, NULL);
863static DEVICE_ATTR(num_temp_sensors, S_IWUSR | S_IRUGO, show_num_temp_sensors,
864 set_num_temp_sensors);
828 865
829static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp_max, 866static 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,
997static struct attribute *adt7470_attr[] = 1034static 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