aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/w83792d.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-12-09 22:53:11 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-12-09 22:53:11 -0500
commitf71eaf68406cfee91b6a96bcdf7ce33dc78829c5 (patch)
tree92a1663ae15d521f25849d28ebb4dfad10567892 /drivers/hwmon/w83792d.c
parent78f1ae193d1662c22cfebb916e788e1ca896c0fe (diff)
parent54fe4671aa5853ca88da72d67e969a3d8de6dcf6 (diff)
Merge branch 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging
* 'hwmon-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jdelvare/staging: (41 commits) hwmon: (adt7475) Add VID support for the ADT7476 hwmon: (adt7475) Add an entry in MAINTAINERS hwmon: (adt7475) Add support for the ADT7476 hwmon: (adt7475) Voltage attenuators can be bypassed hwmon: (adt7475) Print device information on probe hwmon: (adt7475) Handle alternative pin functions hwmon: (adt7475) Move sysfs files removal to a separate function hwmon: (adt7475) Add support for the ADT7490 hwmon: (adt7475) Improve device detection hwmon: (adt7475) Add missing static marker hwmon: (adt7475) Rework voltage inputs handling hwmon: (adt7475) Implement pwm_use_point2_pwm_at_crit hwmon: (adt7475) New documentation hwmon: (adt7475) Add support for the ADT7473 hwmon: (f71882fg) Add support for the f71889fg (version 2) hwmon: (f71882fg) Fix sysfs file removal hwmon: (f71882fg) Cleanup sysfs attr creation 2/2 hwmon: (f71882fg) Cleanup sysfs attr creation 1/2 hwmon: (thmc50) Stop using I2C_CLIENT_MODULE_PARM hwmon: Add Freescale MC13783 ADC driver ...
Diffstat (limited to 'drivers/hwmon/w83792d.c')
-rw-r--r--drivers/hwmon/w83792d.c61
1 files changed, 18 insertions, 43 deletions
diff --git a/drivers/hwmon/w83792d.c b/drivers/hwmon/w83792d.c
index 2be16194ddf3..38978851333f 100644
--- a/drivers/hwmon/w83792d.c
+++ b/drivers/hwmon/w83792d.c
@@ -1273,58 +1273,33 @@ w83792d_detect(struct i2c_client *client, int kind, struct i2c_board_info *info)
1273 return -ENODEV; 1273 return -ENODEV;
1274 } 1274 }
1275 1275
1276 /* The w83792d may be stuck in some other bank than bank 0. This may 1276 if (w83792d_read_value(client, W83792D_REG_CONFIG) & 0x80)
1277 make reading other information impossible. Specify a force=... or 1277 return -ENODEV;
1278 force_*=... parameter, and the Winbond will be reset to the right 1278
1279 bank. */ 1279 val1 = w83792d_read_value(client, W83792D_REG_BANK);
1280 if (kind < 0) { 1280 val2 = w83792d_read_value(client, W83792D_REG_CHIPMAN);
1281 if (w83792d_read_value(client, W83792D_REG_CONFIG) & 0x80) { 1281 /* Check for Winbond ID if in bank 0 */
1282 return -ENODEV; 1282 if (!(val1 & 0x07)) { /* is Bank0 */
1283 } 1283 if ((!(val1 & 0x80) && val2 != 0xa3) ||
1284 val1 = w83792d_read_value(client, W83792D_REG_BANK); 1284 ( (val1 & 0x80) && val2 != 0x5c))
1285 val2 = w83792d_read_value(client, W83792D_REG_CHIPMAN);
1286 /* Check for Winbond ID if in bank 0 */
1287 if (!(val1 & 0x07)) { /* is Bank0 */
1288 if (((!(val1 & 0x80)) && (val2 != 0xa3)) ||
1289 ((val1 & 0x80) && (val2 != 0x5c))) {
1290 return -ENODEV;
1291 }
1292 }
1293 /* If Winbond chip, address of chip and W83792D_REG_I2C_ADDR
1294 should match */
1295 if (w83792d_read_value(client,
1296 W83792D_REG_I2C_ADDR) != address) {
1297 return -ENODEV; 1285 return -ENODEV;
1298 }
1299 } 1286 }
1287 /* If Winbond chip, address of chip and W83792D_REG_I2C_ADDR
1288 should match */
1289 if (w83792d_read_value(client, W83792D_REG_I2C_ADDR) != address)
1290 return -ENODEV;
1300 1291
1301 /* We have either had a force parameter, or we have already detected the 1292 /* Put it now into bank 0 and Vendor ID High Byte */
1302 Winbond. Put it now into bank 0 and Vendor ID High Byte */
1303 w83792d_write_value(client, 1293 w83792d_write_value(client,
1304 W83792D_REG_BANK, 1294 W83792D_REG_BANK,
1305 (w83792d_read_value(client, 1295 (w83792d_read_value(client,
1306 W83792D_REG_BANK) & 0x78) | 0x80); 1296 W83792D_REG_BANK) & 0x78) | 0x80);
1307 1297
1308 /* Determine the chip type. */ 1298 /* Determine the chip type. */
1309 if (kind <= 0) { 1299 val1 = w83792d_read_value(client, W83792D_REG_WCHIPID);
1310 /* get vendor ID */ 1300 val2 = w83792d_read_value(client, W83792D_REG_CHIPMAN);
1311 val2 = w83792d_read_value(client, W83792D_REG_CHIPMAN); 1301 if (val1 != 0x7a || val2 != 0x5c)
1312 if (val2 != 0x5c) { /* the vendor is NOT Winbond */ 1302 return -ENODEV;
1313 return -ENODEV;
1314 }
1315 val1 = w83792d_read_value(client, W83792D_REG_WCHIPID);
1316 if (val1 == 0x7a) {
1317 kind = w83792d;
1318 } else {
1319 if (kind == 0)
1320 dev_warn(&adapter->dev,
1321 "w83792d: Ignoring 'force' parameter for"
1322 " unknown chip at adapter %d, address"
1323 " 0x%02x\n", i2c_adapter_id(adapter),
1324 address);
1325 return -ENODEV;
1326 }
1327 }
1328 1303
1329 strlcpy(info->type, "w83792d", I2C_NAME_SIZE); 1304 strlcpy(info->type, "w83792d", I2C_NAME_SIZE);
1330 1305