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