diff options
Diffstat (limited to 'drivers/hwmon/lm77.c')
-rw-r--r-- | drivers/hwmon/lm77.c | 80 |
1 files changed, 39 insertions, 41 deletions
diff --git a/drivers/hwmon/lm77.c b/drivers/hwmon/lm77.c index 866b401ab6e8..ac067fd19482 100644 --- a/drivers/hwmon/lm77.c +++ b/drivers/hwmon/lm77.c | |||
@@ -249,6 +249,7 @@ static int lm77_detect(struct i2c_client *new_client, int kind, | |||
249 | struct i2c_board_info *info) | 249 | struct i2c_board_info *info) |
250 | { | 250 | { |
251 | struct i2c_adapter *adapter = new_client->adapter; | 251 | struct i2c_adapter *adapter = new_client->adapter; |
252 | int i, cur, conf, hyst, crit, min, max; | ||
252 | 253 | ||
253 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | | 254 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA | |
254 | I2C_FUNC_SMBUS_WORD_DATA)) | 255 | I2C_FUNC_SMBUS_WORD_DATA)) |
@@ -265,51 +266,48 @@ static int lm77_detect(struct i2c_client *new_client, int kind, | |||
265 | 4. registers cycling over 8-address boundaries | 266 | 4. registers cycling over 8-address boundaries |
266 | 267 | ||
267 | Word-sized registers are high-byte first. */ | 268 | Word-sized registers are high-byte first. */ |
268 | if (kind < 0) { | ||
269 | int i, cur, conf, hyst, crit, min, max; | ||
270 | |||
271 | /* addresses cycling */ | ||
272 | cur = i2c_smbus_read_word_data(new_client, 0); | ||
273 | conf = i2c_smbus_read_byte_data(new_client, 1); | ||
274 | hyst = i2c_smbus_read_word_data(new_client, 2); | ||
275 | crit = i2c_smbus_read_word_data(new_client, 3); | ||
276 | min = i2c_smbus_read_word_data(new_client, 4); | ||
277 | max = i2c_smbus_read_word_data(new_client, 5); | ||
278 | for (i = 8; i <= 0xff; i += 8) | ||
279 | if (i2c_smbus_read_byte_data(new_client, i + 1) != conf | ||
280 | || i2c_smbus_read_word_data(new_client, i + 2) != hyst | ||
281 | || i2c_smbus_read_word_data(new_client, i + 3) != crit | ||
282 | || i2c_smbus_read_word_data(new_client, i + 4) != min | ||
283 | || i2c_smbus_read_word_data(new_client, i + 5) != max) | ||
284 | return -ENODEV; | ||
285 | |||
286 | /* sign bits */ | ||
287 | if (((cur & 0x00f0) != 0xf0 && (cur & 0x00f0) != 0x0) | ||
288 | || ((hyst & 0x00f0) != 0xf0 && (hyst & 0x00f0) != 0x0) | ||
289 | || ((crit & 0x00f0) != 0xf0 && (crit & 0x00f0) != 0x0) | ||
290 | || ((min & 0x00f0) != 0xf0 && (min & 0x00f0) != 0x0) | ||
291 | || ((max & 0x00f0) != 0xf0 && (max & 0x00f0) != 0x0)) | ||
292 | return -ENODEV; | ||
293 | 269 | ||
294 | /* unused bits */ | 270 | /* addresses cycling */ |
295 | if (conf & 0xe0) | 271 | cur = i2c_smbus_read_word_data(new_client, 0); |
272 | conf = i2c_smbus_read_byte_data(new_client, 1); | ||
273 | hyst = i2c_smbus_read_word_data(new_client, 2); | ||
274 | crit = i2c_smbus_read_word_data(new_client, 3); | ||
275 | min = i2c_smbus_read_word_data(new_client, 4); | ||
276 | max = i2c_smbus_read_word_data(new_client, 5); | ||
277 | for (i = 8; i <= 0xff; i += 8) { | ||
278 | if (i2c_smbus_read_byte_data(new_client, i + 1) != conf | ||
279 | || i2c_smbus_read_word_data(new_client, i + 2) != hyst | ||
280 | || i2c_smbus_read_word_data(new_client, i + 3) != crit | ||
281 | || i2c_smbus_read_word_data(new_client, i + 4) != min | ||
282 | || i2c_smbus_read_word_data(new_client, i + 5) != max) | ||
296 | return -ENODEV; | 283 | return -ENODEV; |
284 | } | ||
297 | 285 | ||
298 | /* 0x06 and 0x07 return the last read value */ | 286 | /* sign bits */ |
299 | cur = i2c_smbus_read_word_data(new_client, 0); | 287 | if (((cur & 0x00f0) != 0xf0 && (cur & 0x00f0) != 0x0) |
300 | if (i2c_smbus_read_word_data(new_client, 6) != cur | 288 | || ((hyst & 0x00f0) != 0xf0 && (hyst & 0x00f0) != 0x0) |
301 | || i2c_smbus_read_word_data(new_client, 7) != cur) | 289 | || ((crit & 0x00f0) != 0xf0 && (crit & 0x00f0) != 0x0) |
302 | return -ENODEV; | 290 | || ((min & 0x00f0) != 0xf0 && (min & 0x00f0) != 0x0) |
303 | hyst = i2c_smbus_read_word_data(new_client, 2); | 291 | || ((max & 0x00f0) != 0xf0 && (max & 0x00f0) != 0x0)) |
304 | if (i2c_smbus_read_word_data(new_client, 6) != hyst | 292 | return -ENODEV; |
305 | || i2c_smbus_read_word_data(new_client, 7) != hyst) | ||
306 | return -ENODEV; | ||
307 | min = i2c_smbus_read_word_data(new_client, 4); | ||
308 | if (i2c_smbus_read_word_data(new_client, 6) != min | ||
309 | || i2c_smbus_read_word_data(new_client, 7) != min) | ||
310 | return -ENODEV; | ||
311 | 293 | ||
312 | } | 294 | /* unused bits */ |
295 | if (conf & 0xe0) | ||
296 | return -ENODEV; | ||
297 | |||
298 | /* 0x06 and 0x07 return the last read value */ | ||
299 | cur = i2c_smbus_read_word_data(new_client, 0); | ||
300 | if (i2c_smbus_read_word_data(new_client, 6) != cur | ||
301 | || i2c_smbus_read_word_data(new_client, 7) != cur) | ||
302 | return -ENODEV; | ||
303 | hyst = i2c_smbus_read_word_data(new_client, 2); | ||
304 | if (i2c_smbus_read_word_data(new_client, 6) != hyst | ||
305 | || i2c_smbus_read_word_data(new_client, 7) != hyst) | ||
306 | return -ENODEV; | ||
307 | min = i2c_smbus_read_word_data(new_client, 4); | ||
308 | if (i2c_smbus_read_word_data(new_client, 6) != min | ||
309 | || i2c_smbus_read_word_data(new_client, 7) != min) | ||
310 | return -ENODEV; | ||
313 | 311 | ||
314 | strlcpy(info->type, "lm77", I2C_NAME_SIZE); | 312 | strlcpy(info->type, "lm77", I2C_NAME_SIZE); |
315 | 313 | ||