aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/lm75.c
diff options
context:
space:
mode:
authorJean Delvare <khali@linux-fr.org>2013-05-04 08:49:36 -0400
committerJean Delvare <khali@endymion.delvare>2013-05-04 08:49:36 -0400
commit0cd2c72d765191f24d7be14366c0413bf139f3e3 (patch)
tree77d19cabe37cd11b6c5c5f14e8e5dc05da81802f /drivers/hwmon/lm75.c
parent87d0621ae2bdf2e2c60aadbbcb8b6c680777c1bf (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/hwmon/lm75.c')
-rw-r--r--drivers/hwmon/lm75.c42
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)
169 int status; 169 int status;
170 u8 set_mask, clr_mask; 170 u8 set_mask, clr_mask;
171 int new; 171 int new;
172 enum lm75_type kind = id->driver_data;
172 173
173 if (!i2c_check_functionality(client->adapter, 174 if (!i2c_check_functionality(client->adapter,
174 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) 175 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)
187 set_mask = 0; 188 set_mask = 0;
188 clr_mask = LM75_SHUTDOWN; /* continuous conversions */ 189 clr_mask = LM75_SHUTDOWN; /* continuous conversions */
189 190
190 switch (id->driver_data) { 191 switch (kind) {
191 case adt75: 192 case adt75:
192 clr_mask |= 1 << 5; /* not one-shot mode */ 193 clr_mask |= 1 << 5; /* not one-shot mode */
194 data->resolution = 12;
195 data->sample_time = HZ / 8;
193 break; 196 break;
194 case ds1775: 197 case ds1775:
195 case ds75: 198 case ds75:
196 case stds75: 199 case stds75:
197 clr_mask |= 3 << 5; /* 9-bit mode */ 200 clr_mask |= 3 << 5;
201 set_mask |= 2 << 5; /* 11-bit mode */
202 data->resolution = 11;
203 data->sample_time = HZ;
204 break;
205 case lm75:
206 case lm75a:
207 data->resolution = 9;
208 data->sample_time = HZ / 2;
209 break;
210 case max6625:
211 data->resolution = 9;
212 data->sample_time = HZ / 4;
213 break;
214 case max6626:
215 data->resolution = 12;
216 data->resolution_limits = 9;
217 data->sample_time = HZ / 4;
218 break;
219 case tcn75:
220 data->resolution = 9;
221 data->sample_time = HZ / 8;
198 break; 222 break;
199 case mcp980x: 223 case mcp980x:
224 data->resolution_limits = 9;
225 /* fall through */
200 case tmp100: 226 case tmp100:
201 case tmp101: 227 case tmp101:
228 set_mask |= 3 << 5; /* 12-bit mode */
229 data->resolution = 12;
230 data->sample_time = HZ;
231 clr_mask |= 1 << 7; /* not one-shot mode */
232 break;
202 case tmp105: 233 case tmp105:
203 case tmp175: 234 case tmp175:
204 case tmp275: 235 case tmp275:
205 case tmp75: 236 case tmp75:
206 clr_mask |= 3 << 5; /* 9-bit mode */ 237 set_mask |= 3 << 5; /* 12-bit mode */
207 clr_mask |= 1 << 7; /* not one-shot mode */ 238 clr_mask |= 1 << 7; /* not one-shot mode */
239 data->resolution = 12;
240 data->sample_time = HZ / 2;
208 break; 241 break;
209 } 242 }
210 243
211 data->resolution = 9;
212 data->sample_time = HZ + HZ / 2;
213
214 /* configure as specified */ 244 /* configure as specified */
215 status = lm75_read_value(client, LM75_REG_CONF); 245 status = lm75_read_value(client, LM75_REG_CONF);
216 if (status < 0) { 246 if (status < 0) {