diff options
author | Jean Delvare <khali@linux-fr.org> | 2013-05-04 14:49:36 +0200 |
---|---|---|
committer | Jean Delvare <khali@endymion.delvare> | 2013-05-04 14:49:36 +0200 |
commit | 0cd2c72d765191f24d7be14366c0413bf139f3e3 (patch) | |
tree | 77d19cabe37cd11b6c5c5f14e8e5dc05da81802f /drivers | |
parent | 87d0621ae2bdf2e2c60aadbbcb8b6c680777c1bf (diff) |
hwmon: (lm75) Tune resolution and sample time per chip
Most LM75-compatible chips can either sample much faster or with a
much better resolution than the original LM75 chip. So far the lm75
driver did not let the user take benefit of these improvements. Do it
now.
I decided to almost always configure the chip to use the best
resolution possible, which also means the longest sample time. The
only chips for which I didn't are the DS75, DS1775 and STDS75, because
they are really too slow in 12-bit mode (1.2 to 1.5 second worst case)
so I went for 11-bit mode as a more reasonable tradeoff. This choice is
dictated by the fact that the hwmon subsystem is meant for system
monitoring, it has never been supposed to be ultra-fast, and as a
matter of fact we do cache the sampled values in almost all drivers.
If anyone isn't pleased with these default settings, they can always
introduce a platform data structure or DT support for the lm75. That
being said, it seems nobody ever complained that the driver wouldn't
refresh the value faster than every 1.5 second, and the change made
it faster for all chips even in 12-bit mode, so I don't expect any
complaint.
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Acked-by: Guenter Roeck <linux@roeck-us.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/hwmon/lm75.c | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/drivers/hwmon/lm75.c b/drivers/hwmon/lm75.c index 559e675db3c8..928341115793 100644 --- a/drivers/hwmon/lm75.c +++ b/drivers/hwmon/lm75.c @@ -169,6 +169,7 @@ lm75_probe(struct i2c_client *client, const struct i2c_device_id *id) int status; u8 set_mask, clr_mask; int new; + enum lm75_type kind = id->driver_data; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) @@ -187,30 +188,59 @@ lm75_probe(struct i2c_client *client, const struct i2c_device_id *id) set_mask = 0; clr_mask = LM75_SHUTDOWN; /* continuous conversions */ - switch (id->driver_data) { + switch (kind) { case adt75: clr_mask |= 1 << 5; /* not one-shot mode */ + data->resolution = 12; + data->sample_time = HZ / 8; break; case ds1775: case ds75: case stds75: - clr_mask |= 3 << 5; /* 9-bit mode */ + clr_mask |= 3 << 5; + set_mask |= 2 << 5; /* 11-bit mode */ + data->resolution = 11; + data->sample_time = HZ; + break; + case lm75: + case lm75a: + data->resolution = 9; + data->sample_time = HZ / 2; + break; + case max6625: + data->resolution = 9; + data->sample_time = HZ / 4; + break; + case max6626: + data->resolution = 12; + data->resolution_limits = 9; + data->sample_time = HZ / 4; + break; + case tcn75: + data->resolution = 9; + data->sample_time = HZ / 8; break; case mcp980x: + data->resolution_limits = 9; + /* fall through */ case tmp100: case tmp101: + set_mask |= 3 << 5; /* 12-bit mode */ + data->resolution = 12; + data->sample_time = HZ; + clr_mask |= 1 << 7; /* not one-shot mode */ + break; case tmp105: case tmp175: case tmp275: case tmp75: - clr_mask |= 3 << 5; /* 9-bit mode */ + set_mask |= 3 << 5; /* 12-bit mode */ clr_mask |= 1 << 7; /* not one-shot mode */ + data->resolution = 12; + data->sample_time = HZ / 2; break; } - data->resolution = 9; - data->sample_time = HZ + HZ / 2; - /* configure as specified */ status = lm75_read_value(client, LM75_REG_CONF); if (status < 0) { |