diff options
| author | Guenter Roeck <guenter.roeck@ericsson.com> | 2010-08-14 15:08:55 -0400 |
|---|---|---|
| committer | Jean Delvare <khali@linux-fr.org> | 2010-08-14 15:08:55 -0400 |
| commit | c39aedafb242601729bef48db052ebc055ce3ab4 (patch) | |
| tree | 518a88dca7fa8b4904a21ad88df761b02c466c04 | |
| parent | da2e025590cf7038440132d4bbc967a579b11112 (diff) | |
hwmon: (w83627ehf) Add support for W83667HG-B
Add support for W83667HG-B (very similar to the W83667HG).
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Signed-off-by: Jean Delvare <khali@linux-fr.org>
| -rw-r--r-- | Documentation/hwmon/w83627ehf | 15 | ||||
| -rw-r--r-- | drivers/hwmon/w83627ehf.c | 42 |
2 files changed, 43 insertions, 14 deletions
diff --git a/Documentation/hwmon/w83627ehf b/Documentation/hwmon/w83627ehf index b7e42ec4b26b..13d556112fc0 100644 --- a/Documentation/hwmon/w83627ehf +++ b/Documentation/hwmon/w83627ehf | |||
| @@ -20,6 +20,10 @@ Supported chips: | |||
| 20 | Prefix: 'w83667hg' | 20 | Prefix: 'w83667hg' |
| 21 | Addresses scanned: ISA address retrieved from Super I/O registers | 21 | Addresses scanned: ISA address retrieved from Super I/O registers |
| 22 | Datasheet: not available | 22 | Datasheet: not available |
| 23 | * Winbond W83667HG-B | ||
| 24 | Prefix: 'w83667hg' | ||
| 25 | Addresses scanned: ISA address retrieved from Super I/O registers | ||
| 26 | Datasheet: Available from Nuvoton upon request | ||
| 23 | 27 | ||
| 24 | Authors: | 28 | Authors: |
| 25 | Jean Delvare <khali@linux-fr.org> | 29 | Jean Delvare <khali@linux-fr.org> |
| @@ -32,8 +36,8 @@ Description | |||
| 32 | ----------- | 36 | ----------- |
| 33 | 37 | ||
| 34 | This driver implements support for the Winbond W83627EHF, W83627EHG, | 38 | This driver implements support for the Winbond W83627EHF, W83627EHG, |
| 35 | W83627DHG, W83627DHG-P and W83667HG super I/O chips. We will refer to them | 39 | W83627DHG, W83627DHG-P, W83667HG and W83667HG-B super I/O chips. |
| 36 | collectively as Winbond chips. | 40 | We will refer to them collectively as Winbond chips. |
| 37 | 41 | ||
| 38 | The chips implement three temperature sensors, five fan rotation | 42 | The chips implement three temperature sensors, five fan rotation |
| 39 | speed sensors, ten analog voltage sensors (only nine for the 627DHG), one | 43 | speed sensors, ten analog voltage sensors (only nine for the 627DHG), one |
| @@ -68,14 +72,15 @@ follows: | |||
| 68 | temp1 -> pwm1 | 72 | temp1 -> pwm1 |
| 69 | temp2 -> pwm2 | 73 | temp2 -> pwm2 |
| 70 | temp3 -> pwm3 | 74 | temp3 -> pwm3 |
| 71 | prog -> pwm4 (not on 667HG; the programmable setting is not supported by | 75 | prog -> pwm4 (not on 667HG and 667HG-B; the programmable setting is not |
| 72 | the driver) | 76 | supported by the driver) |
| 73 | 77 | ||
| 74 | /sys files | 78 | /sys files |
| 75 | ---------- | 79 | ---------- |
| 76 | 80 | ||
| 77 | name - this is a standard hwmon device entry. For the W83627EHF and W83627EHG, | 81 | name - this is a standard hwmon device entry. For the W83627EHF and W83627EHG, |
| 78 | it is set to "w83627ehf" and for the W83627DHG it is set to "w83627dhg" | 82 | it is set to "w83627ehf", for the W83627DHG it is set to "w83627dhg", |
| 83 | and for the W83667HG it is set to "w83667hg". | ||
| 79 | 84 | ||
| 80 | pwm[1-4] - this file stores PWM duty cycle or DC value (fan speed) in range: | 85 | pwm[1-4] - this file stores PWM duty cycle or DC value (fan speed) in range: |
| 81 | 0 (stop) to 255 (full) | 86 | 0 (stop) to 255 (full) |
diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c index e01a3e97aa17..e96e69dd36fb 100644 --- a/drivers/hwmon/w83627ehf.c +++ b/drivers/hwmon/w83627ehf.c | |||
| @@ -39,6 +39,7 @@ | |||
| 39 | w83627dhg 9 5 4 3 0xa020 0xc1 0x5ca3 | 39 | w83627dhg 9 5 4 3 0xa020 0xc1 0x5ca3 |
| 40 | w83627dhg-p 9 5 4 3 0xb070 0xc1 0x5ca3 | 40 | w83627dhg-p 9 5 4 3 0xb070 0xc1 0x5ca3 |
| 41 | w83667hg 9 5 3 3 0xa510 0xc1 0x5ca3 | 41 | w83667hg 9 5 3 3 0xa510 0xc1 0x5ca3 |
| 42 | w83667hg-b 9 5 3 3 0xb350 0xc1 0x5ca3 | ||
| 42 | */ | 43 | */ |
| 43 | 44 | ||
| 44 | #include <linux/module.h> | 45 | #include <linux/module.h> |
| @@ -55,7 +56,7 @@ | |||
| 55 | #include <linux/io.h> | 56 | #include <linux/io.h> |
| 56 | #include "lm75.h" | 57 | #include "lm75.h" |
| 57 | 58 | ||
| 58 | enum kinds { w83627ehf, w83627dhg, w83627dhg_p, w83667hg }; | 59 | enum kinds { w83627ehf, w83627dhg, w83627dhg_p, w83667hg, w83667hg_b }; |
| 59 | 60 | ||
| 60 | /* used to set data->name = w83627ehf_device_names[data->sio_kind] */ | 61 | /* used to set data->name = w83627ehf_device_names[data->sio_kind] */ |
| 61 | static const char * w83627ehf_device_names[] = { | 62 | static const char * w83627ehf_device_names[] = { |
| @@ -63,6 +64,7 @@ static const char * w83627ehf_device_names[] = { | |||
| 63 | "w83627dhg", | 64 | "w83627dhg", |
| 64 | "w83627dhg", | 65 | "w83627dhg", |
| 65 | "w83667hg", | 66 | "w83667hg", |
| 67 | "w83667hg", | ||
| 66 | }; | 68 | }; |
| 67 | 69 | ||
| 68 | static unsigned short force_id; | 70 | static unsigned short force_id; |
| @@ -91,6 +93,7 @@ MODULE_PARM_DESC(force_id, "Override the detected device ID"); | |||
| 91 | #define SIO_W83627DHG_ID 0xa020 | 93 | #define SIO_W83627DHG_ID 0xa020 |
| 92 | #define SIO_W83627DHG_P_ID 0xb070 | 94 | #define SIO_W83627DHG_P_ID 0xb070 |
| 93 | #define SIO_W83667HG_ID 0xa510 | 95 | #define SIO_W83667HG_ID 0xa510 |
| 96 | #define SIO_W83667HG_B_ID 0xb350 | ||
| 94 | #define SIO_ID_MASK 0xFFF0 | 97 | #define SIO_ID_MASK 0xFFF0 |
| 95 | 98 | ||
| 96 | static inline void | 99 | static inline void |
| @@ -201,8 +204,14 @@ static const u8 W83627EHF_REG_TOLERANCE[] = { 0x07, 0x07, 0x14, 0x62 }; | |||
| 201 | static const u8 W83627EHF_REG_FAN_START_OUTPUT[] = { 0x0a, 0x0b, 0x16, 0x65 }; | 204 | static const u8 W83627EHF_REG_FAN_START_OUTPUT[] = { 0x0a, 0x0b, 0x16, 0x65 }; |
| 202 | static const u8 W83627EHF_REG_FAN_STOP_OUTPUT[] = { 0x08, 0x09, 0x15, 0x64 }; | 205 | static const u8 W83627EHF_REG_FAN_STOP_OUTPUT[] = { 0x08, 0x09, 0x15, 0x64 }; |
| 203 | static const u8 W83627EHF_REG_FAN_STOP_TIME[] = { 0x0c, 0x0d, 0x17, 0x66 }; | 206 | static const u8 W83627EHF_REG_FAN_STOP_TIME[] = { 0x0c, 0x0d, 0x17, 0x66 }; |
| 204 | static const u8 W83627EHF_REG_FAN_MAX_OUTPUT[] = { 0xff, 0x67, 0xff, 0x69 }; | 207 | |
| 205 | static const u8 W83627EHF_REG_FAN_STEP_OUTPUT[] = { 0xff, 0x68, 0xff, 0x6a }; | 208 | static const u8 W83627EHF_REG_FAN_MAX_OUTPUT_COMMON[] |
| 209 | = { 0xff, 0x67, 0xff, 0x69 }; | ||
| 210 | static const u8 W83627EHF_REG_FAN_STEP_OUTPUT_COMMON[] | ||
| 211 | = { 0xff, 0x68, 0xff, 0x6a }; | ||
| 212 | |||
| 213 | static const u8 W83627EHF_REG_FAN_MAX_OUTPUT_W83667_B[] = { 0x67, 0x69, 0x6b }; | ||
| 214 | static const u8 W83627EHF_REG_FAN_STEP_OUTPUT_W83667_B[] = { 0x68, 0x6a, 0x6c }; | ||
| 206 | 215 | ||
| 207 | /* | 216 | /* |
| 208 | * Conversions | 217 | * Conversions |
| @@ -1382,10 +1391,11 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev) | |||
| 1382 | /* 627EHG and 627EHF have 10 voltage inputs; 627DHG and 667HG have 9 */ | 1391 | /* 627EHG and 627EHF have 10 voltage inputs; 627DHG and 667HG have 9 */ |
| 1383 | data->in_num = (sio_data->kind == w83627ehf) ? 10 : 9; | 1392 | data->in_num = (sio_data->kind == w83627ehf) ? 10 : 9; |
| 1384 | /* 667HG has 3 pwms */ | 1393 | /* 667HG has 3 pwms */ |
| 1385 | data->pwm_num = (sio_data->kind == w83667hg) ? 3 : 4; | 1394 | data->pwm_num = (sio_data->kind == w83667hg |
| 1395 | || sio_data->kind == w83667hg_b) ? 3 : 4; | ||
| 1386 | 1396 | ||
| 1387 | /* Check temp3 configuration bit for 667HG */ | 1397 | /* Check temp3 configuration bit for 667HG */ |
| 1388 | if (sio_data->kind == w83667hg) { | 1398 | if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b) { |
| 1389 | data->temp3_disable = w83627ehf_read_value(data, | 1399 | data->temp3_disable = w83627ehf_read_value(data, |
| 1390 | W83627EHF_REG_TEMP_CONFIG[1]) & 0x01; | 1400 | W83627EHF_REG_TEMP_CONFIG[1]) & 0x01; |
| 1391 | data->in6_skip = !data->temp3_disable; | 1401 | data->in6_skip = !data->temp3_disable; |
| @@ -1393,8 +1403,17 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev) | |||
| 1393 | 1403 | ||
| 1394 | data->REG_FAN_START_OUTPUT = W83627EHF_REG_FAN_START_OUTPUT; | 1404 | data->REG_FAN_START_OUTPUT = W83627EHF_REG_FAN_START_OUTPUT; |
| 1395 | data->REG_FAN_STOP_OUTPUT = W83627EHF_REG_FAN_STOP_OUTPUT; | 1405 | data->REG_FAN_STOP_OUTPUT = W83627EHF_REG_FAN_STOP_OUTPUT; |
| 1396 | data->REG_FAN_MAX_OUTPUT = W83627EHF_REG_FAN_MAX_OUTPUT; | 1406 | if (sio_data->kind == w83667hg_b) { |
| 1397 | data->REG_FAN_STEP_OUTPUT = W83627EHF_REG_FAN_STEP_OUTPUT; | 1407 | data->REG_FAN_MAX_OUTPUT = |
| 1408 | W83627EHF_REG_FAN_MAX_OUTPUT_W83667_B; | ||
| 1409 | data->REG_FAN_STEP_OUTPUT = | ||
| 1410 | W83627EHF_REG_FAN_STEP_OUTPUT_W83667_B; | ||
| 1411 | } else { | ||
| 1412 | data->REG_FAN_MAX_OUTPUT = | ||
| 1413 | W83627EHF_REG_FAN_MAX_OUTPUT_COMMON; | ||
| 1414 | data->REG_FAN_STEP_OUTPUT = | ||
| 1415 | W83627EHF_REG_FAN_STEP_OUTPUT_COMMON; | ||
| 1416 | } | ||
| 1398 | 1417 | ||
| 1399 | /* Initialize the chip */ | 1418 | /* Initialize the chip */ |
| 1400 | w83627ehf_init_device(data); | 1419 | w83627ehf_init_device(data); |
| @@ -1402,7 +1421,7 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev) | |||
| 1402 | data->vrm = vid_which_vrm(); | 1421 | data->vrm = vid_which_vrm(); |
| 1403 | superio_enter(sio_data->sioreg); | 1422 | superio_enter(sio_data->sioreg); |
| 1404 | /* Read VID value */ | 1423 | /* Read VID value */ |
| 1405 | if (sio_data->kind == w83667hg) { | 1424 | if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b) { |
| 1406 | /* W83667HG has different pins for VID input and output, so | 1425 | /* W83667HG has different pins for VID input and output, so |
| 1407 | we can get the VID input values directly at logical device D | 1426 | we can get the VID input values directly at logical device D |
| 1408 | 0xe3. */ | 1427 | 0xe3. */ |
| @@ -1453,7 +1472,7 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev) | |||
| 1453 | } | 1472 | } |
| 1454 | 1473 | ||
| 1455 | /* fan4 and fan5 share some pins with the GPIO and serial flash */ | 1474 | /* fan4 and fan5 share some pins with the GPIO and serial flash */ |
| 1456 | if (sio_data->kind == w83667hg) { | 1475 | if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b) { |
| 1457 | fan5pin = superio_inb(sio_data->sioreg, 0x27) & 0x20; | 1476 | fan5pin = superio_inb(sio_data->sioreg, 0x27) & 0x20; |
| 1458 | fan4pin = superio_inb(sio_data->sioreg, 0x27) & 0x40; | 1477 | fan4pin = superio_inb(sio_data->sioreg, 0x27) & 0x40; |
| 1459 | } else { | 1478 | } else { |
| @@ -1609,6 +1628,7 @@ static int __init w83627ehf_find(int sioaddr, unsigned short *addr, | |||
| 1609 | static const char __initdata sio_name_W83627DHG[] = "W83627DHG"; | 1628 | static const char __initdata sio_name_W83627DHG[] = "W83627DHG"; |
| 1610 | static const char __initdata sio_name_W83627DHG_P[] = "W83627DHG-P"; | 1629 | static const char __initdata sio_name_W83627DHG_P[] = "W83627DHG-P"; |
| 1611 | static const char __initdata sio_name_W83667HG[] = "W83667HG"; | 1630 | static const char __initdata sio_name_W83667HG[] = "W83667HG"; |
| 1631 | static const char __initdata sio_name_W83667HG_B[] = "W83667HG-B"; | ||
| 1612 | 1632 | ||
| 1613 | u16 val; | 1633 | u16 val; |
| 1614 | const char *sio_name; | 1634 | const char *sio_name; |
| @@ -1641,6 +1661,10 @@ static int __init w83627ehf_find(int sioaddr, unsigned short *addr, | |||
| 1641 | sio_data->kind = w83667hg; | 1661 | sio_data->kind = w83667hg; |
| 1642 | sio_name = sio_name_W83667HG; | 1662 | sio_name = sio_name_W83667HG; |
| 1643 | break; | 1663 | break; |
| 1664 | case SIO_W83667HG_B_ID: | ||
| 1665 | sio_data->kind = w83667hg_b; | ||
| 1666 | sio_name = sio_name_W83667HG_B; | ||
| 1667 | break; | ||
| 1644 | default: | 1668 | default: |
| 1645 | if (val != 0xffff) | 1669 | if (val != 0xffff) |
| 1646 | pr_debug(DRVNAME ": unsupported chip ID: 0x%04x\n", | 1670 | pr_debug(DRVNAME ": unsupported chip ID: 0x%04x\n", |
