aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/w83791d.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon/w83791d.c')
-rw-r--r--drivers/hwmon/w83791d.c60
1 files changed, 18 insertions, 42 deletions
diff --git a/drivers/hwmon/w83791d.c b/drivers/hwmon/w83791d.c
index 97851c5ba3a..0410bf12c52 100644
--- a/drivers/hwmon/w83791d.c
+++ b/drivers/hwmon/w83791d.c
@@ -1270,56 +1270,32 @@ static int w83791d_detect(struct i2c_client *client, int kind,
1270 return -ENODEV; 1270 return -ENODEV;
1271 } 1271 }
1272 1272
1273 /* The w83791d may be stuck in some other bank than bank 0. This may 1273 if (w83791d_read(client, W83791D_REG_CONFIG) & 0x80)
1274 make reading other information impossible. Specify a force=... 1274 return -ENODEV;
1275 parameter, and the Winbond will be reset to the right bank. */ 1275
1276 if (kind < 0) { 1276 val1 = w83791d_read(client, W83791D_REG_BANK);
1277 if (w83791d_read(client, W83791D_REG_CONFIG) & 0x80) { 1277 val2 = w83791d_read(client, W83791D_REG_CHIPMAN);
1278 return -ENODEV; 1278 /* Check for Winbond ID if in bank 0 */
1279 } 1279 if (!(val1 & 0x07)) {
1280 val1 = w83791d_read(client, W83791D_REG_BANK); 1280 if ((!(val1 & 0x80) && val2 != 0xa3) ||
1281 val2 = w83791d_read(client, W83791D_REG_CHIPMAN); 1281 ( (val1 & 0x80) && val2 != 0x5c)) {
1282 /* Check for Winbond ID if in bank 0 */
1283 if (!(val1 & 0x07)) {
1284 /* yes it is Bank0 */
1285 if (((!(val1 & 0x80)) && (val2 != 0xa3)) ||
1286 ((val1 & 0x80) && (val2 != 0x5c))) {
1287 return -ENODEV;
1288 }
1289 }
1290 /* If Winbond chip, address of chip and W83791D_REG_I2C_ADDR
1291 should match */
1292 if (w83791d_read(client, W83791D_REG_I2C_ADDR) != address) {
1293 return -ENODEV; 1282 return -ENODEV;
1294 } 1283 }
1295 } 1284 }
1285 /* If Winbond chip, address of chip and W83791D_REG_I2C_ADDR
1286 should match */
1287 if (w83791d_read(client, W83791D_REG_I2C_ADDR) != address)
1288 return -ENODEV;
1296 1289
1297 /* We either have a force parameter or we have reason to 1290 /* We want bank 0 and Vendor ID high byte */
1298 believe it is a Winbond chip. Either way, we want bank 0 and
1299 Vendor ID high byte */
1300 val1 = w83791d_read(client, W83791D_REG_BANK) & 0x78; 1291 val1 = w83791d_read(client, W83791D_REG_BANK) & 0x78;
1301 w83791d_write(client, W83791D_REG_BANK, val1 | 0x80); 1292 w83791d_write(client, W83791D_REG_BANK, val1 | 0x80);
1302 1293
1303 /* Verify it is a Winbond w83791d */ 1294 /* Verify it is a Winbond w83791d */
1304 if (kind <= 0) { 1295 val1 = w83791d_read(client, W83791D_REG_WCHIPID);
1305 /* get vendor ID */ 1296 val2 = w83791d_read(client, W83791D_REG_CHIPMAN);
1306 val2 = w83791d_read(client, W83791D_REG_CHIPMAN); 1297 if (val1 != 0x71 || val2 != 0x5c)
1307 if (val2 != 0x5c) { /* the vendor is NOT Winbond */ 1298 return -ENODEV;
1308 return -ENODEV;
1309 }
1310 val1 = w83791d_read(client, W83791D_REG_WCHIPID);
1311 if (val1 == 0x71) {
1312 kind = w83791d;
1313 } else {
1314 if (kind == 0)
1315 dev_warn(&adapter->dev,
1316 "w83791d: Ignoring 'force' parameter "
1317 "for unknown chip at adapter %d, "
1318 "address 0x%02x\n",
1319 i2c_adapter_id(adapter), address);
1320 return -ENODEV;
1321 }
1322 }
1323 1299
1324 strlcpy(info->type, "w83791d", I2C_NAME_SIZE); 1300 strlcpy(info->type, "w83791d", I2C_NAME_SIZE);
1325 1301