diff options
author | Jean Delvare <khali@linux-fr.org> | 2009-12-09 14:35:57 -0500 |
---|---|---|
committer | Jean Delvare <khali@linux-fr.org> | 2009-12-09 14:35:57 -0500 |
commit | 52df6440a29123eed912183fe785bbe174ef14b9 (patch) | |
tree | 3a3b9f4110d21c2ec4f5711444dd9cec6fb3d32c /drivers/hwmon/adm1029.c | |
parent | a1fa4cdcc4abd4c02a81ab7052c16a342d29f060 (diff) |
hwmon: Clean up detect functions
As kind is now hard-coded to -1, there is room for code clean-ups.
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Acked-by: Corentin Labbe <corentin.labbe@geomatys.fr>
Cc: "Mark M. Hoffman" <mhoffman@lightlink.com>
Cc: Juerg Haefliger <juergh@gmail.com>
Cc: Riku Voipio <riku.voipio@iki.fi>
Acked-by: "Hans J. Koch" <hjk@linutronix.de>
Cc: Rudolf Marek <r.marek@assembler.cz>
Diffstat (limited to 'drivers/hwmon/adm1029.c')
-rw-r--r-- | drivers/hwmon/adm1029.c | 55 |
1 files changed, 16 insertions, 39 deletions
diff --git a/drivers/hwmon/adm1029.c b/drivers/hwmon/adm1029.c index 36718150b475..4d7d8433c2f3 100644 --- a/drivers/hwmon/adm1029.c +++ b/drivers/hwmon/adm1029.c | |||
@@ -301,59 +301,36 @@ static int adm1029_detect(struct i2c_client *client, int kind, | |||
301 | struct i2c_board_info *info) | 301 | struct i2c_board_info *info) |
302 | { | 302 | { |
303 | struct i2c_adapter *adapter = client->adapter; | 303 | struct i2c_adapter *adapter = client->adapter; |
304 | u8 man_id, chip_id, temp_devices_installed, nb_fan_support; | ||
304 | 305 | ||
305 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) | 306 | if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) |
306 | return -ENODEV; | 307 | return -ENODEV; |
307 | 308 | ||
308 | /* Now we do the detection and identification. A negative kind | ||
309 | * means that the driver was loaded with no force parameter | ||
310 | * (default), so we must both detect and identify the chip | ||
311 | * (actually there is only one possible kind of chip for now, adm1029). | ||
312 | * A zero kind means that the driver was loaded with the force | ||
313 | * parameter, the detection step shall be skipped. A positive kind | ||
314 | * means that the driver was loaded with the force parameter and a | ||
315 | * given kind of chip is requested, so both the detection and the | ||
316 | * identification steps are skipped. */ | ||
317 | |||
318 | /* Default to an adm1029 if forced */ | ||
319 | if (kind == 0) | ||
320 | kind = adm1029; | ||
321 | |||
322 | /* ADM1029 doesn't have CHIP ID, check just MAN ID | 309 | /* ADM1029 doesn't have CHIP ID, check just MAN ID |
323 | * For better detection we check also ADM1029_TEMP_DEVICES_INSTALLED, | 310 | * For better detection we check also ADM1029_TEMP_DEVICES_INSTALLED, |
324 | * ADM1029_REG_NB_FAN_SUPPORT and compare it with possible values | 311 | * ADM1029_REG_NB_FAN_SUPPORT and compare it with possible values |
325 | * documented | 312 | * documented |
326 | */ | 313 | */ |
327 | 314 | ||
328 | if (kind <= 0) { /* identification */ | 315 | man_id = i2c_smbus_read_byte_data(client, ADM1029_REG_MAN_ID); |
329 | u8 man_id, chip_id, temp_devices_installed, nb_fan_support; | 316 | chip_id = i2c_smbus_read_byte_data(client, ADM1029_REG_CHIP_ID); |
330 | 317 | temp_devices_installed = i2c_smbus_read_byte_data(client, | |
331 | man_id = i2c_smbus_read_byte_data(client, ADM1029_REG_MAN_ID); | ||
332 | chip_id = i2c_smbus_read_byte_data(client, ADM1029_REG_CHIP_ID); | ||
333 | temp_devices_installed = i2c_smbus_read_byte_data(client, | ||
334 | ADM1029_REG_TEMP_DEVICES_INSTALLED); | 318 | ADM1029_REG_TEMP_DEVICES_INSTALLED); |
335 | nb_fan_support = i2c_smbus_read_byte_data(client, | 319 | nb_fan_support = i2c_smbus_read_byte_data(client, |
336 | ADM1029_REG_NB_FAN_SUPPORT); | 320 | ADM1029_REG_NB_FAN_SUPPORT); |
337 | /* 0x41 is Analog Devices */ | 321 | /* 0x41 is Analog Devices */ |
338 | if (man_id == 0x41 && (temp_devices_installed & 0xf9) == 0x01 | 322 | if (man_id != 0x41 || (temp_devices_installed & 0xf9) != 0x01 |
339 | && nb_fan_support == 0x03) { | 323 | || nb_fan_support != 0x03) |
340 | if ((chip_id & 0xF0) == 0x00) { | 324 | return -ENODEV; |
341 | kind = adm1029; | ||
342 | } else { | ||
343 | /* There are no "official" CHIP ID, so actually | ||
344 | * we use Major/Minor revision for that */ | ||
345 | printk(KERN_INFO | ||
346 | "adm1029: Unknown major revision %x, " | ||
347 | "please let us know\n", chip_id); | ||
348 | } | ||
349 | } | ||
350 | 325 | ||
351 | if (kind <= 0) { /* identification failed */ | 326 | if ((chip_id & 0xF0) != 0x00) { |
352 | pr_debug("adm1029: Unsupported chip (man_id=0x%02X, " | 327 | /* There are no "official" CHIP ID, so actually |
353 | "chip_id=0x%02X)\n", man_id, chip_id); | 328 | * we use Major/Minor revision for that */ |
354 | return -ENODEV; | 329 | pr_info("adm1029: Unknown major revision %x, " |
355 | } | 330 | "please let us know\n", chip_id); |
331 | return -ENODEV; | ||
356 | } | 332 | } |
333 | |||
357 | strlcpy(info->type, "adm1029", I2C_NAME_SIZE); | 334 | strlcpy(info->type, "adm1029", I2C_NAME_SIZE); |
358 | 335 | ||
359 | return 0; | 336 | return 0; |