diff options
-rw-r--r-- | Documentation/hwmon/w83781d | 18 | ||||
-rw-r--r-- | drivers/hwmon/Kconfig | 6 | ||||
-rw-r--r-- | drivers/hwmon/w83781d.c | 29 |
3 files changed, 14 insertions, 39 deletions
diff --git a/Documentation/hwmon/w83781d b/Documentation/hwmon/w83781d index dbeadb269a69..6f800a0283e9 100644 --- a/Documentation/hwmon/w83781d +++ b/Documentation/hwmon/w83781d | |||
@@ -14,10 +14,6 @@ Supported chips: | |||
14 | Prefix: 'w83783s' | 14 | Prefix: 'w83783s' |
15 | Addresses scanned: I2C 0x2d | 15 | Addresses scanned: I2C 0x2d |
16 | Datasheet: http://www.winbond-usa.com/products/winbond_products/pdfs/PCIC/w83783s.pdf | 16 | Datasheet: http://www.winbond-usa.com/products/winbond_products/pdfs/PCIC/w83783s.pdf |
17 | * Winbond W83627HF | ||
18 | Prefix: 'w83627hf' | ||
19 | Addresses scanned: I2C 0x28 - 0x2f, ISA 0x290 (8 I/O ports) | ||
20 | Datasheet: http://www.winbond.com/PDF/sheet/w83627hf.pdf | ||
21 | * Asus AS99127F | 17 | * Asus AS99127F |
22 | Prefix: 'as99127f' | 18 | Prefix: 'as99127f' |
23 | Addresses scanned: I2C 0x28 - 0x2f | 19 | Addresses scanned: I2C 0x28 - 0x2f |
@@ -50,20 +46,18 @@ force_subclients=bus,caddr,saddr,saddr | |||
50 | Description | 46 | Description |
51 | ----------- | 47 | ----------- |
52 | 48 | ||
53 | This driver implements support for the Winbond W83781D, W83782D, W83783S, | 49 | This driver implements support for the Winbond W83781D, W83782D, W83783S |
54 | W83627HF chips, and the Asus AS99127F chips. We will refer to them | 50 | chips, and the Asus AS99127F chips. We will refer to them collectively as |
55 | collectively as W8378* chips. | 51 | W8378* chips. |
56 | 52 | ||
57 | There is quite some difference between these chips, but they are similar | 53 | There is quite some difference between these chips, but they are similar |
58 | enough that it was sensible to put them together in one driver. | 54 | enough that it was sensible to put them together in one driver. |
59 | The W83627HF chip is assumed to be identical to the ISA W83782D. | ||
60 | The Asus chips are similar to an I2C-only W83782D. | 55 | The Asus chips are similar to an I2C-only W83782D. |
61 | 56 | ||
62 | Chip #vin #fanin #pwm #temp wchipid vendid i2c ISA | 57 | Chip #vin #fanin #pwm #temp wchipid vendid i2c ISA |
63 | as99127f 7 3 0 3 0x31 0x12c3 yes no | 58 | as99127f 7 3 0 3 0x31 0x12c3 yes no |
64 | as99127f rev.2 (type_name = as99127f) 0x31 0x5ca3 yes no | 59 | as99127f rev.2 (type_name = as99127f) 0x31 0x5ca3 yes no |
65 | w83781d 7 3 0 3 0x10-1 0x5ca3 yes yes | 60 | w83781d 7 3 0 3 0x10-1 0x5ca3 yes yes |
66 | w83627hf 9 3 2 3 0x21 0x5ca3 yes yes(LPC) | ||
67 | w83782d 9 3 2-4 3 0x30 0x5ca3 yes yes | 61 | w83782d 9 3 2-4 3 0x30 0x5ca3 yes yes |
68 | w83783s 5-6 3 2 1-2 0x40 0x5ca3 yes no | 62 | w83783s 5-6 3 2 1-2 0x40 0x5ca3 yes no |
69 | 63 | ||
@@ -143,9 +137,9 @@ Individual alarm and beep bits: | |||
143 | 0x000400: in6 | 137 | 0x000400: in6 |
144 | 0x000800: fan3 | 138 | 0x000800: fan3 |
145 | 0x001000: chassis | 139 | 0x001000: chassis |
146 | 0x002000: temp3 (W83782D and W83627HF only) | 140 | 0x002000: temp3 (W83782D only) |
147 | 0x010000: in7 (W83782D and W83627HF only) | 141 | 0x010000: in7 (W83782D only) |
148 | 0x020000: in8 (W83782D and W83627HF only) | 142 | 0x020000: in8 (W83782D only) |
149 | 143 | ||
150 | If an alarm triggers, it will remain triggered until the hardware register | 144 | If an alarm triggers, it will remain triggered until the hardware register |
151 | is read at least once. This means that the cause for the alarm may | 145 | is read at least once. This means that the cause for the alarm may |
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index af43d566d770..27e0b34ead5f 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
@@ -631,13 +631,13 @@ config SENSORS_VT8231 | |||
631 | will be called vt8231. | 631 | will be called vt8231. |
632 | 632 | ||
633 | config SENSORS_W83781D | 633 | config SENSORS_W83781D |
634 | tristate "Winbond W83781D, W83782D, W83783S, W83627HF, Asus AS99127F" | 634 | tristate "Winbond W83781D, W83782D, W83783S, Asus AS99127F" |
635 | depends on I2C | 635 | depends on I2C |
636 | select HWMON_VID | 636 | select HWMON_VID |
637 | help | 637 | help |
638 | If you say yes here you get support for the Winbond W8378x series | 638 | If you say yes here you get support for the Winbond W8378x series |
639 | of sensor chips: the W83781D, W83782D, W83783S and W83627HF, | 639 | of sensor chips: the W83781D, W83782D and W83783S, and the similar |
640 | and the similar Asus AS99127F. | 640 | Asus AS99127F. |
641 | 641 | ||
642 | This driver can also be built as a module. If so, the module | 642 | This driver can also be built as a module. If so, the module |
643 | will be called w83781d. | 643 | will be called w83781d. |
diff --git a/drivers/hwmon/w83781d.c b/drivers/hwmon/w83781d.c index d38b9ede3abd..8d4d1acbf650 100644 --- a/drivers/hwmon/w83781d.c +++ b/drivers/hwmon/w83781d.c | |||
@@ -28,7 +28,6 @@ | |||
28 | as99127f 7 3 0 3 0x31 0x12c3 yes no | 28 | as99127f 7 3 0 3 0x31 0x12c3 yes no |
29 | as99127f rev.2 (type_name = as99127f) 0x31 0x5ca3 yes no | 29 | as99127f rev.2 (type_name = as99127f) 0x31 0x5ca3 yes no |
30 | w83781d 7 3 0 3 0x10-1 0x5ca3 yes yes | 30 | w83781d 7 3 0 3 0x10-1 0x5ca3 yes yes |
31 | w83627hf 9 3 2 3 0x21 0x5ca3 yes yes(LPC) | ||
32 | w83782d 9 3 2-4 3 0x30 0x5ca3 yes yes | 31 | w83782d 9 3 2-4 3 0x30 0x5ca3 yes yes |
33 | w83783s 5-6 3 2 1-2 0x40 0x5ca3 yes no | 32 | w83783s 5-6 3 2 1-2 0x40 0x5ca3 yes no |
34 | 33 | ||
@@ -59,7 +58,7 @@ static unsigned short normal_i2c[] = { 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, | |||
59 | static unsigned short isa_address = 0x290; | 58 | static unsigned short isa_address = 0x290; |
60 | 59 | ||
61 | /* Insmod parameters */ | 60 | /* Insmod parameters */ |
62 | I2C_CLIENT_INSMOD_5(w83781d, w83782d, w83783s, w83627hf, as99127f); | 61 | I2C_CLIENT_INSMOD_4(w83781d, w83782d, w83783s, as99127f); |
63 | I2C_CLIENT_MODULE_PARM(force_subclients, "List of subclient addresses: " | 62 | I2C_CLIENT_MODULE_PARM(force_subclients, "List of subclient addresses: " |
64 | "{bus, clientaddr, subclientaddr1, subclientaddr2}"); | 63 | "{bus, clientaddr, subclientaddr1, subclientaddr2}"); |
65 | 64 | ||
@@ -113,7 +112,7 @@ MODULE_PARM_DESC(init, "Set to zero to bypass chip initialization"); | |||
113 | #define W83781D_REG_ALARM1 0x41 | 112 | #define W83781D_REG_ALARM1 0x41 |
114 | #define W83781D_REG_ALARM2 0x42 | 113 | #define W83781D_REG_ALARM2 0x42 |
115 | 114 | ||
116 | /* Real-time status (W83782D, W83783S, W83627HF) */ | 115 | /* Real-time status (W83782D, W83783S) */ |
117 | #define W83782D_REG_ALARM1 0x459 | 116 | #define W83782D_REG_ALARM1 0x459 |
118 | #define W83782D_REG_ALARM2 0x45A | 117 | #define W83782D_REG_ALARM2 0x45A |
119 | #define W83782D_REG_ALARM3 0x45B | 118 | #define W83782D_REG_ALARM3 0x45B |
@@ -962,8 +961,6 @@ w83781d_detect_subclients(struct i2c_adapter *adapter, int address, int kind, | |||
962 | client_name = "w83782d subclient"; | 961 | client_name = "w83782d subclient"; |
963 | else if (kind == w83783s) | 962 | else if (kind == w83783s) |
964 | client_name = "w83783s subclient"; | 963 | client_name = "w83783s subclient"; |
965 | else if (kind == w83627hf) | ||
966 | client_name = "w83627hf subclient"; | ||
967 | else if (kind == as99127f) | 964 | else if (kind == as99127f) |
968 | client_name = "as99127f subclient"; | 965 | client_name = "as99127f subclient"; |
969 | 966 | ||
@@ -1267,8 +1264,6 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind) | |||
1267 | kind = w83782d; | 1264 | kind = w83782d; |
1268 | else if (val1 == 0x40 && vendid == winbond && address == 0x2d) | 1265 | else if (val1 == 0x40 && vendid == winbond && address == 0x2d) |
1269 | kind = w83783s; | 1266 | kind = w83783s; |
1270 | else if (val1 == 0x21 && vendid == winbond) | ||
1271 | kind = w83627hf; | ||
1272 | else if (val1 == 0x31) | 1267 | else if (val1 == 0x31) |
1273 | kind = as99127f; | 1268 | kind = as99127f; |
1274 | else { | 1269 | else { |
@@ -1287,8 +1282,6 @@ w83781d_detect(struct i2c_adapter *adapter, int address, int kind) | |||
1287 | client_name = "w83782d"; | 1282 | client_name = "w83782d"; |
1288 | } else if (kind == w83783s) { | 1283 | } else if (kind == w83783s) { |
1289 | client_name = "w83783s"; | 1284 | client_name = "w83783s"; |
1290 | } else if (kind == w83627hf) { | ||
1291 | client_name = "w83627hf"; | ||
1292 | } else if (kind == as99127f) { | 1285 | } else if (kind == as99127f) { |
1293 | client_name = "as99127f"; | 1286 | client_name = "as99127f"; |
1294 | } | 1287 | } |
@@ -1395,10 +1388,6 @@ w83781d_isa_probe(struct platform_device *pdev) | |||
1395 | 1388 | ||
1396 | reg = w83781d_read_value(data, W83781D_REG_WCHIPID); | 1389 | reg = w83781d_read_value(data, W83781D_REG_WCHIPID); |
1397 | switch (reg) { | 1390 | switch (reg) { |
1398 | case 0x21: | ||
1399 | data->type = w83627hf; | ||
1400 | name = "w83627hf"; | ||
1401 | break; | ||
1402 | case 0x30: | 1391 | case 0x30: |
1403 | data->type = w83782d; | 1392 | data->type = w83782d; |
1404 | name = "w83782d"; | 1393 | name = "w83782d"; |
@@ -1598,11 +1587,6 @@ w83781d_init_device(struct device *dev) | |||
1598 | int type = data->type; | 1587 | int type = data->type; |
1599 | u8 tmp; | 1588 | u8 tmp; |
1600 | 1589 | ||
1601 | if (type == w83627hf) | ||
1602 | dev_info(dev, "The W83627HF chip is better supported by the " | ||
1603 | "w83627hf driver, support will be dropped from the " | ||
1604 | "w83781d driver soon\n"); | ||
1605 | |||
1606 | if (reset && type != as99127f) { /* this resets registers we don't have | 1590 | if (reset && type != as99127f) { /* this resets registers we don't have |
1607 | documentation for on the as99127f */ | 1591 | documentation for on the as99127f */ |
1608 | /* Resetting the chip has been the default for a long time, | 1592 | /* Resetting the chip has been the default for a long time, |
@@ -1716,8 +1700,7 @@ static struct w83781d_data *w83781d_update_device(struct device *dev) | |||
1716 | w83781d_read_value(data, W83781D_REG_IN_MIN(i)); | 1700 | w83781d_read_value(data, W83781D_REG_IN_MIN(i)); |
1717 | data->in_max[i] = | 1701 | data->in_max[i] = |
1718 | w83781d_read_value(data, W83781D_REG_IN_MAX(i)); | 1702 | w83781d_read_value(data, W83781D_REG_IN_MAX(i)); |
1719 | if ((data->type != w83782d) | 1703 | if ((data->type != w83782d) && (i == 6)) |
1720 | && (data->type != w83627hf) && (i == 6)) | ||
1721 | break; | 1704 | break; |
1722 | } | 1705 | } |
1723 | for (i = 0; i < 3; i++) { | 1706 | for (i = 0; i < 3; i++) { |
@@ -1775,7 +1758,7 @@ static struct w83781d_data *w83781d_update_device(struct device *dev) | |||
1775 | data->fan_div[1] |= (i >> 4) & 0x04; | 1758 | data->fan_div[1] |= (i >> 4) & 0x04; |
1776 | data->fan_div[2] |= (i >> 5) & 0x04; | 1759 | data->fan_div[2] |= (i >> 5) & 0x04; |
1777 | } | 1760 | } |
1778 | if ((data->type == w83782d) || (data->type == w83627hf)) { | 1761 | if (data->type == w83782d) { |
1779 | data->alarms = w83781d_read_value(data, | 1762 | data->alarms = w83781d_read_value(data, |
1780 | W83782D_REG_ALARM1) | 1763 | W83782D_REG_ALARM1) |
1781 | | (w83781d_read_value(data, | 1764 | | (w83781d_read_value(data, |
@@ -1885,13 +1868,11 @@ w83781d_isa_found(unsigned short address) | |||
1885 | outb_p(W83781D_REG_WCHIPID, address + W83781D_ADDR_REG_OFFSET); | 1868 | outb_p(W83781D_REG_WCHIPID, address + W83781D_ADDR_REG_OFFSET); |
1886 | val = inb_p(address + W83781D_DATA_REG_OFFSET); | 1869 | val = inb_p(address + W83781D_DATA_REG_OFFSET); |
1887 | if ((val & 0xfe) == 0x10 /* W83781D */ | 1870 | if ((val & 0xfe) == 0x10 /* W83781D */ |
1888 | || val == 0x30 /* W83782D */ | 1871 | || val == 0x30) /* W83782D */ |
1889 | || val == 0x21) /* W83627HF */ | ||
1890 | found = 1; | 1872 | found = 1; |
1891 | 1873 | ||
1892 | if (found) | 1874 | if (found) |
1893 | pr_info("w83781d: Found a %s chip at %#x\n", | 1875 | pr_info("w83781d: Found a %s chip at %#x\n", |
1894 | val == 0x21 ? "W83627HF" : | ||
1895 | val == 0x30 ? "W83782D" : "W83781D", (int)address); | 1876 | val == 0x30 ? "W83782D" : "W83781D", (int)address); |
1896 | 1877 | ||
1897 | release: | 1878 | release: |