| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * nct6775 - Driver for the hardware monitoring functionality of |
|---|
| 3 | 4 | * Nuvoton NCT677x Super-I/O chips |
|---|
| .. | .. |
|---|
| 15 | 16 | * Shamelessly ripped from the w83627hf driver |
|---|
| 16 | 17 | * Copyright (C) 2003 Mark Studebaker |
|---|
| 17 | 18 | * |
|---|
| 18 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 19 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 20 | | - * the Free Software Foundation; either version 2 of the License, or |
|---|
| 21 | | - * (at your option) any later version. |
|---|
| 22 | | - * |
|---|
| 23 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 24 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 25 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 26 | | - * GNU General Public License for more details. |
|---|
| 27 | | - * |
|---|
| 28 | | - * You should have received a copy of the GNU General Public License |
|---|
| 29 | | - * along with this program; if not, write to the Free Software |
|---|
| 30 | | - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
|---|
| 31 | | - * |
|---|
| 32 | | - * |
|---|
| 33 | 19 | * Supports the following chips: |
|---|
| 34 | 20 | * |
|---|
| 35 | 21 | * Chip #vin #fan #pwm #temp chip IDs man ID |
|---|
| 36 | 22 | * nct6106d 9 3 3 6+3 0xc450 0xc1 0x5ca3 |
|---|
| 23 | + * nct6116d 9 5 5 3+3 0xd280 0xc1 0x5ca3 |
|---|
| 37 | 24 | * nct6775f 9 4 3 6+3 0xb470 0xc1 0x5ca3 |
|---|
| 38 | 25 | * nct6776f 9 5 3 6+3 0xc330 0xc1 0x5ca3 |
|---|
| 39 | 26 | * nct6779d 15 5 5 2+6 0xc560 0xc1 0x5ca3 |
|---|
| .. | .. |
|---|
| 42 | 29 | * nct6793d 15 6 6 2+6 0xd120 0xc1 0x5ca3 |
|---|
| 43 | 30 | * nct6795d 14 6 6 2+6 0xd350 0xc1 0x5ca3 |
|---|
| 44 | 31 | * nct6796d 14 7 7 2+6 0xd420 0xc1 0x5ca3 |
|---|
| 32 | + * nct6797d 14 7 7 2+6 0xd450 0xc1 0x5ca3 |
|---|
| 33 | + * (0xd451) |
|---|
| 34 | + * nct6798d 14 7 7 2+6 0xd428 0xc1 0x5ca3 |
|---|
| 35 | + * (0xd429) |
|---|
| 45 | 36 | * |
|---|
| 46 | 37 | * #temp lists the number of monitored temperature sources (first value) plus |
|---|
| 47 | 38 | * the number of directly connectable temperature sensors (second value). |
|---|
| .. | .. |
|---|
| 68 | 59 | |
|---|
| 69 | 60 | #define USE_ALTERNATE |
|---|
| 70 | 61 | |
|---|
| 71 | | -enum kinds { nct6106, nct6775, nct6776, nct6779, nct6791, nct6792, nct6793, |
|---|
| 72 | | - nct6795, nct6796 }; |
|---|
| 62 | +enum kinds { nct6106, nct6116, nct6775, nct6776, nct6779, nct6791, nct6792, |
|---|
| 63 | + nct6793, nct6795, nct6796, nct6797, nct6798 }; |
|---|
| 73 | 64 | |
|---|
| 74 | 65 | /* used to set data->name = nct6775_device_names[data->sio_kind] */ |
|---|
| 75 | 66 | static const char * const nct6775_device_names[] = { |
|---|
| 76 | 67 | "nct6106", |
|---|
| 68 | + "nct6116", |
|---|
| 77 | 69 | "nct6775", |
|---|
| 78 | 70 | "nct6776", |
|---|
| 79 | 71 | "nct6779", |
|---|
| .. | .. |
|---|
| 82 | 74 | "nct6793", |
|---|
| 83 | 75 | "nct6795", |
|---|
| 84 | 76 | "nct6796", |
|---|
| 77 | + "nct6797", |
|---|
| 78 | + "nct6798", |
|---|
| 85 | 79 | }; |
|---|
| 86 | 80 | |
|---|
| 87 | 81 | static const char * const nct6775_sio_names[] __initconst = { |
|---|
| 88 | 82 | "NCT6106D", |
|---|
| 83 | + "NCT6116D", |
|---|
| 89 | 84 | "NCT6775F", |
|---|
| 90 | 85 | "NCT6776D/F", |
|---|
| 91 | 86 | "NCT6779D", |
|---|
| .. | .. |
|---|
| 94 | 89 | "NCT6793D", |
|---|
| 95 | 90 | "NCT6795D", |
|---|
| 96 | 91 | "NCT6796D", |
|---|
| 92 | + "NCT6797D", |
|---|
| 93 | + "NCT6798D", |
|---|
| 97 | 94 | }; |
|---|
| 98 | 95 | |
|---|
| 99 | 96 | static unsigned short force_id; |
|---|
| .. | .. |
|---|
| 121 | 118 | #define SIO_REG_ADDR 0x60 /* Logical device address (2 bytes) */ |
|---|
| 122 | 119 | |
|---|
| 123 | 120 | #define SIO_NCT6106_ID 0xc450 |
|---|
| 121 | +#define SIO_NCT6116_ID 0xd280 |
|---|
| 124 | 122 | #define SIO_NCT6775_ID 0xb470 |
|---|
| 125 | 123 | #define SIO_NCT6776_ID 0xc330 |
|---|
| 126 | 124 | #define SIO_NCT6779_ID 0xc560 |
|---|
| .. | .. |
|---|
| 129 | 127 | #define SIO_NCT6793_ID 0xd120 |
|---|
| 130 | 128 | #define SIO_NCT6795_ID 0xd350 |
|---|
| 131 | 129 | #define SIO_NCT6796_ID 0xd420 |
|---|
| 132 | | -#define SIO_ID_MASK 0xFFF0 |
|---|
| 130 | +#define SIO_NCT6797_ID 0xd450 |
|---|
| 131 | +#define SIO_NCT6798_ID 0xd428 |
|---|
| 132 | +#define SIO_ID_MASK 0xFFF8 |
|---|
| 133 | 133 | |
|---|
| 134 | 134 | enum pwm_enable { off, manual, thermal_cruise, speed_cruise, sf3, sf4 }; |
|---|
| 135 | 135 | |
|---|
| .. | .. |
|---|
| 504 | 504 | static const u16 NCT6779_REG_FAN[] = { |
|---|
| 505 | 505 | 0x4c0, 0x4c2, 0x4c4, 0x4c6, 0x4c8, 0x4ca, 0x4ce }; |
|---|
| 506 | 506 | static const u16 NCT6779_REG_FAN_PULSES[NUM_FAN] = { |
|---|
| 507 | | - 0x644, 0x645, 0x646, 0x647, 0x648, 0x649 }; |
|---|
| 507 | + 0x644, 0x645, 0x646, 0x647, 0x648, 0x649, 0x64f }; |
|---|
| 508 | 508 | |
|---|
| 509 | 509 | static const u16 NCT6779_REG_CRITICAL_PWM_ENABLE[] = { |
|---|
| 510 | 510 | 0x136, 0x236, 0x336, 0x836, 0x936, 0xa36, 0xb36 }; |
|---|
| .. | .. |
|---|
| 757 | 757 | #define NCT6796_TEMP_MASK 0xbfff0ffe |
|---|
| 758 | 758 | #define NCT6796_VIRT_TEMP_MASK 0x80000c00 |
|---|
| 759 | 759 | |
|---|
| 760 | +static const char *const nct6798_temp_label[] = { |
|---|
| 761 | + "", |
|---|
| 762 | + "SYSTIN", |
|---|
| 763 | + "CPUTIN", |
|---|
| 764 | + "AUXTIN0", |
|---|
| 765 | + "AUXTIN1", |
|---|
| 766 | + "AUXTIN2", |
|---|
| 767 | + "AUXTIN3", |
|---|
| 768 | + "AUXTIN4", |
|---|
| 769 | + "SMBUSMASTER 0", |
|---|
| 770 | + "SMBUSMASTER 1", |
|---|
| 771 | + "Virtual_TEMP", |
|---|
| 772 | + "Virtual_TEMP", |
|---|
| 773 | + "", |
|---|
| 774 | + "", |
|---|
| 775 | + "", |
|---|
| 776 | + "", |
|---|
| 777 | + "PECI Agent 0", |
|---|
| 778 | + "PECI Agent 1", |
|---|
| 779 | + "PCH_CHIP_CPU_MAX_TEMP", |
|---|
| 780 | + "PCH_CHIP_TEMP", |
|---|
| 781 | + "PCH_CPU_TEMP", |
|---|
| 782 | + "PCH_MCH_TEMP", |
|---|
| 783 | + "Agent0 Dimm0", |
|---|
| 784 | + "Agent0 Dimm1", |
|---|
| 785 | + "Agent1 Dimm0", |
|---|
| 786 | + "Agent1 Dimm1", |
|---|
| 787 | + "BYTE_TEMP0", |
|---|
| 788 | + "BYTE_TEMP1", |
|---|
| 789 | + "PECI Agent 0 Calibration", /* undocumented */ |
|---|
| 790 | + "PECI Agent 1 Calibration", /* undocumented */ |
|---|
| 791 | + "", |
|---|
| 792 | + "Virtual_TEMP" |
|---|
| 793 | +}; |
|---|
| 794 | + |
|---|
| 795 | +#define NCT6798_TEMP_MASK 0xbfff0ffe |
|---|
| 796 | +#define NCT6798_VIRT_TEMP_MASK 0x80000c00 |
|---|
| 797 | + |
|---|
| 760 | 798 | /* NCT6102D/NCT6106D specific data */ |
|---|
| 761 | 799 | |
|---|
| 762 | 800 | #define NCT6106_REG_VBAT 0x318 |
|---|
| .. | .. |
|---|
| 791 | 829 | |
|---|
| 792 | 830 | static const u8 NCT6106_REG_PWM_MODE[] = { 0xf3, 0xf3, 0xf3 }; |
|---|
| 793 | 831 | static const u8 NCT6106_PWM_MODE_MASK[] = { 0x01, 0x02, 0x04 }; |
|---|
| 794 | | -static const u16 NCT6106_REG_PWM[] = { 0x119, 0x129, 0x139 }; |
|---|
| 795 | 832 | static const u16 NCT6106_REG_PWM_READ[] = { 0x4a, 0x4b, 0x4c }; |
|---|
| 796 | 833 | static const u16 NCT6106_REG_FAN_MODE[] = { 0x113, 0x123, 0x133 }; |
|---|
| 797 | | -static const u16 NCT6106_REG_TEMP_SEL[] = { 0x110, 0x120, 0x130 }; |
|---|
| 798 | 834 | static const u16 NCT6106_REG_TEMP_SOURCE[] = { |
|---|
| 799 | 835 | 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5 }; |
|---|
| 800 | 836 | |
|---|
| .. | .. |
|---|
| 860 | 896 | static const u16 NCT6106_REG_TEMP_CRIT[32] = { |
|---|
| 861 | 897 | [11] = 0x204, |
|---|
| 862 | 898 | [12] = 0x205, |
|---|
| 899 | +}; |
|---|
| 900 | + |
|---|
| 901 | +/* NCT6112D/NCT6114D/NCT6116D specific data */ |
|---|
| 902 | + |
|---|
| 903 | +static const u16 NCT6116_REG_FAN[] = { 0x20, 0x22, 0x24, 0x26, 0x28 }; |
|---|
| 904 | +static const u16 NCT6116_REG_FAN_MIN[] = { 0xe0, 0xe2, 0xe4, 0xe6, 0xe8 }; |
|---|
| 905 | +static const u16 NCT6116_REG_FAN_PULSES[] = { 0xf6, 0xf6, 0xf6, 0xf6, 0xf5 }; |
|---|
| 906 | +static const u16 NCT6116_FAN_PULSE_SHIFT[] = { 0, 2, 4, 6, 6 }; |
|---|
| 907 | + |
|---|
| 908 | +static const u16 NCT6116_REG_PWM[] = { 0x119, 0x129, 0x139, 0x199, 0x1a9 }; |
|---|
| 909 | +static const u16 NCT6116_REG_FAN_MODE[] = { 0x113, 0x123, 0x133, 0x193, 0x1a3 }; |
|---|
| 910 | +static const u16 NCT6116_REG_TEMP_SEL[] = { 0x110, 0x120, 0x130, 0x190, 0x1a0 }; |
|---|
| 911 | +static const u16 NCT6116_REG_TEMP_SOURCE[] = { |
|---|
| 912 | + 0xb0, 0xb1, 0xb2 }; |
|---|
| 913 | + |
|---|
| 914 | +static const u16 NCT6116_REG_CRITICAL_TEMP[] = { |
|---|
| 915 | + 0x11a, 0x12a, 0x13a, 0x19a, 0x1aa }; |
|---|
| 916 | +static const u16 NCT6116_REG_CRITICAL_TEMP_TOLERANCE[] = { |
|---|
| 917 | + 0x11b, 0x12b, 0x13b, 0x19b, 0x1ab }; |
|---|
| 918 | + |
|---|
| 919 | +static const u16 NCT6116_REG_CRITICAL_PWM_ENABLE[] = { |
|---|
| 920 | + 0x11c, 0x12c, 0x13c, 0x19c, 0x1ac }; |
|---|
| 921 | +static const u16 NCT6116_REG_CRITICAL_PWM[] = { |
|---|
| 922 | + 0x11d, 0x12d, 0x13d, 0x19d, 0x1ad }; |
|---|
| 923 | + |
|---|
| 924 | +static const u16 NCT6116_REG_FAN_STEP_UP_TIME[] = { |
|---|
| 925 | + 0x114, 0x124, 0x134, 0x194, 0x1a4 }; |
|---|
| 926 | +static const u16 NCT6116_REG_FAN_STEP_DOWN_TIME[] = { |
|---|
| 927 | + 0x115, 0x125, 0x135, 0x195, 0x1a5 }; |
|---|
| 928 | +static const u16 NCT6116_REG_FAN_STOP_OUTPUT[] = { |
|---|
| 929 | + 0x116, 0x126, 0x136, 0x196, 0x1a6 }; |
|---|
| 930 | +static const u16 NCT6116_REG_FAN_START_OUTPUT[] = { |
|---|
| 931 | + 0x117, 0x127, 0x137, 0x197, 0x1a7 }; |
|---|
| 932 | +static const u16 NCT6116_REG_FAN_STOP_TIME[] = { |
|---|
| 933 | + 0x118, 0x128, 0x138, 0x198, 0x1a8 }; |
|---|
| 934 | +static const u16 NCT6116_REG_TOLERANCE_H[] = { |
|---|
| 935 | + 0x112, 0x122, 0x132, 0x192, 0x1a2 }; |
|---|
| 936 | + |
|---|
| 937 | +static const u16 NCT6116_REG_TARGET[] = { |
|---|
| 938 | + 0x111, 0x121, 0x131, 0x191, 0x1a1 }; |
|---|
| 939 | + |
|---|
| 940 | +static const u16 NCT6116_REG_AUTO_TEMP[] = { |
|---|
| 941 | + 0x160, 0x170, 0x180, 0x1d0, 0x1e0 }; |
|---|
| 942 | +static const u16 NCT6116_REG_AUTO_PWM[] = { |
|---|
| 943 | + 0x164, 0x174, 0x184, 0x1d4, 0x1e4 }; |
|---|
| 944 | + |
|---|
| 945 | +static const s8 NCT6116_ALARM_BITS[] = { |
|---|
| 946 | + 0, 1, 2, 3, 4, 5, 7, 8, /* in0.. in7 */ |
|---|
| 947 | + 9, -1, -1, -1, -1, -1, -1, /* in8..in9 */ |
|---|
| 948 | + -1, /* unused */ |
|---|
| 949 | + 32, 33, 34, 35, 36, /* fan1..fan5 */ |
|---|
| 950 | + -1, -1, -1, /* unused */ |
|---|
| 951 | + 16, 17, 18, -1, -1, -1, /* temp1..temp6 */ |
|---|
| 952 | + 48, -1 /* intrusion0, intrusion1 */ |
|---|
| 953 | +}; |
|---|
| 954 | + |
|---|
| 955 | +static const s8 NCT6116_BEEP_BITS[] = { |
|---|
| 956 | + 0, 1, 2, 3, 4, 5, 7, 8, /* in0.. in7 */ |
|---|
| 957 | + 9, 10, 11, 12, -1, -1, -1, /* in8..in14 */ |
|---|
| 958 | + 32, /* global beep enable */ |
|---|
| 959 | + 24, 25, 26, 27, 28, /* fan1..fan5 */ |
|---|
| 960 | + -1, -1, -1, /* unused */ |
|---|
| 961 | + 16, 17, 18, -1, -1, -1, /* temp1..temp6 */ |
|---|
| 962 | + 34, -1 /* intrusion0, intrusion1 */ |
|---|
| 863 | 963 | }; |
|---|
| 864 | 964 | |
|---|
| 865 | 965 | static enum pwm_enable reg_to_pwm_enable(int pwm, int mode) |
|---|
| .. | .. |
|---|
| 1260 | 1360 | return reg == 0x20 || reg == 0x22 || reg == 0x24 || |
|---|
| 1261 | 1361 | reg == 0xe0 || reg == 0xe2 || reg == 0xe4 || |
|---|
| 1262 | 1362 | reg == 0x111 || reg == 0x121 || reg == 0x131; |
|---|
| 1363 | + case nct6116: |
|---|
| 1364 | + return reg == 0x20 || reg == 0x22 || reg == 0x24 || |
|---|
| 1365 | + reg == 0x26 || reg == 0x28 || reg == 0xe0 || reg == 0xe2 || |
|---|
| 1366 | + reg == 0xe4 || reg == 0xe6 || reg == 0xe8 || reg == 0x111 || |
|---|
| 1367 | + reg == 0x121 || reg == 0x131 || reg == 0x191 || reg == 0x1a1; |
|---|
| 1263 | 1368 | case nct6775: |
|---|
| 1264 | 1369 | return (((reg & 0xff00) == 0x100 || |
|---|
| 1265 | 1370 | (reg & 0xff00) == 0x200) && |
|---|
| .. | .. |
|---|
| 1288 | 1393 | case nct6793: |
|---|
| 1289 | 1394 | case nct6795: |
|---|
| 1290 | 1395 | case nct6796: |
|---|
| 1396 | + case nct6797: |
|---|
| 1397 | + case nct6798: |
|---|
| 1291 | 1398 | return reg == 0x150 || reg == 0x153 || reg == 0x155 || |
|---|
| 1292 | 1399 | (reg & 0xfff0) == 0x4c0 || |
|---|
| 1293 | 1400 | reg == 0x402 || |
|---|
| .. | .. |
|---|
| 1637 | 1744 | data->auto_pwm[i][data->auto_pwm_num] = 0xff; |
|---|
| 1638 | 1745 | break; |
|---|
| 1639 | 1746 | case nct6106: |
|---|
| 1747 | + case nct6116: |
|---|
| 1640 | 1748 | case nct6779: |
|---|
| 1641 | 1749 | case nct6791: |
|---|
| 1642 | 1750 | case nct6792: |
|---|
| 1643 | 1751 | case nct6793: |
|---|
| 1644 | 1752 | case nct6795: |
|---|
| 1645 | 1753 | case nct6796: |
|---|
| 1754 | + case nct6797: |
|---|
| 1755 | + case nct6798: |
|---|
| 1646 | 1756 | reg = nct6775_read_value(data, |
|---|
| 1647 | 1757 | data->REG_CRITICAL_PWM_ENABLE[i]); |
|---|
| 1648 | 1758 | if (reg & data->CRITICAL_PWM_ENABLE_MASK) |
|---|
| .. | .. |
|---|
| 1937 | 2047 | static umode_t nct6775_in_is_visible(struct kobject *kobj, |
|---|
| 1938 | 2048 | struct attribute *attr, int index) |
|---|
| 1939 | 2049 | { |
|---|
| 1940 | | - struct device *dev = container_of(kobj, struct device, kobj); |
|---|
| 2050 | + struct device *dev = kobj_to_dev(kobj); |
|---|
| 1941 | 2051 | struct nct6775_data *data = dev_get_drvdata(dev); |
|---|
| 1942 | 2052 | int in = index / 5; /* voltage index */ |
|---|
| 1943 | 2053 | |
|---|
| .. | .. |
|---|
| 2143 | 2253 | static umode_t nct6775_fan_is_visible(struct kobject *kobj, |
|---|
| 2144 | 2254 | struct attribute *attr, int index) |
|---|
| 2145 | 2255 | { |
|---|
| 2146 | | - struct device *dev = container_of(kobj, struct device, kobj); |
|---|
| 2256 | + struct device *dev = kobj_to_dev(kobj); |
|---|
| 2147 | 2257 | struct nct6775_data *data = dev_get_drvdata(dev); |
|---|
| 2148 | 2258 | int fan = index / 6; /* fan index */ |
|---|
| 2149 | 2259 | int nr = index % 6; /* attribute index */ |
|---|
| .. | .. |
|---|
| 2330 | 2440 | static umode_t nct6775_temp_is_visible(struct kobject *kobj, |
|---|
| 2331 | 2441 | struct attribute *attr, int index) |
|---|
| 2332 | 2442 | { |
|---|
| 2333 | | - struct device *dev = container_of(kobj, struct device, kobj); |
|---|
| 2443 | + struct device *dev = kobj_to_dev(kobj); |
|---|
| 2334 | 2444 | struct nct6775_data *data = dev_get_drvdata(dev); |
|---|
| 2335 | 2445 | int temp = index / 10; /* temp index */ |
|---|
| 2336 | 2446 | int nr = index % 10; /* attribute index */ |
|---|
| .. | .. |
|---|
| 2559 | 2669 | case thermal_cruise: |
|---|
| 2560 | 2670 | nct6775_write_value(data, data->REG_TARGET[nr], |
|---|
| 2561 | 2671 | data->target_temp[nr]); |
|---|
| 2562 | | - /* fall through */ |
|---|
| 2672 | + fallthrough; |
|---|
| 2563 | 2673 | default: |
|---|
| 2564 | 2674 | reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); |
|---|
| 2565 | 2675 | reg = (reg & ~data->tolerance_mask) | |
|---|
| .. | .. |
|---|
| 2847 | 2957 | * Fan speed tolerance is a tricky beast, since the associated register is |
|---|
| 2848 | 2958 | * a tick counter, but the value is reported and configured as rpm. |
|---|
| 2849 | 2959 | * Compute resulting low and high rpm values and report the difference. |
|---|
| 2960 | + * A fan speed tolerance only makes sense if a fan target speed has been |
|---|
| 2961 | + * configured, so only display values other than 0 if that is the case. |
|---|
| 2850 | 2962 | */ |
|---|
| 2851 | 2963 | static ssize_t |
|---|
| 2852 | 2964 | show_speed_tolerance(struct device *dev, struct device_attribute *attr, |
|---|
| .. | .. |
|---|
| 2855 | 2967 | struct nct6775_data *data = nct6775_update_device(dev); |
|---|
| 2856 | 2968 | struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr); |
|---|
| 2857 | 2969 | int nr = sattr->index; |
|---|
| 2858 | | - int low = data->target_speed[nr] - data->target_speed_tolerance[nr]; |
|---|
| 2859 | | - int high = data->target_speed[nr] + data->target_speed_tolerance[nr]; |
|---|
| 2860 | | - int tolerance; |
|---|
| 2970 | + int target = data->target_speed[nr]; |
|---|
| 2971 | + int tolerance = 0; |
|---|
| 2861 | 2972 | |
|---|
| 2862 | | - if (low <= 0) |
|---|
| 2863 | | - low = 1; |
|---|
| 2864 | | - if (high > 0xffff) |
|---|
| 2865 | | - high = 0xffff; |
|---|
| 2866 | | - if (high < low) |
|---|
| 2867 | | - high = low; |
|---|
| 2973 | + if (target) { |
|---|
| 2974 | + int low = target - data->target_speed_tolerance[nr]; |
|---|
| 2975 | + int high = target + data->target_speed_tolerance[nr]; |
|---|
| 2868 | 2976 | |
|---|
| 2869 | | - tolerance = (fan_from_reg16(low, data->fan_div[nr]) |
|---|
| 2870 | | - - fan_from_reg16(high, data->fan_div[nr])) / 2; |
|---|
| 2977 | + if (low <= 0) |
|---|
| 2978 | + low = 1; |
|---|
| 2979 | + if (high > 0xffff) |
|---|
| 2980 | + high = 0xffff; |
|---|
| 2981 | + if (high < low) |
|---|
| 2982 | + high = low; |
|---|
| 2983 | + |
|---|
| 2984 | + tolerance = (fan_from_reg16(low, data->fan_div[nr]) |
|---|
| 2985 | + - fan_from_reg16(high, data->fan_div[nr])) / 2; |
|---|
| 2986 | + } |
|---|
| 2871 | 2987 | |
|---|
| 2872 | 2988 | return sprintf(buf, "%d\n", tolerance); |
|---|
| 2873 | 2989 | } |
|---|
| .. | .. |
|---|
| 3065 | 3181 | case nct6776: |
|---|
| 3066 | 3182 | break; /* always enabled, nothing to do */ |
|---|
| 3067 | 3183 | case nct6106: |
|---|
| 3184 | + case nct6116: |
|---|
| 3068 | 3185 | case nct6779: |
|---|
| 3069 | 3186 | case nct6791: |
|---|
| 3070 | 3187 | case nct6792: |
|---|
| 3071 | 3188 | case nct6793: |
|---|
| 3072 | 3189 | case nct6795: |
|---|
| 3073 | 3190 | case nct6796: |
|---|
| 3191 | + case nct6797: |
|---|
| 3192 | + case nct6798: |
|---|
| 3074 | 3193 | nct6775_write_value(data, data->REG_CRITICAL_PWM[nr], |
|---|
| 3075 | 3194 | val); |
|---|
| 3076 | 3195 | reg = nct6775_read_value(data, |
|---|
| .. | .. |
|---|
| 3138 | 3257 | static umode_t nct6775_pwm_is_visible(struct kobject *kobj, |
|---|
| 3139 | 3258 | struct attribute *attr, int index) |
|---|
| 3140 | 3259 | { |
|---|
| 3141 | | - struct device *dev = container_of(kobj, struct device, kobj); |
|---|
| 3260 | + struct device *dev = kobj_to_dev(kobj); |
|---|
| 3142 | 3261 | struct nct6775_data *data = dev_get_drvdata(dev); |
|---|
| 3143 | 3262 | int pwm = index / 36; /* pwm index */ |
|---|
| 3144 | 3263 | int nr = index % 36; /* attribute index */ |
|---|
| .. | .. |
|---|
| 3340 | 3459 | static umode_t nct6775_other_is_visible(struct kobject *kobj, |
|---|
| 3341 | 3460 | struct attribute *attr, int index) |
|---|
| 3342 | 3461 | { |
|---|
| 3343 | | - struct device *dev = container_of(kobj, struct device, kobj); |
|---|
| 3462 | + struct device *dev = kobj_to_dev(kobj); |
|---|
| 3344 | 3463 | struct nct6775_data *data = dev_get_drvdata(dev); |
|---|
| 3345 | 3464 | |
|---|
| 3346 | 3465 | if (index == 0 && !data->have_vid) |
|---|
| .. | .. |
|---|
| 3430 | 3549 | bool pwm3pin = false, pwm4pin = false, pwm5pin = false; |
|---|
| 3431 | 3550 | bool pwm6pin = false, pwm7pin = false; |
|---|
| 3432 | 3551 | int sioreg = data->sioreg; |
|---|
| 3433 | | - int regval; |
|---|
| 3434 | 3552 | |
|---|
| 3435 | 3553 | /* Store SIO_REG_ENABLE for use during resume */ |
|---|
| 3436 | 3554 | superio_select(sioreg, NCT6775_LD_HWM); |
|---|
| .. | .. |
|---|
| 3438 | 3556 | |
|---|
| 3439 | 3557 | /* fan4 and fan5 share some pins with the GPIO and serial flash */ |
|---|
| 3440 | 3558 | if (data->kind == nct6775) { |
|---|
| 3441 | | - regval = superio_inb(sioreg, 0x2c); |
|---|
| 3559 | + int cr2c = superio_inb(sioreg, 0x2c); |
|---|
| 3442 | 3560 | |
|---|
| 3443 | | - fan3pin = regval & BIT(6); |
|---|
| 3444 | | - pwm3pin = regval & BIT(7); |
|---|
| 3561 | + fan3pin = cr2c & BIT(6); |
|---|
| 3562 | + pwm3pin = cr2c & BIT(7); |
|---|
| 3445 | 3563 | |
|---|
| 3446 | 3564 | /* On NCT6775, fan4 shares pins with the fdc interface */ |
|---|
| 3447 | 3565 | fan4pin = !(superio_inb(sioreg, 0x2A) & 0x80); |
|---|
| .. | .. |
|---|
| 3486 | 3604 | fan4min = fan4pin; |
|---|
| 3487 | 3605 | pwm3pin = fan3pin; |
|---|
| 3488 | 3606 | } else if (data->kind == nct6106) { |
|---|
| 3489 | | - regval = superio_inb(sioreg, 0x24); |
|---|
| 3490 | | - fan3pin = !(regval & 0x80); |
|---|
| 3491 | | - pwm3pin = regval & 0x08; |
|---|
| 3607 | + int cr24 = superio_inb(sioreg, 0x24); |
|---|
| 3608 | + |
|---|
| 3609 | + fan3pin = !(cr24 & 0x80); |
|---|
| 3610 | + pwm3pin = cr24 & 0x08; |
|---|
| 3611 | + } else if (data->kind == nct6116) { |
|---|
| 3612 | + int cr1a = superio_inb(sioreg, 0x1a); |
|---|
| 3613 | + int cr1b = superio_inb(sioreg, 0x1b); |
|---|
| 3614 | + int cr24 = superio_inb(sioreg, 0x24); |
|---|
| 3615 | + int cr2a = superio_inb(sioreg, 0x2a); |
|---|
| 3616 | + int cr2b = superio_inb(sioreg, 0x2b); |
|---|
| 3617 | + int cr2f = superio_inb(sioreg, 0x2f); |
|---|
| 3618 | + |
|---|
| 3619 | + fan3pin = !(cr2b & 0x10); |
|---|
| 3620 | + fan4pin = (cr2b & 0x80) || // pin 1(2) |
|---|
| 3621 | + (!(cr2f & 0x10) && (cr1a & 0x04)); // pin 65(66) |
|---|
| 3622 | + fan5pin = (cr2b & 0x80) || // pin 126(127) |
|---|
| 3623 | + (!(cr1b & 0x03) && (cr2a & 0x02)); // pin 94(96) |
|---|
| 3624 | + |
|---|
| 3625 | + pwm3pin = fan3pin && (cr24 & 0x08); |
|---|
| 3626 | + pwm4pin = fan4pin; |
|---|
| 3627 | + pwm5pin = fan5pin; |
|---|
| 3492 | 3628 | } else { |
|---|
| 3493 | | - /* NCT6779D, NCT6791D, NCT6792D, NCT6793D, NCT6795D, NCT6796D */ |
|---|
| 3494 | | - int regval_1b, regval_2a, regval_2f; |
|---|
| 3495 | | - bool dsw_en; |
|---|
| 3629 | + /* |
|---|
| 3630 | + * NCT6779D, NCT6791D, NCT6792D, NCT6793D, NCT6795D, NCT6796D, |
|---|
| 3631 | + * NCT6797D, NCT6798D |
|---|
| 3632 | + */ |
|---|
| 3633 | + int cr1a = superio_inb(sioreg, 0x1a); |
|---|
| 3634 | + int cr1b = superio_inb(sioreg, 0x1b); |
|---|
| 3635 | + int cr1c = superio_inb(sioreg, 0x1c); |
|---|
| 3636 | + int cr1d = superio_inb(sioreg, 0x1d); |
|---|
| 3637 | + int cr2a = superio_inb(sioreg, 0x2a); |
|---|
| 3638 | + int cr2b = superio_inb(sioreg, 0x2b); |
|---|
| 3639 | + int cr2d = superio_inb(sioreg, 0x2d); |
|---|
| 3640 | + int cr2f = superio_inb(sioreg, 0x2f); |
|---|
| 3641 | + bool dsw_en = cr2f & BIT(3); |
|---|
| 3642 | + bool ddr4_en = cr2f & BIT(4); |
|---|
| 3643 | + int cre0; |
|---|
| 3644 | + int creb; |
|---|
| 3645 | + int cred; |
|---|
| 3496 | 3646 | |
|---|
| 3497 | | - regval = superio_inb(sioreg, 0x1c); |
|---|
| 3647 | + superio_select(sioreg, NCT6775_LD_12); |
|---|
| 3648 | + cre0 = superio_inb(sioreg, 0xe0); |
|---|
| 3649 | + creb = superio_inb(sioreg, 0xeb); |
|---|
| 3650 | + cred = superio_inb(sioreg, 0xed); |
|---|
| 3498 | 3651 | |
|---|
| 3499 | | - fan3pin = !(regval & BIT(5)); |
|---|
| 3500 | | - fan4pin = !(regval & BIT(6)); |
|---|
| 3501 | | - fan5pin = !(regval & BIT(7)); |
|---|
| 3652 | + fan3pin = !(cr1c & BIT(5)); |
|---|
| 3653 | + fan4pin = !(cr1c & BIT(6)); |
|---|
| 3654 | + fan5pin = !(cr1c & BIT(7)); |
|---|
| 3502 | 3655 | |
|---|
| 3503 | | - pwm3pin = !(regval & BIT(0)); |
|---|
| 3504 | | - pwm4pin = !(regval & BIT(1)); |
|---|
| 3505 | | - pwm5pin = !(regval & BIT(2)); |
|---|
| 3656 | + pwm3pin = !(cr1c & BIT(0)); |
|---|
| 3657 | + pwm4pin = !(cr1c & BIT(1)); |
|---|
| 3658 | + pwm5pin = !(cr1c & BIT(2)); |
|---|
| 3506 | 3659 | |
|---|
| 3507 | | - regval = superio_inb(sioreg, 0x2d); |
|---|
| 3508 | 3660 | switch (data->kind) { |
|---|
| 3509 | 3661 | case nct6791: |
|---|
| 3662 | + fan6pin = cr2d & BIT(1); |
|---|
| 3663 | + pwm6pin = cr2d & BIT(0); |
|---|
| 3664 | + break; |
|---|
| 3510 | 3665 | case nct6792: |
|---|
| 3511 | | - fan6pin = regval & BIT(1); |
|---|
| 3512 | | - pwm6pin = regval & BIT(0); |
|---|
| 3666 | + fan6pin = !dsw_en && (cr2d & BIT(1)); |
|---|
| 3667 | + pwm6pin = !dsw_en && (cr2d & BIT(0)); |
|---|
| 3513 | 3668 | break; |
|---|
| 3514 | 3669 | case nct6793: |
|---|
| 3670 | + fan5pin |= cr1b & BIT(5); |
|---|
| 3671 | + fan5pin |= creb & BIT(5); |
|---|
| 3672 | + |
|---|
| 3673 | + fan6pin = !dsw_en && (cr2d & BIT(1)); |
|---|
| 3674 | + fan6pin |= creb & BIT(3); |
|---|
| 3675 | + |
|---|
| 3676 | + pwm5pin |= cr2d & BIT(7); |
|---|
| 3677 | + pwm5pin |= (creb & BIT(4)) && !(cr2a & BIT(0)); |
|---|
| 3678 | + |
|---|
| 3679 | + pwm6pin = !dsw_en && (cr2d & BIT(0)); |
|---|
| 3680 | + pwm6pin |= creb & BIT(2); |
|---|
| 3681 | + break; |
|---|
| 3515 | 3682 | case nct6795: |
|---|
| 3683 | + fan5pin |= cr1b & BIT(5); |
|---|
| 3684 | + fan5pin |= creb & BIT(5); |
|---|
| 3685 | + |
|---|
| 3686 | + fan6pin = (cr2a & BIT(4)) && |
|---|
| 3687 | + (!dsw_en || (cred & BIT(4))); |
|---|
| 3688 | + fan6pin |= creb & BIT(3); |
|---|
| 3689 | + |
|---|
| 3690 | + pwm5pin |= cr2d & BIT(7); |
|---|
| 3691 | + pwm5pin |= (creb & BIT(4)) && !(cr2a & BIT(0)); |
|---|
| 3692 | + |
|---|
| 3693 | + pwm6pin = (cr2a & BIT(3)) && (cred & BIT(2)); |
|---|
| 3694 | + pwm6pin |= creb & BIT(2); |
|---|
| 3695 | + break; |
|---|
| 3516 | 3696 | case nct6796: |
|---|
| 3517 | | - regval_1b = superio_inb(sioreg, 0x1b); |
|---|
| 3518 | | - regval_2a = superio_inb(sioreg, 0x2a); |
|---|
| 3519 | | - regval_2f = superio_inb(sioreg, 0x2f); |
|---|
| 3520 | | - dsw_en = regval_2f & BIT(3); |
|---|
| 3697 | + fan5pin |= cr1b & BIT(5); |
|---|
| 3698 | + fan5pin |= (cre0 & BIT(3)) && !(cr1b & BIT(0)); |
|---|
| 3699 | + fan5pin |= creb & BIT(5); |
|---|
| 3521 | 3700 | |
|---|
| 3522 | | - if (!pwm5pin) |
|---|
| 3523 | | - pwm5pin = regval & BIT(7); |
|---|
| 3701 | + fan6pin = (cr2a & BIT(4)) && |
|---|
| 3702 | + (!dsw_en || (cred & BIT(4))); |
|---|
| 3703 | + fan6pin |= creb & BIT(3); |
|---|
| 3524 | 3704 | |
|---|
| 3525 | | - if (!fan5pin) |
|---|
| 3526 | | - fan5pin = regval_1b & BIT(5); |
|---|
| 3705 | + fan7pin = !(cr2b & BIT(2)); |
|---|
| 3527 | 3706 | |
|---|
| 3528 | | - superio_select(sioreg, NCT6775_LD_12); |
|---|
| 3529 | | - if (data->kind != nct6796) { |
|---|
| 3530 | | - int regval_eb = superio_inb(sioreg, 0xeb); |
|---|
| 3707 | + pwm5pin |= cr2d & BIT(7); |
|---|
| 3708 | + pwm5pin |= (cre0 & BIT(4)) && !(cr1b & BIT(0)); |
|---|
| 3709 | + pwm5pin |= (creb & BIT(4)) && !(cr2a & BIT(0)); |
|---|
| 3531 | 3710 | |
|---|
| 3532 | | - if (!dsw_en) { |
|---|
| 3533 | | - fan6pin = regval & BIT(1); |
|---|
| 3534 | | - pwm6pin = regval & BIT(0); |
|---|
| 3535 | | - } |
|---|
| 3711 | + pwm6pin = (cr2a & BIT(3)) && (cred & BIT(2)); |
|---|
| 3712 | + pwm6pin |= creb & BIT(2); |
|---|
| 3536 | 3713 | |
|---|
| 3537 | | - if (!fan5pin) |
|---|
| 3538 | | - fan5pin = regval_eb & BIT(5); |
|---|
| 3539 | | - if (!pwm5pin) |
|---|
| 3540 | | - pwm5pin = (regval_eb & BIT(4)) && |
|---|
| 3541 | | - !(regval_2a & BIT(0)); |
|---|
| 3542 | | - if (!fan6pin) |
|---|
| 3543 | | - fan6pin = regval_eb & BIT(3); |
|---|
| 3544 | | - if (!pwm6pin) |
|---|
| 3545 | | - pwm6pin = regval_eb & BIT(2); |
|---|
| 3546 | | - } |
|---|
| 3714 | + pwm7pin = !(cr1d & (BIT(2) | BIT(3))); |
|---|
| 3715 | + break; |
|---|
| 3716 | + case nct6797: |
|---|
| 3717 | + fan5pin |= !ddr4_en && (cr1b & BIT(5)); |
|---|
| 3718 | + fan5pin |= creb & BIT(5); |
|---|
| 3547 | 3719 | |
|---|
| 3548 | | - if (data->kind == nct6795 || data->kind == nct6796) { |
|---|
| 3549 | | - int regval_ed = superio_inb(sioreg, 0xed); |
|---|
| 3720 | + fan6pin = cr2a & BIT(4); |
|---|
| 3721 | + fan6pin |= creb & BIT(3); |
|---|
| 3550 | 3722 | |
|---|
| 3551 | | - if (!fan6pin) |
|---|
| 3552 | | - fan6pin = (regval_2a & BIT(4)) && |
|---|
| 3553 | | - (!dsw_en || |
|---|
| 3554 | | - (dsw_en && (regval_ed & BIT(4)))); |
|---|
| 3555 | | - if (!pwm6pin) |
|---|
| 3556 | | - pwm6pin = (regval_2a & BIT(3)) && |
|---|
| 3557 | | - (regval_ed & BIT(2)); |
|---|
| 3558 | | - } |
|---|
| 3723 | + fan7pin = cr1a & BIT(1); |
|---|
| 3559 | 3724 | |
|---|
| 3560 | | - if (data->kind == nct6796) { |
|---|
| 3561 | | - int regval_1d = superio_inb(sioreg, 0x1d); |
|---|
| 3562 | | - int regval_2b = superio_inb(sioreg, 0x2b); |
|---|
| 3725 | + pwm5pin |= (creb & BIT(4)) && !(cr2a & BIT(0)); |
|---|
| 3726 | + pwm5pin |= !ddr4_en && (cr2d & BIT(7)); |
|---|
| 3563 | 3727 | |
|---|
| 3564 | | - fan7pin = !(regval_2b & BIT(2)); |
|---|
| 3565 | | - pwm7pin = !(regval_1d & (BIT(2) | BIT(3))); |
|---|
| 3566 | | - } |
|---|
| 3728 | + pwm6pin = creb & BIT(2); |
|---|
| 3729 | + pwm6pin |= cred & BIT(2); |
|---|
| 3567 | 3730 | |
|---|
| 3731 | + pwm7pin = cr1d & BIT(4); |
|---|
| 3732 | + break; |
|---|
| 3733 | + case nct6798: |
|---|
| 3734 | + fan6pin = !(cr1b & BIT(0)) && (cre0 & BIT(3)); |
|---|
| 3735 | + fan6pin |= cr2a & BIT(4); |
|---|
| 3736 | + fan6pin |= creb & BIT(5); |
|---|
| 3737 | + |
|---|
| 3738 | + fan7pin = cr1b & BIT(5); |
|---|
| 3739 | + fan7pin |= !(cr2b & BIT(2)); |
|---|
| 3740 | + fan7pin |= creb & BIT(3); |
|---|
| 3741 | + |
|---|
| 3742 | + pwm6pin = !(cr1b & BIT(0)) && (cre0 & BIT(4)); |
|---|
| 3743 | + pwm6pin |= !(cred & BIT(2)) && (cr2a & BIT(3)); |
|---|
| 3744 | + pwm6pin |= (creb & BIT(4)) && !(cr2a & BIT(0)); |
|---|
| 3745 | + |
|---|
| 3746 | + pwm7pin = !(cr1d & (BIT(2) | BIT(3))); |
|---|
| 3747 | + pwm7pin |= cr2d & BIT(7); |
|---|
| 3748 | + pwm7pin |= creb & BIT(2); |
|---|
| 3568 | 3749 | break; |
|---|
| 3569 | 3750 | default: /* NCT6779D */ |
|---|
| 3570 | 3751 | break; |
|---|
| .. | .. |
|---|
| 3674 | 3855 | data->REG_FAN_TIME[1] = NCT6106_REG_FAN_STEP_UP_TIME; |
|---|
| 3675 | 3856 | data->REG_FAN_TIME[2] = NCT6106_REG_FAN_STEP_DOWN_TIME; |
|---|
| 3676 | 3857 | data->REG_TOLERANCE_H = NCT6106_REG_TOLERANCE_H; |
|---|
| 3677 | | - data->REG_PWM[0] = NCT6106_REG_PWM; |
|---|
| 3858 | + data->REG_PWM[0] = NCT6116_REG_PWM; |
|---|
| 3678 | 3859 | data->REG_PWM[1] = NCT6106_REG_FAN_START_OUTPUT; |
|---|
| 3679 | 3860 | data->REG_PWM[2] = NCT6106_REG_FAN_STOP_OUTPUT; |
|---|
| 3680 | 3861 | data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP; |
|---|
| .. | .. |
|---|
| 3693 | 3874 | data->REG_CRITICAL_PWM = NCT6106_REG_CRITICAL_PWM; |
|---|
| 3694 | 3875 | data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET; |
|---|
| 3695 | 3876 | data->REG_TEMP_SOURCE = NCT6106_REG_TEMP_SOURCE; |
|---|
| 3696 | | - data->REG_TEMP_SEL = NCT6106_REG_TEMP_SEL; |
|---|
| 3877 | + data->REG_TEMP_SEL = NCT6116_REG_TEMP_SEL; |
|---|
| 3697 | 3878 | data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL; |
|---|
| 3698 | 3879 | data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP; |
|---|
| 3699 | 3880 | data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL; |
|---|
| .. | .. |
|---|
| 3702 | 3883 | data->ALARM_BITS = NCT6106_ALARM_BITS; |
|---|
| 3703 | 3884 | data->REG_BEEP = NCT6106_REG_BEEP; |
|---|
| 3704 | 3885 | data->BEEP_BITS = NCT6106_BEEP_BITS; |
|---|
| 3886 | + |
|---|
| 3887 | + reg_temp = NCT6106_REG_TEMP; |
|---|
| 3888 | + reg_temp_mon = NCT6106_REG_TEMP_MON; |
|---|
| 3889 | + num_reg_temp = ARRAY_SIZE(NCT6106_REG_TEMP); |
|---|
| 3890 | + num_reg_temp_mon = ARRAY_SIZE(NCT6106_REG_TEMP_MON); |
|---|
| 3891 | + reg_temp_over = NCT6106_REG_TEMP_OVER; |
|---|
| 3892 | + reg_temp_hyst = NCT6106_REG_TEMP_HYST; |
|---|
| 3893 | + reg_temp_config = NCT6106_REG_TEMP_CONFIG; |
|---|
| 3894 | + reg_temp_alternate = NCT6106_REG_TEMP_ALTERNATE; |
|---|
| 3895 | + reg_temp_crit = NCT6106_REG_TEMP_CRIT; |
|---|
| 3896 | + reg_temp_crit_l = NCT6106_REG_TEMP_CRIT_L; |
|---|
| 3897 | + reg_temp_crit_h = NCT6106_REG_TEMP_CRIT_H; |
|---|
| 3898 | + |
|---|
| 3899 | + break; |
|---|
| 3900 | + case nct6116: |
|---|
| 3901 | + data->in_num = 9; |
|---|
| 3902 | + data->pwm_num = 3; |
|---|
| 3903 | + data->auto_pwm_num = 4; |
|---|
| 3904 | + data->temp_fixed_num = 3; |
|---|
| 3905 | + data->num_temp_alarms = 3; |
|---|
| 3906 | + data->num_temp_beeps = 3; |
|---|
| 3907 | + |
|---|
| 3908 | + data->fan_from_reg = fan_from_reg13; |
|---|
| 3909 | + data->fan_from_reg_min = fan_from_reg13; |
|---|
| 3910 | + |
|---|
| 3911 | + data->temp_label = nct6776_temp_label; |
|---|
| 3912 | + data->temp_mask = NCT6776_TEMP_MASK; |
|---|
| 3913 | + data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK; |
|---|
| 3914 | + |
|---|
| 3915 | + data->REG_VBAT = NCT6106_REG_VBAT; |
|---|
| 3916 | + data->REG_DIODE = NCT6106_REG_DIODE; |
|---|
| 3917 | + data->DIODE_MASK = NCT6106_DIODE_MASK; |
|---|
| 3918 | + data->REG_VIN = NCT6106_REG_IN; |
|---|
| 3919 | + data->REG_IN_MINMAX[0] = NCT6106_REG_IN_MIN; |
|---|
| 3920 | + data->REG_IN_MINMAX[1] = NCT6106_REG_IN_MAX; |
|---|
| 3921 | + data->REG_TARGET = NCT6116_REG_TARGET; |
|---|
| 3922 | + data->REG_FAN = NCT6116_REG_FAN; |
|---|
| 3923 | + data->REG_FAN_MODE = NCT6116_REG_FAN_MODE; |
|---|
| 3924 | + data->REG_FAN_MIN = NCT6116_REG_FAN_MIN; |
|---|
| 3925 | + data->REG_FAN_PULSES = NCT6116_REG_FAN_PULSES; |
|---|
| 3926 | + data->FAN_PULSE_SHIFT = NCT6116_FAN_PULSE_SHIFT; |
|---|
| 3927 | + data->REG_FAN_TIME[0] = NCT6116_REG_FAN_STOP_TIME; |
|---|
| 3928 | + data->REG_FAN_TIME[1] = NCT6116_REG_FAN_STEP_UP_TIME; |
|---|
| 3929 | + data->REG_FAN_TIME[2] = NCT6116_REG_FAN_STEP_DOWN_TIME; |
|---|
| 3930 | + data->REG_TOLERANCE_H = NCT6116_REG_TOLERANCE_H; |
|---|
| 3931 | + data->REG_PWM[0] = NCT6116_REG_PWM; |
|---|
| 3932 | + data->REG_PWM[1] = NCT6116_REG_FAN_START_OUTPUT; |
|---|
| 3933 | + data->REG_PWM[2] = NCT6116_REG_FAN_STOP_OUTPUT; |
|---|
| 3934 | + data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP; |
|---|
| 3935 | + data->REG_PWM[6] = NCT6106_REG_WEIGHT_DUTY_BASE; |
|---|
| 3936 | + data->REG_PWM_READ = NCT6106_REG_PWM_READ; |
|---|
| 3937 | + data->REG_PWM_MODE = NCT6106_REG_PWM_MODE; |
|---|
| 3938 | + data->PWM_MODE_MASK = NCT6106_PWM_MODE_MASK; |
|---|
| 3939 | + data->REG_AUTO_TEMP = NCT6116_REG_AUTO_TEMP; |
|---|
| 3940 | + data->REG_AUTO_PWM = NCT6116_REG_AUTO_PWM; |
|---|
| 3941 | + data->REG_CRITICAL_TEMP = NCT6116_REG_CRITICAL_TEMP; |
|---|
| 3942 | + data->REG_CRITICAL_TEMP_TOLERANCE |
|---|
| 3943 | + = NCT6116_REG_CRITICAL_TEMP_TOLERANCE; |
|---|
| 3944 | + data->REG_CRITICAL_PWM_ENABLE = NCT6116_REG_CRITICAL_PWM_ENABLE; |
|---|
| 3945 | + data->CRITICAL_PWM_ENABLE_MASK |
|---|
| 3946 | + = NCT6106_CRITICAL_PWM_ENABLE_MASK; |
|---|
| 3947 | + data->REG_CRITICAL_PWM = NCT6116_REG_CRITICAL_PWM; |
|---|
| 3948 | + data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET; |
|---|
| 3949 | + data->REG_TEMP_SOURCE = NCT6116_REG_TEMP_SOURCE; |
|---|
| 3950 | + data->REG_TEMP_SEL = NCT6116_REG_TEMP_SEL; |
|---|
| 3951 | + data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL; |
|---|
| 3952 | + data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP; |
|---|
| 3953 | + data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL; |
|---|
| 3954 | + data->REG_WEIGHT_TEMP[2] = NCT6106_REG_WEIGHT_TEMP_BASE; |
|---|
| 3955 | + data->REG_ALARM = NCT6106_REG_ALARM; |
|---|
| 3956 | + data->ALARM_BITS = NCT6116_ALARM_BITS; |
|---|
| 3957 | + data->REG_BEEP = NCT6106_REG_BEEP; |
|---|
| 3958 | + data->BEEP_BITS = NCT6116_BEEP_BITS; |
|---|
| 3705 | 3959 | |
|---|
| 3706 | 3960 | reg_temp = NCT6106_REG_TEMP; |
|---|
| 3707 | 3961 | reg_temp_mon = NCT6106_REG_TEMP_MON; |
|---|
| .. | .. |
|---|
| 3944 | 4198 | case nct6793: |
|---|
| 3945 | 4199 | case nct6795: |
|---|
| 3946 | 4200 | case nct6796: |
|---|
| 4201 | + case nct6797: |
|---|
| 4202 | + case nct6798: |
|---|
| 3947 | 4203 | data->in_num = 15; |
|---|
| 3948 | | - data->pwm_num = (data->kind == nct6796) ? 7 : 6; |
|---|
| 4204 | + data->pwm_num = (data->kind == nct6796 || |
|---|
| 4205 | + data->kind == nct6797 || |
|---|
| 4206 | + data->kind == nct6798) ? 7 : 6; |
|---|
| 3949 | 4207 | data->auto_pwm_num = 4; |
|---|
| 3950 | 4208 | data->has_fan_div = false; |
|---|
| 3951 | 4209 | data->temp_fixed_num = 6; |
|---|
| .. | .. |
|---|
| 3979 | 4237 | data->virt_temp_mask = NCT6793_VIRT_TEMP_MASK; |
|---|
| 3980 | 4238 | break; |
|---|
| 3981 | 4239 | case nct6795: |
|---|
| 4240 | + case nct6797: |
|---|
| 3982 | 4241 | data->temp_label = nct6795_temp_label; |
|---|
| 3983 | 4242 | data->temp_mask = NCT6795_TEMP_MASK; |
|---|
| 3984 | 4243 | data->virt_temp_mask = NCT6795_VIRT_TEMP_MASK; |
|---|
| .. | .. |
|---|
| 3987 | 4246 | data->temp_label = nct6796_temp_label; |
|---|
| 3988 | 4247 | data->temp_mask = NCT6796_TEMP_MASK; |
|---|
| 3989 | 4248 | data->virt_temp_mask = NCT6796_VIRT_TEMP_MASK; |
|---|
| 4249 | + break; |
|---|
| 4250 | + case nct6798: |
|---|
| 4251 | + data->temp_label = nct6798_temp_label; |
|---|
| 4252 | + data->temp_mask = NCT6798_TEMP_MASK; |
|---|
| 4253 | + data->virt_temp_mask = NCT6798_VIRT_TEMP_MASK; |
|---|
| 3990 | 4254 | break; |
|---|
| 3991 | 4255 | } |
|---|
| 3992 | 4256 | |
|---|
| .. | .. |
|---|
| 4251 | 4515 | data->have_vid = (cr2a & 0x60) == 0x40; |
|---|
| 4252 | 4516 | break; |
|---|
| 4253 | 4517 | case nct6106: |
|---|
| 4518 | + case nct6116: |
|---|
| 4254 | 4519 | case nct6779: |
|---|
| 4255 | 4520 | case nct6791: |
|---|
| 4256 | 4521 | case nct6792: |
|---|
| 4257 | 4522 | case nct6793: |
|---|
| 4258 | 4523 | case nct6795: |
|---|
| 4259 | 4524 | case nct6796: |
|---|
| 4525 | + case nct6797: |
|---|
| 4526 | + case nct6798: |
|---|
| 4260 | 4527 | break; |
|---|
| 4261 | 4528 | } |
|---|
| 4262 | 4529 | |
|---|
| .. | .. |
|---|
| 4278 | 4545 | NCT6775_REG_CR_FAN_DEBOUNCE); |
|---|
| 4279 | 4546 | switch (data->kind) { |
|---|
| 4280 | 4547 | case nct6106: |
|---|
| 4548 | + case nct6116: |
|---|
| 4281 | 4549 | tmp |= 0xe0; |
|---|
| 4282 | 4550 | break; |
|---|
| 4283 | 4551 | case nct6775: |
|---|
| .. | .. |
|---|
| 4292 | 4560 | case nct6793: |
|---|
| 4293 | 4561 | case nct6795: |
|---|
| 4294 | 4562 | case nct6796: |
|---|
| 4563 | + case nct6797: |
|---|
| 4564 | + case nct6798: |
|---|
| 4295 | 4565 | tmp |= 0x7e; |
|---|
| 4296 | 4566 | break; |
|---|
| 4297 | 4567 | } |
|---|
| .. | .. |
|---|
| 4391 | 4661 | |
|---|
| 4392 | 4662 | if (data->kind == nct6791 || data->kind == nct6792 || |
|---|
| 4393 | 4663 | data->kind == nct6793 || data->kind == nct6795 || |
|---|
| 4394 | | - data->kind == nct6796) |
|---|
| 4664 | + data->kind == nct6796 || data->kind == nct6797 || |
|---|
| 4665 | + data->kind == nct6798) |
|---|
| 4395 | 4666 | nct6791_enable_io_mapping(sioreg); |
|---|
| 4396 | 4667 | |
|---|
| 4397 | 4668 | superio_exit(sioreg); |
|---|
| .. | .. |
|---|
| 4470 | 4741 | case SIO_NCT6106_ID: |
|---|
| 4471 | 4742 | sio_data->kind = nct6106; |
|---|
| 4472 | 4743 | break; |
|---|
| 4744 | + case SIO_NCT6116_ID: |
|---|
| 4745 | + sio_data->kind = nct6116; |
|---|
| 4746 | + break; |
|---|
| 4473 | 4747 | case SIO_NCT6775_ID: |
|---|
| 4474 | 4748 | sio_data->kind = nct6775; |
|---|
| 4475 | 4749 | break; |
|---|
| .. | .. |
|---|
| 4493 | 4767 | break; |
|---|
| 4494 | 4768 | case SIO_NCT6796_ID: |
|---|
| 4495 | 4769 | sio_data->kind = nct6796; |
|---|
| 4770 | + break; |
|---|
| 4771 | + case SIO_NCT6797_ID: |
|---|
| 4772 | + sio_data->kind = nct6797; |
|---|
| 4773 | + break; |
|---|
| 4774 | + case SIO_NCT6798_ID: |
|---|
| 4775 | + sio_data->kind = nct6798; |
|---|
| 4496 | 4776 | break; |
|---|
| 4497 | 4777 | default: |
|---|
| 4498 | 4778 | if (val != 0xffff) |
|---|
| .. | .. |
|---|
| 4521 | 4801 | |
|---|
| 4522 | 4802 | if (sio_data->kind == nct6791 || sio_data->kind == nct6792 || |
|---|
| 4523 | 4803 | sio_data->kind == nct6793 || sio_data->kind == nct6795 || |
|---|
| 4524 | | - sio_data->kind == nct6796) |
|---|
| 4804 | + sio_data->kind == nct6796 || sio_data->kind == nct6797 || |
|---|
| 4805 | + sio_data->kind == nct6798) |
|---|
| 4525 | 4806 | nct6791_enable_io_mapping(sioaddr); |
|---|
| 4526 | 4807 | |
|---|
| 4527 | 4808 | superio_exit(sioaddr); |
|---|