diff options
author | Hans de Goede <hdegoede@redhat.com> | 2011-03-09 14:57:15 -0500 |
---|---|---|
committer | Guenter Roeck <guenter.roeck@ericsson.com> | 2011-03-15 01:39:26 -0400 |
commit | c11bb993629078264f72f8de8d48d7c3286c4c3e (patch) | |
tree | cc675129726cfba4260248a31a58849050c7854d /drivers/hwmon/f71882fg.c | |
parent | 3cad402281607d4db0d99d88fbd67cabb7c5b9f1 (diff) |
hwmon/f71882fg: Add support for f71869f and f71869e
Note that these 2 are register compatible and report the same superio id,
but they are 2 distinct chips / models!
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Tested-by: Thomas Faber <thfabba@gmx.de>
Tested-by: Alexey Sychev <owl@umail.ru>
Tested-by: Dieter Bloms <dieter@bloms.de>
Signed-off-by: Guenter Roeck <guenter.roeck@ericsson.com>
Diffstat (limited to 'drivers/hwmon/f71882fg.c')
-rw-r--r-- | drivers/hwmon/f71882fg.c | 120 |
1 files changed, 115 insertions, 5 deletions
diff --git a/drivers/hwmon/f71882fg.c b/drivers/hwmon/f71882fg.c index 49cf19621c0c..eea697757891 100644 --- a/drivers/hwmon/f71882fg.c +++ b/drivers/hwmon/f71882fg.c | |||
@@ -49,6 +49,7 @@ | |||
49 | #define SIO_FINTEK_ID 0x1934 /* Manufacturers ID */ | 49 | #define SIO_FINTEK_ID 0x1934 /* Manufacturers ID */ |
50 | #define SIO_F71858_ID 0x0507 /* Chipset ID */ | 50 | #define SIO_F71858_ID 0x0507 /* Chipset ID */ |
51 | #define SIO_F71862_ID 0x0601 /* Chipset ID */ | 51 | #define SIO_F71862_ID 0x0601 /* Chipset ID */ |
52 | #define SIO_F71869_ID 0x0814 /* Chipset ID */ | ||
52 | #define SIO_F71882_ID 0x0541 /* Chipset ID */ | 53 | #define SIO_F71882_ID 0x0541 /* Chipset ID */ |
53 | #define SIO_F71889_ID 0x0723 /* Chipset ID */ | 54 | #define SIO_F71889_ID 0x0723 /* Chipset ID */ |
54 | #define SIO_F71889E_ID 0x0909 /* Chipset ID */ | 55 | #define SIO_F71889E_ID 0x0909 /* Chipset ID */ |
@@ -103,38 +104,42 @@ static unsigned short force_id; | |||
103 | module_param(force_id, ushort, 0); | 104 | module_param(force_id, ushort, 0); |
104 | MODULE_PARM_DESC(force_id, "Override the detected device ID"); | 105 | MODULE_PARM_DESC(force_id, "Override the detected device ID"); |
105 | 106 | ||
106 | enum chips { f71858fg, f71862fg, f71882fg, f71889fg, f71889ed, f8000 }; | 107 | enum chips { f71858fg, f71862fg, f71869, f71882fg, f71889fg, f71889ed, f8000 }; |
107 | 108 | ||
108 | static const char *f71882fg_names[] = { | 109 | static const char *f71882fg_names[] = { |
109 | "f71858fg", | 110 | "f71858fg", |
110 | "f71862fg", | 111 | "f71862fg", |
112 | "f71869", /* Both f71869f and f71869e, reg. compatible and same id */ | ||
111 | "f71882fg", | 113 | "f71882fg", |
112 | "f71889fg", | 114 | "f71889fg", |
113 | "f71889ed", | 115 | "f71889ed", |
114 | "f8000", | 116 | "f8000", |
115 | }; | 117 | }; |
116 | 118 | ||
117 | static const char f71882fg_has_in[6][F71882FG_MAX_INS] = { | 119 | static const char f71882fg_has_in[7][F71882FG_MAX_INS] = { |
118 | { 1, 1, 1, 0, 0, 0, 0, 0, 0 }, /* f71858fg */ | 120 | { 1, 1, 1, 0, 0, 0, 0, 0, 0 }, /* f71858fg */ |
119 | { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* f71862fg */ | 121 | { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* f71862fg */ |
122 | { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* f71869 */ | ||
120 | { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* f71882fg */ | 123 | { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* f71882fg */ |
121 | { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* f71889fg */ | 124 | { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* f71889fg */ |
122 | { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* f71889ed */ | 125 | { 1, 1, 1, 1, 1, 1, 1, 1, 1 }, /* f71889ed */ |
123 | { 1, 1, 1, 0, 0, 0, 0, 0, 0 }, /* f8000 */ | 126 | { 1, 1, 1, 0, 0, 0, 0, 0, 0 }, /* f8000 */ |
124 | }; | 127 | }; |
125 | 128 | ||
126 | static const char f71882fg_has_in1_alarm[6] = { | 129 | static const char f71882fg_has_in1_alarm[7] = { |
127 | 0, /* f71858fg */ | 130 | 0, /* f71858fg */ |
128 | 0, /* f71862fg */ | 131 | 0, /* f71862fg */ |
132 | 0, /* f71869 */ | ||
129 | 1, /* f71882fg */ | 133 | 1, /* f71882fg */ |
130 | 1, /* f71889fg */ | 134 | 1, /* f71889fg */ |
131 | 1, /* f71889ed */ | 135 | 1, /* f71889ed */ |
132 | 0, /* f8000 */ | 136 | 0, /* f8000 */ |
133 | }; | 137 | }; |
134 | 138 | ||
135 | static const char f71882fg_has_beep[6] = { | 139 | static const char f71882fg_has_beep[7] = { |
136 | 0, /* f71858fg */ | 140 | 0, /* f71858fg */ |
137 | 1, /* f71862fg */ | 141 | 1, /* f71862fg */ |
142 | 1, /* f71869 */ | ||
138 | 1, /* f71882fg */ | 143 | 1, /* f71882fg */ |
139 | 1, /* f71889fg */ | 144 | 1, /* f71889fg */ |
140 | 1, /* f71889ed */ | 145 | 1, /* f71889ed */ |
@@ -585,6 +590,86 @@ static struct sensor_device_attribute_2 f71862fg_auto_pwm_attr[] = { | |||
585 | show_pwm_auto_point_temp_hyst, NULL, 3, 2), | 590 | show_pwm_auto_point_temp_hyst, NULL, 3, 2), |
586 | }; | 591 | }; |
587 | 592 | ||
593 | /* PWM attr for the f71869, almost identical to the f71862fg, but the | ||
594 | pwm setting when the temperature is above the pwmX_auto_point1_temp can be | ||
595 | programmed instead of being hardcoded to 0xff */ | ||
596 | static struct sensor_device_attribute_2 f71869_auto_pwm_attr[] = { | ||
597 | SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR, | ||
598 | show_pwm_auto_point_channel, | ||
599 | store_pwm_auto_point_channel, 0, 0), | ||
600 | SENSOR_ATTR_2(pwm1_auto_point1_pwm, S_IRUGO|S_IWUSR, | ||
601 | show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, | ||
602 | 0, 0), | ||
603 | SENSOR_ATTR_2(pwm1_auto_point2_pwm, S_IRUGO|S_IWUSR, | ||
604 | show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, | ||
605 | 1, 0), | ||
606 | SENSOR_ATTR_2(pwm1_auto_point3_pwm, S_IRUGO|S_IWUSR, | ||
607 | show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, | ||
608 | 4, 0), | ||
609 | SENSOR_ATTR_2(pwm1_auto_point1_temp, S_IRUGO|S_IWUSR, | ||
610 | show_pwm_auto_point_temp, store_pwm_auto_point_temp, | ||
611 | 0, 0), | ||
612 | SENSOR_ATTR_2(pwm1_auto_point2_temp, S_IRUGO|S_IWUSR, | ||
613 | show_pwm_auto_point_temp, store_pwm_auto_point_temp, | ||
614 | 3, 0), | ||
615 | SENSOR_ATTR_2(pwm1_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, | ||
616 | show_pwm_auto_point_temp_hyst, | ||
617 | store_pwm_auto_point_temp_hyst, | ||
618 | 0, 0), | ||
619 | SENSOR_ATTR_2(pwm1_auto_point2_temp_hyst, S_IRUGO, | ||
620 | show_pwm_auto_point_temp_hyst, NULL, 3, 0), | ||
621 | |||
622 | SENSOR_ATTR_2(pwm2_auto_channels_temp, S_IRUGO|S_IWUSR, | ||
623 | show_pwm_auto_point_channel, | ||
624 | store_pwm_auto_point_channel, 0, 1), | ||
625 | SENSOR_ATTR_2(pwm2_auto_point1_pwm, S_IRUGO|S_IWUSR, | ||
626 | show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, | ||
627 | 0, 1), | ||
628 | SENSOR_ATTR_2(pwm2_auto_point2_pwm, S_IRUGO|S_IWUSR, | ||
629 | show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, | ||
630 | 1, 1), | ||
631 | SENSOR_ATTR_2(pwm2_auto_point3_pwm, S_IRUGO|S_IWUSR, | ||
632 | show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, | ||
633 | 4, 1), | ||
634 | SENSOR_ATTR_2(pwm2_auto_point1_temp, S_IRUGO|S_IWUSR, | ||
635 | show_pwm_auto_point_temp, store_pwm_auto_point_temp, | ||
636 | 0, 1), | ||
637 | SENSOR_ATTR_2(pwm2_auto_point2_temp, S_IRUGO|S_IWUSR, | ||
638 | show_pwm_auto_point_temp, store_pwm_auto_point_temp, | ||
639 | 3, 1), | ||
640 | SENSOR_ATTR_2(pwm2_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, | ||
641 | show_pwm_auto_point_temp_hyst, | ||
642 | store_pwm_auto_point_temp_hyst, | ||
643 | 0, 1), | ||
644 | SENSOR_ATTR_2(pwm2_auto_point2_temp_hyst, S_IRUGO, | ||
645 | show_pwm_auto_point_temp_hyst, NULL, 3, 1), | ||
646 | |||
647 | SENSOR_ATTR_2(pwm3_auto_channels_temp, S_IRUGO|S_IWUSR, | ||
648 | show_pwm_auto_point_channel, | ||
649 | store_pwm_auto_point_channel, 0, 2), | ||
650 | SENSOR_ATTR_2(pwm3_auto_point1_pwm, S_IRUGO|S_IWUSR, | ||
651 | show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, | ||
652 | 0, 2), | ||
653 | SENSOR_ATTR_2(pwm3_auto_point2_pwm, S_IRUGO|S_IWUSR, | ||
654 | show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, | ||
655 | 1, 2), | ||
656 | SENSOR_ATTR_2(pwm3_auto_point3_pwm, S_IRUGO|S_IWUSR, | ||
657 | show_pwm_auto_point_pwm, store_pwm_auto_point_pwm, | ||
658 | 4, 2), | ||
659 | SENSOR_ATTR_2(pwm3_auto_point1_temp, S_IRUGO|S_IWUSR, | ||
660 | show_pwm_auto_point_temp, store_pwm_auto_point_temp, | ||
661 | 0, 2), | ||
662 | SENSOR_ATTR_2(pwm3_auto_point2_temp, S_IRUGO|S_IWUSR, | ||
663 | show_pwm_auto_point_temp, store_pwm_auto_point_temp, | ||
664 | 3, 2), | ||
665 | SENSOR_ATTR_2(pwm3_auto_point1_temp_hyst, S_IRUGO|S_IWUSR, | ||
666 | show_pwm_auto_point_temp_hyst, | ||
667 | store_pwm_auto_point_temp_hyst, | ||
668 | 0, 2), | ||
669 | SENSOR_ATTR_2(pwm3_auto_point2_temp_hyst, S_IRUGO, | ||
670 | show_pwm_auto_point_temp_hyst, NULL, 3, 2), | ||
671 | }; | ||
672 | |||
588 | /* PWM attr for the standard models */ | 673 | /* PWM attr for the standard models */ |
589 | static struct sensor_device_attribute_2 fxxxx_auto_pwm_attr[4][14] = { { | 674 | static struct sensor_device_attribute_2 fxxxx_auto_pwm_attr[4][14] = { { |
590 | SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR, | 675 | SENSOR_ATTR_2(pwm1_auto_channels_temp, S_IRUGO|S_IWUSR, |
@@ -1036,7 +1121,7 @@ static struct f71882fg_data *f71882fg_update_device(struct device *dev) | |||
1036 | f71882fg_read8(data, | 1121 | f71882fg_read8(data, |
1037 | F71882FG_REG_POINT_MAPPING(nr)); | 1122 | F71882FG_REG_POINT_MAPPING(nr)); |
1038 | 1123 | ||
1039 | if (data->type != f71862fg) { | 1124 | if (data->type != f71862fg && data->type != f71869) { |
1040 | int point; | 1125 | int point; |
1041 | for (point = 0; point < 5; point++) { | 1126 | for (point = 0; point < 5; point++) { |
1042 | data->pwm_auto_point_pwm[nr][point] = | 1127 | data->pwm_auto_point_pwm[nr][point] = |
@@ -1051,6 +1136,12 @@ static struct f71882fg_data *f71882fg_update_device(struct device *dev) | |||
1051 | (nr, point)); | 1136 | (nr, point)); |
1052 | } | 1137 | } |
1053 | } else { | 1138 | } else { |
1139 | if (data->type == f71869) { | ||
1140 | data->pwm_auto_point_pwm[nr][0] = | ||
1141 | f71882fg_read8(data, | ||
1142 | F71882FG_REG_POINT_PWM | ||
1143 | (nr, 0)); | ||
1144 | } | ||
1054 | data->pwm_auto_point_pwm[nr][1] = | 1145 | data->pwm_auto_point_pwm[nr][1] = |
1055 | f71882fg_read8(data, | 1146 | f71882fg_read8(data, |
1056 | F71882FG_REG_POINT_PWM | 1147 | F71882FG_REG_POINT_PWM |
@@ -2029,6 +2120,10 @@ static int __devinit f71882fg_probe(struct platform_device *pdev) | |||
2029 | 2120 | ||
2030 | if (start_reg & 0x02) { | 2121 | if (start_reg & 0x02) { |
2031 | switch (data->type) { | 2122 | switch (data->type) { |
2123 | case f71869: | ||
2124 | /* The f71869 always has signed auto point temps */ | ||
2125 | data->auto_point_temp_signed = 1; | ||
2126 | /* Fall through to select correct fan/pwm reg bank! */ | ||
2032 | case f71889fg: | 2127 | case f71889fg: |
2033 | case f71889ed: | 2128 | case f71889ed: |
2034 | reg = f71882fg_read8(data, F71882FG_REG_FAN_FAULT_T); | 2129 | reg = f71882fg_read8(data, F71882FG_REG_FAN_FAULT_T); |
@@ -2056,6 +2151,7 @@ static int __devinit f71882fg_probe(struct platform_device *pdev) | |||
2056 | case f71862fg: | 2151 | case f71862fg: |
2057 | err = (data->pwm_enable & 0x15) != 0x15; | 2152 | err = (data->pwm_enable & 0x15) != 0x15; |
2058 | break; | 2153 | break; |
2154 | case f71869: | ||
2059 | case f71882fg: | 2155 | case f71882fg: |
2060 | case f71889fg: | 2156 | case f71889fg: |
2061 | case f71889ed: | 2157 | case f71889ed: |
@@ -2086,6 +2182,7 @@ static int __devinit f71882fg_probe(struct platform_device *pdev) | |||
2086 | } | 2182 | } |
2087 | 2183 | ||
2088 | switch (data->type) { | 2184 | switch (data->type) { |
2185 | case f71869: | ||
2089 | case f71889fg: | 2186 | case f71889fg: |
2090 | case f71889ed: | 2187 | case f71889ed: |
2091 | for (i = 0; i < nr_fans; i++) { | 2188 | for (i = 0; i < nr_fans; i++) { |
@@ -2114,6 +2211,11 @@ static int __devinit f71882fg_probe(struct platform_device *pdev) | |||
2114 | f71862fg_auto_pwm_attr, | 2211 | f71862fg_auto_pwm_attr, |
2115 | ARRAY_SIZE(f71862fg_auto_pwm_attr)); | 2212 | ARRAY_SIZE(f71862fg_auto_pwm_attr)); |
2116 | break; | 2213 | break; |
2214 | case f71869: | ||
2215 | err = f71882fg_create_sysfs_files(pdev, | ||
2216 | f71869_auto_pwm_attr, | ||
2217 | ARRAY_SIZE(f71869_auto_pwm_attr)); | ||
2218 | break; | ||
2117 | case f8000: | 2219 | case f8000: |
2118 | err = f71882fg_create_sysfs_files(pdev, | 2220 | err = f71882fg_create_sysfs_files(pdev, |
2119 | f8000_fan_attr, | 2221 | f8000_fan_attr, |
@@ -2224,6 +2326,11 @@ static int f71882fg_remove(struct platform_device *pdev) | |||
2224 | f71862fg_auto_pwm_attr, | 2326 | f71862fg_auto_pwm_attr, |
2225 | ARRAY_SIZE(f71862fg_auto_pwm_attr)); | 2327 | ARRAY_SIZE(f71862fg_auto_pwm_attr)); |
2226 | break; | 2328 | break; |
2329 | case f71869: | ||
2330 | f71882fg_remove_sysfs_files(pdev, | ||
2331 | f71869_auto_pwm_attr, | ||
2332 | ARRAY_SIZE(f71869_auto_pwm_attr)); | ||
2333 | break; | ||
2227 | case f8000: | 2334 | case f8000: |
2228 | f71882fg_remove_sysfs_files(pdev, | 2335 | f71882fg_remove_sysfs_files(pdev, |
2229 | f8000_fan_attr, | 2336 | f8000_fan_attr, |
@@ -2268,6 +2375,9 @@ static int __init f71882fg_find(int sioaddr, unsigned short *address, | |||
2268 | case SIO_F71862_ID: | 2375 | case SIO_F71862_ID: |
2269 | sio_data->type = f71862fg; | 2376 | sio_data->type = f71862fg; |
2270 | break; | 2377 | break; |
2378 | case SIO_F71869_ID: | ||
2379 | sio_data->type = f71869; | ||
2380 | break; | ||
2271 | case SIO_F71882_ID: | 2381 | case SIO_F71882_ID: |
2272 | sio_data->type = f71882fg; | 2382 | sio_data->type = f71882fg; |
2273 | break; | 2383 | break; |