Merge branches 'acpi-scan', 'acpi-resource', 'acpi-apei', 'acpi-extlog' and 'acpi...
[platform/kernel/linux-starfive.git] / drivers / hwmon / nct6775-core.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * nct6775 - Driver for the hardware monitoring functionality of
4  *             Nuvoton NCT677x Super-I/O chips
5  *
6  * Copyright (C) 2012  Guenter Roeck <linux@roeck-us.net>
7  *
8  * Derived from w83627ehf driver
9  * Copyright (C) 2005-2012  Jean Delvare <jdelvare@suse.de>
10  * Copyright (C) 2006  Yuan Mu (Winbond),
11  *                     Rudolf Marek <r.marek@assembler.cz>
12  *                     David Hubbard <david.c.hubbard@gmail.com>
13  *                     Daniel J Blueman <daniel.blueman@gmail.com>
14  * Copyright (C) 2010  Sheng-Yuan Huang (Nuvoton) (PS00)
15  *
16  * Shamelessly ripped from the w83627hf driver
17  * Copyright (C) 2003  Mark Studebaker
18  *
19  * Supports the following chips:
20  *
21  * Chip        #vin    #fan    #pwm    #temp  chip IDs       man ID
22  * nct6106d     9      3       3       6+3    0xc450 0xc1    0x5ca3
23  * nct6116d     9      5       5       3+3    0xd280 0xc1    0x5ca3
24  * nct6775f     9      4       3       6+3    0xb470 0xc1    0x5ca3
25  * nct6776f     9      5       3       6+3    0xc330 0xc1    0x5ca3
26  * nct6779d    15      5       5       2+6    0xc560 0xc1    0x5ca3
27  * nct6791d    15      6       6       2+6    0xc800 0xc1    0x5ca3
28  * nct6792d    15      6       6       2+6    0xc910 0xc1    0x5ca3
29  * nct6793d    15      6       6       2+6    0xd120 0xc1    0x5ca3
30  * nct6795d    14      6       6       2+6    0xd350 0xc1    0x5ca3
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)
36  *
37  * #temp lists the number of monitored temperature sources (first value) plus
38  * the number of directly connectable temperature sensors (second value).
39  */
40
41 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
42
43 #include <linux/module.h>
44 #include <linux/init.h>
45 #include <linux/slab.h>
46 #include <linux/jiffies.h>
47 #include <linux/hwmon.h>
48 #include <linux/hwmon-sysfs.h>
49 #include <linux/err.h>
50 #include <linux/mutex.h>
51 #include <linux/bitops.h>
52 #include <linux/nospec.h>
53 #include <linux/regmap.h>
54 #include "lm75.h"
55 #include "nct6775.h"
56
57 #undef DEFAULT_SYMBOL_NAMESPACE
58 #define DEFAULT_SYMBOL_NAMESPACE HWMON_NCT6775
59
60 #define USE_ALTERNATE
61
62 /* used to set data->name = nct6775_device_names[data->sio_kind] */
63 static const char * const nct6775_device_names[] = {
64         "nct6106",
65         "nct6116",
66         "nct6775",
67         "nct6776",
68         "nct6779",
69         "nct6791",
70         "nct6792",
71         "nct6793",
72         "nct6795",
73         "nct6796",
74         "nct6797",
75         "nct6798",
76 };
77
78 /* Common and NCT6775 specific data */
79
80 /* Voltage min/max registers for nr=7..14 are in bank 5 */
81
82 static const u16 NCT6775_REG_IN_MAX[] = {
83         0x2b, 0x2d, 0x2f, 0x31, 0x33, 0x35, 0x37, 0x554, 0x556, 0x558, 0x55a,
84         0x55c, 0x55e, 0x560, 0x562 };
85 static const u16 NCT6775_REG_IN_MIN[] = {
86         0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x555, 0x557, 0x559, 0x55b,
87         0x55d, 0x55f, 0x561, 0x563 };
88 static const u16 NCT6775_REG_IN[] = {
89         0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x550, 0x551, 0x552
90 };
91
92 #define NCT6775_REG_VBAT                0x5D
93 #define NCT6775_REG_DIODE               0x5E
94 #define NCT6775_DIODE_MASK              0x02
95
96 static const u16 NCT6775_REG_ALARM[NUM_REG_ALARM] = { 0x459, 0x45A, 0x45B };
97
98 /* 0..15 voltages, 16..23 fans, 24..29 temperatures, 30..31 intrusion */
99
100 static const s8 NCT6775_ALARM_BITS[] = {
101         0, 1, 2, 3, 8, 21, 20, 16,      /* in0.. in7 */
102         17, -1, -1, -1, -1, -1, -1,     /* in8..in14 */
103         -1,                             /* unused */
104         6, 7, 11, -1, -1,               /* fan1..fan5 */
105         -1, -1, -1,                     /* unused */
106         4, 5, 13, -1, -1, -1,           /* temp1..temp6 */
107         12, -1 };                       /* intrusion0, intrusion1 */
108
109 static const u16 NCT6775_REG_BEEP[NUM_REG_BEEP] = { 0x56, 0x57, 0x453, 0x4e };
110
111 /*
112  * 0..14 voltages, 15 global beep enable, 16..23 fans, 24..29 temperatures,
113  * 30..31 intrusion
114  */
115 static const s8 NCT6775_BEEP_BITS[] = {
116         0, 1, 2, 3, 8, 9, 10, 16,       /* in0.. in7 */
117         17, -1, -1, -1, -1, -1, -1,     /* in8..in14 */
118         21,                             /* global beep enable */
119         6, 7, 11, 28, -1,               /* fan1..fan5 */
120         -1, -1, -1,                     /* unused */
121         4, 5, 13, -1, -1, -1,           /* temp1..temp6 */
122         12, -1 };                       /* intrusion0, intrusion1 */
123
124 /* DC or PWM output fan configuration */
125 static const u8 NCT6775_REG_PWM_MODE[] = { 0x04, 0x04, 0x12 };
126 static const u8 NCT6775_PWM_MODE_MASK[] = { 0x01, 0x02, 0x01 };
127
128 /* Advanced Fan control, some values are common for all fans */
129
130 static const u16 NCT6775_REG_TARGET[] = {
131         0x101, 0x201, 0x301, 0x801, 0x901, 0xa01, 0xb01 };
132 static const u16 NCT6775_REG_FAN_MODE[] = {
133         0x102, 0x202, 0x302, 0x802, 0x902, 0xa02, 0xb02 };
134 static const u16 NCT6775_REG_FAN_STEP_DOWN_TIME[] = {
135         0x103, 0x203, 0x303, 0x803, 0x903, 0xa03, 0xb03 };
136 static const u16 NCT6775_REG_FAN_STEP_UP_TIME[] = {
137         0x104, 0x204, 0x304, 0x804, 0x904, 0xa04, 0xb04 };
138 static const u16 NCT6775_REG_FAN_STOP_OUTPUT[] = {
139         0x105, 0x205, 0x305, 0x805, 0x905, 0xa05, 0xb05 };
140 static const u16 NCT6775_REG_FAN_START_OUTPUT[] = {
141         0x106, 0x206, 0x306, 0x806, 0x906, 0xa06, 0xb06 };
142 static const u16 NCT6775_REG_FAN_MAX_OUTPUT[] = { 0x10a, 0x20a, 0x30a };
143 static const u16 NCT6775_REG_FAN_STEP_OUTPUT[] = { 0x10b, 0x20b, 0x30b };
144
145 static const u16 NCT6775_REG_FAN_STOP_TIME[] = {
146         0x107, 0x207, 0x307, 0x807, 0x907, 0xa07, 0xb07 };
147 static const u16 NCT6775_REG_PWM[] = {
148         0x109, 0x209, 0x309, 0x809, 0x909, 0xa09, 0xb09 };
149 static const u16 NCT6775_REG_PWM_READ[] = {
150         0x01, 0x03, 0x11, 0x13, 0x15, 0xa09, 0xb09 };
151
152 static const u16 NCT6775_REG_FAN[] = { 0x630, 0x632, 0x634, 0x636, 0x638 };
153 static const u16 NCT6775_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d };
154 static const u16 NCT6775_REG_FAN_PULSES[NUM_FAN] = {
155         0x641, 0x642, 0x643, 0x644 };
156 static const u16 NCT6775_FAN_PULSE_SHIFT[NUM_FAN] = { };
157
158 static const u16 NCT6775_REG_TEMP[] = {
159         0x27, 0x150, 0x250, 0x62b, 0x62c, 0x62d };
160
161 static const u16 NCT6775_REG_TEMP_MON[] = { 0x73, 0x75, 0x77 };
162
163 static const u16 NCT6775_REG_TEMP_CONFIG[ARRAY_SIZE(NCT6775_REG_TEMP)] = {
164         0, 0x152, 0x252, 0x628, 0x629, 0x62A };
165 static const u16 NCT6775_REG_TEMP_HYST[ARRAY_SIZE(NCT6775_REG_TEMP)] = {
166         0x3a, 0x153, 0x253, 0x673, 0x678, 0x67D };
167 static const u16 NCT6775_REG_TEMP_OVER[ARRAY_SIZE(NCT6775_REG_TEMP)] = {
168         0x39, 0x155, 0x255, 0x672, 0x677, 0x67C };
169
170 static const u16 NCT6775_REG_TEMP_SOURCE[ARRAY_SIZE(NCT6775_REG_TEMP)] = {
171         0x621, 0x622, 0x623, 0x624, 0x625, 0x626 };
172
173 static const u16 NCT6775_REG_TEMP_SEL[] = {
174         0x100, 0x200, 0x300, 0x800, 0x900, 0xa00, 0xb00 };
175
176 static const u16 NCT6775_REG_WEIGHT_TEMP_SEL[] = {
177         0x139, 0x239, 0x339, 0x839, 0x939, 0xa39 };
178 static const u16 NCT6775_REG_WEIGHT_TEMP_STEP[] = {
179         0x13a, 0x23a, 0x33a, 0x83a, 0x93a, 0xa3a };
180 static const u16 NCT6775_REG_WEIGHT_TEMP_STEP_TOL[] = {
181         0x13b, 0x23b, 0x33b, 0x83b, 0x93b, 0xa3b };
182 static const u16 NCT6775_REG_WEIGHT_DUTY_STEP[] = {
183         0x13c, 0x23c, 0x33c, 0x83c, 0x93c, 0xa3c };
184 static const u16 NCT6775_REG_WEIGHT_TEMP_BASE[] = {
185         0x13d, 0x23d, 0x33d, 0x83d, 0x93d, 0xa3d };
186
187 static const u16 NCT6775_REG_TEMP_OFFSET[] = { 0x454, 0x455, 0x456 };
188
189 static const u16 NCT6775_REG_AUTO_TEMP[] = {
190         0x121, 0x221, 0x321, 0x821, 0x921, 0xa21, 0xb21 };
191 static const u16 NCT6775_REG_AUTO_PWM[] = {
192         0x127, 0x227, 0x327, 0x827, 0x927, 0xa27, 0xb27 };
193
194 #define NCT6775_AUTO_TEMP(data, nr, p)  ((data)->REG_AUTO_TEMP[nr] + (p))
195 #define NCT6775_AUTO_PWM(data, nr, p)   ((data)->REG_AUTO_PWM[nr] + (p))
196
197 static const u16 NCT6775_REG_CRITICAL_ENAB[] = { 0x134, 0x234, 0x334 };
198
199 static const u16 NCT6775_REG_CRITICAL_TEMP[] = {
200         0x135, 0x235, 0x335, 0x835, 0x935, 0xa35, 0xb35 };
201 static const u16 NCT6775_REG_CRITICAL_TEMP_TOLERANCE[] = {
202         0x138, 0x238, 0x338, 0x838, 0x938, 0xa38, 0xb38 };
203
204 static const char *const nct6775_temp_label[] = {
205         "",
206         "SYSTIN",
207         "CPUTIN",
208         "AUXTIN",
209         "AMD SB-TSI",
210         "PECI Agent 0",
211         "PECI Agent 1",
212         "PECI Agent 2",
213         "PECI Agent 3",
214         "PECI Agent 4",
215         "PECI Agent 5",
216         "PECI Agent 6",
217         "PECI Agent 7",
218         "PCH_CHIP_CPU_MAX_TEMP",
219         "PCH_CHIP_TEMP",
220         "PCH_CPU_TEMP",
221         "PCH_MCH_TEMP",
222         "PCH_DIM0_TEMP",
223         "PCH_DIM1_TEMP",
224         "PCH_DIM2_TEMP",
225         "PCH_DIM3_TEMP"
226 };
227
228 #define NCT6775_TEMP_MASK       0x001ffffe
229 #define NCT6775_VIRT_TEMP_MASK  0x00000000
230
231 static const u16 NCT6775_REG_TEMP_ALTERNATE[32] = {
232         [13] = 0x661,
233         [14] = 0x662,
234         [15] = 0x664,
235 };
236
237 static const u16 NCT6775_REG_TEMP_CRIT[32] = {
238         [4] = 0xa00,
239         [5] = 0xa01,
240         [6] = 0xa02,
241         [7] = 0xa03,
242         [8] = 0xa04,
243         [9] = 0xa05,
244         [10] = 0xa06,
245         [11] = 0xa07
246 };
247
248 static const u16 NCT6775_REG_TSI_TEMP[] = { 0x669 };
249
250 /* NCT6776 specific data */
251
252 /* STEP_UP_TIME and STEP_DOWN_TIME regs are swapped for all chips but NCT6775 */
253 #define NCT6776_REG_FAN_STEP_UP_TIME NCT6775_REG_FAN_STEP_DOWN_TIME
254 #define NCT6776_REG_FAN_STEP_DOWN_TIME NCT6775_REG_FAN_STEP_UP_TIME
255
256 static const s8 NCT6776_ALARM_BITS[] = {
257         0, 1, 2, 3, 8, 21, 20, 16,      /* in0.. in7 */
258         17, -1, -1, -1, -1, -1, -1,     /* in8..in14 */
259         -1,                             /* unused */
260         6, 7, 11, 10, 23,               /* fan1..fan5 */
261         -1, -1, -1,                     /* unused */
262         4, 5, 13, -1, -1, -1,           /* temp1..temp6 */
263         12, 9 };                        /* intrusion0, intrusion1 */
264
265 static const u16 NCT6776_REG_BEEP[NUM_REG_BEEP] = { 0xb2, 0xb3, 0xb4, 0xb5 };
266
267 static const s8 NCT6776_BEEP_BITS[] = {
268         0, 1, 2, 3, 4, 5, 6, 7,         /* in0.. in7 */
269         8, -1, -1, -1, -1, -1, -1,      /* in8..in14 */
270         24,                             /* global beep enable */
271         25, 26, 27, 28, 29,             /* fan1..fan5 */
272         -1, -1, -1,                     /* unused */
273         16, 17, 18, 19, 20, 21,         /* temp1..temp6 */
274         30, 31 };                       /* intrusion0, intrusion1 */
275
276 static const u16 NCT6776_REG_TOLERANCE_H[] = {
277         0x10c, 0x20c, 0x30c, 0x80c, 0x90c, 0xa0c, 0xb0c };
278
279 static const u8 NCT6776_REG_PWM_MODE[] = { 0x04, 0, 0, 0, 0, 0 };
280 static const u8 NCT6776_PWM_MODE_MASK[] = { 0x01, 0, 0, 0, 0, 0 };
281
282 static const u16 NCT6776_REG_FAN_MIN[] = {
283         0x63a, 0x63c, 0x63e, 0x640, 0x642, 0x64a, 0x64c };
284 static const u16 NCT6776_REG_FAN_PULSES[NUM_FAN] = {
285         0x644, 0x645, 0x646, 0x647, 0x648, 0x649 };
286
287 static const u16 NCT6776_REG_WEIGHT_DUTY_BASE[] = {
288         0x13e, 0x23e, 0x33e, 0x83e, 0x93e, 0xa3e };
289
290 static const u16 NCT6776_REG_TEMP_CONFIG[ARRAY_SIZE(NCT6775_REG_TEMP)] = {
291         0x18, 0x152, 0x252, 0x628, 0x629, 0x62A };
292
293 static const char *const nct6776_temp_label[] = {
294         "",
295         "SYSTIN",
296         "CPUTIN",
297         "AUXTIN",
298         "SMBUSMASTER 0",
299         "SMBUSMASTER 1",
300         "SMBUSMASTER 2",
301         "SMBUSMASTER 3",
302         "SMBUSMASTER 4",
303         "SMBUSMASTER 5",
304         "SMBUSMASTER 6",
305         "SMBUSMASTER 7",
306         "PECI Agent 0",
307         "PECI Agent 1",
308         "PCH_CHIP_CPU_MAX_TEMP",
309         "PCH_CHIP_TEMP",
310         "PCH_CPU_TEMP",
311         "PCH_MCH_TEMP",
312         "PCH_DIM0_TEMP",
313         "PCH_DIM1_TEMP",
314         "PCH_DIM2_TEMP",
315         "PCH_DIM3_TEMP",
316         "BYTE_TEMP"
317 };
318
319 #define NCT6776_TEMP_MASK       0x007ffffe
320 #define NCT6776_VIRT_TEMP_MASK  0x00000000
321
322 static const u16 NCT6776_REG_TEMP_ALTERNATE[32] = {
323         [14] = 0x401,
324         [15] = 0x402,
325         [16] = 0x404,
326 };
327
328 static const u16 NCT6776_REG_TEMP_CRIT[32] = {
329         [11] = 0x709,
330         [12] = 0x70a,
331 };
332
333 static const u16 NCT6776_REG_TSI_TEMP[] = {
334         0x409, 0x40b, 0x40d, 0x40f, 0x411, 0x413, 0x415, 0x417 };
335
336 /* NCT6779 specific data */
337
338 static const u16 NCT6779_REG_IN[] = {
339         0x480, 0x481, 0x482, 0x483, 0x484, 0x485, 0x486, 0x487,
340         0x488, 0x489, 0x48a, 0x48b, 0x48c, 0x48d, 0x48e };
341
342 static const u16 NCT6779_REG_ALARM[NUM_REG_ALARM] = {
343         0x459, 0x45A, 0x45B, 0x568 };
344
345 static const s8 NCT6779_ALARM_BITS[] = {
346         0, 1, 2, 3, 8, 21, 20, 16,      /* in0.. in7 */
347         17, 24, 25, 26, 27, 28, 29,     /* in8..in14 */
348         -1,                             /* unused */
349         6, 7, 11, 10, 23,               /* fan1..fan5 */
350         -1, -1, -1,                     /* unused */
351         4, 5, 13, -1, -1, -1,           /* temp1..temp6 */
352         12, 9 };                        /* intrusion0, intrusion1 */
353
354 static const s8 NCT6779_BEEP_BITS[] = {
355         0, 1, 2, 3, 4, 5, 6, 7,         /* in0.. in7 */
356         8, 9, 10, 11, 12, 13, 14,       /* in8..in14 */
357         24,                             /* global beep enable */
358         25, 26, 27, 28, 29,             /* fan1..fan5 */
359         -1, -1, -1,                     /* unused */
360         16, 17, -1, -1, -1, -1,         /* temp1..temp6 */
361         30, 31 };                       /* intrusion0, intrusion1 */
362
363 static const u16 NCT6779_REG_FAN[] = {
364         0x4c0, 0x4c2, 0x4c4, 0x4c6, 0x4c8, 0x4ca, 0x4ce };
365 static const u16 NCT6779_REG_FAN_PULSES[NUM_FAN] = {
366         0x644, 0x645, 0x646, 0x647, 0x648, 0x649, 0x64f };
367
368 static const u16 NCT6779_REG_CRITICAL_PWM_ENABLE[] = {
369         0x136, 0x236, 0x336, 0x836, 0x936, 0xa36, 0xb36 };
370 #define NCT6779_CRITICAL_PWM_ENABLE_MASK        0x01
371 static const u16 NCT6779_REG_CRITICAL_PWM[] = {
372         0x137, 0x237, 0x337, 0x837, 0x937, 0xa37, 0xb37 };
373
374 static const u16 NCT6779_REG_TEMP[] = { 0x27, 0x150 };
375 static const u16 NCT6779_REG_TEMP_MON[] = { 0x73, 0x75, 0x77, 0x79, 0x7b };
376 static const u16 NCT6779_REG_TEMP_CONFIG[ARRAY_SIZE(NCT6779_REG_TEMP)] = {
377         0x18, 0x152 };
378 static const u16 NCT6779_REG_TEMP_HYST[ARRAY_SIZE(NCT6779_REG_TEMP)] = {
379         0x3a, 0x153 };
380 static const u16 NCT6779_REG_TEMP_OVER[ARRAY_SIZE(NCT6779_REG_TEMP)] = {
381         0x39, 0x155 };
382
383 static const u16 NCT6779_REG_TEMP_OFFSET[] = {
384         0x454, 0x455, 0x456, 0x44a, 0x44b, 0x44c };
385
386 static const char *const nct6779_temp_label[] = {
387         "",
388         "SYSTIN",
389         "CPUTIN",
390         "AUXTIN0",
391         "AUXTIN1",
392         "AUXTIN2",
393         "AUXTIN3",
394         "",
395         "SMBUSMASTER 0",
396         "SMBUSMASTER 1",
397         "SMBUSMASTER 2",
398         "SMBUSMASTER 3",
399         "SMBUSMASTER 4",
400         "SMBUSMASTER 5",
401         "SMBUSMASTER 6",
402         "SMBUSMASTER 7",
403         "PECI Agent 0",
404         "PECI Agent 1",
405         "PCH_CHIP_CPU_MAX_TEMP",
406         "PCH_CHIP_TEMP",
407         "PCH_CPU_TEMP",
408         "PCH_MCH_TEMP",
409         "PCH_DIM0_TEMP",
410         "PCH_DIM1_TEMP",
411         "PCH_DIM2_TEMP",
412         "PCH_DIM3_TEMP",
413         "BYTE_TEMP",
414         "",
415         "",
416         "",
417         "",
418         "Virtual_TEMP"
419 };
420
421 #define NCT6779_TEMP_MASK       0x07ffff7e
422 #define NCT6779_VIRT_TEMP_MASK  0x00000000
423 #define NCT6791_TEMP_MASK       0x87ffff7e
424 #define NCT6791_VIRT_TEMP_MASK  0x80000000
425
426 static const u16 NCT6779_REG_TEMP_ALTERNATE[32]
427         = { 0x490, 0x491, 0x492, 0x493, 0x494, 0x495, 0, 0,
428             0, 0, 0, 0, 0, 0, 0, 0,
429             0, 0x400, 0x401, 0x402, 0x404, 0x405, 0x406, 0x407,
430             0x408, 0 };
431
432 static const u16 NCT6779_REG_TEMP_CRIT[32] = {
433         [15] = 0x709,
434         [16] = 0x70a,
435 };
436
437 /* NCT6791 specific data */
438
439 static const u16 NCT6791_REG_WEIGHT_TEMP_SEL[NUM_FAN] = { 0, 0x239 };
440 static const u16 NCT6791_REG_WEIGHT_TEMP_STEP[NUM_FAN] = { 0, 0x23a };
441 static const u16 NCT6791_REG_WEIGHT_TEMP_STEP_TOL[NUM_FAN] = { 0, 0x23b };
442 static const u16 NCT6791_REG_WEIGHT_DUTY_STEP[NUM_FAN] = { 0, 0x23c };
443 static const u16 NCT6791_REG_WEIGHT_TEMP_BASE[NUM_FAN] = { 0, 0x23d };
444 static const u16 NCT6791_REG_WEIGHT_DUTY_BASE[NUM_FAN] = { 0, 0x23e };
445
446 static const u16 NCT6791_REG_ALARM[NUM_REG_ALARM] = {
447         0x459, 0x45A, 0x45B, 0x568, 0x45D };
448
449 static const s8 NCT6791_ALARM_BITS[] = {
450         0, 1, 2, 3, 8, 21, 20, 16,      /* in0.. in7 */
451         17, 24, 25, 26, 27, 28, 29,     /* in8..in14 */
452         -1,                             /* unused */
453         6, 7, 11, 10, 23, 33,           /* fan1..fan6 */
454         -1, -1,                         /* unused */
455         4, 5, 13, -1, -1, -1,           /* temp1..temp6 */
456         12, 9 };                        /* intrusion0, intrusion1 */
457
458 /* NCT6792/NCT6793 specific data */
459
460 static const u16 NCT6792_REG_TEMP_MON[] = {
461         0x73, 0x75, 0x77, 0x79, 0x7b, 0x7d };
462 static const u16 NCT6792_REG_BEEP[NUM_REG_BEEP] = {
463         0xb2, 0xb3, 0xb4, 0xb5, 0xbf };
464
465 static const char *const nct6792_temp_label[] = {
466         "",
467         "SYSTIN",
468         "CPUTIN",
469         "AUXTIN0",
470         "AUXTIN1",
471         "AUXTIN2",
472         "AUXTIN3",
473         "",
474         "SMBUSMASTER 0",
475         "SMBUSMASTER 1",
476         "SMBUSMASTER 2",
477         "SMBUSMASTER 3",
478         "SMBUSMASTER 4",
479         "SMBUSMASTER 5",
480         "SMBUSMASTER 6",
481         "SMBUSMASTER 7",
482         "PECI Agent 0",
483         "PECI Agent 1",
484         "PCH_CHIP_CPU_MAX_TEMP",
485         "PCH_CHIP_TEMP",
486         "PCH_CPU_TEMP",
487         "PCH_MCH_TEMP",
488         "PCH_DIM0_TEMP",
489         "PCH_DIM1_TEMP",
490         "PCH_DIM2_TEMP",
491         "PCH_DIM3_TEMP",
492         "BYTE_TEMP",
493         "PECI Agent 0 Calibration",
494         "PECI Agent 1 Calibration",
495         "",
496         "",
497         "Virtual_TEMP"
498 };
499
500 #define NCT6792_TEMP_MASK       0x9fffff7e
501 #define NCT6792_VIRT_TEMP_MASK  0x80000000
502
503 static const char *const nct6793_temp_label[] = {
504         "",
505         "SYSTIN",
506         "CPUTIN",
507         "AUXTIN0",
508         "AUXTIN1",
509         "AUXTIN2",
510         "AUXTIN3",
511         "",
512         "SMBUSMASTER 0",
513         "SMBUSMASTER 1",
514         "",
515         "",
516         "",
517         "",
518         "",
519         "",
520         "PECI Agent 0",
521         "PECI Agent 1",
522         "PCH_CHIP_CPU_MAX_TEMP",
523         "PCH_CHIP_TEMP",
524         "PCH_CPU_TEMP",
525         "PCH_MCH_TEMP",
526         "Agent0 Dimm0 ",
527         "Agent0 Dimm1",
528         "Agent1 Dimm0",
529         "Agent1 Dimm1",
530         "BYTE_TEMP0",
531         "BYTE_TEMP1",
532         "PECI Agent 0 Calibration",
533         "PECI Agent 1 Calibration",
534         "",
535         "Virtual_TEMP"
536 };
537
538 #define NCT6793_TEMP_MASK       0xbfff037e
539 #define NCT6793_VIRT_TEMP_MASK  0x80000000
540
541 static const char *const nct6795_temp_label[] = {
542         "",
543         "SYSTIN",
544         "CPUTIN",
545         "AUXTIN0",
546         "AUXTIN1",
547         "AUXTIN2",
548         "AUXTIN3",
549         "",
550         "SMBUSMASTER 0",
551         "SMBUSMASTER 1",
552         "SMBUSMASTER 2",
553         "SMBUSMASTER 3",
554         "SMBUSMASTER 4",
555         "SMBUSMASTER 5",
556         "SMBUSMASTER 6",
557         "SMBUSMASTER 7",
558         "PECI Agent 0",
559         "PECI Agent 1",
560         "PCH_CHIP_CPU_MAX_TEMP",
561         "PCH_CHIP_TEMP",
562         "PCH_CPU_TEMP",
563         "PCH_MCH_TEMP",
564         "Agent0 Dimm0",
565         "Agent0 Dimm1",
566         "Agent1 Dimm0",
567         "Agent1 Dimm1",
568         "BYTE_TEMP0",
569         "BYTE_TEMP1",
570         "PECI Agent 0 Calibration",
571         "PECI Agent 1 Calibration",
572         "",
573         "Virtual_TEMP"
574 };
575
576 #define NCT6795_TEMP_MASK       0xbfffff7e
577 #define NCT6795_VIRT_TEMP_MASK  0x80000000
578
579 static const char *const nct6796_temp_label[] = {
580         "",
581         "SYSTIN",
582         "CPUTIN",
583         "AUXTIN0",
584         "AUXTIN1",
585         "AUXTIN2",
586         "AUXTIN3",
587         "AUXTIN4",
588         "SMBUSMASTER 0",
589         "SMBUSMASTER 1",
590         "Virtual_TEMP",
591         "Virtual_TEMP",
592         "",
593         "",
594         "",
595         "",
596         "PECI Agent 0",
597         "PECI Agent 1",
598         "PCH_CHIP_CPU_MAX_TEMP",
599         "PCH_CHIP_TEMP",
600         "PCH_CPU_TEMP",
601         "PCH_MCH_TEMP",
602         "Agent0 Dimm0",
603         "Agent0 Dimm1",
604         "Agent1 Dimm0",
605         "Agent1 Dimm1",
606         "BYTE_TEMP0",
607         "BYTE_TEMP1",
608         "PECI Agent 0 Calibration",
609         "PECI Agent 1 Calibration",
610         "",
611         "Virtual_TEMP"
612 };
613
614 #define NCT6796_TEMP_MASK       0xbfff0ffe
615 #define NCT6796_VIRT_TEMP_MASK  0x80000c00
616
617 static const u16 NCT6796_REG_TSI_TEMP[] = { 0x409, 0x40b };
618
619 static const char *const nct6798_temp_label[] = {
620         "",
621         "SYSTIN",
622         "CPUTIN",
623         "AUXTIN0",
624         "AUXTIN1",
625         "AUXTIN2",
626         "AUXTIN3",
627         "AUXTIN4",
628         "SMBUSMASTER 0",
629         "SMBUSMASTER 1",
630         "Virtual_TEMP",
631         "Virtual_TEMP",
632         "",
633         "",
634         "",
635         "",
636         "PECI Agent 0",
637         "PECI Agent 1",
638         "PCH_CHIP_CPU_MAX_TEMP",
639         "PCH_CHIP_TEMP",
640         "PCH_CPU_TEMP",
641         "PCH_MCH_TEMP",
642         "Agent0 Dimm0",
643         "Agent0 Dimm1",
644         "Agent1 Dimm0",
645         "Agent1 Dimm1",
646         "BYTE_TEMP0",
647         "BYTE_TEMP1",
648         "PECI Agent 0 Calibration",     /* undocumented */
649         "PECI Agent 1 Calibration",     /* undocumented */
650         "",
651         "Virtual_TEMP"
652 };
653
654 #define NCT6798_TEMP_MASK       0xbfff0ffe
655 #define NCT6798_VIRT_TEMP_MASK  0x80000c00
656
657 /* NCT6102D/NCT6106D specific data */
658
659 #define NCT6106_REG_VBAT        0x318
660 #define NCT6106_REG_DIODE       0x319
661 #define NCT6106_DIODE_MASK      0x01
662
663 static const u16 NCT6106_REG_IN_MAX[] = {
664         0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9e, 0xa0, 0xa2 };
665 static const u16 NCT6106_REG_IN_MIN[] = {
666         0x91, 0x93, 0x95, 0x97, 0x99, 0x9b, 0x9f, 0xa1, 0xa3 };
667 static const u16 NCT6106_REG_IN[] = {
668         0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09 };
669
670 static const u16 NCT6106_REG_TEMP[] = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15 };
671 static const u16 NCT6106_REG_TEMP_MON[] = { 0x18, 0x19, 0x1a };
672 static const u16 NCT6106_REG_TEMP_HYST[] = {
673         0xc3, 0xc7, 0xcb, 0xcf, 0xd3, 0xd7 };
674 static const u16 NCT6106_REG_TEMP_OVER[] = {
675         0xc2, 0xc6, 0xca, 0xce, 0xd2, 0xd6 };
676 static const u16 NCT6106_REG_TEMP_CRIT_L[] = {
677         0xc0, 0xc4, 0xc8, 0xcc, 0xd0, 0xd4 };
678 static const u16 NCT6106_REG_TEMP_CRIT_H[] = {
679         0xc1, 0xc5, 0xc9, 0xcf, 0xd1, 0xd5 };
680 static const u16 NCT6106_REG_TEMP_OFFSET[] = { 0x311, 0x312, 0x313 };
681 static const u16 NCT6106_REG_TEMP_CONFIG[] = {
682         0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc };
683
684 static const u16 NCT6106_REG_FAN[] = { 0x20, 0x22, 0x24 };
685 static const u16 NCT6106_REG_FAN_MIN[] = { 0xe0, 0xe2, 0xe4 };
686 static const u16 NCT6106_REG_FAN_PULSES[] = { 0xf6, 0xf6, 0xf6 };
687 static const u16 NCT6106_FAN_PULSE_SHIFT[] = { 0, 2, 4 };
688
689 static const u8 NCT6106_REG_PWM_MODE[] = { 0xf3, 0xf3, 0xf3 };
690 static const u8 NCT6106_PWM_MODE_MASK[] = { 0x01, 0x02, 0x04 };
691 static const u16 NCT6106_REG_PWM_READ[] = { 0x4a, 0x4b, 0x4c };
692 static const u16 NCT6106_REG_FAN_MODE[] = { 0x113, 0x123, 0x133 };
693 static const u16 NCT6106_REG_TEMP_SOURCE[] = {
694         0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5 };
695
696 static const u16 NCT6106_REG_CRITICAL_TEMP[] = { 0x11a, 0x12a, 0x13a };
697 static const u16 NCT6106_REG_CRITICAL_TEMP_TOLERANCE[] = {
698         0x11b, 0x12b, 0x13b };
699
700 static const u16 NCT6106_REG_CRITICAL_PWM_ENABLE[] = { 0x11c, 0x12c, 0x13c };
701 #define NCT6106_CRITICAL_PWM_ENABLE_MASK        0x10
702 static const u16 NCT6106_REG_CRITICAL_PWM[] = { 0x11d, 0x12d, 0x13d };
703
704 static const u16 NCT6106_REG_FAN_STEP_UP_TIME[] = { 0x114, 0x124, 0x134 };
705 static const u16 NCT6106_REG_FAN_STEP_DOWN_TIME[] = { 0x115, 0x125, 0x135 };
706 static const u16 NCT6106_REG_FAN_STOP_OUTPUT[] = { 0x116, 0x126, 0x136 };
707 static const u16 NCT6106_REG_FAN_START_OUTPUT[] = { 0x117, 0x127, 0x137 };
708 static const u16 NCT6106_REG_FAN_STOP_TIME[] = { 0x118, 0x128, 0x138 };
709 static const u16 NCT6106_REG_TOLERANCE_H[] = { 0x112, 0x122, 0x132 };
710
711 static const u16 NCT6106_REG_TARGET[] = { 0x111, 0x121, 0x131 };
712
713 static const u16 NCT6106_REG_WEIGHT_TEMP_SEL[] = { 0x168, 0x178, 0x188 };
714 static const u16 NCT6106_REG_WEIGHT_TEMP_STEP[] = { 0x169, 0x179, 0x189 };
715 static const u16 NCT6106_REG_WEIGHT_TEMP_STEP_TOL[] = { 0x16a, 0x17a, 0x18a };
716 static const u16 NCT6106_REG_WEIGHT_DUTY_STEP[] = { 0x16b, 0x17b, 0x18b };
717 static const u16 NCT6106_REG_WEIGHT_TEMP_BASE[] = { 0x16c, 0x17c, 0x18c };
718 static const u16 NCT6106_REG_WEIGHT_DUTY_BASE[] = { 0x16d, 0x17d, 0x18d };
719
720 static const u16 NCT6106_REG_AUTO_TEMP[] = { 0x160, 0x170, 0x180 };
721 static const u16 NCT6106_REG_AUTO_PWM[] = { 0x164, 0x174, 0x184 };
722
723 static const u16 NCT6106_REG_ALARM[NUM_REG_ALARM] = {
724         0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d };
725
726 static const s8 NCT6106_ALARM_BITS[] = {
727         0, 1, 2, 3, 4, 5, 7, 8,         /* in0.. in7 */
728         9, -1, -1, -1, -1, -1, -1,      /* in8..in14 */
729         -1,                             /* unused */
730         32, 33, 34, -1, -1,             /* fan1..fan5 */
731         -1, -1, -1,                     /* unused */
732         16, 17, 18, 19, 20, 21,         /* temp1..temp6 */
733         48, -1                          /* intrusion0, intrusion1 */
734 };
735
736 static const u16 NCT6106_REG_BEEP[NUM_REG_BEEP] = {
737         0x3c0, 0x3c1, 0x3c2, 0x3c3, 0x3c4 };
738
739 static const s8 NCT6106_BEEP_BITS[] = {
740         0, 1, 2, 3, 4, 5, 7, 8,         /* in0.. in7 */
741         9, 10, 11, 12, -1, -1, -1,      /* in8..in14 */
742         32,                             /* global beep enable */
743         24, 25, 26, 27, 28,             /* fan1..fan5 */
744         -1, -1, -1,                     /* unused */
745         16, 17, 18, 19, 20, 21,         /* temp1..temp6 */
746         34, -1                          /* intrusion0, intrusion1 */
747 };
748
749 static const u16 NCT6106_REG_TEMP_ALTERNATE[32] = {
750         [14] = 0x51,
751         [15] = 0x52,
752         [16] = 0x54,
753 };
754
755 static const u16 NCT6106_REG_TEMP_CRIT[32] = {
756         [11] = 0x204,
757         [12] = 0x205,
758 };
759
760 static const u16 NCT6106_REG_TSI_TEMP[] = { 0x59, 0x5b, 0x5d, 0x5f, 0x61, 0x63, 0x65, 0x67 };
761
762 /* NCT6112D/NCT6114D/NCT6116D specific data */
763
764 static const u16 NCT6116_REG_FAN[] = { 0x20, 0x22, 0x24, 0x26, 0x28 };
765 static const u16 NCT6116_REG_FAN_MIN[] = { 0xe0, 0xe2, 0xe4, 0xe6, 0xe8 };
766 static const u16 NCT6116_REG_FAN_PULSES[] = { 0xf6, 0xf6, 0xf6, 0xf6, 0xf5 };
767 static const u16 NCT6116_FAN_PULSE_SHIFT[] = { 0, 2, 4, 6, 6 };
768
769 static const u16 NCT6116_REG_PWM[] = { 0x119, 0x129, 0x139, 0x199, 0x1a9 };
770 static const u16 NCT6116_REG_FAN_MODE[] = { 0x113, 0x123, 0x133, 0x193, 0x1a3 };
771 static const u16 NCT6116_REG_TEMP_SEL[] = { 0x110, 0x120, 0x130, 0x190, 0x1a0 };
772 static const u16 NCT6116_REG_TEMP_SOURCE[] = {
773         0xb0, 0xb1, 0xb2 };
774
775 static const u16 NCT6116_REG_CRITICAL_TEMP[] = {
776         0x11a, 0x12a, 0x13a, 0x19a, 0x1aa };
777 static const u16 NCT6116_REG_CRITICAL_TEMP_TOLERANCE[] = {
778         0x11b, 0x12b, 0x13b, 0x19b, 0x1ab };
779
780 static const u16 NCT6116_REG_CRITICAL_PWM_ENABLE[] = {
781         0x11c, 0x12c, 0x13c, 0x19c, 0x1ac };
782 static const u16 NCT6116_REG_CRITICAL_PWM[] = {
783         0x11d, 0x12d, 0x13d, 0x19d, 0x1ad };
784
785 static const u16 NCT6116_REG_FAN_STEP_UP_TIME[] = {
786         0x114, 0x124, 0x134, 0x194, 0x1a4 };
787 static const u16 NCT6116_REG_FAN_STEP_DOWN_TIME[] = {
788         0x115, 0x125, 0x135, 0x195, 0x1a5 };
789 static const u16 NCT6116_REG_FAN_STOP_OUTPUT[] = {
790         0x116, 0x126, 0x136, 0x196, 0x1a6 };
791 static const u16 NCT6116_REG_FAN_START_OUTPUT[] = {
792         0x117, 0x127, 0x137, 0x197, 0x1a7 };
793 static const u16 NCT6116_REG_FAN_STOP_TIME[] = {
794         0x118, 0x128, 0x138, 0x198, 0x1a8 };
795 static const u16 NCT6116_REG_TOLERANCE_H[] = {
796         0x112, 0x122, 0x132, 0x192, 0x1a2 };
797
798 static const u16 NCT6116_REG_TARGET[] = {
799         0x111, 0x121, 0x131, 0x191, 0x1a1 };
800
801 static const u16 NCT6116_REG_AUTO_TEMP[] = {
802         0x160, 0x170, 0x180, 0x1d0, 0x1e0 };
803 static const u16 NCT6116_REG_AUTO_PWM[] = {
804         0x164, 0x174, 0x184, 0x1d4, 0x1e4 };
805
806 static const s8 NCT6116_ALARM_BITS[] = {
807         0, 1, 2, 3, 4, 5, 7, 8,         /* in0.. in7 */
808         9, -1, -1, -1, -1, -1, -1,      /* in8..in9 */
809         -1,                             /* unused */
810         32, 33, 34, 35, 36,             /* fan1..fan5 */
811         -1, -1, -1,                     /* unused */
812         16, 17, 18, -1, -1, -1,         /* temp1..temp6 */
813         48, -1                          /* intrusion0, intrusion1 */
814 };
815
816 static const s8 NCT6116_BEEP_BITS[] = {
817         0, 1, 2, 3, 4, 5, 7, 8,         /* in0.. in7 */
818         9, 10, 11, 12, -1, -1, -1,      /* in8..in14 */
819         32,                             /* global beep enable */
820         24, 25, 26, 27, 28,             /* fan1..fan5 */
821         -1, -1, -1,                     /* unused */
822         16, 17, 18, -1, -1, -1,         /* temp1..temp6 */
823         34, -1                          /* intrusion0, intrusion1 */
824 };
825
826 static const u16 NCT6116_REG_TSI_TEMP[] = { 0x59, 0x5b };
827
828 static enum pwm_enable reg_to_pwm_enable(int pwm, int mode)
829 {
830         if (mode == 0 && pwm == 255)
831                 return off;
832         return mode + 1;
833 }
834
835 static int pwm_enable_to_reg(enum pwm_enable mode)
836 {
837         if (mode == off)
838                 return 0;
839         return mode - 1;
840 }
841
842 /*
843  * Conversions
844  */
845
846 /* 1 is DC mode, output in ms */
847 static unsigned int step_time_from_reg(u8 reg, u8 mode)
848 {
849         return mode ? 400 * reg : 100 * reg;
850 }
851
852 static u8 step_time_to_reg(unsigned int msec, u8 mode)
853 {
854         return clamp_val((mode ? (msec + 200) / 400 :
855                                         (msec + 50) / 100), 1, 255);
856 }
857
858 static unsigned int fan_from_reg8(u16 reg, unsigned int divreg)
859 {
860         if (reg == 0 || reg == 255)
861                 return 0;
862         return 1350000U / (reg << divreg);
863 }
864
865 static unsigned int fan_from_reg13(u16 reg, unsigned int divreg)
866 {
867         if ((reg & 0xff1f) == 0xff1f)
868                 return 0;
869
870         reg = (reg & 0x1f) | ((reg & 0xff00) >> 3);
871
872         if (reg == 0)
873                 return 0;
874
875         return 1350000U / reg;
876 }
877
878 static unsigned int fan_from_reg16(u16 reg, unsigned int divreg)
879 {
880         if (reg == 0 || reg == 0xffff)
881                 return 0;
882
883         /*
884          * Even though the registers are 16 bit wide, the fan divisor
885          * still applies.
886          */
887         return 1350000U / (reg << divreg);
888 }
889
890 static unsigned int fan_from_reg_rpm(u16 reg, unsigned int divreg)
891 {
892         return reg;
893 }
894
895 static u16 fan_to_reg(u32 fan, unsigned int divreg)
896 {
897         if (!fan)
898                 return 0;
899
900         return (1350000U / fan) >> divreg;
901 }
902
903 static inline unsigned int
904 div_from_reg(u8 reg)
905 {
906         return BIT(reg);
907 }
908
909 /*
910  * Some of the voltage inputs have internal scaling, the tables below
911  * contain 8 (the ADC LSB in mV) * scaling factor * 100
912  */
913 static const u16 scale_in[15] = {
914         800, 800, 1600, 1600, 800, 800, 800, 1600, 1600, 800, 800, 800, 800,
915         800, 800
916 };
917
918 static inline long in_from_reg(u8 reg, u8 nr)
919 {
920         return DIV_ROUND_CLOSEST(reg * scale_in[nr], 100);
921 }
922
923 static inline u8 in_to_reg(u32 val, u8 nr)
924 {
925         return clamp_val(DIV_ROUND_CLOSEST(val * 100, scale_in[nr]), 0, 255);
926 }
927
928 /* TSI temperatures are in 8.3 format */
929 static inline unsigned int tsi_temp_from_reg(unsigned int reg)
930 {
931         return (reg >> 5) * 125;
932 }
933
934 /*
935  * Data structures and manipulation thereof
936  */
937
938 struct sensor_device_template {
939         struct device_attribute dev_attr;
940         union {
941                 struct {
942                         u8 nr;
943                         u8 index;
944                 } s;
945                 int index;
946         } u;
947         bool s2;        /* true if both index and nr are used */
948 };
949
950 struct sensor_device_attr_u {
951         union {
952                 struct sensor_device_attribute a1;
953                 struct sensor_device_attribute_2 a2;
954         } u;
955         char name[32];
956 };
957
958 #define __TEMPLATE_ATTR(_template, _mode, _show, _store) {      \
959         .attr = {.name = _template, .mode = _mode },            \
960         .show   = _show,                                        \
961         .store  = _store,                                       \
962 }
963
964 #define SENSOR_DEVICE_TEMPLATE(_template, _mode, _show, _store, _index) \
965         { .dev_attr = __TEMPLATE_ATTR(_template, _mode, _show, _store), \
966           .u.index = _index,                                            \
967           .s2 = false }
968
969 #define SENSOR_DEVICE_TEMPLATE_2(_template, _mode, _show, _store,       \
970                                  _nr, _index)                           \
971         { .dev_attr = __TEMPLATE_ATTR(_template, _mode, _show, _store), \
972           .u.s.index = _index,                                          \
973           .u.s.nr = _nr,                                                \
974           .s2 = true }
975
976 #define SENSOR_TEMPLATE(_name, _template, _mode, _show, _store, _index) \
977 static struct sensor_device_template sensor_dev_template_##_name        \
978         = SENSOR_DEVICE_TEMPLATE(_template, _mode, _show, _store,       \
979                                  _index)
980
981 #define SENSOR_TEMPLATE_2(_name, _template, _mode, _show, _store,       \
982                           _nr, _index)                                  \
983 static struct sensor_device_template sensor_dev_template_##_name        \
984         = SENSOR_DEVICE_TEMPLATE_2(_template, _mode, _show, _store,     \
985                                  _nr, _index)
986
987 struct sensor_template_group {
988         struct sensor_device_template **templates;
989         umode_t (*is_visible)(struct kobject *, struct attribute *, int);
990         int base;
991 };
992
993 static int nct6775_add_template_attr_group(struct device *dev, struct nct6775_data *data,
994                                            const struct sensor_template_group *tg, int repeat)
995 {
996         struct attribute_group *group;
997         struct sensor_device_attr_u *su;
998         struct sensor_device_attribute *a;
999         struct sensor_device_attribute_2 *a2;
1000         struct attribute **attrs;
1001         struct sensor_device_template **t;
1002         int i, count;
1003
1004         if (repeat <= 0)
1005                 return -EINVAL;
1006
1007         t = tg->templates;
1008         for (count = 0; *t; t++, count++)
1009                 ;
1010
1011         if (count == 0)
1012                 return -EINVAL;
1013
1014         group = devm_kzalloc(dev, sizeof(*group), GFP_KERNEL);
1015         if (group == NULL)
1016                 return -ENOMEM;
1017
1018         attrs = devm_kcalloc(dev, repeat * count + 1, sizeof(*attrs),
1019                              GFP_KERNEL);
1020         if (attrs == NULL)
1021                 return -ENOMEM;
1022
1023         su = devm_kzalloc(dev, array3_size(repeat, count, sizeof(*su)),
1024                                GFP_KERNEL);
1025         if (su == NULL)
1026                 return -ENOMEM;
1027
1028         group->attrs = attrs;
1029         group->is_visible = tg->is_visible;
1030
1031         for (i = 0; i < repeat; i++) {
1032                 t = tg->templates;
1033                 while (*t != NULL) {
1034                         snprintf(su->name, sizeof(su->name),
1035                                  (*t)->dev_attr.attr.name, tg->base + i);
1036                         if ((*t)->s2) {
1037                                 a2 = &su->u.a2;
1038                                 sysfs_attr_init(&a2->dev_attr.attr);
1039                                 a2->dev_attr.attr.name = su->name;
1040                                 a2->nr = (*t)->u.s.nr + i;
1041                                 a2->index = (*t)->u.s.index;
1042                                 a2->dev_attr.attr.mode =
1043                                   (*t)->dev_attr.attr.mode;
1044                                 a2->dev_attr.show = (*t)->dev_attr.show;
1045                                 a2->dev_attr.store = (*t)->dev_attr.store;
1046                                 *attrs = &a2->dev_attr.attr;
1047                         } else {
1048                                 a = &su->u.a1;
1049                                 sysfs_attr_init(&a->dev_attr.attr);
1050                                 a->dev_attr.attr.name = su->name;
1051                                 a->index = (*t)->u.index + i;
1052                                 a->dev_attr.attr.mode =
1053                                   (*t)->dev_attr.attr.mode;
1054                                 a->dev_attr.show = (*t)->dev_attr.show;
1055                                 a->dev_attr.store = (*t)->dev_attr.store;
1056                                 *attrs = &a->dev_attr.attr;
1057                         }
1058                         attrs++;
1059                         su++;
1060                         t++;
1061                 }
1062         }
1063
1064         return nct6775_add_attr_group(data, group);
1065 }
1066
1067 bool nct6775_reg_is_word_sized(struct nct6775_data *data, u16 reg)
1068 {
1069         switch (data->kind) {
1070         case nct6106:
1071                 return reg == 0x20 || reg == 0x22 || reg == 0x24 ||
1072                   (reg >= 0x59 && reg < 0x69 && (reg & 1)) ||
1073                   reg == 0xe0 || reg == 0xe2 || reg == 0xe4 ||
1074                   reg == 0x111 || reg == 0x121 || reg == 0x131;
1075         case nct6116:
1076                 return reg == 0x20 || reg == 0x22 || reg == 0x24 ||
1077                   reg == 0x26 || reg == 0x28 || reg == 0x59 || reg == 0x5b ||
1078                   reg == 0xe0 || reg == 0xe2 || reg == 0xe4 || reg == 0xe6 ||
1079                   reg == 0xe8 || reg == 0x111 || reg == 0x121 || reg == 0x131 ||
1080                   reg == 0x191 || reg == 0x1a1;
1081         case nct6775:
1082                 return (((reg & 0xff00) == 0x100 ||
1083                     (reg & 0xff00) == 0x200) &&
1084                    ((reg & 0x00ff) == 0x50 ||
1085                     (reg & 0x00ff) == 0x53 ||
1086                     (reg & 0x00ff) == 0x55)) ||
1087                   (reg & 0xfff0) == 0x630 ||
1088                   reg == 0x640 || reg == 0x642 ||
1089                   reg == 0x662 || reg == 0x669 ||
1090                   ((reg & 0xfff0) == 0x650 && (reg & 0x000f) >= 0x06) ||
1091                   reg == 0x73 || reg == 0x75 || reg == 0x77;
1092         case nct6776:
1093                 return (((reg & 0xff00) == 0x100 ||
1094                     (reg & 0xff00) == 0x200) &&
1095                    ((reg & 0x00ff) == 0x50 ||
1096                     (reg & 0x00ff) == 0x53 ||
1097                     (reg & 0x00ff) == 0x55)) ||
1098                   (reg & 0xfff0) == 0x630 ||
1099                   reg == 0x402 ||
1100                   (reg >= 0x409 && reg < 0x419 && (reg & 1)) ||
1101                   reg == 0x640 || reg == 0x642 ||
1102                   ((reg & 0xfff0) == 0x650 && (reg & 0x000f) >= 0x06) ||
1103                   reg == 0x73 || reg == 0x75 || reg == 0x77;
1104         case nct6779:
1105         case nct6791:
1106         case nct6792:
1107         case nct6793:
1108         case nct6795:
1109         case nct6796:
1110         case nct6797:
1111         case nct6798:
1112                 return reg == 0x150 || reg == 0x153 || reg == 0x155 ||
1113                   (reg & 0xfff0) == 0x4c0 ||
1114                   reg == 0x402 ||
1115                   (reg >= 0x409 && reg < 0x419 && (reg & 1)) ||
1116                   reg == 0x63a || reg == 0x63c || reg == 0x63e ||
1117                   reg == 0x640 || reg == 0x642 || reg == 0x64a ||
1118                   reg == 0x64c ||
1119                   reg == 0x73 || reg == 0x75 || reg == 0x77 || reg == 0x79 ||
1120                   reg == 0x7b || reg == 0x7d;
1121         }
1122         return false;
1123 }
1124 EXPORT_SYMBOL_GPL(nct6775_reg_is_word_sized);
1125
1126 /* We left-align 8-bit temperature values to make the code simpler */
1127 static int nct6775_read_temp(struct nct6775_data *data, u16 reg, u16 *val)
1128 {
1129         int err;
1130
1131         err = nct6775_read_value(data, reg, val);
1132         if (err)
1133                 return err;
1134
1135         if (!nct6775_reg_is_word_sized(data, reg))
1136                 *val <<= 8;
1137
1138         return 0;
1139 }
1140
1141 /* This function assumes that the caller holds data->update_lock */
1142 static int nct6775_write_fan_div(struct nct6775_data *data, int nr)
1143 {
1144         u16 reg;
1145         int err;
1146         u16 fandiv_reg = nr < 2 ? NCT6775_REG_FANDIV1 : NCT6775_REG_FANDIV2;
1147         unsigned int oddshift = (nr & 1) * 4; /* masks shift by four if nr is odd */
1148
1149         err = nct6775_read_value(data, fandiv_reg, &reg);
1150         if (err)
1151                 return err;
1152         reg &= 0x70 >> oddshift;
1153         reg |= data->fan_div[nr] & (0x7 << oddshift);
1154         return nct6775_write_value(data, fandiv_reg, reg);
1155 }
1156
1157 static int nct6775_write_fan_div_common(struct nct6775_data *data, int nr)
1158 {
1159         if (data->kind == nct6775)
1160                 return nct6775_write_fan_div(data, nr);
1161         return 0;
1162 }
1163
1164 static int nct6775_update_fan_div(struct nct6775_data *data)
1165 {
1166         int err;
1167         u16 i;
1168
1169         err = nct6775_read_value(data, NCT6775_REG_FANDIV1, &i);
1170         if (err)
1171                 return err;
1172         data->fan_div[0] = i & 0x7;
1173         data->fan_div[1] = (i & 0x70) >> 4;
1174         err = nct6775_read_value(data, NCT6775_REG_FANDIV2, &i);
1175         if (err)
1176                 return err;
1177         data->fan_div[2] = i & 0x7;
1178         if (data->has_fan & BIT(3))
1179                 data->fan_div[3] = (i & 0x70) >> 4;
1180
1181         return 0;
1182 }
1183
1184 static int nct6775_update_fan_div_common(struct nct6775_data *data)
1185 {
1186         if (data->kind == nct6775)
1187                 return nct6775_update_fan_div(data);
1188         return 0;
1189 }
1190
1191 static int nct6775_init_fan_div(struct nct6775_data *data)
1192 {
1193         int i, err;
1194
1195         err = nct6775_update_fan_div_common(data);
1196         if (err)
1197                 return err;
1198
1199         /*
1200          * For all fans, start with highest divider value if the divider
1201          * register is not initialized. This ensures that we get a
1202          * reading from the fan count register, even if it is not optimal.
1203          * We'll compute a better divider later on.
1204          */
1205         for (i = 0; i < ARRAY_SIZE(data->fan_div); i++) {
1206                 if (!(data->has_fan & BIT(i)))
1207                         continue;
1208                 if (data->fan_div[i] == 0) {
1209                         data->fan_div[i] = 7;
1210                         err = nct6775_write_fan_div_common(data, i);
1211                         if (err)
1212                                 return err;
1213                 }
1214         }
1215
1216         return 0;
1217 }
1218
1219 static int nct6775_init_fan_common(struct device *dev,
1220                                    struct nct6775_data *data)
1221 {
1222         int i, err;
1223         u16 reg;
1224
1225         if (data->has_fan_div) {
1226                 err = nct6775_init_fan_div(data);
1227                 if (err)
1228                         return err;
1229         }
1230
1231         /*
1232          * If fan_min is not set (0), set it to 0xff to disable it. This
1233          * prevents the unnecessary warning when fanX_min is reported as 0.
1234          */
1235         for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) {
1236                 if (data->has_fan_min & BIT(i)) {
1237                         err = nct6775_read_value(data, data->REG_FAN_MIN[i], &reg);
1238                         if (err)
1239                                 return err;
1240                         if (!reg) {
1241                                 err = nct6775_write_value(data, data->REG_FAN_MIN[i],
1242                                                           data->has_fan_div ? 0xff : 0xff1f);
1243                                 if (err)
1244                                         return err;
1245                         }
1246                 }
1247         }
1248
1249         return 0;
1250 }
1251
1252 static int nct6775_select_fan_div(struct device *dev,
1253                                   struct nct6775_data *data, int nr, u16 reg)
1254 {
1255         int err;
1256         u8 fan_div = data->fan_div[nr];
1257         u16 fan_min;
1258
1259         if (!data->has_fan_div)
1260                 return 0;
1261
1262         /*
1263          * If we failed to measure the fan speed, or the reported value is not
1264          * in the optimal range, and the clock divider can be modified,
1265          * let's try that for next time.
1266          */
1267         if (reg == 0x00 && fan_div < 0x07)
1268                 fan_div++;
1269         else if (reg != 0x00 && reg < 0x30 && fan_div > 0)
1270                 fan_div--;
1271
1272         if (fan_div != data->fan_div[nr]) {
1273                 dev_dbg(dev, "Modifying fan%d clock divider from %u to %u\n",
1274                         nr + 1, div_from_reg(data->fan_div[nr]),
1275                         div_from_reg(fan_div));
1276
1277                 /* Preserve min limit if possible */
1278                 if (data->has_fan_min & BIT(nr)) {
1279                         fan_min = data->fan_min[nr];
1280                         if (fan_div > data->fan_div[nr]) {
1281                                 if (fan_min != 255 && fan_min > 1)
1282                                         fan_min >>= 1;
1283                         } else {
1284                                 if (fan_min != 255) {
1285                                         fan_min <<= 1;
1286                                         if (fan_min > 254)
1287                                                 fan_min = 254;
1288                                 }
1289                         }
1290                         if (fan_min != data->fan_min[nr]) {
1291                                 data->fan_min[nr] = fan_min;
1292                                 err = nct6775_write_value(data, data->REG_FAN_MIN[nr], fan_min);
1293                                 if (err)
1294                                         return err;
1295                         }
1296                 }
1297                 data->fan_div[nr] = fan_div;
1298                 err = nct6775_write_fan_div_common(data, nr);
1299                 if (err)
1300                         return err;
1301         }
1302
1303         return 0;
1304 }
1305
1306 static int nct6775_update_pwm(struct device *dev)
1307 {
1308         struct nct6775_data *data = dev_get_drvdata(dev);
1309         int i, j, err;
1310         u16 fanmodecfg, reg;
1311         bool duty_is_dc;
1312
1313         for (i = 0; i < data->pwm_num; i++) {
1314                 if (!(data->has_pwm & BIT(i)))
1315                         continue;
1316
1317                 err = nct6775_read_value(data, data->REG_PWM_MODE[i], &reg);
1318                 if (err)
1319                         return err;
1320                 duty_is_dc = data->REG_PWM_MODE[i] && (reg & data->PWM_MODE_MASK[i]);
1321                 data->pwm_mode[i] = !duty_is_dc;
1322
1323                 err = nct6775_read_value(data, data->REG_FAN_MODE[i], &fanmodecfg);
1324                 if (err)
1325                         return err;
1326                 for (j = 0; j < ARRAY_SIZE(data->REG_PWM); j++) {
1327                         if (data->REG_PWM[j] && data->REG_PWM[j][i]) {
1328                                 err = nct6775_read_value(data, data->REG_PWM[j][i], &reg);
1329                                 if (err)
1330                                         return err;
1331                                 data->pwm[j][i] = reg;
1332                         }
1333                 }
1334
1335                 data->pwm_enable[i] = reg_to_pwm_enable(data->pwm[0][i],
1336                                                         (fanmodecfg >> 4) & 7);
1337
1338                 if (!data->temp_tolerance[0][i] ||
1339                     data->pwm_enable[i] != speed_cruise)
1340                         data->temp_tolerance[0][i] = fanmodecfg & 0x0f;
1341                 if (!data->target_speed_tolerance[i] ||
1342                     data->pwm_enable[i] == speed_cruise) {
1343                         u8 t = fanmodecfg & 0x0f;
1344
1345                         if (data->REG_TOLERANCE_H) {
1346                                 err = nct6775_read_value(data, data->REG_TOLERANCE_H[i], &reg);
1347                                 if (err)
1348                                         return err;
1349                                 t |= (reg & 0x70) >> 1;
1350                         }
1351                         data->target_speed_tolerance[i] = t;
1352                 }
1353
1354                 err = nct6775_read_value(data, data->REG_CRITICAL_TEMP_TOLERANCE[i], &reg);
1355                 if (err)
1356                         return err;
1357                 data->temp_tolerance[1][i] = reg;
1358
1359                 err = nct6775_read_value(data, data->REG_TEMP_SEL[i], &reg);
1360                 if (err)
1361                         return err;
1362                 data->pwm_temp_sel[i] = reg & 0x1f;
1363                 /* If fan can stop, report floor as 0 */
1364                 if (reg & 0x80)
1365                         data->pwm[2][i] = 0;
1366
1367                 if (!data->REG_WEIGHT_TEMP_SEL[i])
1368                         continue;
1369
1370                 err = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[i], &reg);
1371                 if (err)
1372                         return err;
1373                 data->pwm_weight_temp_sel[i] = reg & 0x1f;
1374                 /* If weight is disabled, report weight source as 0 */
1375                 if (!(reg & 0x80))
1376                         data->pwm_weight_temp_sel[i] = 0;
1377
1378                 /* Weight temp data */
1379                 for (j = 0; j < ARRAY_SIZE(data->weight_temp); j++) {
1380                         err = nct6775_read_value(data, data->REG_WEIGHT_TEMP[j][i], &reg);
1381                         if (err)
1382                                 return err;
1383                         data->weight_temp[j][i] = reg;
1384                 }
1385         }
1386
1387         return 0;
1388 }
1389
1390 static int nct6775_update_pwm_limits(struct device *dev)
1391 {
1392         struct nct6775_data *data = dev_get_drvdata(dev);
1393         int i, j, err;
1394         u16 reg, reg_t;
1395
1396         for (i = 0; i < data->pwm_num; i++) {
1397                 if (!(data->has_pwm & BIT(i)))
1398                         continue;
1399
1400                 for (j = 0; j < ARRAY_SIZE(data->fan_time); j++) {
1401                         err = nct6775_read_value(data, data->REG_FAN_TIME[j][i], &reg);
1402                         if (err)
1403                                 return err;
1404                         data->fan_time[j][i] = reg;
1405                 }
1406
1407                 err = nct6775_read_value(data, data->REG_TARGET[i], &reg_t);
1408                 if (err)
1409                         return err;
1410
1411                 /* Update only in matching mode or if never updated */
1412                 if (!data->target_temp[i] ||
1413                     data->pwm_enable[i] == thermal_cruise)
1414                         data->target_temp[i] = reg_t & data->target_temp_mask;
1415                 if (!data->target_speed[i] ||
1416                     data->pwm_enable[i] == speed_cruise) {
1417                         if (data->REG_TOLERANCE_H) {
1418                                 err = nct6775_read_value(data, data->REG_TOLERANCE_H[i], &reg);
1419                                 if (err)
1420                                         return err;
1421                                 reg_t |= (reg & 0x0f) << 8;
1422                         }
1423                         data->target_speed[i] = reg_t;
1424                 }
1425
1426                 for (j = 0; j < data->auto_pwm_num; j++) {
1427                         err = nct6775_read_value(data, NCT6775_AUTO_PWM(data, i, j), &reg);
1428                         if (err)
1429                                 return err;
1430                         data->auto_pwm[i][j] = reg;
1431
1432                         err = nct6775_read_value(data, NCT6775_AUTO_TEMP(data, i, j), &reg);
1433                         if (err)
1434                                 return err;
1435                         data->auto_temp[i][j] = reg;
1436                 }
1437
1438                 /* critical auto_pwm temperature data */
1439                 err = nct6775_read_value(data, data->REG_CRITICAL_TEMP[i], &reg);
1440                 if (err)
1441                         return err;
1442                 data->auto_temp[i][data->auto_pwm_num] = reg;
1443
1444                 switch (data->kind) {
1445                 case nct6775:
1446                         err = nct6775_read_value(data, NCT6775_REG_CRITICAL_ENAB[i], &reg);
1447                         if (err)
1448                                 return err;
1449                         data->auto_pwm[i][data->auto_pwm_num] =
1450                                                 (reg & 0x02) ? 0xff : 0x00;
1451                         break;
1452                 case nct6776:
1453                         data->auto_pwm[i][data->auto_pwm_num] = 0xff;
1454                         break;
1455                 case nct6106:
1456                 case nct6116:
1457                 case nct6779:
1458                 case nct6791:
1459                 case nct6792:
1460                 case nct6793:
1461                 case nct6795:
1462                 case nct6796:
1463                 case nct6797:
1464                 case nct6798:
1465                         err = nct6775_read_value(data, data->REG_CRITICAL_PWM_ENABLE[i], &reg);
1466                         if (err)
1467                                 return err;
1468                         if (reg & data->CRITICAL_PWM_ENABLE_MASK) {
1469                                 err = nct6775_read_value(data, data->REG_CRITICAL_PWM[i], &reg);
1470                                 if (err)
1471                                         return err;
1472                         } else {
1473                                 reg = 0xff;
1474                         }
1475                         data->auto_pwm[i][data->auto_pwm_num] = reg;
1476                         break;
1477                 }
1478         }
1479
1480         return 0;
1481 }
1482
1483 struct nct6775_data *nct6775_update_device(struct device *dev)
1484 {
1485         struct nct6775_data *data = dev_get_drvdata(dev);
1486         int i, j, err = 0;
1487         u16 reg;
1488
1489         mutex_lock(&data->update_lock);
1490
1491         if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
1492             || !data->valid) {
1493                 /* Fan clock dividers */
1494                 err = nct6775_update_fan_div_common(data);
1495                 if (err)
1496                         goto out;
1497
1498                 /* Measured voltages and limits */
1499                 for (i = 0; i < data->in_num; i++) {
1500                         if (!(data->have_in & BIT(i)))
1501                                 continue;
1502
1503                         err = nct6775_read_value(data, data->REG_VIN[i], &reg);
1504                         if (err)
1505                                 goto out;
1506                         data->in[i][0] = reg;
1507
1508                         err = nct6775_read_value(data, data->REG_IN_MINMAX[0][i], &reg);
1509                         if (err)
1510                                 goto out;
1511                         data->in[i][1] = reg;
1512
1513                         err = nct6775_read_value(data, data->REG_IN_MINMAX[1][i], &reg);
1514                         if (err)
1515                                 goto out;
1516                         data->in[i][2] = reg;
1517                 }
1518
1519                 /* Measured fan speeds and limits */
1520                 for (i = 0; i < ARRAY_SIZE(data->rpm); i++) {
1521                         if (!(data->has_fan & BIT(i)))
1522                                 continue;
1523
1524                         err = nct6775_read_value(data, data->REG_FAN[i], &reg);
1525                         if (err)
1526                                 goto out;
1527                         data->rpm[i] = data->fan_from_reg(reg,
1528                                                           data->fan_div[i]);
1529
1530                         if (data->has_fan_min & BIT(i)) {
1531                                 err = nct6775_read_value(data, data->REG_FAN_MIN[i], &reg);
1532                                 if (err)
1533                                         goto out;
1534                                 data->fan_min[i] = reg;
1535                         }
1536
1537                         if (data->REG_FAN_PULSES[i]) {
1538                                 err = nct6775_read_value(data, data->REG_FAN_PULSES[i], &reg);
1539                                 if (err)
1540                                         goto out;
1541                                 data->fan_pulses[i] = (reg >> data->FAN_PULSE_SHIFT[i]) & 0x03;
1542                         }
1543
1544                         err = nct6775_select_fan_div(dev, data, i, reg);
1545                         if (err)
1546                                 goto out;
1547                 }
1548
1549                 err = nct6775_update_pwm(dev);
1550                 if (err)
1551                         goto out;
1552
1553                 err = nct6775_update_pwm_limits(dev);
1554                 if (err)
1555                         goto out;
1556
1557                 /* Measured temperatures and limits */
1558                 for (i = 0; i < NUM_TEMP; i++) {
1559                         if (!(data->have_temp & BIT(i)))
1560                                 continue;
1561                         for (j = 0; j < ARRAY_SIZE(data->reg_temp); j++) {
1562                                 if (data->reg_temp[j][i]) {
1563                                         err = nct6775_read_temp(data, data->reg_temp[j][i], &reg);
1564                                         if (err)
1565                                                 goto out;
1566                                         data->temp[j][i] = reg;
1567                                 }
1568                         }
1569                         if (i >= NUM_TEMP_FIXED ||
1570                             !(data->have_temp_fixed & BIT(i)))
1571                                 continue;
1572                         err = nct6775_read_value(data, data->REG_TEMP_OFFSET[i], &reg);
1573                         if (err)
1574                                 goto out;
1575                         data->temp_offset[i] = reg;
1576                 }
1577
1578                 for (i = 0; i < NUM_TSI_TEMP; i++) {
1579                         if (!(data->have_tsi_temp & BIT(i)))
1580                                 continue;
1581                         err = nct6775_read_value(data, data->REG_TSI_TEMP[i], &reg);
1582                         if (err)
1583                                 goto out;
1584                         data->tsi_temp[i] = reg;
1585                 }
1586
1587                 data->alarms = 0;
1588                 for (i = 0; i < NUM_REG_ALARM; i++) {
1589                         u16 alarm;
1590
1591                         if (!data->REG_ALARM[i])
1592                                 continue;
1593                         err = nct6775_read_value(data, data->REG_ALARM[i], &alarm);
1594                         if (err)
1595                                 goto out;
1596                         data->alarms |= ((u64)alarm) << (i << 3);
1597                 }
1598
1599                 data->beeps = 0;
1600                 for (i = 0; i < NUM_REG_BEEP; i++) {
1601                         u16 beep;
1602
1603                         if (!data->REG_BEEP[i])
1604                                 continue;
1605                         err = nct6775_read_value(data, data->REG_BEEP[i], &beep);
1606                         if (err)
1607                                 goto out;
1608                         data->beeps |= ((u64)beep) << (i << 3);
1609                 }
1610
1611                 data->last_updated = jiffies;
1612                 data->valid = true;
1613         }
1614 out:
1615         mutex_unlock(&data->update_lock);
1616         return err ? ERR_PTR(err) : data;
1617 }
1618 EXPORT_SYMBOL_GPL(nct6775_update_device);
1619
1620 /*
1621  * Sysfs callback functions
1622  */
1623 static ssize_t
1624 show_in_reg(struct device *dev, struct device_attribute *attr, char *buf)
1625 {
1626         struct nct6775_data *data = nct6775_update_device(dev);
1627         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
1628         int index = sattr->index;
1629         int nr = sattr->nr;
1630
1631         if (IS_ERR(data))
1632                 return PTR_ERR(data);
1633
1634         return sprintf(buf, "%ld\n", in_from_reg(data->in[nr][index], nr));
1635 }
1636
1637 static ssize_t
1638 store_in_reg(struct device *dev, struct device_attribute *attr, const char *buf,
1639              size_t count)
1640 {
1641         struct nct6775_data *data = dev_get_drvdata(dev);
1642         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
1643         int index = sattr->index;
1644         int nr = sattr->nr;
1645         unsigned long val;
1646         int err;
1647
1648         err = kstrtoul(buf, 10, &val);
1649         if (err < 0)
1650                 return err;
1651         mutex_lock(&data->update_lock);
1652         data->in[nr][index] = in_to_reg(val, nr);
1653         err = nct6775_write_value(data, data->REG_IN_MINMAX[index - 1][nr], data->in[nr][index]);
1654         mutex_unlock(&data->update_lock);
1655         return err ? : count;
1656 }
1657
1658 ssize_t
1659 nct6775_show_alarm(struct device *dev, struct device_attribute *attr, char *buf)
1660 {
1661         struct nct6775_data *data = nct6775_update_device(dev);
1662         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
1663         int nr;
1664
1665         if (IS_ERR(data))
1666                 return PTR_ERR(data);
1667
1668         nr = data->ALARM_BITS[sattr->index];
1669         return sprintf(buf, "%u\n",
1670                        (unsigned int)((data->alarms >> nr) & 0x01));
1671 }
1672 EXPORT_SYMBOL_GPL(nct6775_show_alarm);
1673
1674 static int find_temp_source(struct nct6775_data *data, int index, int count)
1675 {
1676         int source = data->temp_src[index];
1677         int nr, err;
1678
1679         for (nr = 0; nr < count; nr++) {
1680                 u16 src;
1681
1682                 err = nct6775_read_value(data, data->REG_TEMP_SOURCE[nr], &src);
1683                 if (err)
1684                         return err;
1685                 if ((src & 0x1f) == source)
1686                         return nr;
1687         }
1688         return -ENODEV;
1689 }
1690
1691 static ssize_t
1692 show_temp_alarm(struct device *dev, struct device_attribute *attr, char *buf)
1693 {
1694         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
1695         struct nct6775_data *data = nct6775_update_device(dev);
1696         unsigned int alarm = 0;
1697         int nr;
1698
1699         if (IS_ERR(data))
1700                 return PTR_ERR(data);
1701
1702         /*
1703          * For temperatures, there is no fixed mapping from registers to alarm
1704          * bits. Alarm bits are determined by the temperature source mapping.
1705          */
1706         nr = find_temp_source(data, sattr->index, data->num_temp_alarms);
1707         if (nr >= 0) {
1708                 int bit = data->ALARM_BITS[nr + TEMP_ALARM_BASE];
1709
1710                 alarm = (data->alarms >> bit) & 0x01;
1711         }
1712         return sprintf(buf, "%u\n", alarm);
1713 }
1714
1715 ssize_t
1716 nct6775_show_beep(struct device *dev, struct device_attribute *attr, char *buf)
1717 {
1718         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
1719         struct nct6775_data *data = nct6775_update_device(dev);
1720         int nr;
1721
1722         if (IS_ERR(data))
1723                 return PTR_ERR(data);
1724
1725         nr = data->BEEP_BITS[sattr->index];
1726
1727         return sprintf(buf, "%u\n",
1728                        (unsigned int)((data->beeps >> nr) & 0x01));
1729 }
1730 EXPORT_SYMBOL_GPL(nct6775_show_beep);
1731
1732 ssize_t
1733 nct6775_store_beep(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1734 {
1735         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
1736         struct nct6775_data *data = dev_get_drvdata(dev);
1737         int nr = data->BEEP_BITS[sattr->index];
1738         int regindex = nr >> 3;
1739         unsigned long val;
1740         int err;
1741
1742         err = kstrtoul(buf, 10, &val);
1743         if (err < 0)
1744                 return err;
1745         if (val > 1)
1746                 return -EINVAL;
1747
1748         mutex_lock(&data->update_lock);
1749         if (val)
1750                 data->beeps |= (1ULL << nr);
1751         else
1752                 data->beeps &= ~(1ULL << nr);
1753         err = nct6775_write_value(data, data->REG_BEEP[regindex],
1754                                   (data->beeps >> (regindex << 3)) & 0xff);
1755         mutex_unlock(&data->update_lock);
1756         return err ? : count;
1757 }
1758 EXPORT_SYMBOL_GPL(nct6775_store_beep);
1759
1760 static ssize_t
1761 show_temp_beep(struct device *dev, struct device_attribute *attr, char *buf)
1762 {
1763         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
1764         struct nct6775_data *data = nct6775_update_device(dev);
1765         unsigned int beep = 0;
1766         int nr;
1767
1768         if (IS_ERR(data))
1769                 return PTR_ERR(data);
1770
1771         /*
1772          * For temperatures, there is no fixed mapping from registers to beep
1773          * enable bits. Beep enable bits are determined by the temperature
1774          * source mapping.
1775          */
1776         nr = find_temp_source(data, sattr->index, data->num_temp_beeps);
1777         if (nr >= 0) {
1778                 int bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE];
1779
1780                 beep = (data->beeps >> bit) & 0x01;
1781         }
1782         return sprintf(buf, "%u\n", beep);
1783 }
1784
1785 static ssize_t
1786 store_temp_beep(struct device *dev, struct device_attribute *attr,
1787                 const char *buf, size_t count)
1788 {
1789         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
1790         struct nct6775_data *data = dev_get_drvdata(dev);
1791         int nr, bit, regindex;
1792         unsigned long val;
1793         int err;
1794
1795         err = kstrtoul(buf, 10, &val);
1796         if (err < 0)
1797                 return err;
1798         if (val > 1)
1799                 return -EINVAL;
1800
1801         nr = find_temp_source(data, sattr->index, data->num_temp_beeps);
1802         if (nr < 0)
1803                 return nr;
1804
1805         bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE];
1806         regindex = bit >> 3;
1807
1808         mutex_lock(&data->update_lock);
1809         if (val)
1810                 data->beeps |= (1ULL << bit);
1811         else
1812                 data->beeps &= ~(1ULL << bit);
1813         err = nct6775_write_value(data, data->REG_BEEP[regindex],
1814                                   (data->beeps >> (regindex << 3)) & 0xff);
1815         mutex_unlock(&data->update_lock);
1816
1817         return err ? : count;
1818 }
1819
1820 static umode_t nct6775_in_is_visible(struct kobject *kobj,
1821                                      struct attribute *attr, int index)
1822 {
1823         struct device *dev = kobj_to_dev(kobj);
1824         struct nct6775_data *data = dev_get_drvdata(dev);
1825         int in = index / 5;     /* voltage index */
1826
1827         if (!(data->have_in & BIT(in)))
1828                 return 0;
1829
1830         return nct6775_attr_mode(data, attr);
1831 }
1832
1833 SENSOR_TEMPLATE_2(in_input, "in%d_input", 0444, show_in_reg, NULL, 0, 0);
1834 SENSOR_TEMPLATE(in_alarm, "in%d_alarm", 0444, nct6775_show_alarm, NULL, 0);
1835 SENSOR_TEMPLATE(in_beep, "in%d_beep", 0644, nct6775_show_beep, nct6775_store_beep, 0);
1836 SENSOR_TEMPLATE_2(in_min, "in%d_min", 0644, show_in_reg, store_in_reg, 0, 1);
1837 SENSOR_TEMPLATE_2(in_max, "in%d_max", 0644, show_in_reg, store_in_reg, 0, 2);
1838
1839 /*
1840  * nct6775_in_is_visible uses the index into the following array
1841  * to determine if attributes should be created or not.
1842  * Any change in order or content must be matched.
1843  */
1844 static struct sensor_device_template *nct6775_attributes_in_template[] = {
1845         &sensor_dev_template_in_input,
1846         &sensor_dev_template_in_alarm,
1847         &sensor_dev_template_in_beep,
1848         &sensor_dev_template_in_min,
1849         &sensor_dev_template_in_max,
1850         NULL
1851 };
1852
1853 static const struct sensor_template_group nct6775_in_template_group = {
1854         .templates = nct6775_attributes_in_template,
1855         .is_visible = nct6775_in_is_visible,
1856 };
1857
1858 static ssize_t
1859 show_fan(struct device *dev, struct device_attribute *attr, char *buf)
1860 {
1861         struct nct6775_data *data = nct6775_update_device(dev);
1862         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
1863         int nr = sattr->index;
1864
1865         if (IS_ERR(data))
1866                 return PTR_ERR(data);
1867
1868         return sprintf(buf, "%d\n", data->rpm[nr]);
1869 }
1870
1871 static ssize_t
1872 show_fan_min(struct device *dev, struct device_attribute *attr, char *buf)
1873 {
1874         struct nct6775_data *data = nct6775_update_device(dev);
1875         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
1876         int nr = sattr->index;
1877
1878         if (IS_ERR(data))
1879                 return PTR_ERR(data);
1880
1881         return sprintf(buf, "%d\n",
1882                        data->fan_from_reg_min(data->fan_min[nr],
1883                                               data->fan_div[nr]));
1884 }
1885
1886 static ssize_t
1887 show_fan_div(struct device *dev, struct device_attribute *attr, char *buf)
1888 {
1889         struct nct6775_data *data = nct6775_update_device(dev);
1890         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
1891         int nr = sattr->index;
1892
1893         if (IS_ERR(data))
1894                 return PTR_ERR(data);
1895
1896         return sprintf(buf, "%u\n", div_from_reg(data->fan_div[nr]));
1897 }
1898
1899 static ssize_t
1900 store_fan_min(struct device *dev, struct device_attribute *attr,
1901               const char *buf, size_t count)
1902 {
1903         struct nct6775_data *data = dev_get_drvdata(dev);
1904         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
1905         int nr = sattr->index;
1906         unsigned long val;
1907         unsigned int reg;
1908         u8 new_div;
1909         int err;
1910
1911         err = kstrtoul(buf, 10, &val);
1912         if (err < 0)
1913                 return err;
1914
1915         mutex_lock(&data->update_lock);
1916         if (!data->has_fan_div) {
1917                 /* NCT6776F or NCT6779D; we know this is a 13 bit register */
1918                 if (!val) {
1919                         val = 0xff1f;
1920                 } else {
1921                         if (val > 1350000U)
1922                                 val = 135000U;
1923                         val = 1350000U / val;
1924                         val = (val & 0x1f) | ((val << 3) & 0xff00);
1925                 }
1926                 data->fan_min[nr] = val;
1927                 goto write_min; /* Leave fan divider alone */
1928         }
1929         if (!val) {
1930                 /* No min limit, alarm disabled */
1931                 data->fan_min[nr] = 255;
1932                 new_div = data->fan_div[nr]; /* No change */
1933                 dev_info(dev, "fan%u low limit and alarm disabled\n", nr + 1);
1934                 goto write_div;
1935         }
1936         reg = 1350000U / val;
1937         if (reg >= 128 * 255) {
1938                 /*
1939                  * Speed below this value cannot possibly be represented,
1940                  * even with the highest divider (128)
1941                  */
1942                 data->fan_min[nr] = 254;
1943                 new_div = 7; /* 128 == BIT(7) */
1944                 dev_warn(dev,
1945                          "fan%u low limit %lu below minimum %u, set to minimum\n",
1946                          nr + 1, val, data->fan_from_reg_min(254, 7));
1947         } else if (!reg) {
1948                 /*
1949                  * Speed above this value cannot possibly be represented,
1950                  * even with the lowest divider (1)
1951                  */
1952                 data->fan_min[nr] = 1;
1953                 new_div = 0; /* 1 == BIT(0) */
1954                 dev_warn(dev,
1955                          "fan%u low limit %lu above maximum %u, set to maximum\n",
1956                          nr + 1, val, data->fan_from_reg_min(1, 0));
1957         } else {
1958                 /*
1959                  * Automatically pick the best divider, i.e. the one such
1960                  * that the min limit will correspond to a register value
1961                  * in the 96..192 range
1962                  */
1963                 new_div = 0;
1964                 while (reg > 192 && new_div < 7) {
1965                         reg >>= 1;
1966                         new_div++;
1967                 }
1968                 data->fan_min[nr] = reg;
1969         }
1970
1971 write_div:
1972         /*
1973          * Write both the fan clock divider (if it changed) and the new
1974          * fan min (unconditionally)
1975          */
1976         if (new_div != data->fan_div[nr]) {
1977                 dev_dbg(dev, "fan%u clock divider changed from %u to %u\n",
1978                         nr + 1, div_from_reg(data->fan_div[nr]),
1979                         div_from_reg(new_div));
1980                 data->fan_div[nr] = new_div;
1981                 err = nct6775_write_fan_div_common(data, nr);
1982                 if (err)
1983                         goto write_min;
1984                 /* Give the chip time to sample a new speed value */
1985                 data->last_updated = jiffies;
1986         }
1987
1988 write_min:
1989         err = nct6775_write_value(data, data->REG_FAN_MIN[nr], data->fan_min[nr]);
1990         mutex_unlock(&data->update_lock);
1991
1992         return err ? : count;
1993 }
1994
1995 static ssize_t
1996 show_fan_pulses(struct device *dev, struct device_attribute *attr, char *buf)
1997 {
1998         struct nct6775_data *data = nct6775_update_device(dev);
1999         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2000         int p;
2001
2002         if (IS_ERR(data))
2003                 return PTR_ERR(data);
2004
2005         p = data->fan_pulses[sattr->index];
2006         return sprintf(buf, "%d\n", p ? : 4);
2007 }
2008
2009 static ssize_t
2010 store_fan_pulses(struct device *dev, struct device_attribute *attr,
2011                  const char *buf, size_t count)
2012 {
2013         struct nct6775_data *data = dev_get_drvdata(dev);
2014         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2015         int nr = sattr->index;
2016         unsigned long val;
2017         int err;
2018         u16 reg;
2019
2020         err = kstrtoul(buf, 10, &val);
2021         if (err < 0)
2022                 return err;
2023
2024         if (val > 4)
2025                 return -EINVAL;
2026
2027         mutex_lock(&data->update_lock);
2028         data->fan_pulses[nr] = val & 3;
2029         err = nct6775_read_value(data, data->REG_FAN_PULSES[nr], &reg);
2030         if (err)
2031                 goto out;
2032         reg &= ~(0x03 << data->FAN_PULSE_SHIFT[nr]);
2033         reg |= (val & 3) << data->FAN_PULSE_SHIFT[nr];
2034         err = nct6775_write_value(data, data->REG_FAN_PULSES[nr], reg);
2035 out:
2036         mutex_unlock(&data->update_lock);
2037
2038         return err ? : count;
2039 }
2040
2041 static umode_t nct6775_fan_is_visible(struct kobject *kobj,
2042                                       struct attribute *attr, int index)
2043 {
2044         struct device *dev = kobj_to_dev(kobj);
2045         struct nct6775_data *data = dev_get_drvdata(dev);
2046         int fan = index / 6;    /* fan index */
2047         int nr = index % 6;     /* attribute index */
2048
2049         if (!(data->has_fan & BIT(fan)))
2050                 return 0;
2051
2052         if (nr == 1 && data->ALARM_BITS[FAN_ALARM_BASE + fan] == -1)
2053                 return 0;
2054         if (nr == 2 && data->BEEP_BITS[FAN_ALARM_BASE + fan] == -1)
2055                 return 0;
2056         if (nr == 3 && !data->REG_FAN_PULSES[fan])
2057                 return 0;
2058         if (nr == 4 && !(data->has_fan_min & BIT(fan)))
2059                 return 0;
2060         if (nr == 5 && data->kind != nct6775)
2061                 return 0;
2062
2063         return nct6775_attr_mode(data, attr);
2064 }
2065
2066 SENSOR_TEMPLATE(fan_input, "fan%d_input", 0444, show_fan, NULL, 0);
2067 SENSOR_TEMPLATE(fan_alarm, "fan%d_alarm", 0444, nct6775_show_alarm, NULL, FAN_ALARM_BASE);
2068 SENSOR_TEMPLATE(fan_beep, "fan%d_beep", 0644, nct6775_show_beep,
2069                 nct6775_store_beep, FAN_ALARM_BASE);
2070 SENSOR_TEMPLATE(fan_pulses, "fan%d_pulses", 0644, show_fan_pulses, store_fan_pulses, 0);
2071 SENSOR_TEMPLATE(fan_min, "fan%d_min", 0644, show_fan_min, store_fan_min, 0);
2072 SENSOR_TEMPLATE(fan_div, "fan%d_div", 0444, show_fan_div, NULL, 0);
2073
2074 /*
2075  * nct6775_fan_is_visible uses the index into the following array
2076  * to determine if attributes should be created or not.
2077  * Any change in order or content must be matched.
2078  */
2079 static struct sensor_device_template *nct6775_attributes_fan_template[] = {
2080         &sensor_dev_template_fan_input,
2081         &sensor_dev_template_fan_alarm, /* 1 */
2082         &sensor_dev_template_fan_beep,  /* 2 */
2083         &sensor_dev_template_fan_pulses,
2084         &sensor_dev_template_fan_min,   /* 4 */
2085         &sensor_dev_template_fan_div,   /* 5 */
2086         NULL
2087 };
2088
2089 static const struct sensor_template_group nct6775_fan_template_group = {
2090         .templates = nct6775_attributes_fan_template,
2091         .is_visible = nct6775_fan_is_visible,
2092         .base = 1,
2093 };
2094
2095 static ssize_t
2096 show_temp_label(struct device *dev, struct device_attribute *attr, char *buf)
2097 {
2098         struct nct6775_data *data = nct6775_update_device(dev);
2099         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2100         int nr = sattr->index;
2101
2102         if (IS_ERR(data))
2103                 return PTR_ERR(data);
2104
2105         return sprintf(buf, "%s\n", data->temp_label[data->temp_src[nr]]);
2106 }
2107
2108 static ssize_t
2109 show_temp(struct device *dev, struct device_attribute *attr, char *buf)
2110 {
2111         struct nct6775_data *data = nct6775_update_device(dev);
2112         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
2113         int nr = sattr->nr;
2114         int index = sattr->index;
2115
2116         if (IS_ERR(data))
2117                 return PTR_ERR(data);
2118
2119         return sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(data->temp[index][nr]));
2120 }
2121
2122 static ssize_t
2123 store_temp(struct device *dev, struct device_attribute *attr, const char *buf,
2124            size_t count)
2125 {
2126         struct nct6775_data *data = dev_get_drvdata(dev);
2127         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
2128         int nr = sattr->nr;
2129         int index = sattr->index;
2130         int err;
2131         long val;
2132
2133         err = kstrtol(buf, 10, &val);
2134         if (err < 0)
2135                 return err;
2136
2137         mutex_lock(&data->update_lock);
2138         data->temp[index][nr] = LM75_TEMP_TO_REG(val);
2139         err = nct6775_write_temp(data, data->reg_temp[index][nr], data->temp[index][nr]);
2140         mutex_unlock(&data->update_lock);
2141         return err ? : count;
2142 }
2143
2144 static ssize_t
2145 show_temp_offset(struct device *dev, struct device_attribute *attr, char *buf)
2146 {
2147         struct nct6775_data *data = nct6775_update_device(dev);
2148         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2149
2150         if (IS_ERR(data))
2151                 return PTR_ERR(data);
2152
2153         return sprintf(buf, "%d\n", data->temp_offset[sattr->index] * 1000);
2154 }
2155
2156 static ssize_t
2157 store_temp_offset(struct device *dev, struct device_attribute *attr,
2158                   const char *buf, size_t count)
2159 {
2160         struct nct6775_data *data = dev_get_drvdata(dev);
2161         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2162         int nr = sattr->index;
2163         long val;
2164         int err;
2165
2166         err = kstrtol(buf, 10, &val);
2167         if (err < 0)
2168                 return err;
2169
2170         val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), -128, 127);
2171
2172         mutex_lock(&data->update_lock);
2173         data->temp_offset[nr] = val;
2174         err = nct6775_write_value(data, data->REG_TEMP_OFFSET[nr], val);
2175         mutex_unlock(&data->update_lock);
2176
2177         return err ? : count;
2178 }
2179
2180 static ssize_t
2181 show_temp_type(struct device *dev, struct device_attribute *attr, char *buf)
2182 {
2183         struct nct6775_data *data = nct6775_update_device(dev);
2184         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2185         int nr = sattr->index;
2186
2187         if (IS_ERR(data))
2188                 return PTR_ERR(data);
2189
2190         return sprintf(buf, "%d\n", (int)data->temp_type[nr]);
2191 }
2192
2193 static ssize_t
2194 store_temp_type(struct device *dev, struct device_attribute *attr,
2195                 const char *buf, size_t count)
2196 {
2197         struct nct6775_data *data = nct6775_update_device(dev);
2198         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2199         int nr = sattr->index;
2200         unsigned long val;
2201         int err;
2202         u8 vbit, dbit;
2203         u16 vbat, diode;
2204
2205         if (IS_ERR(data))
2206                 return PTR_ERR(data);
2207
2208         err = kstrtoul(buf, 10, &val);
2209         if (err < 0)
2210                 return err;
2211
2212         if (val != 1 && val != 3 && val != 4)
2213                 return -EINVAL;
2214
2215         mutex_lock(&data->update_lock);
2216
2217         data->temp_type[nr] = val;
2218         vbit = 0x02 << nr;
2219         dbit = data->DIODE_MASK << nr;
2220
2221         err = nct6775_read_value(data, data->REG_VBAT, &vbat);
2222         if (err)
2223                 goto out;
2224         vbat &= ~vbit;
2225
2226         err = nct6775_read_value(data, data->REG_DIODE, &diode);
2227         if (err)
2228                 goto out;
2229         diode &= ~dbit;
2230
2231         switch (val) {
2232         case 1: /* CPU diode (diode, current mode) */
2233                 vbat |= vbit;
2234                 diode |= dbit;
2235                 break;
2236         case 3: /* diode, voltage mode */
2237                 vbat |= dbit;
2238                 break;
2239         case 4: /* thermistor */
2240                 break;
2241         }
2242         err = nct6775_write_value(data, data->REG_VBAT, vbat);
2243         if (err)
2244                 goto out;
2245         err = nct6775_write_value(data, data->REG_DIODE, diode);
2246 out:
2247         mutex_unlock(&data->update_lock);
2248         return err ? : count;
2249 }
2250
2251 static umode_t nct6775_temp_is_visible(struct kobject *kobj,
2252                                        struct attribute *attr, int index)
2253 {
2254         struct device *dev = kobj_to_dev(kobj);
2255         struct nct6775_data *data = dev_get_drvdata(dev);
2256         int temp = index / 10;  /* temp index */
2257         int nr = index % 10;    /* attribute index */
2258
2259         if (!(data->have_temp & BIT(temp)))
2260                 return 0;
2261
2262         if (nr == 1 && !data->temp_label)
2263                 return 0;
2264
2265         if (nr == 2 && find_temp_source(data, temp, data->num_temp_alarms) < 0)
2266                 return 0;                               /* alarm */
2267
2268         if (nr == 3 && find_temp_source(data, temp, data->num_temp_beeps) < 0)
2269                 return 0;                               /* beep */
2270
2271         if (nr == 4 && !data->reg_temp[1][temp])        /* max */
2272                 return 0;
2273
2274         if (nr == 5 && !data->reg_temp[2][temp])        /* max_hyst */
2275                 return 0;
2276
2277         if (nr == 6 && !data->reg_temp[3][temp])        /* crit */
2278                 return 0;
2279
2280         if (nr == 7 && !data->reg_temp[4][temp])        /* lcrit */
2281                 return 0;
2282
2283         /* offset and type only apply to fixed sensors */
2284         if (nr > 7 && !(data->have_temp_fixed & BIT(temp)))
2285                 return 0;
2286
2287         return nct6775_attr_mode(data, attr);
2288 }
2289
2290 SENSOR_TEMPLATE_2(temp_input, "temp%d_input", 0444, show_temp, NULL, 0, 0);
2291 SENSOR_TEMPLATE(temp_label, "temp%d_label", 0444, show_temp_label, NULL, 0);
2292 SENSOR_TEMPLATE_2(temp_max, "temp%d_max", 0644, show_temp, store_temp, 0, 1);
2293 SENSOR_TEMPLATE_2(temp_max_hyst, "temp%d_max_hyst", 0644, show_temp, store_temp, 0, 2);
2294 SENSOR_TEMPLATE_2(temp_crit, "temp%d_crit", 0644, show_temp, store_temp, 0, 3);
2295 SENSOR_TEMPLATE_2(temp_lcrit, "temp%d_lcrit", 0644, show_temp, store_temp, 0, 4);
2296 SENSOR_TEMPLATE(temp_offset, "temp%d_offset", 0644, show_temp_offset, store_temp_offset, 0);
2297 SENSOR_TEMPLATE(temp_type, "temp%d_type", 0644, show_temp_type, store_temp_type, 0);
2298 SENSOR_TEMPLATE(temp_alarm, "temp%d_alarm", 0444, show_temp_alarm, NULL, 0);
2299 SENSOR_TEMPLATE(temp_beep, "temp%d_beep", 0644, show_temp_beep, store_temp_beep, 0);
2300
2301 /*
2302  * nct6775_temp_is_visible uses the index into the following array
2303  * to determine if attributes should be created or not.
2304  * Any change in order or content must be matched.
2305  */
2306 static struct sensor_device_template *nct6775_attributes_temp_template[] = {
2307         &sensor_dev_template_temp_input,
2308         &sensor_dev_template_temp_label,
2309         &sensor_dev_template_temp_alarm,        /* 2 */
2310         &sensor_dev_template_temp_beep,         /* 3 */
2311         &sensor_dev_template_temp_max,          /* 4 */
2312         &sensor_dev_template_temp_max_hyst,     /* 5 */
2313         &sensor_dev_template_temp_crit,         /* 6 */
2314         &sensor_dev_template_temp_lcrit,        /* 7 */
2315         &sensor_dev_template_temp_offset,       /* 8 */
2316         &sensor_dev_template_temp_type,         /* 9 */
2317         NULL
2318 };
2319
2320 static const struct sensor_template_group nct6775_temp_template_group = {
2321         .templates = nct6775_attributes_temp_template,
2322         .is_visible = nct6775_temp_is_visible,
2323         .base = 1,
2324 };
2325
2326 static ssize_t show_tsi_temp(struct device *dev, struct device_attribute *attr, char *buf)
2327 {
2328         struct nct6775_data *data = nct6775_update_device(dev);
2329         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2330
2331         if (IS_ERR(data))
2332                 return PTR_ERR(data);
2333
2334         return sysfs_emit(buf, "%u\n", tsi_temp_from_reg(data->tsi_temp[sattr->index]));
2335 }
2336
2337 static ssize_t show_tsi_temp_label(struct device *dev, struct device_attribute *attr, char *buf)
2338 {
2339         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2340
2341         return sysfs_emit(buf, "TSI%d_TEMP\n", sattr->index);
2342 }
2343
2344 SENSOR_TEMPLATE(tsi_temp_input, "temp%d_input", 0444, show_tsi_temp, NULL, 0);
2345 SENSOR_TEMPLATE(tsi_temp_label, "temp%d_label", 0444, show_tsi_temp_label, NULL, 0);
2346
2347 static umode_t nct6775_tsi_temp_is_visible(struct kobject *kobj, struct attribute *attr,
2348                                                int index)
2349 {
2350         struct device *dev = kobj_to_dev(kobj);
2351         struct nct6775_data *data = dev_get_drvdata(dev);
2352         int temp = index / 2;
2353
2354         return (data->have_tsi_temp & BIT(temp)) ? nct6775_attr_mode(data, attr) : 0;
2355 }
2356
2357 /*
2358  * The index calculation in nct6775_tsi_temp_is_visible() must be kept in
2359  * sync with the size of this array.
2360  */
2361 static struct sensor_device_template *nct6775_tsi_temp_template[] = {
2362         &sensor_dev_template_tsi_temp_input,
2363         &sensor_dev_template_tsi_temp_label,
2364         NULL
2365 };
2366
2367 static ssize_t
2368 show_pwm_mode(struct device *dev, struct device_attribute *attr, char *buf)
2369 {
2370         struct nct6775_data *data = nct6775_update_device(dev);
2371         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2372
2373         if (IS_ERR(data))
2374                 return PTR_ERR(data);
2375
2376         return sprintf(buf, "%d\n", data->pwm_mode[sattr->index]);
2377 }
2378
2379 static ssize_t
2380 store_pwm_mode(struct device *dev, struct device_attribute *attr,
2381                const char *buf, size_t count)
2382 {
2383         struct nct6775_data *data = dev_get_drvdata(dev);
2384         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2385         int nr = sattr->index;
2386         unsigned long val;
2387         int err;
2388         u16 reg;
2389
2390         err = kstrtoul(buf, 10, &val);
2391         if (err < 0)
2392                 return err;
2393
2394         if (val > 1)
2395                 return -EINVAL;
2396
2397         /* Setting DC mode (0) is not supported for all chips/channels */
2398         if (data->REG_PWM_MODE[nr] == 0) {
2399                 if (!val)
2400                         return -EINVAL;
2401                 return count;
2402         }
2403
2404         mutex_lock(&data->update_lock);
2405         data->pwm_mode[nr] = val;
2406         err = nct6775_read_value(data, data->REG_PWM_MODE[nr], &reg);
2407         if (err)
2408                 goto out;
2409         reg &= ~data->PWM_MODE_MASK[nr];
2410         if (!val)
2411                 reg |= data->PWM_MODE_MASK[nr];
2412         err = nct6775_write_value(data, data->REG_PWM_MODE[nr], reg);
2413 out:
2414         mutex_unlock(&data->update_lock);
2415         return err ? : count;
2416 }
2417
2418 static ssize_t
2419 show_pwm(struct device *dev, struct device_attribute *attr, char *buf)
2420 {
2421         struct nct6775_data *data = nct6775_update_device(dev);
2422         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
2423         int nr = sattr->nr;
2424         int index = sattr->index;
2425         int err;
2426         u16 pwm;
2427
2428         if (IS_ERR(data))
2429                 return PTR_ERR(data);
2430
2431         /*
2432          * For automatic fan control modes, show current pwm readings.
2433          * Otherwise, show the configured value.
2434          */
2435         if (index == 0 && data->pwm_enable[nr] > manual) {
2436                 err = nct6775_read_value(data, data->REG_PWM_READ[nr], &pwm);
2437                 if (err)
2438                         return err;
2439         } else {
2440                 pwm = data->pwm[index][nr];
2441         }
2442
2443         return sprintf(buf, "%d\n", pwm);
2444 }
2445
2446 static ssize_t
2447 store_pwm(struct device *dev, struct device_attribute *attr, const char *buf,
2448           size_t count)
2449 {
2450         struct nct6775_data *data = dev_get_drvdata(dev);
2451         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
2452         int nr = sattr->nr;
2453         int index = sattr->index;
2454         unsigned long val;
2455         int minval[7] = { 0, 1, 1, data->pwm[2][nr], 0, 0, 0 };
2456         int maxval[7]
2457           = { 255, 255, data->pwm[3][nr] ? : 255, 255, 255, 255, 255 };
2458         int err;
2459         u16 reg;
2460
2461         err = kstrtoul(buf, 10, &val);
2462         if (err < 0)
2463                 return err;
2464         val = clamp_val(val, minval[index], maxval[index]);
2465
2466         mutex_lock(&data->update_lock);
2467         data->pwm[index][nr] = val;
2468         err = nct6775_write_value(data, data->REG_PWM[index][nr], val);
2469         if (err)
2470                 goto out;
2471         if (index == 2) { /* floor: disable if val == 0 */
2472                 err = nct6775_read_value(data, data->REG_TEMP_SEL[nr], &reg);
2473                 if (err)
2474                         goto out;
2475                 reg &= 0x7f;
2476                 if (val)
2477                         reg |= 0x80;
2478                 err = nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg);
2479         }
2480 out:
2481         mutex_unlock(&data->update_lock);
2482         return err ? : count;
2483 }
2484
2485 /* Returns 0 if OK, -EINVAL otherwise */
2486 static int check_trip_points(struct nct6775_data *data, int nr)
2487 {
2488         int i;
2489
2490         for (i = 0; i < data->auto_pwm_num - 1; i++) {
2491                 if (data->auto_temp[nr][i] > data->auto_temp[nr][i + 1])
2492                         return -EINVAL;
2493         }
2494         for (i = 0; i < data->auto_pwm_num - 1; i++) {
2495                 if (data->auto_pwm[nr][i] > data->auto_pwm[nr][i + 1])
2496                         return -EINVAL;
2497         }
2498         /* validate critical temperature and pwm if enabled (pwm > 0) */
2499         if (data->auto_pwm[nr][data->auto_pwm_num]) {
2500                 if (data->auto_temp[nr][data->auto_pwm_num - 1] >
2501                                 data->auto_temp[nr][data->auto_pwm_num] ||
2502                     data->auto_pwm[nr][data->auto_pwm_num - 1] >
2503                                 data->auto_pwm[nr][data->auto_pwm_num])
2504                         return -EINVAL;
2505         }
2506         return 0;
2507 }
2508
2509 static int pwm_update_registers(struct nct6775_data *data, int nr)
2510 {
2511         u16 reg;
2512         int err;
2513
2514         switch (data->pwm_enable[nr]) {
2515         case off:
2516         case manual:
2517                 break;
2518         case speed_cruise:
2519                 err = nct6775_read_value(data, data->REG_FAN_MODE[nr], &reg);
2520                 if (err)
2521                         return err;
2522                 reg = (reg & ~data->tolerance_mask) |
2523                   (data->target_speed_tolerance[nr] & data->tolerance_mask);
2524                 err = nct6775_write_value(data, data->REG_FAN_MODE[nr], reg);
2525                 if (err)
2526                         return err;
2527                 err = nct6775_write_value(data, data->REG_TARGET[nr],
2528                                           data->target_speed[nr] & 0xff);
2529                 if (err)
2530                         return err;
2531                 if (data->REG_TOLERANCE_H) {
2532                         reg = (data->target_speed[nr] >> 8) & 0x0f;
2533                         reg |= (data->target_speed_tolerance[nr] & 0x38) << 1;
2534                         err = nct6775_write_value(data, data->REG_TOLERANCE_H[nr], reg);
2535                         if (err)
2536                                 return err;
2537                 }
2538                 break;
2539         case thermal_cruise:
2540                 err = nct6775_write_value(data, data->REG_TARGET[nr], data->target_temp[nr]);
2541                 if (err)
2542                         return err;
2543                 fallthrough;
2544         default:
2545                 err = nct6775_read_value(data, data->REG_FAN_MODE[nr], &reg);
2546                 if (err)
2547                         return err;
2548                 reg = (reg & ~data->tolerance_mask) |
2549                   data->temp_tolerance[0][nr];
2550                 err = nct6775_write_value(data, data->REG_FAN_MODE[nr], reg);
2551                 if (err)
2552                         return err;
2553                 break;
2554         }
2555
2556         return 0;
2557 }
2558
2559 static ssize_t
2560 show_pwm_enable(struct device *dev, struct device_attribute *attr, char *buf)
2561 {
2562         struct nct6775_data *data = nct6775_update_device(dev);
2563         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2564
2565         if (IS_ERR(data))
2566                 return PTR_ERR(data);
2567
2568         return sprintf(buf, "%d\n", data->pwm_enable[sattr->index]);
2569 }
2570
2571 static ssize_t
2572 store_pwm_enable(struct device *dev, struct device_attribute *attr,
2573                  const char *buf, size_t count)
2574 {
2575         struct nct6775_data *data = dev_get_drvdata(dev);
2576         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2577         int nr = sattr->index;
2578         unsigned long val;
2579         int err;
2580         u16 reg;
2581
2582         err = kstrtoul(buf, 10, &val);
2583         if (err < 0)
2584                 return err;
2585
2586         if (val > sf4)
2587                 return -EINVAL;
2588
2589         if (val == sf3 && data->kind != nct6775)
2590                 return -EINVAL;
2591
2592         if (val == sf4 && check_trip_points(data, nr)) {
2593                 dev_err(dev, "Inconsistent trip points, not switching to SmartFan IV mode\n");
2594                 dev_err(dev, "Adjust trip points and try again\n");
2595                 return -EINVAL;
2596         }
2597
2598         mutex_lock(&data->update_lock);
2599         data->pwm_enable[nr] = val;
2600         if (val == off) {
2601                 /*
2602                  * turn off pwm control: select manual mode, set pwm to maximum
2603                  */
2604                 data->pwm[0][nr] = 255;
2605                 err = nct6775_write_value(data, data->REG_PWM[0][nr], 255);
2606                 if (err)
2607                         goto out;
2608         }
2609         err = pwm_update_registers(data, nr);
2610         if (err)
2611                 goto out;
2612         err = nct6775_read_value(data, data->REG_FAN_MODE[nr], &reg);
2613         if (err)
2614                 goto out;
2615         reg &= 0x0f;
2616         reg |= pwm_enable_to_reg(val) << 4;
2617         err = nct6775_write_value(data, data->REG_FAN_MODE[nr], reg);
2618 out:
2619         mutex_unlock(&data->update_lock);
2620         return err ? : count;
2621 }
2622
2623 static ssize_t
2624 show_pwm_temp_sel_common(struct nct6775_data *data, char *buf, int src)
2625 {
2626         int i, sel = 0;
2627
2628         for (i = 0; i < NUM_TEMP; i++) {
2629                 if (!(data->have_temp & BIT(i)))
2630                         continue;
2631                 if (src == data->temp_src[i]) {
2632                         sel = i + 1;
2633                         break;
2634                 }
2635         }
2636
2637         return sprintf(buf, "%d\n", sel);
2638 }
2639
2640 static ssize_t
2641 show_pwm_temp_sel(struct device *dev, struct device_attribute *attr, char *buf)
2642 {
2643         struct nct6775_data *data = nct6775_update_device(dev);
2644         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2645         int index = sattr->index;
2646
2647         if (IS_ERR(data))
2648                 return PTR_ERR(data);
2649
2650         return show_pwm_temp_sel_common(data, buf, data->pwm_temp_sel[index]);
2651 }
2652
2653 static ssize_t
2654 store_pwm_temp_sel(struct device *dev, struct device_attribute *attr,
2655                    const char *buf, size_t count)
2656 {
2657         struct nct6775_data *data = nct6775_update_device(dev);
2658         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2659         int nr = sattr->index;
2660         unsigned long val;
2661         int err, src;
2662         u16 reg;
2663
2664         if (IS_ERR(data))
2665                 return PTR_ERR(data);
2666
2667         err = kstrtoul(buf, 10, &val);
2668         if (err < 0)
2669                 return err;
2670         if (val == 0 || val > NUM_TEMP)
2671                 return -EINVAL;
2672         if (!(data->have_temp & BIT(val - 1)) || !data->temp_src[val - 1])
2673                 return -EINVAL;
2674
2675         mutex_lock(&data->update_lock);
2676         src = data->temp_src[val - 1];
2677         data->pwm_temp_sel[nr] = src;
2678         err = nct6775_read_value(data, data->REG_TEMP_SEL[nr], &reg);
2679         if (err)
2680                 goto out;
2681         reg &= 0xe0;
2682         reg |= src;
2683         err = nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg);
2684 out:
2685         mutex_unlock(&data->update_lock);
2686
2687         return err ? : count;
2688 }
2689
2690 static ssize_t
2691 show_pwm_weight_temp_sel(struct device *dev, struct device_attribute *attr,
2692                          char *buf)
2693 {
2694         struct nct6775_data *data = nct6775_update_device(dev);
2695         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2696         int index = sattr->index;
2697
2698         if (IS_ERR(data))
2699                 return PTR_ERR(data);
2700
2701         return show_pwm_temp_sel_common(data, buf,
2702                                         data->pwm_weight_temp_sel[index]);
2703 }
2704
2705 static ssize_t
2706 store_pwm_weight_temp_sel(struct device *dev, struct device_attribute *attr,
2707                           const char *buf, size_t count)
2708 {
2709         struct nct6775_data *data = nct6775_update_device(dev);
2710         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2711         int nr = sattr->index;
2712         unsigned long val;
2713         int err, src;
2714         u16 reg;
2715
2716         if (IS_ERR(data))
2717                 return PTR_ERR(data);
2718
2719         err = kstrtoul(buf, 10, &val);
2720         if (err < 0)
2721                 return err;
2722         if (val > NUM_TEMP)
2723                 return -EINVAL;
2724         val = array_index_nospec(val, NUM_TEMP + 1);
2725         if (val && (!(data->have_temp & BIT(val - 1)) ||
2726                     !data->temp_src[val - 1]))
2727                 return -EINVAL;
2728
2729         mutex_lock(&data->update_lock);
2730         if (val) {
2731                 src = data->temp_src[val - 1];
2732                 data->pwm_weight_temp_sel[nr] = src;
2733                 err = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr], &reg);
2734                 if (err)
2735                         goto out;
2736                 reg &= 0xe0;
2737                 reg |= (src | 0x80);
2738                 err = nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg);
2739         } else {
2740                 data->pwm_weight_temp_sel[nr] = 0;
2741                 err = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr], &reg);
2742                 if (err)
2743                         goto out;
2744                 reg &= 0x7f;
2745                 err = nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg);
2746         }
2747 out:
2748         mutex_unlock(&data->update_lock);
2749
2750         return err ? : count;
2751 }
2752
2753 static ssize_t
2754 show_target_temp(struct device *dev, struct device_attribute *attr, char *buf)
2755 {
2756         struct nct6775_data *data = nct6775_update_device(dev);
2757         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2758
2759         if (IS_ERR(data))
2760                 return PTR_ERR(data);
2761
2762         return sprintf(buf, "%d\n", data->target_temp[sattr->index] * 1000);
2763 }
2764
2765 static ssize_t
2766 store_target_temp(struct device *dev, struct device_attribute *attr,
2767                   const char *buf, size_t count)
2768 {
2769         struct nct6775_data *data = dev_get_drvdata(dev);
2770         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2771         int nr = sattr->index;
2772         unsigned long val;
2773         int err;
2774
2775         err = kstrtoul(buf, 10, &val);
2776         if (err < 0)
2777                 return err;
2778
2779         val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0,
2780                         data->target_temp_mask);
2781
2782         mutex_lock(&data->update_lock);
2783         data->target_temp[nr] = val;
2784         err = pwm_update_registers(data, nr);
2785         mutex_unlock(&data->update_lock);
2786         return err ? : count;
2787 }
2788
2789 static ssize_t
2790 show_target_speed(struct device *dev, struct device_attribute *attr, char *buf)
2791 {
2792         struct nct6775_data *data = nct6775_update_device(dev);
2793         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2794         int nr = sattr->index;
2795
2796         if (IS_ERR(data))
2797                 return PTR_ERR(data);
2798
2799         return sprintf(buf, "%d\n",
2800                        fan_from_reg16(data->target_speed[nr],
2801                                       data->fan_div[nr]));
2802 }
2803
2804 static ssize_t
2805 store_target_speed(struct device *dev, struct device_attribute *attr,
2806                    const char *buf, size_t count)
2807 {
2808         struct nct6775_data *data = dev_get_drvdata(dev);
2809         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2810         int nr = sattr->index;
2811         unsigned long val;
2812         int err;
2813         u16 speed;
2814
2815         err = kstrtoul(buf, 10, &val);
2816         if (err < 0)
2817                 return err;
2818
2819         val = clamp_val(val, 0, 1350000U);
2820         speed = fan_to_reg(val, data->fan_div[nr]);
2821
2822         mutex_lock(&data->update_lock);
2823         data->target_speed[nr] = speed;
2824         err = pwm_update_registers(data, nr);
2825         mutex_unlock(&data->update_lock);
2826         return err ? : count;
2827 }
2828
2829 static ssize_t
2830 show_temp_tolerance(struct device *dev, struct device_attribute *attr,
2831                     char *buf)
2832 {
2833         struct nct6775_data *data = nct6775_update_device(dev);
2834         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
2835         int nr = sattr->nr;
2836         int index = sattr->index;
2837
2838         if (IS_ERR(data))
2839                 return PTR_ERR(data);
2840
2841         return sprintf(buf, "%d\n", data->temp_tolerance[index][nr] * 1000);
2842 }
2843
2844 static ssize_t
2845 store_temp_tolerance(struct device *dev, struct device_attribute *attr,
2846                      const char *buf, size_t count)
2847 {
2848         struct nct6775_data *data = dev_get_drvdata(dev);
2849         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
2850         int nr = sattr->nr;
2851         int index = sattr->index;
2852         unsigned long val;
2853         int err;
2854
2855         err = kstrtoul(buf, 10, &val);
2856         if (err < 0)
2857                 return err;
2858
2859         /* Limit tolerance as needed */
2860         val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, data->tolerance_mask);
2861
2862         mutex_lock(&data->update_lock);
2863         data->temp_tolerance[index][nr] = val;
2864         if (index)
2865                 err = pwm_update_registers(data, nr);
2866         else
2867                 err = nct6775_write_value(data, data->REG_CRITICAL_TEMP_TOLERANCE[nr], val);
2868         mutex_unlock(&data->update_lock);
2869         return err ? : count;
2870 }
2871
2872 /*
2873  * Fan speed tolerance is a tricky beast, since the associated register is
2874  * a tick counter, but the value is reported and configured as rpm.
2875  * Compute resulting low and high rpm values and report the difference.
2876  * A fan speed tolerance only makes sense if a fan target speed has been
2877  * configured, so only display values other than 0 if that is the case.
2878  */
2879 static ssize_t
2880 show_speed_tolerance(struct device *dev, struct device_attribute *attr,
2881                      char *buf)
2882 {
2883         struct nct6775_data *data = nct6775_update_device(dev);
2884         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2885         int nr = sattr->index;
2886         int target, tolerance = 0;
2887
2888         if (IS_ERR(data))
2889                 return PTR_ERR(data);
2890
2891         target = data->target_speed[nr];
2892
2893         if (target) {
2894                 int low = target - data->target_speed_tolerance[nr];
2895                 int high = target + data->target_speed_tolerance[nr];
2896
2897                 if (low <= 0)
2898                         low = 1;
2899                 if (high > 0xffff)
2900                         high = 0xffff;
2901                 if (high < low)
2902                         high = low;
2903
2904                 tolerance = (fan_from_reg16(low, data->fan_div[nr])
2905                              - fan_from_reg16(high, data->fan_div[nr])) / 2;
2906         }
2907
2908         return sprintf(buf, "%d\n", tolerance);
2909 }
2910
2911 static ssize_t
2912 store_speed_tolerance(struct device *dev, struct device_attribute *attr,
2913                       const char *buf, size_t count)
2914 {
2915         struct nct6775_data *data = dev_get_drvdata(dev);
2916         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2917         int nr = sattr->index;
2918         unsigned long val;
2919         int err;
2920         int low, high;
2921
2922         err = kstrtoul(buf, 10, &val);
2923         if (err < 0)
2924                 return err;
2925
2926         high = fan_from_reg16(data->target_speed[nr], data->fan_div[nr]) + val;
2927         low = fan_from_reg16(data->target_speed[nr], data->fan_div[nr]) - val;
2928         if (low <= 0)
2929                 low = 1;
2930         if (high < low)
2931                 high = low;
2932
2933         val = (fan_to_reg(low, data->fan_div[nr]) -
2934                fan_to_reg(high, data->fan_div[nr])) / 2;
2935
2936         /* Limit tolerance as needed */
2937         val = clamp_val(val, 0, data->speed_tolerance_limit);
2938
2939         mutex_lock(&data->update_lock);
2940         data->target_speed_tolerance[nr] = val;
2941         err = pwm_update_registers(data, nr);
2942         mutex_unlock(&data->update_lock);
2943         return err ? : count;
2944 }
2945
2946 SENSOR_TEMPLATE_2(pwm, "pwm%d", 0644, show_pwm, store_pwm, 0, 0);
2947 SENSOR_TEMPLATE(pwm_mode, "pwm%d_mode", 0644, show_pwm_mode, store_pwm_mode, 0);
2948 SENSOR_TEMPLATE(pwm_enable, "pwm%d_enable", 0644, show_pwm_enable, store_pwm_enable, 0);
2949 SENSOR_TEMPLATE(pwm_temp_sel, "pwm%d_temp_sel", 0644, show_pwm_temp_sel, store_pwm_temp_sel, 0);
2950 SENSOR_TEMPLATE(pwm_target_temp, "pwm%d_target_temp", 0644, show_target_temp, store_target_temp, 0);
2951 SENSOR_TEMPLATE(fan_target, "fan%d_target", 0644, show_target_speed, store_target_speed, 0);
2952 SENSOR_TEMPLATE(fan_tolerance, "fan%d_tolerance", 0644, show_speed_tolerance,
2953                 store_speed_tolerance, 0);
2954
2955 /* Smart Fan registers */
2956
2957 static ssize_t
2958 show_weight_temp(struct device *dev, struct device_attribute *attr, char *buf)
2959 {
2960         struct nct6775_data *data = nct6775_update_device(dev);
2961         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
2962         int nr = sattr->nr;
2963         int index = sattr->index;
2964
2965         if (IS_ERR(data))
2966                 return PTR_ERR(data);
2967
2968         return sprintf(buf, "%d\n", data->weight_temp[index][nr] * 1000);
2969 }
2970
2971 static ssize_t
2972 store_weight_temp(struct device *dev, struct device_attribute *attr,
2973                   const char *buf, size_t count)
2974 {
2975         struct nct6775_data *data = dev_get_drvdata(dev);
2976         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
2977         int nr = sattr->nr;
2978         int index = sattr->index;
2979         unsigned long val;
2980         int err;
2981
2982         err = kstrtoul(buf, 10, &val);
2983         if (err < 0)
2984                 return err;
2985
2986         val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, 255);
2987
2988         mutex_lock(&data->update_lock);
2989         data->weight_temp[index][nr] = val;
2990         err = nct6775_write_value(data, data->REG_WEIGHT_TEMP[index][nr], val);
2991         mutex_unlock(&data->update_lock);
2992         return err ? : count;
2993 }
2994
2995 SENSOR_TEMPLATE(pwm_weight_temp_sel, "pwm%d_weight_temp_sel", 0644,
2996                 show_pwm_weight_temp_sel, store_pwm_weight_temp_sel, 0);
2997 SENSOR_TEMPLATE_2(pwm_weight_temp_step, "pwm%d_weight_temp_step",
2998                   0644, show_weight_temp, store_weight_temp, 0, 0);
2999 SENSOR_TEMPLATE_2(pwm_weight_temp_step_tol, "pwm%d_weight_temp_step_tol",
3000                   0644, show_weight_temp, store_weight_temp, 0, 1);
3001 SENSOR_TEMPLATE_2(pwm_weight_temp_step_base, "pwm%d_weight_temp_step_base",
3002                   0644, show_weight_temp, store_weight_temp, 0, 2);
3003 SENSOR_TEMPLATE_2(pwm_weight_duty_step, "pwm%d_weight_duty_step", 0644, show_pwm, store_pwm, 0, 5);
3004 SENSOR_TEMPLATE_2(pwm_weight_duty_base, "pwm%d_weight_duty_base", 0644, show_pwm, store_pwm, 0, 6);
3005
3006 static ssize_t
3007 show_fan_time(struct device *dev, struct device_attribute *attr, char *buf)
3008 {
3009         struct nct6775_data *data = nct6775_update_device(dev);
3010         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
3011         int nr = sattr->nr;
3012         int index = sattr->index;
3013
3014         if (IS_ERR(data))
3015                 return PTR_ERR(data);
3016
3017         return sprintf(buf, "%d\n",
3018                        step_time_from_reg(data->fan_time[index][nr],
3019                                           data->pwm_mode[nr]));
3020 }
3021
3022 static ssize_t
3023 store_fan_time(struct device *dev, struct device_attribute *attr,
3024                const char *buf, size_t count)
3025 {
3026         struct nct6775_data *data = dev_get_drvdata(dev);
3027         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
3028         int nr = sattr->nr;
3029         int index = sattr->index;
3030         unsigned long val;
3031         int err;
3032
3033         err = kstrtoul(buf, 10, &val);
3034         if (err < 0)
3035                 return err;
3036
3037         val = step_time_to_reg(val, data->pwm_mode[nr]);
3038         mutex_lock(&data->update_lock);
3039         data->fan_time[index][nr] = val;
3040         err = nct6775_write_value(data, data->REG_FAN_TIME[index][nr], val);
3041         mutex_unlock(&data->update_lock);
3042         return err ? : count;
3043 }
3044
3045 static ssize_t
3046 show_auto_pwm(struct device *dev, struct device_attribute *attr, char *buf)
3047 {
3048         struct nct6775_data *data = nct6775_update_device(dev);
3049         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
3050
3051         if (IS_ERR(data))
3052                 return PTR_ERR(data);
3053
3054         return sprintf(buf, "%d\n", data->auto_pwm[sattr->nr][sattr->index]);
3055 }
3056
3057 static ssize_t
3058 store_auto_pwm(struct device *dev, struct device_attribute *attr,
3059                const char *buf, size_t count)
3060 {
3061         struct nct6775_data *data = dev_get_drvdata(dev);
3062         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
3063         int nr = sattr->nr;
3064         int point = sattr->index;
3065         unsigned long val;
3066         int err;
3067         u16 reg;
3068
3069         err = kstrtoul(buf, 10, &val);
3070         if (err < 0)
3071                 return err;
3072         if (val > 255)
3073                 return -EINVAL;
3074
3075         if (point == data->auto_pwm_num) {
3076                 if (data->kind != nct6775 && !val)
3077                         return -EINVAL;
3078                 if (data->kind != nct6779 && val)
3079                         val = 0xff;
3080         }
3081
3082         mutex_lock(&data->update_lock);
3083         data->auto_pwm[nr][point] = val;
3084         if (point < data->auto_pwm_num) {
3085                 err = nct6775_write_value(data, NCT6775_AUTO_PWM(data, nr, point),
3086                                           data->auto_pwm[nr][point]);
3087         } else {
3088                 switch (data->kind) {
3089                 case nct6775:
3090                         /* disable if needed (pwm == 0) */
3091                         err = nct6775_read_value(data, NCT6775_REG_CRITICAL_ENAB[nr], &reg);
3092                         if (err)
3093                                 break;
3094                         if (val)
3095                                 reg |= 0x02;
3096                         else
3097                                 reg &= ~0x02;
3098                         err = nct6775_write_value(data, NCT6775_REG_CRITICAL_ENAB[nr], reg);
3099                         break;
3100                 case nct6776:
3101                         break; /* always enabled, nothing to do */
3102                 case nct6106:
3103                 case nct6116:
3104                 case nct6779:
3105                 case nct6791:
3106                 case nct6792:
3107                 case nct6793:
3108                 case nct6795:
3109                 case nct6796:
3110                 case nct6797:
3111                 case nct6798:
3112                         err = nct6775_write_value(data, data->REG_CRITICAL_PWM[nr], val);
3113                         if (err)
3114                                 break;
3115                         err = nct6775_read_value(data, data->REG_CRITICAL_PWM_ENABLE[nr], &reg);
3116                         if (err)
3117                                 break;
3118                         if (val == 255)
3119                                 reg &= ~data->CRITICAL_PWM_ENABLE_MASK;
3120                         else
3121                                 reg |= data->CRITICAL_PWM_ENABLE_MASK;
3122                         err = nct6775_write_value(data, data->REG_CRITICAL_PWM_ENABLE[nr], reg);
3123                         break;
3124                 }
3125         }
3126         mutex_unlock(&data->update_lock);
3127         return err ? : count;
3128 }
3129
3130 static ssize_t
3131 show_auto_temp(struct device *dev, struct device_attribute *attr, char *buf)
3132 {
3133         struct nct6775_data *data = nct6775_update_device(dev);
3134         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
3135         int nr = sattr->nr;
3136         int point = sattr->index;
3137
3138         if (IS_ERR(data))
3139                 return PTR_ERR(data);
3140
3141         /*
3142          * We don't know for sure if the temperature is signed or unsigned.
3143          * Assume it is unsigned.
3144          */
3145         return sprintf(buf, "%d\n", data->auto_temp[nr][point] * 1000);
3146 }
3147
3148 static ssize_t
3149 store_auto_temp(struct device *dev, struct device_attribute *attr,
3150                 const char *buf, size_t count)
3151 {
3152         struct nct6775_data *data = dev_get_drvdata(dev);
3153         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
3154         int nr = sattr->nr;
3155         int point = sattr->index;
3156         unsigned long val;
3157         int err;
3158
3159         err = kstrtoul(buf, 10, &val);
3160         if (err)
3161                 return err;
3162         if (val > 255000)
3163                 return -EINVAL;
3164
3165         mutex_lock(&data->update_lock);
3166         data->auto_temp[nr][point] = DIV_ROUND_CLOSEST(val, 1000);
3167         if (point < data->auto_pwm_num) {
3168                 err = nct6775_write_value(data, NCT6775_AUTO_TEMP(data, nr, point),
3169                                           data->auto_temp[nr][point]);
3170         } else {
3171                 err = nct6775_write_value(data, data->REG_CRITICAL_TEMP[nr],
3172                                           data->auto_temp[nr][point]);
3173         }
3174         mutex_unlock(&data->update_lock);
3175         return err ? : count;
3176 }
3177
3178 static umode_t nct6775_pwm_is_visible(struct kobject *kobj,
3179                                       struct attribute *attr, int index)
3180 {
3181         struct device *dev = kobj_to_dev(kobj);
3182         struct nct6775_data *data = dev_get_drvdata(dev);
3183         int pwm = index / 36;   /* pwm index */
3184         int nr = index % 36;    /* attribute index */
3185
3186         if (!(data->has_pwm & BIT(pwm)))
3187                 return 0;
3188
3189         if ((nr >= 14 && nr <= 18) || nr == 21)   /* weight */
3190                 if (!data->REG_WEIGHT_TEMP_SEL[pwm])
3191                         return 0;
3192         if (nr == 19 && data->REG_PWM[3] == NULL) /* pwm_max */
3193                 return 0;
3194         if (nr == 20 && data->REG_PWM[4] == NULL) /* pwm_step */
3195                 return 0;
3196         if (nr == 21 && data->REG_PWM[6] == NULL) /* weight_duty_base */
3197                 return 0;
3198
3199         if (nr >= 22 && nr <= 35) {             /* auto point */
3200                 int api = (nr - 22) / 2;        /* auto point index */
3201
3202                 if (api > data->auto_pwm_num)
3203                         return 0;
3204         }
3205         return nct6775_attr_mode(data, attr);
3206 }
3207
3208 SENSOR_TEMPLATE_2(pwm_stop_time, "pwm%d_stop_time", 0644, show_fan_time, store_fan_time, 0, 0);
3209 SENSOR_TEMPLATE_2(pwm_step_up_time, "pwm%d_step_up_time", 0644,
3210                   show_fan_time, store_fan_time, 0, 1);
3211 SENSOR_TEMPLATE_2(pwm_step_down_time, "pwm%d_step_down_time", 0644,
3212                   show_fan_time, store_fan_time, 0, 2);
3213 SENSOR_TEMPLATE_2(pwm_start, "pwm%d_start", 0644, show_pwm, store_pwm, 0, 1);
3214 SENSOR_TEMPLATE_2(pwm_floor, "pwm%d_floor", 0644, show_pwm, store_pwm, 0, 2);
3215 SENSOR_TEMPLATE_2(pwm_temp_tolerance, "pwm%d_temp_tolerance", 0644,
3216                   show_temp_tolerance, store_temp_tolerance, 0, 0);
3217 SENSOR_TEMPLATE_2(pwm_crit_temp_tolerance, "pwm%d_crit_temp_tolerance",
3218                   0644, show_temp_tolerance, store_temp_tolerance, 0, 1);
3219
3220 SENSOR_TEMPLATE_2(pwm_max, "pwm%d_max", 0644, show_pwm, store_pwm, 0, 3);
3221
3222 SENSOR_TEMPLATE_2(pwm_step, "pwm%d_step", 0644, show_pwm, store_pwm, 0, 4);
3223
3224 SENSOR_TEMPLATE_2(pwm_auto_point1_pwm, "pwm%d_auto_point1_pwm",
3225                   0644, show_auto_pwm, store_auto_pwm, 0, 0);
3226 SENSOR_TEMPLATE_2(pwm_auto_point1_temp, "pwm%d_auto_point1_temp",
3227                   0644, show_auto_temp, store_auto_temp, 0, 0);
3228
3229 SENSOR_TEMPLATE_2(pwm_auto_point2_pwm, "pwm%d_auto_point2_pwm",
3230                   0644, show_auto_pwm, store_auto_pwm, 0, 1);
3231 SENSOR_TEMPLATE_2(pwm_auto_point2_temp, "pwm%d_auto_point2_temp",
3232                   0644, show_auto_temp, store_auto_temp, 0, 1);
3233
3234 SENSOR_TEMPLATE_2(pwm_auto_point3_pwm, "pwm%d_auto_point3_pwm",
3235                   0644, show_auto_pwm, store_auto_pwm, 0, 2);
3236 SENSOR_TEMPLATE_2(pwm_auto_point3_temp, "pwm%d_auto_point3_temp",
3237                   0644, show_auto_temp, store_auto_temp, 0, 2);
3238
3239 SENSOR_TEMPLATE_2(pwm_auto_point4_pwm, "pwm%d_auto_point4_pwm",
3240                   0644, show_auto_pwm, store_auto_pwm, 0, 3);
3241 SENSOR_TEMPLATE_2(pwm_auto_point4_temp, "pwm%d_auto_point4_temp",
3242                   0644, show_auto_temp, store_auto_temp, 0, 3);
3243
3244 SENSOR_TEMPLATE_2(pwm_auto_point5_pwm, "pwm%d_auto_point5_pwm",
3245                   0644, show_auto_pwm, store_auto_pwm, 0, 4);
3246 SENSOR_TEMPLATE_2(pwm_auto_point5_temp, "pwm%d_auto_point5_temp",
3247                   0644, show_auto_temp, store_auto_temp, 0, 4);
3248
3249 SENSOR_TEMPLATE_2(pwm_auto_point6_pwm, "pwm%d_auto_point6_pwm",
3250                   0644, show_auto_pwm, store_auto_pwm, 0, 5);
3251 SENSOR_TEMPLATE_2(pwm_auto_point6_temp, "pwm%d_auto_point6_temp",
3252                   0644, show_auto_temp, store_auto_temp, 0, 5);
3253
3254 SENSOR_TEMPLATE_2(pwm_auto_point7_pwm, "pwm%d_auto_point7_pwm",
3255                   0644, show_auto_pwm, store_auto_pwm, 0, 6);
3256 SENSOR_TEMPLATE_2(pwm_auto_point7_temp, "pwm%d_auto_point7_temp",
3257                   0644, show_auto_temp, store_auto_temp, 0, 6);
3258
3259 /*
3260  * nct6775_pwm_is_visible uses the index into the following array
3261  * to determine if attributes should be created or not.
3262  * Any change in order or content must be matched.
3263  */
3264 static struct sensor_device_template *nct6775_attributes_pwm_template[] = {
3265         &sensor_dev_template_pwm,
3266         &sensor_dev_template_pwm_mode,
3267         &sensor_dev_template_pwm_enable,
3268         &sensor_dev_template_pwm_temp_sel,
3269         &sensor_dev_template_pwm_temp_tolerance,
3270         &sensor_dev_template_pwm_crit_temp_tolerance,
3271         &sensor_dev_template_pwm_target_temp,
3272         &sensor_dev_template_fan_target,
3273         &sensor_dev_template_fan_tolerance,
3274         &sensor_dev_template_pwm_stop_time,
3275         &sensor_dev_template_pwm_step_up_time,
3276         &sensor_dev_template_pwm_step_down_time,
3277         &sensor_dev_template_pwm_start,
3278         &sensor_dev_template_pwm_floor,
3279         &sensor_dev_template_pwm_weight_temp_sel,       /* 14 */
3280         &sensor_dev_template_pwm_weight_temp_step,
3281         &sensor_dev_template_pwm_weight_temp_step_tol,
3282         &sensor_dev_template_pwm_weight_temp_step_base,
3283         &sensor_dev_template_pwm_weight_duty_step,      /* 18 */
3284         &sensor_dev_template_pwm_max,                   /* 19 */
3285         &sensor_dev_template_pwm_step,                  /* 20 */
3286         &sensor_dev_template_pwm_weight_duty_base,      /* 21 */
3287         &sensor_dev_template_pwm_auto_point1_pwm,       /* 22 */
3288         &sensor_dev_template_pwm_auto_point1_temp,
3289         &sensor_dev_template_pwm_auto_point2_pwm,
3290         &sensor_dev_template_pwm_auto_point2_temp,
3291         &sensor_dev_template_pwm_auto_point3_pwm,
3292         &sensor_dev_template_pwm_auto_point3_temp,
3293         &sensor_dev_template_pwm_auto_point4_pwm,
3294         &sensor_dev_template_pwm_auto_point4_temp,
3295         &sensor_dev_template_pwm_auto_point5_pwm,
3296         &sensor_dev_template_pwm_auto_point5_temp,
3297         &sensor_dev_template_pwm_auto_point6_pwm,
3298         &sensor_dev_template_pwm_auto_point6_temp,
3299         &sensor_dev_template_pwm_auto_point7_pwm,
3300         &sensor_dev_template_pwm_auto_point7_temp,      /* 35 */
3301
3302         NULL
3303 };
3304
3305 static const struct sensor_template_group nct6775_pwm_template_group = {
3306         .templates = nct6775_attributes_pwm_template,
3307         .is_visible = nct6775_pwm_is_visible,
3308         .base = 1,
3309 };
3310
3311 static inline int nct6775_init_device(struct nct6775_data *data)
3312 {
3313         int i, err;
3314         u16 tmp, diode;
3315
3316         /* Start monitoring if needed */
3317         if (data->REG_CONFIG) {
3318                 err = nct6775_read_value(data, data->REG_CONFIG, &tmp);
3319                 if (err)
3320                         return err;
3321                 if (!(tmp & 0x01)) {
3322                         err = nct6775_write_value(data, data->REG_CONFIG, tmp | 0x01);
3323                         if (err)
3324                                 return err;
3325                 }
3326         }
3327
3328         /* Enable temperature sensors if needed */
3329         for (i = 0; i < NUM_TEMP; i++) {
3330                 if (!(data->have_temp & BIT(i)))
3331                         continue;
3332                 if (!data->reg_temp_config[i])
3333                         continue;
3334                 err = nct6775_read_value(data, data->reg_temp_config[i], &tmp);
3335                 if (err)
3336                         return err;
3337                 if (tmp & 0x01) {
3338                         err = nct6775_write_value(data, data->reg_temp_config[i], tmp & 0xfe);
3339                         if (err)
3340                                 return err;
3341                 }
3342         }
3343
3344         /* Enable VBAT monitoring if needed */
3345         err = nct6775_read_value(data, data->REG_VBAT, &tmp);
3346         if (err)
3347                 return err;
3348         if (!(tmp & 0x01)) {
3349                 err = nct6775_write_value(data, data->REG_VBAT, tmp | 0x01);
3350                 if (err)
3351                         return err;
3352         }
3353
3354         err = nct6775_read_value(data, data->REG_DIODE, &diode);
3355         if (err)
3356                 return err;
3357
3358         for (i = 0; i < data->temp_fixed_num; i++) {
3359                 if (!(data->have_temp_fixed & BIT(i)))
3360                         continue;
3361                 if ((tmp & (data->DIODE_MASK << i)))    /* diode */
3362                         data->temp_type[i]
3363                           = 3 - ((diode >> i) & data->DIODE_MASK);
3364                 else                            /* thermistor */
3365                         data->temp_type[i] = 4;
3366         }
3367
3368         return 0;
3369 }
3370
3371 static int add_temp_sensors(struct nct6775_data *data, const u16 *regp,
3372                             int *available, int *mask)
3373 {
3374         int i, err;
3375         u16 src;
3376
3377         for (i = 0; i < data->pwm_num && *available; i++) {
3378                 int index;
3379
3380                 if (!regp[i])
3381                         continue;
3382                 err = nct6775_read_value(data, regp[i], &src);
3383                 if (err)
3384                         return err;
3385                 src &= 0x1f;
3386                 if (!src || (*mask & BIT(src)))
3387                         continue;
3388                 if (!(data->temp_mask & BIT(src)))
3389                         continue;
3390
3391                 index = __ffs(*available);
3392                 err = nct6775_write_value(data, data->REG_TEMP_SOURCE[index], src);
3393                 if (err)
3394                         return err;
3395                 *available &= ~BIT(index);
3396                 *mask |= BIT(src);
3397         }
3398
3399         return 0;
3400 }
3401
3402 int nct6775_probe(struct device *dev, struct nct6775_data *data,
3403                   const struct regmap_config *regmapcfg)
3404 {
3405         int i, s, err = 0;
3406         int mask, available;
3407         u16 src;
3408         const u16 *reg_temp, *reg_temp_over, *reg_temp_hyst, *reg_temp_config;
3409         const u16 *reg_temp_mon, *reg_temp_alternate, *reg_temp_crit;
3410         const u16 *reg_temp_crit_l = NULL, *reg_temp_crit_h = NULL;
3411         int num_reg_temp, num_reg_temp_mon, num_reg_tsi_temp;
3412         struct device *hwmon_dev;
3413         struct sensor_template_group tsi_temp_tg;
3414
3415         data->regmap = devm_regmap_init(dev, NULL, data, regmapcfg);
3416         if (IS_ERR(data->regmap))
3417                 return PTR_ERR(data->regmap);
3418
3419         mutex_init(&data->update_lock);
3420         data->name = nct6775_device_names[data->kind];
3421         data->bank = 0xff;              /* Force initial bank selection */
3422
3423         switch (data->kind) {
3424         case nct6106:
3425                 data->in_num = 9;
3426                 data->pwm_num = 3;
3427                 data->auto_pwm_num = 4;
3428                 data->temp_fixed_num = 3;
3429                 data->num_temp_alarms = 6;
3430                 data->num_temp_beeps = 6;
3431
3432                 data->fan_from_reg = fan_from_reg13;
3433                 data->fan_from_reg_min = fan_from_reg13;
3434
3435                 data->temp_label = nct6776_temp_label;
3436                 data->temp_mask = NCT6776_TEMP_MASK;
3437                 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK;
3438
3439                 data->REG_VBAT = NCT6106_REG_VBAT;
3440                 data->REG_DIODE = NCT6106_REG_DIODE;
3441                 data->DIODE_MASK = NCT6106_DIODE_MASK;
3442                 data->REG_VIN = NCT6106_REG_IN;
3443                 data->REG_IN_MINMAX[0] = NCT6106_REG_IN_MIN;
3444                 data->REG_IN_MINMAX[1] = NCT6106_REG_IN_MAX;
3445                 data->REG_TARGET = NCT6106_REG_TARGET;
3446                 data->REG_FAN = NCT6106_REG_FAN;
3447                 data->REG_FAN_MODE = NCT6106_REG_FAN_MODE;
3448                 data->REG_FAN_MIN = NCT6106_REG_FAN_MIN;
3449                 data->REG_FAN_PULSES = NCT6106_REG_FAN_PULSES;
3450                 data->FAN_PULSE_SHIFT = NCT6106_FAN_PULSE_SHIFT;
3451                 data->REG_FAN_TIME[0] = NCT6106_REG_FAN_STOP_TIME;
3452                 data->REG_FAN_TIME[1] = NCT6106_REG_FAN_STEP_UP_TIME;
3453                 data->REG_FAN_TIME[2] = NCT6106_REG_FAN_STEP_DOWN_TIME;
3454                 data->REG_TOLERANCE_H = NCT6106_REG_TOLERANCE_H;
3455                 data->REG_PWM[0] = NCT6116_REG_PWM;
3456                 data->REG_PWM[1] = NCT6106_REG_FAN_START_OUTPUT;
3457                 data->REG_PWM[2] = NCT6106_REG_FAN_STOP_OUTPUT;
3458                 data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP;
3459                 data->REG_PWM[6] = NCT6106_REG_WEIGHT_DUTY_BASE;
3460                 data->REG_PWM_READ = NCT6106_REG_PWM_READ;
3461                 data->REG_PWM_MODE = NCT6106_REG_PWM_MODE;
3462                 data->PWM_MODE_MASK = NCT6106_PWM_MODE_MASK;
3463                 data->REG_AUTO_TEMP = NCT6106_REG_AUTO_TEMP;
3464                 data->REG_AUTO_PWM = NCT6106_REG_AUTO_PWM;
3465                 data->REG_CRITICAL_TEMP = NCT6106_REG_CRITICAL_TEMP;
3466                 data->REG_CRITICAL_TEMP_TOLERANCE
3467                   = NCT6106_REG_CRITICAL_TEMP_TOLERANCE;
3468                 data->REG_CRITICAL_PWM_ENABLE = NCT6106_REG_CRITICAL_PWM_ENABLE;
3469                 data->CRITICAL_PWM_ENABLE_MASK
3470                   = NCT6106_CRITICAL_PWM_ENABLE_MASK;
3471                 data->REG_CRITICAL_PWM = NCT6106_REG_CRITICAL_PWM;
3472                 data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET;
3473                 data->REG_TEMP_SOURCE = NCT6106_REG_TEMP_SOURCE;
3474                 data->REG_TEMP_SEL = NCT6116_REG_TEMP_SEL;
3475                 data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL;
3476                 data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP;
3477                 data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL;
3478                 data->REG_WEIGHT_TEMP[2] = NCT6106_REG_WEIGHT_TEMP_BASE;
3479                 data->REG_ALARM = NCT6106_REG_ALARM;
3480                 data->ALARM_BITS = NCT6106_ALARM_BITS;
3481                 data->REG_BEEP = NCT6106_REG_BEEP;
3482                 data->BEEP_BITS = NCT6106_BEEP_BITS;
3483                 data->REG_TSI_TEMP = NCT6106_REG_TSI_TEMP;
3484
3485                 reg_temp = NCT6106_REG_TEMP;
3486                 reg_temp_mon = NCT6106_REG_TEMP_MON;
3487                 num_reg_temp = ARRAY_SIZE(NCT6106_REG_TEMP);
3488                 num_reg_temp_mon = ARRAY_SIZE(NCT6106_REG_TEMP_MON);
3489                 num_reg_tsi_temp = ARRAY_SIZE(NCT6106_REG_TSI_TEMP);
3490                 reg_temp_over = NCT6106_REG_TEMP_OVER;
3491                 reg_temp_hyst = NCT6106_REG_TEMP_HYST;
3492                 reg_temp_config = NCT6106_REG_TEMP_CONFIG;
3493                 reg_temp_alternate = NCT6106_REG_TEMP_ALTERNATE;
3494                 reg_temp_crit = NCT6106_REG_TEMP_CRIT;
3495                 reg_temp_crit_l = NCT6106_REG_TEMP_CRIT_L;
3496                 reg_temp_crit_h = NCT6106_REG_TEMP_CRIT_H;
3497
3498                 break;
3499         case nct6116:
3500                 data->in_num = 9;
3501                 data->pwm_num = 3;
3502                 data->auto_pwm_num = 4;
3503                 data->temp_fixed_num = 3;
3504                 data->num_temp_alarms = 3;
3505                 data->num_temp_beeps = 3;
3506
3507                 data->fan_from_reg = fan_from_reg13;
3508                 data->fan_from_reg_min = fan_from_reg13;
3509
3510                 data->temp_label = nct6776_temp_label;
3511                 data->temp_mask = NCT6776_TEMP_MASK;
3512                 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK;
3513
3514                 data->REG_VBAT = NCT6106_REG_VBAT;
3515                 data->REG_DIODE = NCT6106_REG_DIODE;
3516                 data->DIODE_MASK = NCT6106_DIODE_MASK;
3517                 data->REG_VIN = NCT6106_REG_IN;
3518                 data->REG_IN_MINMAX[0] = NCT6106_REG_IN_MIN;
3519                 data->REG_IN_MINMAX[1] = NCT6106_REG_IN_MAX;
3520                 data->REG_TARGET = NCT6116_REG_TARGET;
3521                 data->REG_FAN = NCT6116_REG_FAN;
3522                 data->REG_FAN_MODE = NCT6116_REG_FAN_MODE;
3523                 data->REG_FAN_MIN = NCT6116_REG_FAN_MIN;
3524                 data->REG_FAN_PULSES = NCT6116_REG_FAN_PULSES;
3525                 data->FAN_PULSE_SHIFT = NCT6116_FAN_PULSE_SHIFT;
3526                 data->REG_FAN_TIME[0] = NCT6116_REG_FAN_STOP_TIME;
3527                 data->REG_FAN_TIME[1] = NCT6116_REG_FAN_STEP_UP_TIME;
3528                 data->REG_FAN_TIME[2] = NCT6116_REG_FAN_STEP_DOWN_TIME;
3529                 data->REG_TOLERANCE_H = NCT6116_REG_TOLERANCE_H;
3530                 data->REG_PWM[0] = NCT6116_REG_PWM;
3531                 data->REG_PWM[1] = NCT6116_REG_FAN_START_OUTPUT;
3532                 data->REG_PWM[2] = NCT6116_REG_FAN_STOP_OUTPUT;
3533                 data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP;
3534                 data->REG_PWM[6] = NCT6106_REG_WEIGHT_DUTY_BASE;
3535                 data->REG_PWM_READ = NCT6106_REG_PWM_READ;
3536                 data->REG_PWM_MODE = NCT6106_REG_PWM_MODE;
3537                 data->PWM_MODE_MASK = NCT6106_PWM_MODE_MASK;
3538                 data->REG_AUTO_TEMP = NCT6116_REG_AUTO_TEMP;
3539                 data->REG_AUTO_PWM = NCT6116_REG_AUTO_PWM;
3540                 data->REG_CRITICAL_TEMP = NCT6116_REG_CRITICAL_TEMP;
3541                 data->REG_CRITICAL_TEMP_TOLERANCE
3542                   = NCT6116_REG_CRITICAL_TEMP_TOLERANCE;
3543                 data->REG_CRITICAL_PWM_ENABLE = NCT6116_REG_CRITICAL_PWM_ENABLE;
3544                 data->CRITICAL_PWM_ENABLE_MASK
3545                   = NCT6106_CRITICAL_PWM_ENABLE_MASK;
3546                 data->REG_CRITICAL_PWM = NCT6116_REG_CRITICAL_PWM;
3547                 data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET;
3548                 data->REG_TEMP_SOURCE = NCT6116_REG_TEMP_SOURCE;
3549                 data->REG_TEMP_SEL = NCT6116_REG_TEMP_SEL;
3550                 data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL;
3551                 data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP;
3552                 data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL;
3553                 data->REG_WEIGHT_TEMP[2] = NCT6106_REG_WEIGHT_TEMP_BASE;
3554                 data->REG_ALARM = NCT6106_REG_ALARM;
3555                 data->ALARM_BITS = NCT6116_ALARM_BITS;
3556                 data->REG_BEEP = NCT6106_REG_BEEP;
3557                 data->BEEP_BITS = NCT6116_BEEP_BITS;
3558                 data->REG_TSI_TEMP = NCT6116_REG_TSI_TEMP;
3559
3560                 reg_temp = NCT6106_REG_TEMP;
3561                 reg_temp_mon = NCT6106_REG_TEMP_MON;
3562                 num_reg_temp = ARRAY_SIZE(NCT6106_REG_TEMP);
3563                 num_reg_temp_mon = ARRAY_SIZE(NCT6106_REG_TEMP_MON);
3564                 num_reg_tsi_temp = ARRAY_SIZE(NCT6116_REG_TSI_TEMP);
3565                 reg_temp_over = NCT6106_REG_TEMP_OVER;
3566                 reg_temp_hyst = NCT6106_REG_TEMP_HYST;
3567                 reg_temp_config = NCT6106_REG_TEMP_CONFIG;
3568                 reg_temp_alternate = NCT6106_REG_TEMP_ALTERNATE;
3569                 reg_temp_crit = NCT6106_REG_TEMP_CRIT;
3570                 reg_temp_crit_l = NCT6106_REG_TEMP_CRIT_L;
3571                 reg_temp_crit_h = NCT6106_REG_TEMP_CRIT_H;
3572
3573                 break;
3574         case nct6775:
3575                 data->in_num = 9;
3576                 data->pwm_num = 3;
3577                 data->auto_pwm_num = 6;
3578                 data->has_fan_div = true;
3579                 data->temp_fixed_num = 3;
3580                 data->num_temp_alarms = 3;
3581                 data->num_temp_beeps = 3;
3582
3583                 data->ALARM_BITS = NCT6775_ALARM_BITS;
3584                 data->BEEP_BITS = NCT6775_BEEP_BITS;
3585
3586                 data->fan_from_reg = fan_from_reg16;
3587                 data->fan_from_reg_min = fan_from_reg8;
3588                 data->target_temp_mask = 0x7f;
3589                 data->tolerance_mask = 0x0f;
3590                 data->speed_tolerance_limit = 15;
3591
3592                 data->temp_label = nct6775_temp_label;
3593                 data->temp_mask = NCT6775_TEMP_MASK;
3594                 data->virt_temp_mask = NCT6775_VIRT_TEMP_MASK;
3595
3596                 data->REG_CONFIG = NCT6775_REG_CONFIG;
3597                 data->REG_VBAT = NCT6775_REG_VBAT;
3598                 data->REG_DIODE = NCT6775_REG_DIODE;
3599                 data->DIODE_MASK = NCT6775_DIODE_MASK;
3600                 data->REG_VIN = NCT6775_REG_IN;
3601                 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
3602                 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
3603                 data->REG_TARGET = NCT6775_REG_TARGET;
3604                 data->REG_FAN = NCT6775_REG_FAN;
3605                 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
3606                 data->REG_FAN_MIN = NCT6775_REG_FAN_MIN;
3607                 data->REG_FAN_PULSES = NCT6775_REG_FAN_PULSES;
3608                 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
3609                 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
3610                 data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME;
3611                 data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME;
3612                 data->REG_PWM[0] = NCT6775_REG_PWM;
3613                 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
3614                 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT;
3615                 data->REG_PWM[3] = NCT6775_REG_FAN_MAX_OUTPUT;
3616                 data->REG_PWM[4] = NCT6775_REG_FAN_STEP_OUTPUT;
3617                 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP;
3618                 data->REG_PWM_READ = NCT6775_REG_PWM_READ;
3619                 data->REG_PWM_MODE = NCT6775_REG_PWM_MODE;
3620                 data->PWM_MODE_MASK = NCT6775_PWM_MODE_MASK;
3621                 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP;
3622                 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM;
3623                 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP;
3624                 data->REG_CRITICAL_TEMP_TOLERANCE
3625                   = NCT6775_REG_CRITICAL_TEMP_TOLERANCE;
3626                 data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET;
3627                 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE;
3628                 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL;
3629                 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL;
3630                 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP;
3631                 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL;
3632                 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE;
3633                 data->REG_ALARM = NCT6775_REG_ALARM;
3634                 data->REG_BEEP = NCT6775_REG_BEEP;
3635                 data->REG_TSI_TEMP = NCT6775_REG_TSI_TEMP;
3636
3637                 reg_temp = NCT6775_REG_TEMP;
3638                 reg_temp_mon = NCT6775_REG_TEMP_MON;
3639                 num_reg_temp = ARRAY_SIZE(NCT6775_REG_TEMP);
3640                 num_reg_temp_mon = ARRAY_SIZE(NCT6775_REG_TEMP_MON);
3641                 num_reg_tsi_temp = ARRAY_SIZE(NCT6775_REG_TSI_TEMP);
3642                 reg_temp_over = NCT6775_REG_TEMP_OVER;
3643                 reg_temp_hyst = NCT6775_REG_TEMP_HYST;
3644                 reg_temp_config = NCT6775_REG_TEMP_CONFIG;
3645                 reg_temp_alternate = NCT6775_REG_TEMP_ALTERNATE;
3646                 reg_temp_crit = NCT6775_REG_TEMP_CRIT;
3647
3648                 break;
3649         case nct6776:
3650                 data->in_num = 9;
3651                 data->pwm_num = 3;
3652                 data->auto_pwm_num = 4;
3653                 data->has_fan_div = false;
3654                 data->temp_fixed_num = 3;
3655                 data->num_temp_alarms = 3;
3656                 data->num_temp_beeps = 6;
3657
3658                 data->ALARM_BITS = NCT6776_ALARM_BITS;
3659                 data->BEEP_BITS = NCT6776_BEEP_BITS;
3660
3661                 data->fan_from_reg = fan_from_reg13;
3662                 data->fan_from_reg_min = fan_from_reg13;
3663                 data->target_temp_mask = 0xff;
3664                 data->tolerance_mask = 0x07;
3665                 data->speed_tolerance_limit = 63;
3666
3667                 data->temp_label = nct6776_temp_label;
3668                 data->temp_mask = NCT6776_TEMP_MASK;
3669                 data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK;
3670
3671                 data->REG_CONFIG = NCT6775_REG_CONFIG;
3672                 data->REG_VBAT = NCT6775_REG_VBAT;
3673                 data->REG_DIODE = NCT6775_REG_DIODE;
3674                 data->DIODE_MASK = NCT6775_DIODE_MASK;
3675                 data->REG_VIN = NCT6775_REG_IN;
3676                 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
3677                 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
3678                 data->REG_TARGET = NCT6775_REG_TARGET;
3679                 data->REG_FAN = NCT6775_REG_FAN;
3680                 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
3681                 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN;
3682                 data->REG_FAN_PULSES = NCT6776_REG_FAN_PULSES;
3683                 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
3684                 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
3685                 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME;
3686                 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME;
3687                 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
3688                 data->REG_PWM[0] = NCT6775_REG_PWM;
3689                 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
3690                 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT;
3691                 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP;
3692                 data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE;
3693                 data->REG_PWM_READ = NCT6775_REG_PWM_READ;
3694                 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE;
3695                 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK;
3696                 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP;
3697                 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM;
3698                 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP;
3699                 data->REG_CRITICAL_TEMP_TOLERANCE
3700                   = NCT6775_REG_CRITICAL_TEMP_TOLERANCE;
3701                 data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET;
3702                 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE;
3703                 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL;
3704                 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL;
3705                 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP;
3706                 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL;
3707                 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE;
3708                 data->REG_ALARM = NCT6775_REG_ALARM;
3709                 data->REG_BEEP = NCT6776_REG_BEEP;
3710                 data->REG_TSI_TEMP = NCT6776_REG_TSI_TEMP;
3711
3712                 reg_temp = NCT6775_REG_TEMP;
3713                 reg_temp_mon = NCT6775_REG_TEMP_MON;
3714                 num_reg_temp = ARRAY_SIZE(NCT6775_REG_TEMP);
3715                 num_reg_temp_mon = ARRAY_SIZE(NCT6775_REG_TEMP_MON);
3716                 num_reg_tsi_temp = ARRAY_SIZE(NCT6776_REG_TSI_TEMP);
3717                 reg_temp_over = NCT6775_REG_TEMP_OVER;
3718                 reg_temp_hyst = NCT6775_REG_TEMP_HYST;
3719                 reg_temp_config = NCT6776_REG_TEMP_CONFIG;
3720                 reg_temp_alternate = NCT6776_REG_TEMP_ALTERNATE;
3721                 reg_temp_crit = NCT6776_REG_TEMP_CRIT;
3722
3723                 break;
3724         case nct6779:
3725                 data->in_num = 15;
3726                 data->pwm_num = 5;
3727                 data->auto_pwm_num = 4;
3728                 data->has_fan_div = false;
3729                 data->temp_fixed_num = 6;
3730                 data->num_temp_alarms = 2;
3731                 data->num_temp_beeps = 2;
3732
3733                 data->ALARM_BITS = NCT6779_ALARM_BITS;
3734                 data->BEEP_BITS = NCT6779_BEEP_BITS;
3735
3736                 data->fan_from_reg = fan_from_reg_rpm;
3737                 data->fan_from_reg_min = fan_from_reg13;
3738                 data->target_temp_mask = 0xff;
3739                 data->tolerance_mask = 0x07;
3740                 data->speed_tolerance_limit = 63;
3741
3742                 data->temp_label = nct6779_temp_label;
3743                 data->temp_mask = NCT6779_TEMP_MASK;
3744                 data->virt_temp_mask = NCT6779_VIRT_TEMP_MASK;
3745
3746                 data->REG_CONFIG = NCT6775_REG_CONFIG;
3747                 data->REG_VBAT = NCT6775_REG_VBAT;
3748                 data->REG_DIODE = NCT6775_REG_DIODE;
3749                 data->DIODE_MASK = NCT6775_DIODE_MASK;
3750                 data->REG_VIN = NCT6779_REG_IN;
3751                 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
3752                 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
3753                 data->REG_TARGET = NCT6775_REG_TARGET;
3754                 data->REG_FAN = NCT6779_REG_FAN;
3755                 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
3756                 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN;
3757                 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES;
3758                 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
3759                 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
3760                 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME;
3761                 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME;
3762                 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
3763                 data->REG_PWM[0] = NCT6775_REG_PWM;
3764                 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
3765                 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT;
3766                 data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP;
3767                 data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE;
3768                 data->REG_PWM_READ = NCT6775_REG_PWM_READ;
3769                 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE;
3770                 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK;
3771                 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP;
3772                 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM;
3773                 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP;
3774                 data->REG_CRITICAL_TEMP_TOLERANCE
3775                   = NCT6775_REG_CRITICAL_TEMP_TOLERANCE;
3776                 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE;
3777                 data->CRITICAL_PWM_ENABLE_MASK
3778                   = NCT6779_CRITICAL_PWM_ENABLE_MASK;
3779                 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM;
3780                 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET;
3781                 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE;
3782                 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL;
3783                 data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL;
3784                 data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP;
3785                 data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL;
3786                 data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE;
3787                 data->REG_ALARM = NCT6779_REG_ALARM;
3788                 data->REG_BEEP = NCT6776_REG_BEEP;
3789                 data->REG_TSI_TEMP = NCT6776_REG_TSI_TEMP;
3790
3791                 reg_temp = NCT6779_REG_TEMP;
3792                 reg_temp_mon = NCT6779_REG_TEMP_MON;
3793                 num_reg_temp = ARRAY_SIZE(NCT6779_REG_TEMP);
3794                 num_reg_temp_mon = ARRAY_SIZE(NCT6779_REG_TEMP_MON);
3795                 num_reg_tsi_temp = ARRAY_SIZE(NCT6776_REG_TSI_TEMP);
3796                 reg_temp_over = NCT6779_REG_TEMP_OVER;
3797                 reg_temp_hyst = NCT6779_REG_TEMP_HYST;
3798                 reg_temp_config = NCT6779_REG_TEMP_CONFIG;
3799                 reg_temp_alternate = NCT6779_REG_TEMP_ALTERNATE;
3800                 reg_temp_crit = NCT6779_REG_TEMP_CRIT;
3801
3802                 break;
3803         case nct6791:
3804         case nct6792:
3805         case nct6793:
3806         case nct6795:
3807         case nct6796:
3808         case nct6797:
3809         case nct6798:
3810                 data->in_num = 15;
3811                 data->pwm_num = (data->kind == nct6796 ||
3812                                  data->kind == nct6797 ||
3813                                  data->kind == nct6798) ? 7 : 6;
3814                 data->auto_pwm_num = 4;
3815                 data->has_fan_div = false;
3816                 data->temp_fixed_num = 6;
3817                 data->num_temp_alarms = 2;
3818                 data->num_temp_beeps = 2;
3819
3820                 data->ALARM_BITS = NCT6791_ALARM_BITS;
3821                 data->BEEP_BITS = NCT6779_BEEP_BITS;
3822
3823                 data->fan_from_reg = fan_from_reg_rpm;
3824                 data->fan_from_reg_min = fan_from_reg13;
3825                 data->target_temp_mask = 0xff;
3826                 data->tolerance_mask = 0x07;
3827                 data->speed_tolerance_limit = 63;
3828
3829                 switch (data->kind) {
3830                 default:
3831                 case nct6791:
3832                         data->temp_label = nct6779_temp_label;
3833                         data->temp_mask = NCT6791_TEMP_MASK;
3834                         data->virt_temp_mask = NCT6791_VIRT_TEMP_MASK;
3835                         break;
3836                 case nct6792:
3837                         data->temp_label = nct6792_temp_label;
3838                         data->temp_mask = NCT6792_TEMP_MASK;
3839                         data->virt_temp_mask = NCT6792_VIRT_TEMP_MASK;
3840                         break;
3841                 case nct6793:
3842                         data->temp_label = nct6793_temp_label;
3843                         data->temp_mask = NCT6793_TEMP_MASK;
3844                         data->virt_temp_mask = NCT6793_VIRT_TEMP_MASK;
3845                         break;
3846                 case nct6795:
3847                 case nct6797:
3848                         data->temp_label = nct6795_temp_label;
3849                         data->temp_mask = NCT6795_TEMP_MASK;
3850                         data->virt_temp_mask = NCT6795_VIRT_TEMP_MASK;
3851                         break;
3852                 case nct6796:
3853                         data->temp_label = nct6796_temp_label;
3854                         data->temp_mask = NCT6796_TEMP_MASK;
3855                         data->virt_temp_mask = NCT6796_VIRT_TEMP_MASK;
3856                         break;
3857                 case nct6798:
3858                         data->temp_label = nct6798_temp_label;
3859                         data->temp_mask = NCT6798_TEMP_MASK;
3860                         data->virt_temp_mask = NCT6798_VIRT_TEMP_MASK;
3861                         break;
3862                 }
3863
3864                 data->REG_CONFIG = NCT6775_REG_CONFIG;
3865                 data->REG_VBAT = NCT6775_REG_VBAT;
3866                 data->REG_DIODE = NCT6775_REG_DIODE;
3867                 data->DIODE_MASK = NCT6775_DIODE_MASK;
3868                 data->REG_VIN = NCT6779_REG_IN;
3869                 data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
3870                 data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
3871                 data->REG_TARGET = NCT6775_REG_TARGET;
3872                 data->REG_FAN = NCT6779_REG_FAN;
3873                 data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
3874                 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN;
3875                 data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES;
3876                 data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
3877                 data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
3878                 data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME;
3879                 data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME;
3880                 data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
3881                 data->REG_PWM[0] = NCT6775_REG_PWM;
3882                 data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
3883                 data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT;
3884                 data->REG_PWM[5] = NCT6791_REG_WEIGHT_DUTY_STEP;
3885                 data->REG_PWM[6] = NCT6791_REG_WEIGHT_DUTY_BASE;
3886                 data->REG_PWM_READ = NCT6775_REG_PWM_READ;
3887                 data->REG_PWM_MODE = NCT6776_REG_PWM_MODE;
3888                 data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK;
3889                 data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP;
3890                 data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM;
3891                 data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP;
3892                 data->REG_CRITICAL_TEMP_TOLERANCE
3893                   = NCT6775_REG_CRITICAL_TEMP_TOLERANCE;
3894                 data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE;
3895                 data->CRITICAL_PWM_ENABLE_MASK
3896                   = NCT6779_CRITICAL_PWM_ENABLE_MASK;
3897                 data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM;
3898                 data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET;
3899                 data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE;
3900                 data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL;
3901                 data->REG_WEIGHT_TEMP_SEL = NCT6791_REG_WEIGHT_TEMP_SEL;
3902                 data->REG_WEIGHT_TEMP[0] = NCT6791_REG_WEIGHT_TEMP_STEP;
3903                 data->REG_WEIGHT_TEMP[1] = NCT6791_REG_WEIGHT_TEMP_STEP_TOL;
3904                 data->REG_WEIGHT_TEMP[2] = NCT6791_REG_WEIGHT_TEMP_BASE;
3905                 data->REG_ALARM = NCT6791_REG_ALARM;
3906                 if (data->kind == nct6791)
3907                         data->REG_BEEP = NCT6776_REG_BEEP;
3908                 else
3909                         data->REG_BEEP = NCT6792_REG_BEEP;
3910                 switch (data->kind) {
3911                 case nct6791:
3912                 case nct6792:
3913                 case nct6793:
3914                         data->REG_TSI_TEMP = NCT6776_REG_TSI_TEMP;
3915                         num_reg_tsi_temp = ARRAY_SIZE(NCT6776_REG_TSI_TEMP);
3916                         break;
3917                 case nct6795:
3918                 case nct6796:
3919                 case nct6797:
3920                 case nct6798:
3921                         data->REG_TSI_TEMP = NCT6796_REG_TSI_TEMP;
3922                         num_reg_tsi_temp = ARRAY_SIZE(NCT6796_REG_TSI_TEMP);
3923                         break;
3924                 default:
3925                         num_reg_tsi_temp = 0;
3926                         break;
3927                 }
3928
3929                 reg_temp = NCT6779_REG_TEMP;
3930                 num_reg_temp = ARRAY_SIZE(NCT6779_REG_TEMP);
3931                 if (data->kind == nct6791) {
3932                         reg_temp_mon = NCT6779_REG_TEMP_MON;
3933                         num_reg_temp_mon = ARRAY_SIZE(NCT6779_REG_TEMP_MON);
3934                 } else {
3935                         reg_temp_mon = NCT6792_REG_TEMP_MON;
3936                         num_reg_temp_mon = ARRAY_SIZE(NCT6792_REG_TEMP_MON);
3937                 }
3938                 reg_temp_over = NCT6779_REG_TEMP_OVER;
3939                 reg_temp_hyst = NCT6779_REG_TEMP_HYST;
3940                 reg_temp_config = NCT6779_REG_TEMP_CONFIG;
3941                 reg_temp_alternate = NCT6779_REG_TEMP_ALTERNATE;
3942                 reg_temp_crit = NCT6779_REG_TEMP_CRIT;
3943
3944                 break;
3945         default:
3946                 return -ENODEV;
3947         }
3948         data->have_in = BIT(data->in_num) - 1;
3949         data->have_temp = 0;
3950
3951         /*
3952          * On some boards, not all available temperature sources are monitored,
3953          * even though some of the monitoring registers are unused.
3954          * Get list of unused monitoring registers, then detect if any fan
3955          * controls are configured to use unmonitored temperature sources.
3956          * If so, assign the unmonitored temperature sources to available
3957          * monitoring registers.
3958          */
3959         mask = 0;
3960         available = 0;
3961         for (i = 0; i < num_reg_temp; i++) {
3962                 if (reg_temp[i] == 0)
3963                         continue;
3964
3965                 err = nct6775_read_value(data, data->REG_TEMP_SOURCE[i], &src);
3966                 if (err)
3967                         return err;
3968                 src &= 0x1f;
3969                 if (!src || (mask & BIT(src)))
3970                         available |= BIT(i);
3971
3972                 mask |= BIT(src);
3973         }
3974
3975         /*
3976          * Now find unmonitored temperature registers and enable monitoring
3977          * if additional monitoring registers are available.
3978          */
3979         err = add_temp_sensors(data, data->REG_TEMP_SEL, &available, &mask);
3980         if (err)
3981                 return err;
3982         err = add_temp_sensors(data, data->REG_WEIGHT_TEMP_SEL, &available, &mask);
3983         if (err)
3984                 return err;
3985
3986         mask = 0;
3987         s = NUM_TEMP_FIXED;     /* First dynamic temperature attribute */
3988         for (i = 0; i < num_reg_temp; i++) {
3989                 if (reg_temp[i] == 0)
3990                         continue;
3991
3992                 err = nct6775_read_value(data, data->REG_TEMP_SOURCE[i], &src);
3993                 if (err)
3994                         return err;
3995                 src &= 0x1f;
3996                 if (!src || (mask & BIT(src)))
3997                         continue;
3998
3999                 if (!(data->temp_mask & BIT(src))) {
4000                         dev_info(dev,
4001                                  "Invalid temperature source %d at index %d, source register 0x%x, temp register 0x%x\n",
4002                                  src, i, data->REG_TEMP_SOURCE[i], reg_temp[i]);
4003                         continue;
4004                 }
4005
4006                 mask |= BIT(src);
4007
4008                 /* Use fixed index for SYSTIN(1), CPUTIN(2), AUXTIN(3) */
4009                 if (src <= data->temp_fixed_num) {
4010                         data->have_temp |= BIT(src - 1);
4011                         data->have_temp_fixed |= BIT(src - 1);
4012                         data->reg_temp[0][src - 1] = reg_temp[i];
4013                         data->reg_temp[1][src - 1] = reg_temp_over[i];
4014                         data->reg_temp[2][src - 1] = reg_temp_hyst[i];
4015                         if (reg_temp_crit_h && reg_temp_crit_h[i])
4016                                 data->reg_temp[3][src - 1] = reg_temp_crit_h[i];
4017                         else if (reg_temp_crit[src - 1])
4018                                 data->reg_temp[3][src - 1]
4019                                   = reg_temp_crit[src - 1];
4020                         if (reg_temp_crit_l && reg_temp_crit_l[i])
4021                                 data->reg_temp[4][src - 1] = reg_temp_crit_l[i];
4022                         data->reg_temp_config[src - 1] = reg_temp_config[i];
4023                         data->temp_src[src - 1] = src;
4024                         continue;
4025                 }
4026
4027                 if (s >= NUM_TEMP)
4028                         continue;
4029
4030                 /* Use dynamic index for other sources */
4031                 data->have_temp |= BIT(s);
4032                 data->reg_temp[0][s] = reg_temp[i];
4033                 data->reg_temp[1][s] = reg_temp_over[i];
4034                 data->reg_temp[2][s] = reg_temp_hyst[i];
4035                 data->reg_temp_config[s] = reg_temp_config[i];
4036                 if (reg_temp_crit_h && reg_temp_crit_h[i])
4037                         data->reg_temp[3][s] = reg_temp_crit_h[i];
4038                 else if (reg_temp_crit[src - 1])
4039                         data->reg_temp[3][s] = reg_temp_crit[src - 1];
4040                 if (reg_temp_crit_l && reg_temp_crit_l[i])
4041                         data->reg_temp[4][s] = reg_temp_crit_l[i];
4042
4043                 data->temp_src[s] = src;
4044                 s++;
4045         }
4046
4047         /*
4048          * Repeat with temperatures used for fan control.
4049          * This set of registers does not support limits.
4050          */
4051         for (i = 0; i < num_reg_temp_mon; i++) {
4052                 if (reg_temp_mon[i] == 0)
4053                         continue;
4054
4055                 err = nct6775_read_value(data, data->REG_TEMP_SEL[i], &src);
4056                 if (err)
4057                         return err;
4058                 src &= 0x1f;
4059                 if (!src)
4060                         continue;
4061
4062                 if (!(data->temp_mask & BIT(src))) {
4063                         dev_info(dev,
4064                                  "Invalid temperature source %d at index %d, source register 0x%x, temp register 0x%x\n",
4065                                  src, i, data->REG_TEMP_SEL[i],
4066                                  reg_temp_mon[i]);
4067                         continue;
4068                 }
4069
4070                 /*
4071                  * For virtual temperature sources, the 'virtual' temperature
4072                  * for each fan reflects a different temperature, and there
4073                  * are no duplicates.
4074                  */
4075                 if (!(data->virt_temp_mask & BIT(src))) {
4076                         if (mask & BIT(src))
4077                                 continue;
4078                         mask |= BIT(src);
4079                 }
4080
4081                 /* Use fixed index for SYSTIN(1), CPUTIN(2), AUXTIN(3) */
4082                 if (src <= data->temp_fixed_num) {
4083                         if (data->have_temp & BIT(src - 1))
4084                                 continue;
4085                         data->have_temp |= BIT(src - 1);
4086                         data->have_temp_fixed |= BIT(src - 1);
4087                         data->reg_temp[0][src - 1] = reg_temp_mon[i];
4088                         data->temp_src[src - 1] = src;
4089                         continue;
4090                 }
4091
4092                 if (s >= NUM_TEMP)
4093                         continue;
4094
4095                 /* Use dynamic index for other sources */
4096                 data->have_temp |= BIT(s);
4097                 data->reg_temp[0][s] = reg_temp_mon[i];
4098                 data->temp_src[s] = src;
4099                 s++;
4100         }
4101
4102 #ifdef USE_ALTERNATE
4103         /*
4104          * Go through the list of alternate temp registers and enable
4105          * if possible.
4106          * The temperature is already monitored if the respective bit in <mask>
4107          * is set.
4108          */
4109         for (i = 0; i < 31; i++) {
4110                 if (!(data->temp_mask & BIT(i + 1)))
4111                         continue;
4112                 if (!reg_temp_alternate[i])
4113                         continue;
4114                 if (mask & BIT(i + 1))
4115                         continue;
4116                 if (i < data->temp_fixed_num) {
4117                         if (data->have_temp & BIT(i))
4118                                 continue;
4119                         data->have_temp |= BIT(i);
4120                         data->have_temp_fixed |= BIT(i);
4121                         data->reg_temp[0][i] = reg_temp_alternate[i];
4122                         if (i < num_reg_temp) {
4123                                 data->reg_temp[1][i] = reg_temp_over[i];
4124                                 data->reg_temp[2][i] = reg_temp_hyst[i];
4125                         }
4126                         data->temp_src[i] = i + 1;
4127                         continue;
4128                 }
4129
4130                 if (s >= NUM_TEMP)      /* Abort if no more space */
4131                         break;
4132
4133                 data->have_temp |= BIT(s);
4134                 data->reg_temp[0][s] = reg_temp_alternate[i];
4135                 data->temp_src[s] = i + 1;
4136                 s++;
4137         }
4138 #endif /* USE_ALTERNATE */
4139
4140         /* Check which TSIx_TEMP registers are active */
4141         for (i = 0; i < num_reg_tsi_temp; i++) {
4142                 u16 tmp;
4143
4144                 err = nct6775_read_value(data, data->REG_TSI_TEMP[i], &tmp);
4145                 if (err)
4146                         return err;
4147                 if (tmp)
4148                         data->have_tsi_temp |= BIT(i);
4149         }
4150
4151         /* Initialize the chip */
4152         err = nct6775_init_device(data);
4153         if (err)
4154                 return err;
4155
4156         if (data->driver_init) {
4157                 err = data->driver_init(data);
4158                 if (err)
4159                         return err;
4160         }
4161
4162         /* Read fan clock dividers immediately */
4163         err = nct6775_init_fan_common(dev, data);
4164         if (err)
4165                 return err;
4166
4167         /* Register sysfs hooks */
4168         err = nct6775_add_template_attr_group(dev, data, &nct6775_pwm_template_group,
4169                                               data->pwm_num);
4170         if (err)
4171                 return err;
4172
4173         err = nct6775_add_template_attr_group(dev, data, &nct6775_in_template_group,
4174                                               fls(data->have_in));
4175         if (err)
4176                 return err;
4177
4178         err = nct6775_add_template_attr_group(dev, data, &nct6775_fan_template_group,
4179                                               fls(data->has_fan));
4180         if (err)
4181                 return err;
4182
4183         err = nct6775_add_template_attr_group(dev, data, &nct6775_temp_template_group,
4184                                               fls(data->have_temp));
4185         if (err)
4186                 return err;
4187
4188         if (data->have_tsi_temp) {
4189                 tsi_temp_tg.templates = nct6775_tsi_temp_template;
4190                 tsi_temp_tg.is_visible = nct6775_tsi_temp_is_visible;
4191                 tsi_temp_tg.base = fls(data->have_temp) + 1;
4192                 err = nct6775_add_template_attr_group(dev, data, &tsi_temp_tg,
4193                                                       fls(data->have_tsi_temp));
4194                 if (err)
4195                         return err;
4196         }
4197
4198         hwmon_dev = devm_hwmon_device_register_with_groups(dev, data->name,
4199                                                            data, data->groups);
4200         return PTR_ERR_OR_ZERO(hwmon_dev);
4201 }
4202 EXPORT_SYMBOL_GPL(nct6775_probe);
4203
4204 MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
4205 MODULE_DESCRIPTION("Core driver for NCT6775F and compatible chips");
4206 MODULE_LICENSE("GPL");