nct6775-core.c 118 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0-or-later
2 3 4 5 6 7 8
/*
 * nct6775 - Driver for the hardware monitoring functionality of
 *	       Nuvoton NCT677x Super-I/O chips
 *
 * Copyright (C) 2012  Guenter Roeck <linux@roeck-us.net>
 *
 * Derived from w83627ehf driver
9
 * Copyright (C) 2005-2012  Jean Delvare <jdelvare@suse.de>
10 11 12 13 14 15 16 17 18 19 20 21
 * Copyright (C) 2006  Yuan Mu (Winbond),
 *		       Rudolf Marek <r.marek@assembler.cz>
 *		       David Hubbard <david.c.hubbard@gmail.com>
 *		       Daniel J Blueman <daniel.blueman@gmail.com>
 * Copyright (C) 2010  Sheng-Yuan Huang (Nuvoton) (PS00)
 *
 * Shamelessly ripped from the w83627hf driver
 * Copyright (C) 2003  Mark Studebaker
 *
 * Supports the following chips:
 *
 * Chip        #vin    #fan    #pwm    #temp  chip IDs       man ID
22
 * nct6106d     9      3       3       6+3    0xc450 0xc1    0x5ca3
23
 * nct6116d     9      5       5       3+3    0xd280 0xc1    0x5ca3
24 25 26
 * nct6775f     9      4       3       6+3    0xb470 0xc1    0x5ca3
 * nct6776f     9      5       3       6+3    0xc330 0xc1    0x5ca3
 * nct6779d    15      5       5       2+6    0xc560 0xc1    0x5ca3
27
 * nct6791d    15      6       6       2+6    0xc800 0xc1    0x5ca3
28
 * nct6792d    15      6       6       2+6    0xc910 0xc1    0x5ca3
29
 * nct6793d    15      6       6       2+6    0xd120 0xc1    0x5ca3
30
 * nct6795d    14      6       6       2+6    0xd350 0xc1    0x5ca3
31
 * nct6796d    14      7       7       2+6    0xd420 0xc1    0x5ca3
32
 * nct6797d    14      7       7       2+6    0xd450 0xc1    0x5ca3
33
 *                                           (0xd451)
34 35
 * nct6798d    14      7       7       2+6    0xd428 0xc1    0x5ca3
 *                                           (0xd429)
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
 *
 * #temp lists the number of monitored temperature sources (first value) plus
 * the number of directly connectable temperature sensors (second value).
 */

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/jiffies.h>
#include <linux/hwmon.h>
#include <linux/hwmon-sysfs.h>
#include <linux/err.h>
#include <linux/mutex.h>
51
#include <linux/bitops.h>
52
#include <linux/nospec.h>
53
#include <linux/regmap.h>
54
#include "lm75.h"
55
#include "nct6775.h"
56

57 58
#undef DEFAULT_SYMBOL_NAMESPACE
#define DEFAULT_SYMBOL_NAMESPACE HWMON_NCT6775
59

60
#define USE_ALTERNATE
61 62 63

/* used to set data->name = nct6775_device_names[data->sio_kind] */
static const char * const nct6775_device_names[] = {
64
	"nct6106",
65
	"nct6116",
66 67 68
	"nct6775",
	"nct6776",
	"nct6779",
69
	"nct6791",
70
	"nct6792",
71
	"nct6793",
72
	"nct6795",
73
	"nct6796",
74
	"nct6797",
75
	"nct6798",
76 77
};

78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
/* Common and NCT6775 specific data */

/* Voltage min/max registers for nr=7..14 are in bank 5 */

static const u16 NCT6775_REG_IN_MAX[] = {
	0x2b, 0x2d, 0x2f, 0x31, 0x33, 0x35, 0x37, 0x554, 0x556, 0x558, 0x55a,
	0x55c, 0x55e, 0x560, 0x562 };
static const u16 NCT6775_REG_IN_MIN[] = {
	0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x555, 0x557, 0x559, 0x55b,
	0x55d, 0x55f, 0x561, 0x563 };
static const u16 NCT6775_REG_IN[] = {
	0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x550, 0x551, 0x552
};

#define NCT6775_REG_VBAT		0x5D
93
#define NCT6775_REG_DIODE		0x5E
94
#define NCT6775_DIODE_MASK		0x02
95 96 97

static const u16 NCT6775_REG_ALARM[NUM_REG_ALARM] = { 0x459, 0x45A, 0x45B };

98
/* 0..15 voltages, 16..23 fans, 24..29 temperatures, 30..31 intrusion */
99 100 101 102 103

static const s8 NCT6775_ALARM_BITS[] = {
	0, 1, 2, 3, 8, 21, 20, 16,	/* in0.. in7 */
	17, -1, -1, -1, -1, -1, -1,	/* in8..in14 */
	-1,				/* unused */
104
	6, 7, 11, -1, -1,		/* fan1..fan5 */
105 106 107 108
	-1, -1, -1,			/* unused */
	4, 5, 13, -1, -1, -1,		/* temp1..temp6 */
	12, -1 };			/* intrusion0, intrusion1 */

109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
static const u16 NCT6775_REG_BEEP[NUM_REG_BEEP] = { 0x56, 0x57, 0x453, 0x4e };

/*
 * 0..14 voltages, 15 global beep enable, 16..23 fans, 24..29 temperatures,
 * 30..31 intrusion
 */
static const s8 NCT6775_BEEP_BITS[] = {
	0, 1, 2, 3, 8, 9, 10, 16,	/* in0.. in7 */
	17, -1, -1, -1, -1, -1, -1,	/* in8..in14 */
	21,				/* global beep enable */
	6, 7, 11, 28, -1,		/* fan1..fan5 */
	-1, -1, -1,			/* unused */
	4, 5, 13, -1, -1, -1,		/* temp1..temp6 */
	12, -1 };			/* intrusion0, intrusion1 */

124 125 126 127
/* DC or PWM output fan configuration */
static const u8 NCT6775_REG_PWM_MODE[] = { 0x04, 0x04, 0x12 };
static const u8 NCT6775_PWM_MODE_MASK[] = { 0x01, 0x02, 0x01 };

128
/* Advanced Fan control, some values are common for all fans */
129

130
static const u16 NCT6775_REG_TARGET[] = {
131
	0x101, 0x201, 0x301, 0x801, 0x901, 0xa01, 0xb01 };
132
static const u16 NCT6775_REG_FAN_MODE[] = {
133
	0x102, 0x202, 0x302, 0x802, 0x902, 0xa02, 0xb02 };
134
static const u16 NCT6775_REG_FAN_STEP_DOWN_TIME[] = {
135
	0x103, 0x203, 0x303, 0x803, 0x903, 0xa03, 0xb03 };
136
static const u16 NCT6775_REG_FAN_STEP_UP_TIME[] = {
137
	0x104, 0x204, 0x304, 0x804, 0x904, 0xa04, 0xb04 };
138
static const u16 NCT6775_REG_FAN_STOP_OUTPUT[] = {
139
	0x105, 0x205, 0x305, 0x805, 0x905, 0xa05, 0xb05 };
140
static const u16 NCT6775_REG_FAN_START_OUTPUT[] = {
141
	0x106, 0x206, 0x306, 0x806, 0x906, 0xa06, 0xb06 };
142 143 144 145
static const u16 NCT6775_REG_FAN_MAX_OUTPUT[] = { 0x10a, 0x20a, 0x30a };
static const u16 NCT6775_REG_FAN_STEP_OUTPUT[] = { 0x10b, 0x20b, 0x30b };

static const u16 NCT6775_REG_FAN_STOP_TIME[] = {
146
	0x107, 0x207, 0x307, 0x807, 0x907, 0xa07, 0xb07 };
147
static const u16 NCT6775_REG_PWM[] = {
148
	0x109, 0x209, 0x309, 0x809, 0x909, 0xa09, 0xb09 };
149
static const u16 NCT6775_REG_PWM_READ[] = {
150
	0x01, 0x03, 0x11, 0x13, 0x15, 0xa09, 0xb09 };
151

152 153
static const u16 NCT6775_REG_FAN[] = { 0x630, 0x632, 0x634, 0x636, 0x638 };
static const u16 NCT6775_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d };
154 155 156
static const u16 NCT6775_REG_FAN_PULSES[NUM_FAN] = {
	0x641, 0x642, 0x643, 0x644 };
static const u16 NCT6775_FAN_PULSE_SHIFT[NUM_FAN] = { };
157

158 159 160
static const u16 NCT6775_REG_TEMP[] = {
	0x27, 0x150, 0x250, 0x62b, 0x62c, 0x62d };

161 162
static const u16 NCT6775_REG_TEMP_MON[] = { 0x73, 0x75, 0x77 };

163 164 165 166 167 168 169 170 171 172
static const u16 NCT6775_REG_TEMP_CONFIG[ARRAY_SIZE(NCT6775_REG_TEMP)] = {
	0, 0x152, 0x252, 0x628, 0x629, 0x62A };
static const u16 NCT6775_REG_TEMP_HYST[ARRAY_SIZE(NCT6775_REG_TEMP)] = {
	0x3a, 0x153, 0x253, 0x673, 0x678, 0x67D };
static const u16 NCT6775_REG_TEMP_OVER[ARRAY_SIZE(NCT6775_REG_TEMP)] = {
	0x39, 0x155, 0x255, 0x672, 0x677, 0x67C };

static const u16 NCT6775_REG_TEMP_SOURCE[ARRAY_SIZE(NCT6775_REG_TEMP)] = {
	0x621, 0x622, 0x623, 0x624, 0x625, 0x626 };

173
static const u16 NCT6775_REG_TEMP_SEL[] = {
174
	0x100, 0x200, 0x300, 0x800, 0x900, 0xa00, 0xb00 };
175

176
static const u16 NCT6775_REG_WEIGHT_TEMP_SEL[] = {
177
	0x139, 0x239, 0x339, 0x839, 0x939, 0xa39 };
178
static const u16 NCT6775_REG_WEIGHT_TEMP_STEP[] = {
179
	0x13a, 0x23a, 0x33a, 0x83a, 0x93a, 0xa3a };
180
static const u16 NCT6775_REG_WEIGHT_TEMP_STEP_TOL[] = {
181
	0x13b, 0x23b, 0x33b, 0x83b, 0x93b, 0xa3b };
182
static const u16 NCT6775_REG_WEIGHT_DUTY_STEP[] = {
183
	0x13c, 0x23c, 0x33c, 0x83c, 0x93c, 0xa3c };
184
static const u16 NCT6775_REG_WEIGHT_TEMP_BASE[] = {
185
	0x13d, 0x23d, 0x33d, 0x83d, 0x93d, 0xa3d };
186

187 188
static const u16 NCT6775_REG_TEMP_OFFSET[] = { 0x454, 0x455, 0x456 };

189
static const u16 NCT6775_REG_AUTO_TEMP[] = {
190
	0x121, 0x221, 0x321, 0x821, 0x921, 0xa21, 0xb21 };
191
static const u16 NCT6775_REG_AUTO_PWM[] = {
192
	0x127, 0x227, 0x327, 0x827, 0x927, 0xa27, 0xb27 };
193 194 195 196 197 198 199

#define NCT6775_AUTO_TEMP(data, nr, p)	((data)->REG_AUTO_TEMP[nr] + (p))
#define NCT6775_AUTO_PWM(data, nr, p)	((data)->REG_AUTO_PWM[nr] + (p))

static const u16 NCT6775_REG_CRITICAL_ENAB[] = { 0x134, 0x234, 0x334 };

static const u16 NCT6775_REG_CRITICAL_TEMP[] = {
200
	0x135, 0x235, 0x335, 0x835, 0x935, 0xa35, 0xb35 };
201
static const u16 NCT6775_REG_CRITICAL_TEMP_TOLERANCE[] = {
202
	0x138, 0x238, 0x338, 0x838, 0x938, 0xa38, 0xb38 };
203

204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
static const char *const nct6775_temp_label[] = {
	"",
	"SYSTIN",
	"CPUTIN",
	"AUXTIN",
	"AMD SB-TSI",
	"PECI Agent 0",
	"PECI Agent 1",
	"PECI Agent 2",
	"PECI Agent 3",
	"PECI Agent 4",
	"PECI Agent 5",
	"PECI Agent 6",
	"PECI Agent 7",
	"PCH_CHIP_CPU_MAX_TEMP",
	"PCH_CHIP_TEMP",
	"PCH_CPU_TEMP",
	"PCH_MCH_TEMP",
	"PCH_DIM0_TEMP",
	"PCH_DIM1_TEMP",
	"PCH_DIM2_TEMP",
	"PCH_DIM3_TEMP"
};

228
#define NCT6775_TEMP_MASK	0x001ffffe
229
#define NCT6775_VIRT_TEMP_MASK	0x00000000
230

231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
static const u16 NCT6775_REG_TEMP_ALTERNATE[32] = {
	[13] = 0x661,
	[14] = 0x662,
	[15] = 0x664,
};

static const u16 NCT6775_REG_TEMP_CRIT[32] = {
	[4] = 0xa00,
	[5] = 0xa01,
	[6] = 0xa02,
	[7] = 0xa03,
	[8] = 0xa04,
	[9] = 0xa05,
	[10] = 0xa06,
	[11] = 0xa07
};
247

248 249
static const u16 NCT6775_REG_TSI_TEMP[] = { 0x669 };

250 251
/* NCT6776 specific data */

252 253 254 255
/* STEP_UP_TIME and STEP_DOWN_TIME regs are swapped for all chips but NCT6775 */
#define NCT6776_REG_FAN_STEP_UP_TIME NCT6775_REG_FAN_STEP_DOWN_TIME
#define NCT6776_REG_FAN_STEP_DOWN_TIME NCT6775_REG_FAN_STEP_UP_TIME

256 257 258 259 260 261 262 263 264
static const s8 NCT6776_ALARM_BITS[] = {
	0, 1, 2, 3, 8, 21, 20, 16,	/* in0.. in7 */
	17, -1, -1, -1, -1, -1, -1,	/* in8..in14 */
	-1,				/* unused */
	6, 7, 11, 10, 23,		/* fan1..fan5 */
	-1, -1, -1,			/* unused */
	4, 5, 13, -1, -1, -1,		/* temp1..temp6 */
	12, 9 };			/* intrusion0, intrusion1 */

265 266 267 268 269 270 271 272 273 274 275
static const u16 NCT6776_REG_BEEP[NUM_REG_BEEP] = { 0xb2, 0xb3, 0xb4, 0xb5 };

static const s8 NCT6776_BEEP_BITS[] = {
	0, 1, 2, 3, 4, 5, 6, 7,		/* in0.. in7 */
	8, -1, -1, -1, -1, -1, -1,	/* in8..in14 */
	24,				/* global beep enable */
	25, 26, 27, 28, 29,		/* fan1..fan5 */
	-1, -1, -1,			/* unused */
	16, 17, 18, 19, 20, 21,		/* temp1..temp6 */
	30, 31 };			/* intrusion0, intrusion1 */

276
static const u16 NCT6776_REG_TOLERANCE_H[] = {
277
	0x10c, 0x20c, 0x30c, 0x80c, 0x90c, 0xa0c, 0xb0c };
278

279 280
static const u8 NCT6776_REG_PWM_MODE[] = { 0x04, 0, 0, 0, 0, 0 };
static const u8 NCT6776_PWM_MODE_MASK[] = { 0x01, 0, 0, 0, 0, 0 };
281

282
static const u16 NCT6776_REG_FAN_MIN[] = {
283
	0x63a, 0x63c, 0x63e, 0x640, 0x642, 0x64a, 0x64c };
284 285
static const u16 NCT6776_REG_FAN_PULSES[NUM_FAN] = {
	0x644, 0x645, 0x646, 0x647, 0x648, 0x649 };
286

287
static const u16 NCT6776_REG_WEIGHT_DUTY_BASE[] = {
288
	0x13e, 0x23e, 0x33e, 0x83e, 0x93e, 0xa3e };
289

290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
static const u16 NCT6776_REG_TEMP_CONFIG[ARRAY_SIZE(NCT6775_REG_TEMP)] = {
	0x18, 0x152, 0x252, 0x628, 0x629, 0x62A };

static const char *const nct6776_temp_label[] = {
	"",
	"SYSTIN",
	"CPUTIN",
	"AUXTIN",
	"SMBUSMASTER 0",
	"SMBUSMASTER 1",
	"SMBUSMASTER 2",
	"SMBUSMASTER 3",
	"SMBUSMASTER 4",
	"SMBUSMASTER 5",
	"SMBUSMASTER 6",
	"SMBUSMASTER 7",
	"PECI Agent 0",
	"PECI Agent 1",
	"PCH_CHIP_CPU_MAX_TEMP",
	"PCH_CHIP_TEMP",
	"PCH_CPU_TEMP",
	"PCH_MCH_TEMP",
	"PCH_DIM0_TEMP",
	"PCH_DIM1_TEMP",
	"PCH_DIM2_TEMP",
	"PCH_DIM3_TEMP",
	"BYTE_TEMP"
};

319
#define NCT6776_TEMP_MASK	0x007ffffe
320
#define NCT6776_VIRT_TEMP_MASK	0x00000000
321

322 323 324 325 326 327 328 329 330 331
static const u16 NCT6776_REG_TEMP_ALTERNATE[32] = {
	[14] = 0x401,
	[15] = 0x402,
	[16] = 0x404,
};

static const u16 NCT6776_REG_TEMP_CRIT[32] = {
	[11] = 0x709,
	[12] = 0x70a,
};
332

333 334 335
static const u16 NCT6776_REG_TSI_TEMP[] = {
	0x409, 0x40b, 0x40d, 0x40f, 0x411, 0x413, 0x415, 0x417 };

336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
/* NCT6779 specific data */

static const u16 NCT6779_REG_IN[] = {
	0x480, 0x481, 0x482, 0x483, 0x484, 0x485, 0x486, 0x487,
	0x488, 0x489, 0x48a, 0x48b, 0x48c, 0x48d, 0x48e };

static const u16 NCT6779_REG_ALARM[NUM_REG_ALARM] = {
	0x459, 0x45A, 0x45B, 0x568 };

static const s8 NCT6779_ALARM_BITS[] = {
	0, 1, 2, 3, 8, 21, 20, 16,	/* in0.. in7 */
	17, 24, 25, 26, 27, 28, 29,	/* in8..in14 */
	-1,				/* unused */
	6, 7, 11, 10, 23,		/* fan1..fan5 */
	-1, -1, -1,			/* unused */
	4, 5, 13, -1, -1, -1,		/* temp1..temp6 */
	12, 9 };			/* intrusion0, intrusion1 */

354 355 356 357 358 359 360 361 362
static const s8 NCT6779_BEEP_BITS[] = {
	0, 1, 2, 3, 4, 5, 6, 7,		/* in0.. in7 */
	8, 9, 10, 11, 12, 13, 14,	/* in8..in14 */
	24,				/* global beep enable */
	25, 26, 27, 28, 29,		/* fan1..fan5 */
	-1, -1, -1,			/* unused */
	16, 17, -1, -1, -1, -1,		/* temp1..temp6 */
	30, 31 };			/* intrusion0, intrusion1 */

363
static const u16 NCT6779_REG_FAN[] = {
364
	0x4c0, 0x4c2, 0x4c4, 0x4c6, 0x4c8, 0x4ca, 0x4ce };
365
static const u16 NCT6779_REG_FAN_PULSES[NUM_FAN] = {
366
	0x644, 0x645, 0x646, 0x647, 0x648, 0x649, 0x64f };
367

368
static const u16 NCT6779_REG_CRITICAL_PWM_ENABLE[] = {
369
	0x136, 0x236, 0x336, 0x836, 0x936, 0xa36, 0xb36 };
370
#define NCT6779_CRITICAL_PWM_ENABLE_MASK	0x01
371
static const u16 NCT6779_REG_CRITICAL_PWM[] = {
372
	0x137, 0x237, 0x337, 0x837, 0x937, 0xa37, 0xb37 };
373

374
static const u16 NCT6779_REG_TEMP[] = { 0x27, 0x150 };
375
static const u16 NCT6779_REG_TEMP_MON[] = { 0x73, 0x75, 0x77, 0x79, 0x7b };
376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
static const u16 NCT6779_REG_TEMP_CONFIG[ARRAY_SIZE(NCT6779_REG_TEMP)] = {
	0x18, 0x152 };
static const u16 NCT6779_REG_TEMP_HYST[ARRAY_SIZE(NCT6779_REG_TEMP)] = {
	0x3a, 0x153 };
static const u16 NCT6779_REG_TEMP_OVER[ARRAY_SIZE(NCT6779_REG_TEMP)] = {
	0x39, 0x155 };

static const u16 NCT6779_REG_TEMP_OFFSET[] = {
	0x454, 0x455, 0x456, 0x44a, 0x44b, 0x44c };

static const char *const nct6779_temp_label[] = {
	"",
	"SYSTIN",
	"CPUTIN",
	"AUXTIN0",
	"AUXTIN1",
	"AUXTIN2",
	"AUXTIN3",
	"",
	"SMBUSMASTER 0",
	"SMBUSMASTER 1",
	"SMBUSMASTER 2",
	"SMBUSMASTER 3",
	"SMBUSMASTER 4",
	"SMBUSMASTER 5",
	"SMBUSMASTER 6",
	"SMBUSMASTER 7",
	"PECI Agent 0",
	"PECI Agent 1",
	"PCH_CHIP_CPU_MAX_TEMP",
	"PCH_CHIP_TEMP",
	"PCH_CPU_TEMP",
	"PCH_MCH_TEMP",
	"PCH_DIM0_TEMP",
	"PCH_DIM1_TEMP",
	"PCH_DIM2_TEMP",
	"PCH_DIM3_TEMP",
413 414 415 416 417 418
	"BYTE_TEMP",
	"",
	"",
	"",
	"",
	"Virtual_TEMP"
419 420
};

421
#define NCT6779_TEMP_MASK	0x07ffff7e
422
#define NCT6779_VIRT_TEMP_MASK	0x00000000
423
#define NCT6791_TEMP_MASK	0x87ffff7e
424
#define NCT6791_VIRT_TEMP_MASK	0x80000000
425

426
static const u16 NCT6779_REG_TEMP_ALTERNATE[32]
427 428 429 430 431
	= { 0x490, 0x491, 0x492, 0x493, 0x494, 0x495, 0, 0,
	    0, 0, 0, 0, 0, 0, 0, 0,
	    0, 0x400, 0x401, 0x402, 0x404, 0x405, 0x406, 0x407,
	    0x408, 0 };

432 433 434 435
static const u16 NCT6779_REG_TEMP_CRIT[32] = {
	[15] = 0x709,
	[16] = 0x70a,
};
436

437 438
/* NCT6791 specific data */

439 440 441 442 443 444
static const u16 NCT6791_REG_WEIGHT_TEMP_SEL[NUM_FAN] = { 0, 0x239 };
static const u16 NCT6791_REG_WEIGHT_TEMP_STEP[NUM_FAN] = { 0, 0x23a };
static const u16 NCT6791_REG_WEIGHT_TEMP_STEP_TOL[NUM_FAN] = { 0, 0x23b };
static const u16 NCT6791_REG_WEIGHT_DUTY_STEP[NUM_FAN] = { 0, 0x23c };
static const u16 NCT6791_REG_WEIGHT_TEMP_BASE[NUM_FAN] = { 0, 0x23d };
static const u16 NCT6791_REG_WEIGHT_DUTY_BASE[NUM_FAN] = { 0, 0x23e };
445

446 447 448 449 450 451 452 453 454 455 456 457
static const u16 NCT6791_REG_ALARM[NUM_REG_ALARM] = {
	0x459, 0x45A, 0x45B, 0x568, 0x45D };

static const s8 NCT6791_ALARM_BITS[] = {
	0, 1, 2, 3, 8, 21, 20, 16,	/* in0.. in7 */
	17, 24, 25, 26, 27, 28, 29,	/* in8..in14 */
	-1,				/* unused */
	6, 7, 11, 10, 23, 33,		/* fan1..fan6 */
	-1, -1,				/* unused */
	4, 5, 13, -1, -1, -1,		/* temp1..temp6 */
	12, 9 };			/* intrusion0, intrusion1 */

458
/* NCT6792/NCT6793 specific data */
459 460 461 462 463

static const u16 NCT6792_REG_TEMP_MON[] = {
	0x73, 0x75, 0x77, 0x79, 0x7b, 0x7d };
static const u16 NCT6792_REG_BEEP[NUM_REG_BEEP] = {
	0xb2, 0xb3, 0xb4, 0xb5, 0xbf };
464

465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499
static const char *const nct6792_temp_label[] = {
	"",
	"SYSTIN",
	"CPUTIN",
	"AUXTIN0",
	"AUXTIN1",
	"AUXTIN2",
	"AUXTIN3",
	"",
	"SMBUSMASTER 0",
	"SMBUSMASTER 1",
	"SMBUSMASTER 2",
	"SMBUSMASTER 3",
	"SMBUSMASTER 4",
	"SMBUSMASTER 5",
	"SMBUSMASTER 6",
	"SMBUSMASTER 7",
	"PECI Agent 0",
	"PECI Agent 1",
	"PCH_CHIP_CPU_MAX_TEMP",
	"PCH_CHIP_TEMP",
	"PCH_CPU_TEMP",
	"PCH_MCH_TEMP",
	"PCH_DIM0_TEMP",
	"PCH_DIM1_TEMP",
	"PCH_DIM2_TEMP",
	"PCH_DIM3_TEMP",
	"BYTE_TEMP",
	"PECI Agent 0 Calibration",
	"PECI Agent 1 Calibration",
	"",
	"",
	"Virtual_TEMP"
};

500
#define NCT6792_TEMP_MASK	0x9fffff7e
501
#define NCT6792_VIRT_TEMP_MASK	0x80000000
502

503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537
static const char *const nct6793_temp_label[] = {
	"",
	"SYSTIN",
	"CPUTIN",
	"AUXTIN0",
	"AUXTIN1",
	"AUXTIN2",
	"AUXTIN3",
	"",
	"SMBUSMASTER 0",
	"SMBUSMASTER 1",
	"",
	"",
	"",
	"",
	"",
	"",
	"PECI Agent 0",
	"PECI Agent 1",
	"PCH_CHIP_CPU_MAX_TEMP",
	"PCH_CHIP_TEMP",
	"PCH_CPU_TEMP",
	"PCH_MCH_TEMP",
	"Agent0 Dimm0 ",
	"Agent0 Dimm1",
	"Agent1 Dimm0",
	"Agent1 Dimm1",
	"BYTE_TEMP0",
	"BYTE_TEMP1",
	"PECI Agent 0 Calibration",
	"PECI Agent 1 Calibration",
	"",
	"Virtual_TEMP"
};

538
#define NCT6793_TEMP_MASK	0xbfff037e
539
#define NCT6793_VIRT_TEMP_MASK	0x80000000
540

541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563
static const char *const nct6795_temp_label[] = {
	"",
	"SYSTIN",
	"CPUTIN",
	"AUXTIN0",
	"AUXTIN1",
	"AUXTIN2",
	"AUXTIN3",
	"",
	"SMBUSMASTER 0",
	"SMBUSMASTER 1",
	"SMBUSMASTER 2",
	"SMBUSMASTER 3",
	"SMBUSMASTER 4",
	"SMBUSMASTER 5",
	"SMBUSMASTER 6",
	"SMBUSMASTER 7",
	"PECI Agent 0",
	"PECI Agent 1",
	"PCH_CHIP_CPU_MAX_TEMP",
	"PCH_CHIP_TEMP",
	"PCH_CPU_TEMP",
	"PCH_MCH_TEMP",
564 565 566 567
	"Agent0 Dimm0",
	"Agent0 Dimm1",
	"Agent1 Dimm0",
	"Agent1 Dimm1",
568 569 570 571 572 573 574 575 576
	"BYTE_TEMP0",
	"BYTE_TEMP1",
	"PECI Agent 0 Calibration",
	"PECI Agent 1 Calibration",
	"",
	"Virtual_TEMP"
};

#define NCT6795_TEMP_MASK	0xbfffff7e
577
#define NCT6795_VIRT_TEMP_MASK	0x80000000
578

579 580 581 582 583 584 585 586 587 588 589
static const char *const nct6796_temp_label[] = {
	"",
	"SYSTIN",
	"CPUTIN",
	"AUXTIN0",
	"AUXTIN1",
	"AUXTIN2",
	"AUXTIN3",
	"AUXTIN4",
	"SMBUSMASTER 0",
	"SMBUSMASTER 1",
590 591
	"Virtual_TEMP",
	"Virtual_TEMP",
592 593 594 595 596 597 598 599 600 601
	"",
	"",
	"",
	"",
	"PECI Agent 0",
	"PECI Agent 1",
	"PCH_CHIP_CPU_MAX_TEMP",
	"PCH_CHIP_TEMP",
	"PCH_CPU_TEMP",
	"PCH_MCH_TEMP",
602 603 604 605
	"Agent0 Dimm0",
	"Agent0 Dimm1",
	"Agent1 Dimm0",
	"Agent1 Dimm1",
606 607 608 609 610 611 612 613
	"BYTE_TEMP0",
	"BYTE_TEMP1",
	"PECI Agent 0 Calibration",
	"PECI Agent 1 Calibration",
	"",
	"Virtual_TEMP"
};

614 615
#define NCT6796_TEMP_MASK	0xbfff0ffe
#define NCT6796_VIRT_TEMP_MASK	0x80000c00
616

617 618
static const u16 NCT6796_REG_TSI_TEMP[] = { 0x409, 0x40b };

619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647
static const char *const nct6798_temp_label[] = {
	"",
	"SYSTIN",
	"CPUTIN",
	"AUXTIN0",
	"AUXTIN1",
	"AUXTIN2",
	"AUXTIN3",
	"AUXTIN4",
	"SMBUSMASTER 0",
	"SMBUSMASTER 1",
	"Virtual_TEMP",
	"Virtual_TEMP",
	"",
	"",
	"",
	"",
	"PECI Agent 0",
	"PECI Agent 1",
	"PCH_CHIP_CPU_MAX_TEMP",
	"PCH_CHIP_TEMP",
	"PCH_CPU_TEMP",
	"PCH_MCH_TEMP",
	"Agent0 Dimm0",
	"Agent0 Dimm1",
	"Agent1 Dimm0",
	"Agent1 Dimm1",
	"BYTE_TEMP0",
	"BYTE_TEMP1",
648 649
	"PECI Agent 0 Calibration",	/* undocumented */
	"PECI Agent 1 Calibration",	/* undocumented */
650 651 652 653
	"",
	"Virtual_TEMP"
};

654
#define NCT6798_TEMP_MASK	0xbfff0ffe
655 656
#define NCT6798_VIRT_TEMP_MASK	0x80000c00

657 658 659 660 661 662 663 664 665 666 667 668 669 670
/* NCT6102D/NCT6106D specific data */

#define NCT6106_REG_VBAT	0x318
#define NCT6106_REG_DIODE	0x319
#define NCT6106_DIODE_MASK	0x01

static const u16 NCT6106_REG_IN_MAX[] = {
	0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9e, 0xa0, 0xa2 };
static const u16 NCT6106_REG_IN_MIN[] = {
	0x91, 0x93, 0x95, 0x97, 0x99, 0x9b, 0x9f, 0xa1, 0xa3 };
static const u16 NCT6106_REG_IN[] = {
	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x07, 0x08, 0x09 };

static const u16 NCT6106_REG_TEMP[] = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15 };
671
static const u16 NCT6106_REG_TEMP_MON[] = { 0x18, 0x19, 0x1a };
672 673 674
static const u16 NCT6106_REG_TEMP_HYST[] = {
	0xc3, 0xc7, 0xcb, 0xcf, 0xd3, 0xd7 };
static const u16 NCT6106_REG_TEMP_OVER[] = {
675 676 677 678 679
	0xc2, 0xc6, 0xca, 0xce, 0xd2, 0xd6 };
static const u16 NCT6106_REG_TEMP_CRIT_L[] = {
	0xc0, 0xc4, 0xc8, 0xcc, 0xd0, 0xd4 };
static const u16 NCT6106_REG_TEMP_CRIT_H[] = {
	0xc1, 0xc5, 0xc9, 0xcf, 0xd1, 0xd5 };
680 681 682 683 684 685
static const u16 NCT6106_REG_TEMP_OFFSET[] = { 0x311, 0x312, 0x313 };
static const u16 NCT6106_REG_TEMP_CONFIG[] = {
	0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc };

static const u16 NCT6106_REG_FAN[] = { 0x20, 0x22, 0x24 };
static const u16 NCT6106_REG_FAN_MIN[] = { 0xe0, 0xe2, 0xe4 };
686 687
static const u16 NCT6106_REG_FAN_PULSES[] = { 0xf6, 0xf6, 0xf6 };
static const u16 NCT6106_FAN_PULSE_SHIFT[] = { 0, 2, 4 };
688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715

static const u8 NCT6106_REG_PWM_MODE[] = { 0xf3, 0xf3, 0xf3 };
static const u8 NCT6106_PWM_MODE_MASK[] = { 0x01, 0x02, 0x04 };
static const u16 NCT6106_REG_PWM_READ[] = { 0x4a, 0x4b, 0x4c };
static const u16 NCT6106_REG_FAN_MODE[] = { 0x113, 0x123, 0x133 };
static const u16 NCT6106_REG_TEMP_SOURCE[] = {
	0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5 };

static const u16 NCT6106_REG_CRITICAL_TEMP[] = { 0x11a, 0x12a, 0x13a };
static const u16 NCT6106_REG_CRITICAL_TEMP_TOLERANCE[] = {
	0x11b, 0x12b, 0x13b };

static const u16 NCT6106_REG_CRITICAL_PWM_ENABLE[] = { 0x11c, 0x12c, 0x13c };
#define NCT6106_CRITICAL_PWM_ENABLE_MASK	0x10
static const u16 NCT6106_REG_CRITICAL_PWM[] = { 0x11d, 0x12d, 0x13d };

static const u16 NCT6106_REG_FAN_STEP_UP_TIME[] = { 0x114, 0x124, 0x134 };
static const u16 NCT6106_REG_FAN_STEP_DOWN_TIME[] = { 0x115, 0x125, 0x135 };
static const u16 NCT6106_REG_FAN_STOP_OUTPUT[] = { 0x116, 0x126, 0x136 };
static const u16 NCT6106_REG_FAN_START_OUTPUT[] = { 0x117, 0x127, 0x137 };
static const u16 NCT6106_REG_FAN_STOP_TIME[] = { 0x118, 0x128, 0x138 };
static const u16 NCT6106_REG_TOLERANCE_H[] = { 0x112, 0x122, 0x132 };

static const u16 NCT6106_REG_TARGET[] = { 0x111, 0x121, 0x131 };

static const u16 NCT6106_REG_WEIGHT_TEMP_SEL[] = { 0x168, 0x178, 0x188 };
static const u16 NCT6106_REG_WEIGHT_TEMP_STEP[] = { 0x169, 0x179, 0x189 };
static const u16 NCT6106_REG_WEIGHT_TEMP_STEP_TOL[] = { 0x16a, 0x17a, 0x18a };
716
static const u16 NCT6106_REG_WEIGHT_DUTY_STEP[] = { 0x16b, 0x17b, 0x18b };
717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735
static const u16 NCT6106_REG_WEIGHT_TEMP_BASE[] = { 0x16c, 0x17c, 0x18c };
static const u16 NCT6106_REG_WEIGHT_DUTY_BASE[] = { 0x16d, 0x17d, 0x18d };

static const u16 NCT6106_REG_AUTO_TEMP[] = { 0x160, 0x170, 0x180 };
static const u16 NCT6106_REG_AUTO_PWM[] = { 0x164, 0x174, 0x184 };

static const u16 NCT6106_REG_ALARM[NUM_REG_ALARM] = {
	0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d };

static const s8 NCT6106_ALARM_BITS[] = {
	0, 1, 2, 3, 4, 5, 7, 8,		/* in0.. in7 */
	9, -1, -1, -1, -1, -1, -1,	/* in8..in14 */
	-1,				/* unused */
	32, 33, 34, -1, -1,		/* fan1..fan5 */
	-1, -1, -1,			/* unused */
	16, 17, 18, 19, 20, 21,		/* temp1..temp6 */
	48, -1				/* intrusion0, intrusion1 */
};

736 737 738 739 740 741 742 743 744 745 746 747 748
static const u16 NCT6106_REG_BEEP[NUM_REG_BEEP] = {
	0x3c0, 0x3c1, 0x3c2, 0x3c3, 0x3c4 };

static const s8 NCT6106_BEEP_BITS[] = {
	0, 1, 2, 3, 4, 5, 7, 8,		/* in0.. in7 */
	9, 10, 11, 12, -1, -1, -1,	/* in8..in14 */
	32,				/* global beep enable */
	24, 25, 26, 27, 28,		/* fan1..fan5 */
	-1, -1, -1,			/* unused */
	16, 17, 18, 19, 20, 21,		/* temp1..temp6 */
	34, -1				/* intrusion0, intrusion1 */
};

749 750 751 752 753
static const u16 NCT6106_REG_TEMP_ALTERNATE[32] = {
	[14] = 0x51,
	[15] = 0x52,
	[16] = 0x54,
};
754

755 756 757 758
static const u16 NCT6106_REG_TEMP_CRIT[32] = {
	[11] = 0x204,
	[12] = 0x205,
};
759

760 761
static const u16 NCT6106_REG_TSI_TEMP[] = { 0x59, 0x5b, 0x5d, 0x5f, 0x61, 0x63, 0x65, 0x67 };

762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825
/* NCT6112D/NCT6114D/NCT6116D specific data */

static const u16 NCT6116_REG_FAN[] = { 0x20, 0x22, 0x24, 0x26, 0x28 };
static const u16 NCT6116_REG_FAN_MIN[] = { 0xe0, 0xe2, 0xe4, 0xe6, 0xe8 };
static const u16 NCT6116_REG_FAN_PULSES[] = { 0xf6, 0xf6, 0xf6, 0xf6, 0xf5 };
static const u16 NCT6116_FAN_PULSE_SHIFT[] = { 0, 2, 4, 6, 6 };

static const u16 NCT6116_REG_PWM[] = { 0x119, 0x129, 0x139, 0x199, 0x1a9 };
static const u16 NCT6116_REG_FAN_MODE[] = { 0x113, 0x123, 0x133, 0x193, 0x1a3 };
static const u16 NCT6116_REG_TEMP_SEL[] = { 0x110, 0x120, 0x130, 0x190, 0x1a0 };
static const u16 NCT6116_REG_TEMP_SOURCE[] = {
	0xb0, 0xb1, 0xb2 };

static const u16 NCT6116_REG_CRITICAL_TEMP[] = {
	0x11a, 0x12a, 0x13a, 0x19a, 0x1aa };
static const u16 NCT6116_REG_CRITICAL_TEMP_TOLERANCE[] = {
	0x11b, 0x12b, 0x13b, 0x19b, 0x1ab };

static const u16 NCT6116_REG_CRITICAL_PWM_ENABLE[] = {
	0x11c, 0x12c, 0x13c, 0x19c, 0x1ac };
static const u16 NCT6116_REG_CRITICAL_PWM[] = {
	0x11d, 0x12d, 0x13d, 0x19d, 0x1ad };

static const u16 NCT6116_REG_FAN_STEP_UP_TIME[] = {
	0x114, 0x124, 0x134, 0x194, 0x1a4 };
static const u16 NCT6116_REG_FAN_STEP_DOWN_TIME[] = {
	0x115, 0x125, 0x135, 0x195, 0x1a5 };
static const u16 NCT6116_REG_FAN_STOP_OUTPUT[] = {
	0x116, 0x126, 0x136, 0x196, 0x1a6 };
static const u16 NCT6116_REG_FAN_START_OUTPUT[] = {
	0x117, 0x127, 0x137, 0x197, 0x1a7 };
static const u16 NCT6116_REG_FAN_STOP_TIME[] = {
	0x118, 0x128, 0x138, 0x198, 0x1a8 };
static const u16 NCT6116_REG_TOLERANCE_H[] = {
	0x112, 0x122, 0x132, 0x192, 0x1a2 };

static const u16 NCT6116_REG_TARGET[] = {
	0x111, 0x121, 0x131, 0x191, 0x1a1 };

static const u16 NCT6116_REG_AUTO_TEMP[] = {
	0x160, 0x170, 0x180, 0x1d0, 0x1e0 };
static const u16 NCT6116_REG_AUTO_PWM[] = {
	0x164, 0x174, 0x184, 0x1d4, 0x1e4 };

static const s8 NCT6116_ALARM_BITS[] = {
	0, 1, 2, 3, 4, 5, 7, 8,		/* in0.. in7 */
	9, -1, -1, -1, -1, -1, -1,	/* in8..in9 */
	-1,				/* unused */
	32, 33, 34, 35, 36,		/* fan1..fan5 */
	-1, -1, -1,			/* unused */
	16, 17, 18, -1, -1, -1,		/* temp1..temp6 */
	48, -1				/* intrusion0, intrusion1 */
};

static const s8 NCT6116_BEEP_BITS[] = {
	0, 1, 2, 3, 4, 5, 7, 8,		/* in0.. in7 */
	9, 10, 11, 12, -1, -1, -1,	/* in8..in14 */
	32,				/* global beep enable */
	24, 25, 26, 27, 28,		/* fan1..fan5 */
	-1, -1, -1,			/* unused */
	16, 17, 18, -1, -1, -1,		/* temp1..temp6 */
	34, -1				/* intrusion0, intrusion1 */
};

826 827
static const u16 NCT6116_REG_TSI_TEMP[] = { 0x59, 0x5b };

828 829 830 831 832 833 834 835 836 837 838 839 840 841
static enum pwm_enable reg_to_pwm_enable(int pwm, int mode)
{
	if (mode == 0 && pwm == 255)
		return off;
	return mode + 1;
}

static int pwm_enable_to_reg(enum pwm_enable mode)
{
	if (mode == off)
		return 0;
	return mode - 1;
}

842 843 844 845
/*
 * Conversions
 */

846 847 848 849 850 851 852 853 854 855 856 857
/* 1 is DC mode, output in ms */
static unsigned int step_time_from_reg(u8 reg, u8 mode)
{
	return mode ? 400 * reg : 100 * reg;
}

static u8 step_time_to_reg(unsigned int msec, u8 mode)
{
	return clamp_val((mode ? (msec + 200) / 400 :
					(msec + 50) / 100), 1, 255);
}

858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889
static unsigned int fan_from_reg8(u16 reg, unsigned int divreg)
{
	if (reg == 0 || reg == 255)
		return 0;
	return 1350000U / (reg << divreg);
}

static unsigned int fan_from_reg13(u16 reg, unsigned int divreg)
{
	if ((reg & 0xff1f) == 0xff1f)
		return 0;

	reg = (reg & 0x1f) | ((reg & 0xff00) >> 3);

	if (reg == 0)
		return 0;

	return 1350000U / reg;
}

static unsigned int fan_from_reg16(u16 reg, unsigned int divreg)
{
	if (reg == 0 || reg == 0xffff)
		return 0;

	/*
	 * Even though the registers are 16 bit wide, the fan divisor
	 * still applies.
	 */
	return 1350000U / (reg << divreg);
}

890 891 892 893 894
static unsigned int fan_from_reg_rpm(u16 reg, unsigned int divreg)
{
	return reg;
}

895 896 897 898 899 900 901 902
static u16 fan_to_reg(u32 fan, unsigned int divreg)
{
	if (!fan)
		return 0;

	return (1350000U / fan) >> divreg;
}

903 904 905
static inline unsigned int
div_from_reg(u8 reg)
{
906
	return BIT(reg);
907 908
}

909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927
/*
 * Some of the voltage inputs have internal scaling, the tables below
 * contain 8 (the ADC LSB in mV) * scaling factor * 100
 */
static const u16 scale_in[15] = {
	800, 800, 1600, 1600, 800, 800, 800, 1600, 1600, 800, 800, 800, 800,
	800, 800
};

static inline long in_from_reg(u8 reg, u8 nr)
{
	return DIV_ROUND_CLOSEST(reg * scale_in[nr], 100);
}

static inline u8 in_to_reg(u32 val, u8 nr)
{
	return clamp_val(DIV_ROUND_CLOSEST(val * 100, scale_in[nr]), 0, 255);
}

928 929 930 931 932 933
/* TSI temperatures are in 8.3 format */
static inline unsigned int tsi_temp_from_reg(unsigned int reg)
{
	return (reg >> 5) * 125;
}

934 935 936 937
/*
 * Data structures and manipulation thereof
 */

938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992
struct sensor_device_template {
	struct device_attribute dev_attr;
	union {
		struct {
			u8 nr;
			u8 index;
		} s;
		int index;
	} u;
	bool s2;	/* true if both index and nr are used */
};

struct sensor_device_attr_u {
	union {
		struct sensor_device_attribute a1;
		struct sensor_device_attribute_2 a2;
	} u;
	char name[32];
};

#define __TEMPLATE_ATTR(_template, _mode, _show, _store) {	\
	.attr = {.name = _template, .mode = _mode },		\
	.show	= _show,					\
	.store	= _store,					\
}

#define SENSOR_DEVICE_TEMPLATE(_template, _mode, _show, _store, _index)	\
	{ .dev_attr = __TEMPLATE_ATTR(_template, _mode, _show, _store),	\
	  .u.index = _index,						\
	  .s2 = false }

#define SENSOR_DEVICE_TEMPLATE_2(_template, _mode, _show, _store,	\
				 _nr, _index)				\
	{ .dev_attr = __TEMPLATE_ATTR(_template, _mode, _show, _store),	\
	  .u.s.index = _index,						\
	  .u.s.nr = _nr,						\
	  .s2 = true }

#define SENSOR_TEMPLATE(_name, _template, _mode, _show, _store, _index)	\
static struct sensor_device_template sensor_dev_template_##_name	\
	= SENSOR_DEVICE_TEMPLATE(_template, _mode, _show, _store,	\
				 _index)

#define SENSOR_TEMPLATE_2(_name, _template, _mode, _show, _store,	\
			  _nr, _index)					\
static struct sensor_device_template sensor_dev_template_##_name	\
	= SENSOR_DEVICE_TEMPLATE_2(_template, _mode, _show, _store,	\
				 _nr, _index)

struct sensor_template_group {
	struct sensor_device_template **templates;
	umode_t (*is_visible)(struct kobject *, struct attribute *, int);
	int base;
};

993 994
static int nct6775_add_template_attr_group(struct device *dev, struct nct6775_data *data,
					   const struct sensor_template_group *tg, int repeat)
995 996 997 998 999 1000 1001
{
	struct attribute_group *group;
	struct sensor_device_attr_u *su;
	struct sensor_device_attribute *a;
	struct sensor_device_attribute_2 *a2;
	struct attribute **attrs;
	struct sensor_device_template **t;
1002
	int i, count;
1003 1004

	if (repeat <= 0)
1005
		return -EINVAL;
1006 1007 1008 1009 1010 1011

	t = tg->templates;
	for (count = 0; *t; t++, count++)
		;

	if (count == 0)
1012
		return -EINVAL;
1013 1014 1015

	group = devm_kzalloc(dev, sizeof(*group), GFP_KERNEL);
	if (group == NULL)
1016
		return -ENOMEM;
1017

1018
	attrs = devm_kcalloc(dev, repeat * count + 1, sizeof(*attrs),
1019 1020
			     GFP_KERNEL);
	if (attrs == NULL)
1021
		return -ENOMEM;
1022

1023
	su = devm_kzalloc(dev, array3_size(repeat, count, sizeof(*su)),
1024 1025
			       GFP_KERNEL);
	if (su == NULL)
1026
		return -ENOMEM;
1027 1028 1029 1030 1031 1032

	group->attrs = attrs;
	group->is_visible = tg->is_visible;

	for (i = 0; i < repeat; i++) {
		t = tg->templates;
1033
		while (*t != NULL) {
1034 1035 1036 1037
			snprintf(su->name, sizeof(su->name),
				 (*t)->dev_attr.attr.name, tg->base + i);
			if ((*t)->s2) {
				a2 = &su->u.a2;
1038
				sysfs_attr_init(&a2->dev_attr.attr);
1039 1040 1041 1042 1043 1044 1045 1046 1047 1048
				a2->dev_attr.attr.name = su->name;
				a2->nr = (*t)->u.s.nr + i;
				a2->index = (*t)->u.s.index;
				a2->dev_attr.attr.mode =
				  (*t)->dev_attr.attr.mode;
				a2->dev_attr.show = (*t)->dev_attr.show;
				a2->dev_attr.store = (*t)->dev_attr.store;
				*attrs = &a2->dev_attr.attr;
			} else {
				a = &su->u.a1;
1049
				sysfs_attr_init(&a->dev_attr.attr);
1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063
				a->dev_attr.attr.name = su->name;
				a->index = (*t)->u.index + i;
				a->dev_attr.attr.mode =
				  (*t)->dev_attr.attr.mode;
				a->dev_attr.show = (*t)->dev_attr.show;
				a->dev_attr.store = (*t)->dev_attr.store;
				*attrs = &a->dev_attr.attr;
			}
			attrs++;
			su++;
			t++;
		}
	}

1064
	return nct6775_add_attr_group(data, group);
1065 1066
}

1067
bool nct6775_reg_is_word_sized(struct nct6775_data *data, u16 reg)
1068 1069
{
	switch (data->kind) {
1070 1071
	case nct6106:
		return reg == 0x20 || reg == 0x22 || reg == 0x24 ||
1072
		  (reg >= 0x59 && reg < 0x69 && (reg & 1)) ||
1073 1074
		  reg == 0xe0 || reg == 0xe2 || reg == 0xe4 ||
		  reg == 0x111 || reg == 0x121 || reg == 0x131;
1075 1076
	case nct6116:
		return reg == 0x20 || reg == 0x22 || reg == 0x24 ||
1077 1078 1079 1080
		  reg == 0x26 || reg == 0x28 || reg == 0x59 || reg == 0x5b ||
		  reg == 0xe0 || reg == 0xe2 || reg == 0xe4 || reg == 0xe6 ||
		  reg == 0xe8 || reg == 0x111 || reg == 0x121 || reg == 0x131 ||
		  reg == 0x191 || reg == 0x1a1;
1081 1082 1083 1084 1085 1086 1087 1088
	case nct6775:
		return (((reg & 0xff00) == 0x100 ||
		    (reg & 0xff00) == 0x200) &&
		   ((reg & 0x00ff) == 0x50 ||
		    (reg & 0x00ff) == 0x53 ||
		    (reg & 0x00ff) == 0x55)) ||
		  (reg & 0xfff0) == 0x630 ||
		  reg == 0x640 || reg == 0x642 ||
1089
		  reg == 0x662 || reg == 0x669 ||
1090 1091 1092 1093 1094 1095 1096 1097 1098 1099
		  ((reg & 0xfff0) == 0x650 && (reg & 0x000f) >= 0x06) ||
		  reg == 0x73 || reg == 0x75 || reg == 0x77;
	case nct6776:
		return (((reg & 0xff00) == 0x100 ||
		    (reg & 0xff00) == 0x200) &&
		   ((reg & 0x00ff) == 0x50 ||
		    (reg & 0x00ff) == 0x53 ||
		    (reg & 0x00ff) == 0x55)) ||
		  (reg & 0xfff0) == 0x630 ||
		  reg == 0x402 ||
1100
		  (reg >= 0x409 && reg < 0x419 && (reg & 1)) ||
1101 1102 1103 1104
		  reg == 0x640 || reg == 0x642 ||
		  ((reg & 0xfff0) == 0x650 && (reg & 0x000f) >= 0x06) ||
		  reg == 0x73 || reg == 0x75 || reg == 0x77;
	case nct6779:
1105
	case nct6791:
1106
	case nct6792:
1107
	case nct6793:
1108
	case nct6795:
1109
	case nct6796:
1110
	case nct6797:
1111
	case nct6798:
1112
		return reg == 0x150 || reg == 0x153 || reg == 0x155 ||
1113
		  (reg & 0xfff0) == 0x4c0 ||
1114
		  reg == 0x402 ||
1115
		  (reg >= 0x409 && reg < 0x419 && (reg & 1)) ||
1116
		  reg == 0x63a || reg == 0x63c || reg == 0x63e ||
1117
		  reg == 0x640 || reg == 0x642 || reg == 0x64a ||
1118
		  reg == 0x64c ||
1119
		  reg == 0x73 || reg == 0x75 || reg == 0x77 || reg == 0x79 ||
1120
		  reg == 0x7b || reg == 0x7d;
1121 1122 1123
	}
	return false;
}
1124
EXPORT_SYMBOL_GPL(nct6775_reg_is_word_sized);
1125

1126
/* We left-align 8-bit temperature values to make the code simpler */
1127
static int nct6775_read_temp(struct nct6775_data *data, u16 reg, u16 *val)
1128
{
1129 1130 1131 1132 1133
	int err;

	err = nct6775_read_value(data, reg, val);
	if (err)
		return err;
1134

1135
	if (!nct6775_reg_is_word_sized(data, reg))
1136
		*val <<= 8;
1137

1138
	return 0;
1139 1140
}

1141
/* This function assumes that the caller holds data->update_lock */
1142
static int nct6775_write_fan_div(struct nct6775_data *data, int nr)
1143
{
1144 1145 1146 1147
	u16 reg;
	int err;
	u16 fandiv_reg = nr < 2 ? NCT6775_REG_FANDIV1 : NCT6775_REG_FANDIV2;
	unsigned int oddshift = (nr & 1) * 4; /* masks shift by four if nr is odd */
1148

1149 1150 1151 1152
	err = nct6775_read_value(data, fandiv_reg, &reg);
	if (err)
		return err;
	reg &= 0x70 >> oddshift;
1153
	reg |= (data->fan_div[nr] & 0x7) << oddshift;
1154
	return nct6775_write_value(data, fandiv_reg, reg);
1155 1156
}

1157
static int nct6775_write_fan_div_common(struct nct6775_data *data, int nr)
1158 1159
{
	if (data->kind == nct6775)
1160 1161
		return nct6775_write_fan_div(data, nr);
	return 0;
1162 1163
}

1164
static int nct6775_update_fan_div(struct nct6775_data *data)
1165
{
1166 1167
	int err;
	u16 i;
1168

1169 1170 1171
	err = nct6775_read_value(data, NCT6775_REG_FANDIV1, &i);
	if (err)
		return err;
1172 1173
	data->fan_div[0] = i & 0x7;
	data->fan_div[1] = (i & 0x70) >> 4;
1174 1175 1176
	err = nct6775_read_value(data, NCT6775_REG_FANDIV2, &i);
	if (err)
		return err;
1177
	data->fan_div[2] = i & 0x7;
1178
	if (data->has_fan & BIT(3))
1179
		data->fan_div[3] = (i & 0x70) >> 4;
1180 1181

	return 0;
1182 1183
}

1184
static int nct6775_update_fan_div_common(struct nct6775_data *data)
1185 1186
{
	if (data->kind == nct6775)
1187 1188
		return nct6775_update_fan_div(data);
	return 0;
1189 1190
}

1191
static int nct6775_init_fan_div(struct nct6775_data *data)
1192
{
1193 1194 1195 1196 1197
	int i, err;

	err = nct6775_update_fan_div_common(data);
	if (err)
		return err;
1198 1199 1200 1201 1202 1203 1204

	/*
	 * For all fans, start with highest divider value if the divider
	 * register is not initialized. This ensures that we get a
	 * reading from the fan count register, even if it is not optimal.
	 * We'll compute a better divider later on.
	 */
1205
	for (i = 0; i < ARRAY_SIZE(data->fan_div); i++) {
1206
		if (!(data->has_fan & BIT(i)))
1207 1208 1209
			continue;
		if (data->fan_div[i] == 0) {
			data->fan_div[i] = 7;
1210 1211 1212
			err = nct6775_write_fan_div_common(data, i);
			if (err)
				return err;
1213 1214
		}
	}
1215 1216

	return 0;
1217 1218
}

1219 1220
static int nct6775_init_fan_common(struct device *dev,
				   struct nct6775_data *data)
1221
{
1222 1223
	int i, err;
	u16 reg;
1224

1225 1226 1227 1228 1229
	if (data->has_fan_div) {
		err = nct6775_init_fan_div(data);
		if (err)
			return err;
	}
1230 1231 1232 1233 1234

	/*
	 * If fan_min is not set (0), set it to 0xff to disable it. This
	 * prevents the unnecessary warning when fanX_min is reported as 0.
	 */
1235
	for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) {
1236
		if (data->has_fan_min & BIT(i)) {
1237 1238 1239 1240 1241 1242 1243 1244 1245
			err = nct6775_read_value(data, data->REG_FAN_MIN[i], &reg);
			if (err)
				return err;
			if (!reg) {
				err = nct6775_write_value(data, data->REG_FAN_MIN[i],
							  data->has_fan_div ? 0xff : 0xff1f);
				if (err)
					return err;
			}
1246 1247
		}
	}
1248 1249

	return 0;
1250 1251
}

1252 1253
static int nct6775_select_fan_div(struct device *dev,
				  struct nct6775_data *data, int nr, u16 reg)
1254
{
1255
	int err;
1256 1257 1258 1259
	u8 fan_div = data->fan_div[nr];
	u16 fan_min;

	if (!data->has_fan_div)
1260
		return 0;
1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277

	/*
	 * If we failed to measure the fan speed, or the reported value is not
	 * in the optimal range, and the clock divider can be modified,
	 * let's try that for next time.
	 */
	if (reg == 0x00 && fan_div < 0x07)
		fan_div++;
	else if (reg != 0x00 && reg < 0x30 && fan_div > 0)
		fan_div--;

	if (fan_div != data->fan_div[nr]) {
		dev_dbg(dev, "Modifying fan%d clock divider from %u to %u\n",
			nr + 1, div_from_reg(data->fan_div[nr]),
			div_from_reg(fan_div));

		/* Preserve min limit if possible */
1278
		if (data->has_fan_min & BIT(nr)) {
1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291
			fan_min = data->fan_min[nr];
			if (fan_div > data->fan_div[nr]) {
				if (fan_min != 255 && fan_min > 1)
					fan_min >>= 1;
			} else {
				if (fan_min != 255) {
					fan_min <<= 1;
					if (fan_min > 254)
						fan_min = 254;
				}
			}
			if (fan_min != data->fan_min[nr]) {
				data->fan_min[nr] = fan_min;
1292 1293 1294
				err = nct6775_write_value(data, data->REG_FAN_MIN[nr], fan_min);
				if (err)
					return err;
1295 1296 1297
			}
		}
		data->fan_div[nr] = fan_div;
1298 1299 1300
		err = nct6775_write_fan_div_common(data, nr);
		if (err)
			return err;
1301
	}
1302 1303

	return 0;
1304 1305
}

1306
static int nct6775_update_pwm(struct device *dev)
1307 1308
{
	struct nct6775_data *data = dev_get_drvdata(dev);
1309 1310
	int i, j, err;
	u16 fanmodecfg, reg;
1311 1312 1313
	bool duty_is_dc;

	for (i = 0; i < data->pwm_num; i++) {
1314
		if (!(data->has_pwm & BIT(i)))
1315 1316
			continue;

1317 1318 1319 1320
		err = nct6775_read_value(data, data->REG_PWM_MODE[i], &reg);
		if (err)
			return err;
		duty_is_dc = data->REG_PWM_MODE[i] && (reg & data->PWM_MODE_MASK[i]);
1321
		data->pwm_mode[i] = !duty_is_dc;
1322

1323 1324 1325
		err = nct6775_read_value(data, data->REG_FAN_MODE[i], &fanmodecfg);
		if (err)
			return err;
1326 1327
		for (j = 0; j < ARRAY_SIZE(data->REG_PWM); j++) {
			if (data->REG_PWM[j] && data->REG_PWM[j][i]) {
1328 1329 1330 1331
				err = nct6775_read_value(data, data->REG_PWM[j][i], &reg);
				if (err)
					return err;
				data->pwm[j][i] = reg;
1332 1333 1334 1335 1336
			}
		}

		data->pwm_enable[i] = reg_to_pwm_enable(data->pwm[0][i],
							(fanmodecfg >> 4) & 7);
1337 1338 1339 1340 1341 1342 1343

		if (!data->temp_tolerance[0][i] ||
		    data->pwm_enable[i] != speed_cruise)
			data->temp_tolerance[0][i] = fanmodecfg & 0x0f;
		if (!data->target_speed_tolerance[i] ||
		    data->pwm_enable[i] == speed_cruise) {
			u8 t = fanmodecfg & 0x0f;
1344

1345
			if (data->REG_TOLERANCE_H) {
1346 1347 1348 1349
				err = nct6775_read_value(data, data->REG_TOLERANCE_H[i], &reg);
				if (err)
					return err;
				t |= (reg & 0x70) >> 1;
1350 1351 1352 1353
			}
			data->target_speed_tolerance[i] = t;
		}

1354 1355 1356 1357
		err = nct6775_read_value(data, data->REG_CRITICAL_TEMP_TOLERANCE[i], &reg);
		if (err)
			return err;
		data->temp_tolerance[1][i] = reg;
1358

1359 1360 1361
		err = nct6775_read_value(data, data->REG_TEMP_SEL[i], &reg);
		if (err)
			return err;
1362 1363 1364 1365
		data->pwm_temp_sel[i] = reg & 0x1f;
		/* If fan can stop, report floor as 0 */
		if (reg & 0x80)
			data->pwm[2][i] = 0;
1366

1367 1368 1369
		if (!data->REG_WEIGHT_TEMP_SEL[i])
			continue;

1370 1371 1372
		err = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[i], &reg);
		if (err)
			return err;
1373 1374
		data->pwm_weight_temp_sel[i] = reg & 0x1f;
		/* If weight is disabled, report weight source as 0 */
1375
		if (!(reg & 0x80))
1376 1377 1378
			data->pwm_weight_temp_sel[i] = 0;

		/* Weight temp data */
1379
		for (j = 0; j < ARRAY_SIZE(data->weight_temp); j++) {
1380 1381 1382 1383
			err = nct6775_read_value(data, data->REG_WEIGHT_TEMP[j][i], &reg);
			if (err)
				return err;
			data->weight_temp[j][i] = reg;
1384
		}
1385
	}
1386 1387

	return 0;
1388 1389
}

1390
static int nct6775_update_pwm_limits(struct device *dev)
1391 1392
{
	struct nct6775_data *data = dev_get_drvdata(dev);
1393 1394
	int i, j, err;
	u16 reg, reg_t;
1395 1396

	for (i = 0; i < data->pwm_num; i++) {
1397
		if (!(data->has_pwm & BIT(i)))
1398 1399
			continue;

1400
		for (j = 0; j < ARRAY_SIZE(data->fan_time); j++) {
1401 1402 1403 1404
			err = nct6775_read_value(data, data->REG_FAN_TIME[j][i], &reg);
			if (err)
				return err;
			data->fan_time[j][i] = reg;
1405 1406
		}

1407 1408 1409 1410
		err = nct6775_read_value(data, data->REG_TARGET[i], &reg_t);
		if (err)
			return err;

1411 1412 1413 1414 1415 1416 1417
		/* Update only in matching mode or if never updated */
		if (!data->target_temp[i] ||
		    data->pwm_enable[i] == thermal_cruise)
			data->target_temp[i] = reg_t & data->target_temp_mask;
		if (!data->target_speed[i] ||
		    data->pwm_enable[i] == speed_cruise) {
			if (data->REG_TOLERANCE_H) {
1418 1419 1420 1421
				err = nct6775_read_value(data, data->REG_TOLERANCE_H[i], &reg);
				if (err)
					return err;
				reg_t |= (reg & 0x0f) << 8;
1422 1423 1424 1425 1426
			}
			data->target_speed[i] = reg_t;
		}

		for (j = 0; j < data->auto_pwm_num; j++) {
1427 1428 1429 1430 1431 1432 1433 1434 1435
			err = nct6775_read_value(data, NCT6775_AUTO_PWM(data, i, j), &reg);
			if (err)
				return err;
			data->auto_pwm[i][j] = reg;

			err = nct6775_read_value(data, NCT6775_AUTO_TEMP(data, i, j), &reg);
			if (err)
				return err;
			data->auto_temp[i][j] = reg;
1436 1437 1438
		}

		/* critical auto_pwm temperature data */
1439 1440 1441 1442
		err = nct6775_read_value(data, data->REG_CRITICAL_TEMP[i], &reg);
		if (err)
			return err;
		data->auto_temp[i][data->auto_pwm_num] = reg;
1443 1444 1445

		switch (data->kind) {
		case nct6775:
1446 1447 1448
			err = nct6775_read_value(data, NCT6775_REG_CRITICAL_ENAB[i], &reg);
			if (err)
				return err;
1449 1450 1451 1452 1453 1454
			data->auto_pwm[i][data->auto_pwm_num] =
						(reg & 0x02) ? 0xff : 0x00;
			break;
		case nct6776:
			data->auto_pwm[i][data->auto_pwm_num] = 0xff;
			break;
1455
		case nct6106:
1456
		case nct6116:
1457
		case nct6779:
1458
		case nct6791:
1459
		case nct6792:
1460
		case nct6793:
1461
		case nct6795:
1462
		case nct6796:
1463
		case nct6797:
1464
		case nct6798:
1465 1466 1467 1468 1469 1470 1471 1472
			err = nct6775_read_value(data, data->REG_CRITICAL_PWM_ENABLE[i], &reg);
			if (err)
				return err;
			if (reg & data->CRITICAL_PWM_ENABLE_MASK) {
				err = nct6775_read_value(data, data->REG_CRITICAL_PWM[i], &reg);
				if (err)
					return err;
			} else {
1473
				reg = 0xff;
1474
			}
1475
			data->auto_pwm[i][data->auto_pwm_num] = reg;
1476 1477
			break;
		}
1478
	}
1479 1480

	return 0;
1481 1482
}

1483
struct nct6775_data *nct6775_update_device(struct device *dev)
1484 1485
{
	struct nct6775_data *data = dev_get_drvdata(dev);
1486 1487
	int i, j, err = 0;
	u16 reg;
1488 1489 1490

	mutex_lock(&data->update_lock);

1491
	if (time_after(jiffies, data->last_updated + HZ + HZ / 2)
1492
	    || !data->valid) {
1493
		/* Fan clock dividers */
1494 1495 1496
		err = nct6775_update_fan_div_common(data);
		if (err)
			goto out;
1497

1498 1499
		/* Measured voltages and limits */
		for (i = 0; i < data->in_num; i++) {
1500
			if (!(data->have_in & BIT(i)))
1501 1502
				continue;

1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516
			err = nct6775_read_value(data, data->REG_VIN[i], &reg);
			if (err)
				goto out;
			data->in[i][0] = reg;

			err = nct6775_read_value(data, data->REG_IN_MINMAX[0][i], &reg);
			if (err)
				goto out;
			data->in[i][1] = reg;

			err = nct6775_read_value(data, data->REG_IN_MINMAX[1][i], &reg);
			if (err)
				goto out;
			data->in[i][2] = reg;
1517 1518
		}

1519
		/* Measured fan speeds and limits */
1520
		for (i = 0; i < ARRAY_SIZE(data->rpm); i++) {
1521
			if (!(data->has_fan & BIT(i)))
1522 1523
				continue;

1524 1525 1526
			err = nct6775_read_value(data, data->REG_FAN[i], &reg);
			if (err)
				goto out;
1527 1528 1529
			data->rpm[i] = data->fan_from_reg(reg,
							  data->fan_div[i]);

1530 1531 1532 1533 1534 1535
			if (data->has_fan_min & BIT(i)) {
				err = nct6775_read_value(data, data->REG_FAN_MIN[i], &reg);
				if (err)
					goto out;
				data->fan_min[i] = reg;
			}
1536 1537

			if (data->REG_FAN_PULSES[i]) {
1538 1539 1540 1541
				err = nct6775_read_value(data, data->REG_FAN_PULSES[i], &reg);
				if (err)
					goto out;
				data->fan_pulses[i] = (reg >> data->FAN_PULSE_SHIFT[i]) & 0x03;
1542
			}
1543

1544 1545 1546
			err = nct6775_select_fan_div(dev, data, i, reg);
			if (err)
				goto out;
1547 1548
		}

1549 1550 1551 1552 1553 1554 1555
		err = nct6775_update_pwm(dev);
		if (err)
			goto out;

		err = nct6775_update_pwm_limits(dev);
		if (err)
			goto out;
1556

1557 1558
		/* Measured temperatures and limits */
		for (i = 0; i < NUM_TEMP; i++) {
1559
			if (!(data->have_temp & BIT(i)))
1560
				continue;
1561
			for (j = 0; j < ARRAY_SIZE(data->reg_temp); j++) {
1562 1563 1564 1565 1566 1567
				if (data->reg_temp[j][i]) {
					err = nct6775_read_temp(data, data->reg_temp[j][i], &reg);
					if (err)
						goto out;
					data->temp[j][i] = reg;
				}
1568
			}
1569
			if (i >= NUM_TEMP_FIXED ||
1570
			    !(data->have_temp_fixed & BIT(i)))
1571
				continue;
1572 1573 1574 1575
			err = nct6775_read_value(data, data->REG_TEMP_OFFSET[i], &reg);
			if (err)
				goto out;
			data->temp_offset[i] = reg;
1576 1577
		}

1578 1579 1580
		for (i = 0; i < NUM_TSI_TEMP; i++) {
			if (!(data->have_tsi_temp & BIT(i)))
				continue;
1581 1582 1583 1584
			err = nct6775_read_value(data, data->REG_TSI_TEMP[i], &reg);
			if (err)
				goto out;
			data->tsi_temp[i] = reg;
1585 1586
		}

1587 1588
		data->alarms = 0;
		for (i = 0; i < NUM_REG_ALARM; i++) {
1589
			u16 alarm;
1590

1591 1592
			if (!data->REG_ALARM[i])
				continue;
1593 1594 1595
			err = nct6775_read_value(data, data->REG_ALARM[i], &alarm);
			if (err)
				goto out;
1596 1597 1598
			data->alarms |= ((u64)alarm) << (i << 3);
		}

1599 1600
		data->beeps = 0;
		for (i = 0; i < NUM_REG_BEEP; i++) {
1601
			u16 beep;
1602

1603 1604
			if (!data->REG_BEEP[i])
				continue;
1605 1606 1607
			err = nct6775_read_value(data, data->REG_BEEP[i], &beep);
			if (err)
				goto out;
1608 1609 1610
			data->beeps |= ((u64)beep) << (i << 3);
		}

1611 1612 1613
		data->last_updated = jiffies;
		data->valid = true;
	}
1614
out:
1615
	mutex_unlock(&data->update_lock);
1616
	return err ? ERR_PTR(err) : data;
1617
}
1618
EXPORT_SYMBOL_GPL(nct6775_update_device);
1619 1620 1621 1622 1623 1624 1625 1626 1627 1628

/*
 * Sysfs callback functions
 */
static ssize_t
show_in_reg(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int index = sattr->index;
1629 1630
	int nr = sattr->nr;

1631 1632 1633
	if (IS_ERR(data))
		return PTR_ERR(data);

1634 1635 1636 1637 1638 1639 1640 1641 1642 1643
	return sprintf(buf, "%ld\n", in_from_reg(data->in[nr][index], nr));
}

static ssize_t
store_in_reg(struct device *dev, struct device_attribute *attr, const char *buf,
	     size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int index = sattr->index;
1644
	int nr = sattr->nr;
1645
	unsigned long val;
1646 1647 1648
	int err;

	err = kstrtoul(buf, 10, &val);
1649 1650 1651 1652
	if (err < 0)
		return err;
	mutex_lock(&data->update_lock);
	data->in[nr][index] = in_to_reg(val, nr);
1653
	err = nct6775_write_value(data, data->REG_IN_MINMAX[index - 1][nr], data->in[nr][index]);
1654
	mutex_unlock(&data->update_lock);
1655
	return err ? : count;
1656 1657
}

1658 1659
ssize_t
nct6775_show_alarm(struct device *dev, struct device_attribute *attr, char *buf)
1660 1661 1662
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
1663 1664 1665 1666
	int nr;

	if (IS_ERR(data))
		return PTR_ERR(data);
1667

1668
	nr = data->ALARM_BITS[sattr->index];
1669 1670 1671
	return sprintf(buf, "%u\n",
		       (unsigned int)((data->alarms >> nr) & 0x01));
}
1672
EXPORT_SYMBOL_GPL(nct6775_show_alarm);
1673

1674 1675 1676
static int find_temp_source(struct nct6775_data *data, int index, int count)
{
	int source = data->temp_src[index];
1677
	int nr, err;
1678 1679

	for (nr = 0; nr < count; nr++) {
1680
		u16 src;
1681

1682 1683 1684 1685
		err = nct6775_read_value(data, data->REG_TEMP_SOURCE[nr], &src);
		if (err)
			return err;
		if ((src & 0x1f) == source)
1686 1687
			return nr;
	}
1688
	return -ENODEV;
1689 1690 1691 1692 1693 1694 1695 1696 1697 1698
}

static ssize_t
show_temp_alarm(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	struct nct6775_data *data = nct6775_update_device(dev);
	unsigned int alarm = 0;
	int nr;

1699 1700 1701
	if (IS_ERR(data))
		return PTR_ERR(data);

1702 1703 1704 1705 1706 1707 1708
	/*
	 * For temperatures, there is no fixed mapping from registers to alarm
	 * bits. Alarm bits are determined by the temperature source mapping.
	 */
	nr = find_temp_source(data, sattr->index, data->num_temp_alarms);
	if (nr >= 0) {
		int bit = data->ALARM_BITS[nr + TEMP_ALARM_BASE];
1709

1710 1711 1712 1713 1714
		alarm = (data->alarms >> bit) & 0x01;
	}
	return sprintf(buf, "%u\n", alarm);
}

1715 1716
ssize_t
nct6775_show_beep(struct device *dev, struct device_attribute *attr, char *buf)
1717 1718 1719
{
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	struct nct6775_data *data = nct6775_update_device(dev);
1720 1721 1722 1723 1724 1725
	int nr;

	if (IS_ERR(data))
		return PTR_ERR(data);

	nr = data->BEEP_BITS[sattr->index];
1726 1727 1728 1729

	return sprintf(buf, "%u\n",
		       (unsigned int)((data->beeps >> nr) & 0x01));
}
1730
EXPORT_SYMBOL_GPL(nct6775_show_beep);
1731

1732 1733
ssize_t
nct6775_store_beep(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1734 1735 1736 1737 1738 1739
{
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	struct nct6775_data *data = dev_get_drvdata(dev);
	int nr = data->BEEP_BITS[sattr->index];
	int regindex = nr >> 3;
	unsigned long val;
1740
	int err;
1741

1742
	err = kstrtoul(buf, 10, &val);
1743 1744 1745 1746 1747 1748 1749 1750 1751 1752
	if (err < 0)
		return err;
	if (val > 1)
		return -EINVAL;

	mutex_lock(&data->update_lock);
	if (val)
		data->beeps |= (1ULL << nr);
	else
		data->beeps &= ~(1ULL << nr);
1753 1754
	err = nct6775_write_value(data, data->REG_BEEP[regindex],
				  (data->beeps >> (regindex << 3)) & 0xff);
1755
	mutex_unlock(&data->update_lock);
1756
	return err ? : count;
1757
}
1758
EXPORT_SYMBOL_GPL(nct6775_store_beep);
1759 1760 1761 1762 1763 1764 1765 1766 1767

static ssize_t
show_temp_beep(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	struct nct6775_data *data = nct6775_update_device(dev);
	unsigned int beep = 0;
	int nr;

1768 1769 1770
	if (IS_ERR(data))
		return PTR_ERR(data);

1771 1772 1773 1774 1775 1776 1777 1778
	/*
	 * For temperatures, there is no fixed mapping from registers to beep
	 * enable bits. Beep enable bits are determined by the temperature
	 * source mapping.
	 */
	nr = find_temp_source(data, sattr->index, data->num_temp_beeps);
	if (nr >= 0) {
		int bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE];
1779

1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792
		beep = (data->beeps >> bit) & 0x01;
	}
	return sprintf(buf, "%u\n", beep);
}

static ssize_t
store_temp_beep(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
{
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	struct nct6775_data *data = dev_get_drvdata(dev);
	int nr, bit, regindex;
	unsigned long val;
1793
	int err;
1794

1795
	err = kstrtoul(buf, 10, &val);
1796 1797 1798 1799 1800 1801 1802
	if (err < 0)
		return err;
	if (val > 1)
		return -EINVAL;

	nr = find_temp_source(data, sattr->index, data->num_temp_beeps);
	if (nr < 0)
1803
		return nr;
1804 1805 1806 1807 1808 1809 1810 1811 1812

	bit = data->BEEP_BITS[nr + TEMP_ALARM_BASE];
	regindex = bit >> 3;

	mutex_lock(&data->update_lock);
	if (val)
		data->beeps |= (1ULL << bit);
	else
		data->beeps &= ~(1ULL << bit);
1813 1814
	err = nct6775_write_value(data, data->REG_BEEP[regindex],
				  (data->beeps >> (regindex << 3)) & 0xff);
1815 1816
	mutex_unlock(&data->update_lock);

1817
	return err ? : count;
1818 1819
}

1820 1821 1822
static umode_t nct6775_in_is_visible(struct kobject *kobj,
				     struct attribute *attr, int index)
{
1823
	struct device *dev = kobj_to_dev(kobj);
1824
	struct nct6775_data *data = dev_get_drvdata(dev);
1825
	int in = index / 5;	/* voltage index */
1826

1827
	if (!(data->have_in & BIT(in)))
1828 1829
		return 0;

1830
	return nct6775_attr_mode(data, attr);
1831 1832
}

1833
SENSOR_TEMPLATE_2(in_input, "in%d_input", 0444, show_in_reg, NULL, 0, 0);
1834 1835
SENSOR_TEMPLATE(in_alarm, "in%d_alarm", 0444, nct6775_show_alarm, NULL, 0);
SENSOR_TEMPLATE(in_beep, "in%d_beep", 0644, nct6775_show_beep, nct6775_store_beep, 0);
1836 1837
SENSOR_TEMPLATE_2(in_min, "in%d_min", 0644, show_in_reg, store_in_reg, 0, 1);
SENSOR_TEMPLATE_2(in_max, "in%d_max", 0644, show_in_reg, store_in_reg, 0, 2);
1838 1839 1840 1841 1842 1843 1844 1845 1846

/*
 * nct6775_in_is_visible uses the index into the following array
 * to determine if attributes should be created or not.
 * Any change in order or content must be matched.
 */
static struct sensor_device_template *nct6775_attributes_in_template[] = {
	&sensor_dev_template_in_input,
	&sensor_dev_template_in_alarm,
1847
	&sensor_dev_template_in_beep,
1848 1849 1850
	&sensor_dev_template_in_min,
	&sensor_dev_template_in_max,
	NULL
1851 1852
};

1853
static const struct sensor_template_group nct6775_in_template_group = {
1854 1855
	.templates = nct6775_attributes_in_template,
	.is_visible = nct6775_in_is_visible,
1856 1857
};

1858 1859 1860 1861 1862 1863
static ssize_t
show_fan(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
1864

1865 1866 1867
	if (IS_ERR(data))
		return PTR_ERR(data);

1868 1869 1870 1871 1872 1873 1874 1875 1876
	return sprintf(buf, "%d\n", data->rpm[nr]);
}

static ssize_t
show_fan_min(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
1877

1878 1879 1880
	if (IS_ERR(data))
		return PTR_ERR(data);

1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891
	return sprintf(buf, "%d\n",
		       data->fan_from_reg_min(data->fan_min[nr],
					      data->fan_div[nr]));
}

static ssize_t
show_fan_div(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
1892

1893 1894 1895
	if (IS_ERR(data))
		return PTR_ERR(data);

1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908
	return sprintf(buf, "%u\n", div_from_reg(data->fan_div[nr]));
}

static ssize_t
store_fan_min(struct device *dev, struct device_attribute *attr,
	      const char *buf, size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
	unsigned long val;
	unsigned int reg;
	u8 new_div;
1909
	int err;
1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942

	err = kstrtoul(buf, 10, &val);
	if (err < 0)
		return err;

	mutex_lock(&data->update_lock);
	if (!data->has_fan_div) {
		/* NCT6776F or NCT6779D; we know this is a 13 bit register */
		if (!val) {
			val = 0xff1f;
		} else {
			if (val > 1350000U)
				val = 135000U;
			val = 1350000U / val;
			val = (val & 0x1f) | ((val << 3) & 0xff00);
		}
		data->fan_min[nr] = val;
		goto write_min;	/* Leave fan divider alone */
	}
	if (!val) {
		/* No min limit, alarm disabled */
		data->fan_min[nr] = 255;
		new_div = data->fan_div[nr]; /* No change */
		dev_info(dev, "fan%u low limit and alarm disabled\n", nr + 1);
		goto write_div;
	}
	reg = 1350000U / val;
	if (reg >= 128 * 255) {
		/*
		 * Speed below this value cannot possibly be represented,
		 * even with the highest divider (128)
		 */
		data->fan_min[nr] = 254;
1943
		new_div = 7; /* 128 == BIT(7) */
1944 1945 1946 1947 1948 1949 1950 1951 1952
		dev_warn(dev,
			 "fan%u low limit %lu below minimum %u, set to minimum\n",
			 nr + 1, val, data->fan_from_reg_min(254, 7));
	} else if (!reg) {
		/*
		 * Speed above this value cannot possibly be represented,
		 * even with the lowest divider (1)
		 */
		data->fan_min[nr] = 1;
1953
		new_div = 0; /* 1 == BIT(0) */
1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980
		dev_warn(dev,
			 "fan%u low limit %lu above maximum %u, set to maximum\n",
			 nr + 1, val, data->fan_from_reg_min(1, 0));
	} else {
		/*
		 * Automatically pick the best divider, i.e. the one such
		 * that the min limit will correspond to a register value
		 * in the 96..192 range
		 */
		new_div = 0;
		while (reg > 192 && new_div < 7) {
			reg >>= 1;
			new_div++;
		}
		data->fan_min[nr] = reg;
	}

write_div:
	/*
	 * Write both the fan clock divider (if it changed) and the new
	 * fan min (unconditionally)
	 */
	if (new_div != data->fan_div[nr]) {
		dev_dbg(dev, "fan%u clock divider changed from %u to %u\n",
			nr + 1, div_from_reg(data->fan_div[nr]),
			div_from_reg(new_div));
		data->fan_div[nr] = new_div;
1981 1982 1983
		err = nct6775_write_fan_div_common(data, nr);
		if (err)
			goto write_min;
1984 1985 1986 1987 1988
		/* Give the chip time to sample a new speed value */
		data->last_updated = jiffies;
	}

write_min:
1989
	err = nct6775_write_value(data, data->REG_FAN_MIN[nr], data->fan_min[nr]);
1990 1991
	mutex_unlock(&data->update_lock);

1992
	return err ? : count;
1993 1994
}

1995 1996 1997 1998 1999
static ssize_t
show_fan_pulses(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
2000 2001 2002 2003
	int p;

	if (IS_ERR(data))
		return PTR_ERR(data);
2004

2005
	p = data->fan_pulses[sattr->index];
2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017
	return sprintf(buf, "%d\n", p ? : 4);
}

static ssize_t
store_fan_pulses(struct device *dev, struct device_attribute *attr,
		 const char *buf, size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
	unsigned long val;
	int err;
2018
	u16 reg;
2019 2020 2021 2022 2023 2024 2025 2026 2027 2028

	err = kstrtoul(buf, 10, &val);
	if (err < 0)
		return err;

	if (val > 4)
		return -EINVAL;

	mutex_lock(&data->update_lock);
	data->fan_pulses[nr] = val & 3;
2029 2030 2031
	err = nct6775_read_value(data, data->REG_FAN_PULSES[nr], &reg);
	if (err)
		goto out;
2032 2033
	reg &= ~(0x03 << data->FAN_PULSE_SHIFT[nr]);
	reg |= (val & 3) << data->FAN_PULSE_SHIFT[nr];
2034 2035
	err = nct6775_write_value(data, data->REG_FAN_PULSES[nr], reg);
out:
2036 2037
	mutex_unlock(&data->update_lock);

2038
	return err ? : count;
2039 2040
}

2041 2042 2043
static umode_t nct6775_fan_is_visible(struct kobject *kobj,
				      struct attribute *attr, int index)
{
2044
	struct device *dev = kobj_to_dev(kobj);
2045
	struct nct6775_data *data = dev_get_drvdata(dev);
2046 2047
	int fan = index / 6;	/* fan index */
	int nr = index % 6;	/* attribute index */
2048

2049
	if (!(data->has_fan & BIT(fan)))
2050
		return 0;
2051

2052 2053
	if (nr == 1 && data->ALARM_BITS[FAN_ALARM_BASE + fan] == -1)
		return 0;
2054
	if (nr == 2 && data->BEEP_BITS[FAN_ALARM_BASE + fan] == -1)
2055
		return 0;
2056 2057
	if (nr == 3 && !data->REG_FAN_PULSES[fan])
		return 0;
2058
	if (nr == 4 && !(data->has_fan_min & BIT(fan)))
2059 2060
		return 0;
	if (nr == 5 && data->kind != nct6775)
2061 2062
		return 0;

2063
	return nct6775_attr_mode(data, attr);
2064
}
2065

2066
SENSOR_TEMPLATE(fan_input, "fan%d_input", 0444, show_fan, NULL, 0);
2067 2068 2069
SENSOR_TEMPLATE(fan_alarm, "fan%d_alarm", 0444, nct6775_show_alarm, NULL, FAN_ALARM_BASE);
SENSOR_TEMPLATE(fan_beep, "fan%d_beep", 0644, nct6775_show_beep,
		nct6775_store_beep, FAN_ALARM_BASE);
2070 2071 2072
SENSOR_TEMPLATE(fan_pulses, "fan%d_pulses", 0644, show_fan_pulses, store_fan_pulses, 0);
SENSOR_TEMPLATE(fan_min, "fan%d_min", 0644, show_fan_min, store_fan_min, 0);
SENSOR_TEMPLATE(fan_div, "fan%d_div", 0444, show_fan_div, NULL, 0);
2073 2074 2075 2076 2077 2078 2079 2080 2081

/*
 * nct6775_fan_is_visible uses the index into the following array
 * to determine if attributes should be created or not.
 * Any change in order or content must be matched.
 */
static struct sensor_device_template *nct6775_attributes_fan_template[] = {
	&sensor_dev_template_fan_input,
	&sensor_dev_template_fan_alarm,	/* 1 */
2082
	&sensor_dev_template_fan_beep,	/* 2 */
2083
	&sensor_dev_template_fan_pulses,
2084 2085
	&sensor_dev_template_fan_min,	/* 4 */
	&sensor_dev_template_fan_div,	/* 5 */
2086
	NULL
2087 2088
};

2089
static const struct sensor_template_group nct6775_fan_template_group = {
2090 2091 2092
	.templates = nct6775_attributes_fan_template,
	.is_visible = nct6775_fan_is_visible,
	.base = 1,
2093 2094
};

2095 2096 2097 2098 2099 2100
static ssize_t
show_temp_label(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
2101

2102 2103 2104
	if (IS_ERR(data))
		return PTR_ERR(data);

2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115
	return sprintf(buf, "%s\n", data->temp_label[data->temp_src[nr]]);
}

static ssize_t
show_temp(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;

2116 2117 2118
	if (IS_ERR(data))
		return PTR_ERR(data);

2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138
	return sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(data->temp[index][nr]));
}

static ssize_t
store_temp(struct device *dev, struct device_attribute *attr, const char *buf,
	   size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;
	int err;
	long val;

	err = kstrtol(buf, 10, &val);
	if (err < 0)
		return err;

	mutex_lock(&data->update_lock);
	data->temp[index][nr] = LM75_TEMP_TO_REG(val);
2139
	err = nct6775_write_temp(data, data->reg_temp[index][nr], data->temp[index][nr]);
2140
	mutex_unlock(&data->update_lock);
2141
	return err ? : count;
2142 2143 2144 2145 2146 2147 2148 2149
}

static ssize_t
show_temp_offset(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);

2150 2151 2152
	if (IS_ERR(data))
		return PTR_ERR(data);

2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173
	return sprintf(buf, "%d\n", data->temp_offset[sattr->index] * 1000);
}

static ssize_t
store_temp_offset(struct device *dev, struct device_attribute *attr,
		  const char *buf, size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
	long val;
	int err;

	err = kstrtol(buf, 10, &val);
	if (err < 0)
		return err;

	val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), -128, 127);

	mutex_lock(&data->update_lock);
	data->temp_offset[nr] = val;
2174
	err = nct6775_write_value(data, data->REG_TEMP_OFFSET[nr], val);
2175 2176
	mutex_unlock(&data->update_lock);

2177
	return err ? : count;
2178 2179 2180 2181 2182 2183 2184 2185
}

static ssize_t
show_temp_type(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
2186

2187 2188 2189
	if (IS_ERR(data))
		return PTR_ERR(data);

2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201
	return sprintf(buf, "%d\n", (int)data->temp_type[nr]);
}

static ssize_t
store_temp_type(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
	unsigned long val;
	int err;
2202 2203 2204 2205 2206
	u8 vbit, dbit;
	u16 vbat, diode;

	if (IS_ERR(data))
		return PTR_ERR(data);
2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217

	err = kstrtoul(buf, 10, &val);
	if (err < 0)
		return err;

	if (val != 1 && val != 3 && val != 4)
		return -EINVAL;

	mutex_lock(&data->update_lock);

	data->temp_type[nr] = val;
2218 2219
	vbit = 0x02 << nr;
	dbit = data->DIODE_MASK << nr;
2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230

	err = nct6775_read_value(data, data->REG_VBAT, &vbat);
	if (err)
		goto out;
	vbat &= ~vbit;

	err = nct6775_read_value(data, data->REG_DIODE, &diode);
	if (err)
		goto out;
	diode &= ~dbit;

2231 2232
	switch (val) {
	case 1:	/* CPU diode (diode, current mode) */
2233 2234
		vbat |= vbit;
		diode |= dbit;
2235 2236
		break;
	case 3: /* diode, voltage mode */
2237
		vbat |= dbit;
2238 2239 2240 2241
		break;
	case 4:	/* thermistor */
		break;
	}
2242 2243 2244 2245 2246
	err = nct6775_write_value(data, data->REG_VBAT, vbat);
	if (err)
		goto out;
	err = nct6775_write_value(data, data->REG_DIODE, diode);
out:
2247
	mutex_unlock(&data->update_lock);
2248
	return err ? : count;
2249 2250
}

2251 2252 2253
static umode_t nct6775_temp_is_visible(struct kobject *kobj,
				       struct attribute *attr, int index)
{
2254
	struct device *dev = kobj_to_dev(kobj);
2255
	struct nct6775_data *data = dev_get_drvdata(dev);
2256 2257
	int temp = index / 10;	/* temp index */
	int nr = index % 10;	/* attribute index */
2258

2259
	if (!(data->have_temp & BIT(temp)))
2260
		return 0;
2261

2262 2263 2264
	if (nr == 1 && !data->temp_label)
		return 0;

2265 2266
	if (nr == 2 && find_temp_source(data, temp, data->num_temp_alarms) < 0)
		return 0;				/* alarm */
2267

2268 2269 2270 2271
	if (nr == 3 && find_temp_source(data, temp, data->num_temp_beeps) < 0)
		return 0;				/* beep */

	if (nr == 4 && !data->reg_temp[1][temp])	/* max */
2272
		return 0;
2273

2274
	if (nr == 5 && !data->reg_temp[2][temp])	/* max_hyst */
2275
		return 0;
2276

2277
	if (nr == 6 && !data->reg_temp[3][temp])	/* crit */
2278 2279
		return 0;

2280
	if (nr == 7 && !data->reg_temp[4][temp])	/* lcrit */
2281 2282 2283
		return 0;

	/* offset and type only apply to fixed sensors */
2284
	if (nr > 7 && !(data->have_temp_fixed & BIT(temp)))
2285
		return 0;
2286

2287
	return nct6775_attr_mode(data, attr);
2288 2289
}

2290 2291 2292 2293 2294 2295 2296 2297 2298 2299
SENSOR_TEMPLATE_2(temp_input, "temp%d_input", 0444, show_temp, NULL, 0, 0);
SENSOR_TEMPLATE(temp_label, "temp%d_label", 0444, show_temp_label, NULL, 0);
SENSOR_TEMPLATE_2(temp_max, "temp%d_max", 0644, show_temp, store_temp, 0, 1);
SENSOR_TEMPLATE_2(temp_max_hyst, "temp%d_max_hyst", 0644, show_temp, store_temp, 0, 2);
SENSOR_TEMPLATE_2(temp_crit, "temp%d_crit", 0644, show_temp, store_temp, 0, 3);
SENSOR_TEMPLATE_2(temp_lcrit, "temp%d_lcrit", 0644, show_temp, store_temp, 0, 4);
SENSOR_TEMPLATE(temp_offset, "temp%d_offset", 0644, show_temp_offset, store_temp_offset, 0);
SENSOR_TEMPLATE(temp_type, "temp%d_type", 0644, show_temp_type, store_temp_type, 0);
SENSOR_TEMPLATE(temp_alarm, "temp%d_alarm", 0444, show_temp_alarm, NULL, 0);
SENSOR_TEMPLATE(temp_beep, "temp%d_beep", 0644, show_temp_beep, store_temp_beep, 0);
2300 2301 2302 2303 2304 2305 2306 2307 2308 2309

/*
 * nct6775_temp_is_visible uses the index into the following array
 * to determine if attributes should be created or not.
 * Any change in order or content must be matched.
 */
static struct sensor_device_template *nct6775_attributes_temp_template[] = {
	&sensor_dev_template_temp_input,
	&sensor_dev_template_temp_label,
	&sensor_dev_template_temp_alarm,	/* 2 */
2310 2311 2312 2313 2314 2315 2316
	&sensor_dev_template_temp_beep,		/* 3 */
	&sensor_dev_template_temp_max,		/* 4 */
	&sensor_dev_template_temp_max_hyst,	/* 5 */
	&sensor_dev_template_temp_crit,		/* 6 */
	&sensor_dev_template_temp_lcrit,	/* 7 */
	&sensor_dev_template_temp_offset,	/* 8 */
	&sensor_dev_template_temp_type,		/* 9 */
2317
	NULL
2318 2319
};

2320
static const struct sensor_template_group nct6775_temp_template_group = {
2321 2322 2323
	.templates = nct6775_attributes_temp_template,
	.is_visible = nct6775_temp_is_visible,
	.base = 1,
2324 2325
};

2326 2327 2328 2329 2330
static ssize_t show_tsi_temp(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);

2331 2332 2333
	if (IS_ERR(data))
		return PTR_ERR(data);

2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353
	return sysfs_emit(buf, "%u\n", tsi_temp_from_reg(data->tsi_temp[sattr->index]));
}

static ssize_t show_tsi_temp_label(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);

	return sysfs_emit(buf, "TSI%d_TEMP\n", sattr->index);
}

SENSOR_TEMPLATE(tsi_temp_input, "temp%d_input", 0444, show_tsi_temp, NULL, 0);
SENSOR_TEMPLATE(tsi_temp_label, "temp%d_label", 0444, show_tsi_temp_label, NULL, 0);

static umode_t nct6775_tsi_temp_is_visible(struct kobject *kobj, struct attribute *attr,
					       int index)
{
	struct device *dev = kobj_to_dev(kobj);
	struct nct6775_data *data = dev_get_drvdata(dev);
	int temp = index / 2;

2354
	return (data->have_tsi_temp & BIT(temp)) ? nct6775_attr_mode(data, attr) : 0;
2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366
}

/*
 * The index calculation in nct6775_tsi_temp_is_visible() must be kept in
 * sync with the size of this array.
 */
static struct sensor_device_template *nct6775_tsi_temp_template[] = {
	&sensor_dev_template_tsi_temp_input,
	&sensor_dev_template_tsi_temp_label,
	NULL
};

2367 2368 2369 2370 2371 2372
static ssize_t
show_pwm_mode(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);

2373 2374 2375
	if (IS_ERR(data))
		return PTR_ERR(data);

2376
	return sprintf(buf, "%d\n", data->pwm_mode[sattr->index]);
2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387
}

static ssize_t
store_pwm_mode(struct device *dev, struct device_attribute *attr,
	       const char *buf, size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
	unsigned long val;
	int err;
2388
	u16 reg;
2389 2390 2391 2392 2393 2394 2395 2396

	err = kstrtoul(buf, 10, &val);
	if (err < 0)
		return err;

	if (val > 1)
		return -EINVAL;

2397
	/* Setting DC mode (0) is not supported for all chips/channels */
2398
	if (data->REG_PWM_MODE[nr] == 0) {
2399
		if (!val)
2400 2401 2402 2403 2404 2405
			return -EINVAL;
		return count;
	}

	mutex_lock(&data->update_lock);
	data->pwm_mode[nr] = val;
2406 2407 2408
	err = nct6775_read_value(data, data->REG_PWM_MODE[nr], &reg);
	if (err)
		goto out;
2409
	reg &= ~data->PWM_MODE_MASK[nr];
2410
	if (!val)
2411
		reg |= data->PWM_MODE_MASK[nr];
2412 2413
	err = nct6775_write_value(data, data->REG_PWM_MODE[nr], reg);
out:
2414
	mutex_unlock(&data->update_lock);
2415
	return err ? : count;
2416 2417 2418 2419 2420 2421 2422 2423 2424
}

static ssize_t
show_pwm(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;
2425 2426 2427 2428 2429
	int err;
	u16 pwm;

	if (IS_ERR(data))
		return PTR_ERR(data);
2430 2431 2432 2433 2434

	/*
	 * For automatic fan control modes, show current pwm readings.
	 * Otherwise, show the configured value.
	 */
2435 2436 2437 2438 2439
	if (index == 0 && data->pwm_enable[nr] > manual) {
		err = nct6775_read_value(data, data->REG_PWM_READ[nr], &pwm);
		if (err)
			return err;
	} else {
2440
		pwm = data->pwm[index][nr];
2441
	}
2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454

	return sprintf(buf, "%d\n", pwm);
}

static ssize_t
store_pwm(struct device *dev, struct device_attribute *attr, const char *buf,
	  size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;
	unsigned long val;
2455 2456 2457
	int minval[7] = { 0, 1, 1, data->pwm[2][nr], 0, 0, 0 };
	int maxval[7]
	  = { 255, 255, data->pwm[3][nr] ? : 255, 255, 255, 255, 255 };
2458
	int err;
2459
	u16 reg;
2460 2461 2462 2463

	err = kstrtoul(buf, 10, &val);
	if (err < 0)
		return err;
2464
	val = clamp_val(val, minval[index], maxval[index]);
2465 2466 2467

	mutex_lock(&data->update_lock);
	data->pwm[index][nr] = val;
2468 2469 2470
	err = nct6775_write_value(data, data->REG_PWM[index][nr], val);
	if (err)
		goto out;
2471
	if (index == 2)	{ /* floor: disable if val == 0 */
2472 2473 2474
		err = nct6775_read_value(data, data->REG_TEMP_SEL[nr], &reg);
		if (err)
			goto out;
2475 2476 2477
		reg &= 0x7f;
		if (val)
			reg |= 0x80;
2478
		err = nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg);
2479
	}
2480
out:
2481
	mutex_unlock(&data->update_lock);
2482
	return err ? : count;
2483 2484
}

2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508
/* Returns 0 if OK, -EINVAL otherwise */
static int check_trip_points(struct nct6775_data *data, int nr)
{
	int i;

	for (i = 0; i < data->auto_pwm_num - 1; i++) {
		if (data->auto_temp[nr][i] > data->auto_temp[nr][i + 1])
			return -EINVAL;
	}
	for (i = 0; i < data->auto_pwm_num - 1; i++) {
		if (data->auto_pwm[nr][i] > data->auto_pwm[nr][i + 1])
			return -EINVAL;
	}
	/* validate critical temperature and pwm if enabled (pwm > 0) */
	if (data->auto_pwm[nr][data->auto_pwm_num]) {
		if (data->auto_temp[nr][data->auto_pwm_num - 1] >
				data->auto_temp[nr][data->auto_pwm_num] ||
		    data->auto_pwm[nr][data->auto_pwm_num - 1] >
				data->auto_pwm[nr][data->auto_pwm_num])
			return -EINVAL;
	}
	return 0;
}

2509
static int pwm_update_registers(struct nct6775_data *data, int nr)
2510
{
2511 2512
	u16 reg;
	int err;
2513 2514 2515 2516 2517 2518

	switch (data->pwm_enable[nr]) {
	case off:
	case manual:
		break;
	case speed_cruise:
2519 2520 2521
		err = nct6775_read_value(data, data->REG_FAN_MODE[nr], &reg);
		if (err)
			return err;
2522 2523
		reg = (reg & ~data->tolerance_mask) |
		  (data->target_speed_tolerance[nr] & data->tolerance_mask);
2524 2525 2526 2527 2528 2529 2530
		err = nct6775_write_value(data, data->REG_FAN_MODE[nr], reg);
		if (err)
			return err;
		err = nct6775_write_value(data, data->REG_TARGET[nr],
					  data->target_speed[nr] & 0xff);
		if (err)
			return err;
2531 2532 2533
		if (data->REG_TOLERANCE_H) {
			reg = (data->target_speed[nr] >> 8) & 0x0f;
			reg |= (data->target_speed_tolerance[nr] & 0x38) << 1;
2534 2535 2536
			err = nct6775_write_value(data, data->REG_TOLERANCE_H[nr], reg);
			if (err)
				return err;
2537 2538 2539
		}
		break;
	case thermal_cruise:
2540 2541 2542
		err = nct6775_write_value(data, data->REG_TARGET[nr], data->target_temp[nr]);
		if (err)
			return err;
2543
		fallthrough;
2544
	default:
2545 2546 2547
		err = nct6775_read_value(data, data->REG_FAN_MODE[nr], &reg);
		if (err)
			return err;
2548 2549
		reg = (reg & ~data->tolerance_mask) |
		  data->temp_tolerance[0][nr];
2550 2551 2552
		err = nct6775_write_value(data, data->REG_FAN_MODE[nr], reg);
		if (err)
			return err;
2553 2554
		break;
	}
2555 2556

	return 0;
2557 2558
}

2559 2560 2561 2562 2563 2564
static ssize_t
show_pwm_enable(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);

2565 2566 2567
	if (IS_ERR(data))
		return PTR_ERR(data);

2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591
	return sprintf(buf, "%d\n", data->pwm_enable[sattr->index]);
}

static ssize_t
store_pwm_enable(struct device *dev, struct device_attribute *attr,
		 const char *buf, size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
	unsigned long val;
	int err;
	u16 reg;

	err = kstrtoul(buf, 10, &val);
	if (err < 0)
		return err;

	if (val > sf4)
		return -EINVAL;

	if (val == sf3 && data->kind != nct6775)
		return -EINVAL;

2592 2593 2594 2595 2596 2597
	if (val == sf4 && check_trip_points(data, nr)) {
		dev_err(dev, "Inconsistent trip points, not switching to SmartFan IV mode\n");
		dev_err(dev, "Adjust trip points and try again\n");
		return -EINVAL;
	}

2598 2599 2600 2601 2602 2603 2604
	mutex_lock(&data->update_lock);
	data->pwm_enable[nr] = val;
	if (val == off) {
		/*
		 * turn off pwm control: select manual mode, set pwm to maximum
		 */
		data->pwm[0][nr] = 255;
2605 2606 2607
		err = nct6775_write_value(data, data->REG_PWM[0][nr], 255);
		if (err)
			goto out;
2608
	}
2609 2610 2611 2612 2613 2614
	err = pwm_update_registers(data, nr);
	if (err)
		goto out;
	err = nct6775_read_value(data, data->REG_FAN_MODE[nr], &reg);
	if (err)
		goto out;
2615 2616
	reg &= 0x0f;
	reg |= pwm_enable_to_reg(val) << 4;
2617 2618
	err = nct6775_write_value(data, data->REG_FAN_MODE[nr], reg);
out:
2619
	mutex_unlock(&data->update_lock);
2620
	return err ? : count;
2621 2622
}

2623
static ssize_t
2624
show_pwm_temp_sel_common(struct nct6775_data *data, char *buf, int src)
2625
{
2626
	int i, sel = 0;
2627 2628

	for (i = 0; i < NUM_TEMP; i++) {
2629
		if (!(data->have_temp & BIT(i)))
2630 2631 2632 2633 2634 2635 2636 2637 2638 2639
			continue;
		if (src == data->temp_src[i]) {
			sel = i + 1;
			break;
		}
	}

	return sprintf(buf, "%d\n", sel);
}

2640 2641 2642 2643 2644 2645 2646
static ssize_t
show_pwm_temp_sel(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int index = sattr->index;

2647 2648 2649
	if (IS_ERR(data))
		return PTR_ERR(data);

2650 2651 2652
	return show_pwm_temp_sel_common(data, buf, data->pwm_temp_sel[index]);
}

2653 2654 2655 2656 2657 2658 2659 2660
static ssize_t
store_pwm_temp_sel(struct device *dev, struct device_attribute *attr,
		   const char *buf, size_t count)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
	unsigned long val;
2661 2662 2663 2664 2665
	int err, src;
	u16 reg;

	if (IS_ERR(data))
		return PTR_ERR(data);
2666 2667 2668 2669 2670 2671

	err = kstrtoul(buf, 10, &val);
	if (err < 0)
		return err;
	if (val == 0 || val > NUM_TEMP)
		return -EINVAL;
2672
	if (!(data->have_temp & BIT(val - 1)) || !data->temp_src[val - 1])
2673 2674 2675 2676 2677
		return -EINVAL;

	mutex_lock(&data->update_lock);
	src = data->temp_src[val - 1];
	data->pwm_temp_sel[nr] = src;
2678 2679 2680
	err = nct6775_read_value(data, data->REG_TEMP_SEL[nr], &reg);
	if (err)
		goto out;
2681 2682
	reg &= 0xe0;
	reg |= src;
2683 2684
	err = nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg);
out:
2685 2686
	mutex_unlock(&data->update_lock);

2687
	return err ? : count;
2688 2689
}

2690 2691 2692 2693 2694 2695 2696 2697
static ssize_t
show_pwm_weight_temp_sel(struct device *dev, struct device_attribute *attr,
			 char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int index = sattr->index;

2698 2699 2700
	if (IS_ERR(data))
		return PTR_ERR(data);

2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712
	return show_pwm_temp_sel_common(data, buf,
					data->pwm_weight_temp_sel[index]);
}

static ssize_t
store_pwm_weight_temp_sel(struct device *dev, struct device_attribute *attr,
			  const char *buf, size_t count)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
	unsigned long val;
2713 2714 2715 2716 2717
	int err, src;
	u16 reg;

	if (IS_ERR(data))
		return PTR_ERR(data);
2718 2719 2720 2721 2722 2723

	err = kstrtoul(buf, 10, &val);
	if (err < 0)
		return err;
	if (val > NUM_TEMP)
		return -EINVAL;
2724
	val = array_index_nospec(val, NUM_TEMP + 1);
2725
	if (val && (!(data->have_temp & BIT(val - 1)) ||
2726 2727 2728 2729 2730 2731 2732
		    !data->temp_src[val - 1]))
		return -EINVAL;

	mutex_lock(&data->update_lock);
	if (val) {
		src = data->temp_src[val - 1];
		data->pwm_weight_temp_sel[nr] = src;
2733 2734 2735
		err = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr], &reg);
		if (err)
			goto out;
2736 2737
		reg &= 0xe0;
		reg |= (src | 0x80);
2738
		err = nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg);
2739 2740
	} else {
		data->pwm_weight_temp_sel[nr] = 0;
2741 2742 2743
		err = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr], &reg);
		if (err)
			goto out;
2744
		reg &= 0x7f;
2745
		err = nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg);
2746
	}
2747
out:
2748 2749
	mutex_unlock(&data->update_lock);

2750
	return err ? : count;
2751 2752
}

2753 2754 2755 2756 2757 2758
static ssize_t
show_target_temp(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);

2759 2760 2761
	if (IS_ERR(data))
		return PTR_ERR(data);

2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783
	return sprintf(buf, "%d\n", data->target_temp[sattr->index] * 1000);
}

static ssize_t
store_target_temp(struct device *dev, struct device_attribute *attr,
		  const char *buf, size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
	unsigned long val;
	int err;

	err = kstrtoul(buf, 10, &val);
	if (err < 0)
		return err;

	val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0,
			data->target_temp_mask);

	mutex_lock(&data->update_lock);
	data->target_temp[nr] = val;
2784
	err = pwm_update_registers(data, nr);
2785
	mutex_unlock(&data->update_lock);
2786
	return err ? : count;
2787 2788 2789 2790 2791 2792 2793 2794 2795
}

static ssize_t
show_target_speed(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;

2796 2797 2798
	if (IS_ERR(data))
		return PTR_ERR(data);

2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823
	return sprintf(buf, "%d\n",
		       fan_from_reg16(data->target_speed[nr],
				      data->fan_div[nr]));
}

static ssize_t
store_target_speed(struct device *dev, struct device_attribute *attr,
		   const char *buf, size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
	unsigned long val;
	int err;
	u16 speed;

	err = kstrtoul(buf, 10, &val);
	if (err < 0)
		return err;

	val = clamp_val(val, 0, 1350000U);
	speed = fan_to_reg(val, data->fan_div[nr]);

	mutex_lock(&data->update_lock);
	data->target_speed[nr] = speed;
2824
	err = pwm_update_registers(data, nr);
2825
	mutex_unlock(&data->update_lock);
2826
	return err ? : count;
2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837
}

static ssize_t
show_temp_tolerance(struct device *dev, struct device_attribute *attr,
		    char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;

2838 2839 2840
	if (IS_ERR(data))
		return PTR_ERR(data);

2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864
	return sprintf(buf, "%d\n", data->temp_tolerance[index][nr] * 1000);
}

static ssize_t
store_temp_tolerance(struct device *dev, struct device_attribute *attr,
		     const char *buf, size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;
	unsigned long val;
	int err;

	err = kstrtoul(buf, 10, &val);
	if (err < 0)
		return err;

	/* Limit tolerance as needed */
	val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, data->tolerance_mask);

	mutex_lock(&data->update_lock);
	data->temp_tolerance[index][nr] = val;
	if (index)
2865
		err = pwm_update_registers(data, nr);
2866
	else
2867
		err = nct6775_write_value(data, data->REG_CRITICAL_TEMP_TOLERANCE[nr], val);
2868
	mutex_unlock(&data->update_lock);
2869
	return err ? : count;
2870 2871 2872 2873 2874 2875
}

/*
 * Fan speed tolerance is a tricky beast, since the associated register is
 * a tick counter, but the value is reported and configured as rpm.
 * Compute resulting low and high rpm values and report the difference.
2876 2877
 * A fan speed tolerance only makes sense if a fan target speed has been
 * configured, so only display values other than 0 if that is the case.
2878 2879 2880 2881 2882 2883 2884 2885
 */
static ssize_t
show_speed_tolerance(struct device *dev, struct device_attribute *attr,
		     char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
2886 2887 2888 2889 2890 2891
	int target, tolerance = 0;

	if (IS_ERR(data))
		return PTR_ERR(data);

	target = data->target_speed[nr];
2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906

	if (target) {
		int low = target - data->target_speed_tolerance[nr];
		int high = target + data->target_speed_tolerance[nr];

		if (low <= 0)
			low = 1;
		if (high > 0xffff)
			high = 0xffff;
		if (high < low)
			high = low;

		tolerance = (fan_from_reg16(low, data->fan_div[nr])
			     - fan_from_reg16(high, data->fan_div[nr])) / 2;
	}
2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925

	return sprintf(buf, "%d\n", tolerance);
}

static ssize_t
store_speed_tolerance(struct device *dev, struct device_attribute *attr,
		      const char *buf, size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
	int nr = sattr->index;
	unsigned long val;
	int err;
	int low, high;

	err = kstrtoul(buf, 10, &val);
	if (err < 0)
		return err;

2926 2927
	high = fan_from_reg16(data->target_speed[nr], data->fan_div[nr]) + val;
	low = fan_from_reg16(data->target_speed[nr], data->fan_div[nr]) - val;
2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940
	if (low <= 0)
		low = 1;
	if (high < low)
		high = low;

	val = (fan_to_reg(low, data->fan_div[nr]) -
	       fan_to_reg(high, data->fan_div[nr])) / 2;

	/* Limit tolerance as needed */
	val = clamp_val(val, 0, data->speed_tolerance_limit);

	mutex_lock(&data->update_lock);
	data->target_speed_tolerance[nr] = val;
2941
	err = pwm_update_registers(data, nr);
2942
	mutex_unlock(&data->update_lock);
2943
	return err ? : count;
2944 2945
}

2946 2947 2948 2949 2950 2951 2952 2953
SENSOR_TEMPLATE_2(pwm, "pwm%d", 0644, show_pwm, store_pwm, 0, 0);
SENSOR_TEMPLATE(pwm_mode, "pwm%d_mode", 0644, show_pwm_mode, store_pwm_mode, 0);
SENSOR_TEMPLATE(pwm_enable, "pwm%d_enable", 0644, show_pwm_enable, store_pwm_enable, 0);
SENSOR_TEMPLATE(pwm_temp_sel, "pwm%d_temp_sel", 0644, show_pwm_temp_sel, store_pwm_temp_sel, 0);
SENSOR_TEMPLATE(pwm_target_temp, "pwm%d_target_temp", 0644, show_target_temp, store_target_temp, 0);
SENSOR_TEMPLATE(fan_target, "fan%d_target", 0644, show_target_speed, store_target_speed, 0);
SENSOR_TEMPLATE(fan_tolerance, "fan%d_tolerance", 0644, show_speed_tolerance,
		store_speed_tolerance, 0);
2954 2955 2956

/* Smart Fan registers */

2957 2958 2959 2960 2961 2962 2963 2964
static ssize_t
show_weight_temp(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;

2965 2966 2967
	if (IS_ERR(data))
		return PTR_ERR(data);

2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989
	return sprintf(buf, "%d\n", data->weight_temp[index][nr] * 1000);
}

static ssize_t
store_weight_temp(struct device *dev, struct device_attribute *attr,
		  const char *buf, size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;
	unsigned long val;
	int err;

	err = kstrtoul(buf, 10, &val);
	if (err < 0)
		return err;

	val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, 255);

	mutex_lock(&data->update_lock);
	data->weight_temp[index][nr] = val;
2990
	err = nct6775_write_value(data, data->REG_WEIGHT_TEMP[index][nr], val);
2991
	mutex_unlock(&data->update_lock);
2992
	return err ? : count;
2993 2994
}

2995 2996
SENSOR_TEMPLATE(pwm_weight_temp_sel, "pwm%d_weight_temp_sel", 0644,
		show_pwm_weight_temp_sel, store_pwm_weight_temp_sel, 0);
2997
SENSOR_TEMPLATE_2(pwm_weight_temp_step, "pwm%d_weight_temp_step",
2998
		  0644, show_weight_temp, store_weight_temp, 0, 0);
2999
SENSOR_TEMPLATE_2(pwm_weight_temp_step_tol, "pwm%d_weight_temp_step_tol",
3000
		  0644, show_weight_temp, store_weight_temp, 0, 1);
3001
SENSOR_TEMPLATE_2(pwm_weight_temp_step_base, "pwm%d_weight_temp_step_base",
3002 3003 3004
		  0644, show_weight_temp, store_weight_temp, 0, 2);
SENSOR_TEMPLATE_2(pwm_weight_duty_step, "pwm%d_weight_duty_step", 0644, show_pwm, store_pwm, 0, 5);
SENSOR_TEMPLATE_2(pwm_weight_duty_base, "pwm%d_weight_duty_base", 0644, show_pwm, store_pwm, 0, 6);
3005

3006 3007 3008 3009 3010 3011 3012 3013
static ssize_t
show_fan_time(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;

3014 3015 3016
	if (IS_ERR(data))
		return PTR_ERR(data);

3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039
	return sprintf(buf, "%d\n",
		       step_time_from_reg(data->fan_time[index][nr],
					  data->pwm_mode[nr]));
}

static ssize_t
store_fan_time(struct device *dev, struct device_attribute *attr,
	       const char *buf, size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int index = sattr->index;
	unsigned long val;
	int err;

	err = kstrtoul(buf, 10, &val);
	if (err < 0)
		return err;

	val = step_time_to_reg(val, data->pwm_mode[nr]);
	mutex_lock(&data->update_lock);
	data->fan_time[index][nr] = val;
3040
	err = nct6775_write_value(data, data->REG_FAN_TIME[index][nr], val);
3041
	mutex_unlock(&data->update_lock);
3042
	return err ? : count;
3043 3044 3045 3046 3047 3048 3049 3050
}

static ssize_t
show_auto_pwm(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);

3051 3052 3053
	if (IS_ERR(data))
		return PTR_ERR(data);

3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066
	return sprintf(buf, "%d\n", data->auto_pwm[sattr->nr][sattr->index]);
}

static ssize_t
store_auto_pwm(struct device *dev, struct device_attribute *attr,
	       const char *buf, size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int point = sattr->index;
	unsigned long val;
	int err;
3067
	u16 reg;
3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084

	err = kstrtoul(buf, 10, &val);
	if (err < 0)
		return err;
	if (val > 255)
		return -EINVAL;

	if (point == data->auto_pwm_num) {
		if (data->kind != nct6775 && !val)
			return -EINVAL;
		if (data->kind != nct6779 && val)
			val = 0xff;
	}

	mutex_lock(&data->update_lock);
	data->auto_pwm[nr][point] = val;
	if (point < data->auto_pwm_num) {
3085 3086
		err = nct6775_write_value(data, NCT6775_AUTO_PWM(data, nr, point),
					  data->auto_pwm[nr][point]);
3087 3088 3089 3090
	} else {
		switch (data->kind) {
		case nct6775:
			/* disable if needed (pwm == 0) */
3091 3092 3093
			err = nct6775_read_value(data, NCT6775_REG_CRITICAL_ENAB[nr], &reg);
			if (err)
				break;
3094 3095 3096 3097
			if (val)
				reg |= 0x02;
			else
				reg &= ~0x02;
3098
			err = nct6775_write_value(data, NCT6775_REG_CRITICAL_ENAB[nr], reg);
3099 3100 3101
			break;
		case nct6776:
			break; /* always enabled, nothing to do */
3102
		case nct6106:
3103
		case nct6116:
3104
		case nct6779:
3105
		case nct6791:
3106
		case nct6792:
3107
		case nct6793:
3108
		case nct6795:
3109
		case nct6796:
3110
		case nct6797:
3111
		case nct6798:
3112 3113 3114 3115 3116 3117
			err = nct6775_write_value(data, data->REG_CRITICAL_PWM[nr], val);
			if (err)
				break;
			err = nct6775_read_value(data, data->REG_CRITICAL_PWM_ENABLE[nr], &reg);
			if (err)
				break;
3118
			if (val == 255)
3119
				reg &= ~data->CRITICAL_PWM_ENABLE_MASK;
3120
			else
3121
				reg |= data->CRITICAL_PWM_ENABLE_MASK;
3122
			err = nct6775_write_value(data, data->REG_CRITICAL_PWM_ENABLE[nr], reg);
3123 3124 3125 3126
			break;
		}
	}
	mutex_unlock(&data->update_lock);
3127
	return err ? : count;
3128 3129 3130 3131 3132 3133 3134 3135 3136 3137
}

static ssize_t
show_auto_temp(struct device *dev, struct device_attribute *attr, char *buf)
{
	struct nct6775_data *data = nct6775_update_device(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int point = sattr->index;

3138 3139 3140
	if (IS_ERR(data))
		return PTR_ERR(data);

3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167
	/*
	 * We don't know for sure if the temperature is signed or unsigned.
	 * Assume it is unsigned.
	 */
	return sprintf(buf, "%d\n", data->auto_temp[nr][point] * 1000);
}

static ssize_t
store_auto_temp(struct device *dev, struct device_attribute *attr,
		const char *buf, size_t count)
{
	struct nct6775_data *data = dev_get_drvdata(dev);
	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
	int nr = sattr->nr;
	int point = sattr->index;
	unsigned long val;
	int err;

	err = kstrtoul(buf, 10, &val);
	if (err)
		return err;
	if (val > 255000)
		return -EINVAL;

	mutex_lock(&data->update_lock);
	data->auto_temp[nr][point] = DIV_ROUND_CLOSEST(val, 1000);
	if (point < data->auto_pwm_num) {
3168 3169
		err = nct6775_write_value(data, NCT6775_AUTO_TEMP(data, nr, point),
					  data->auto_temp[nr][point]);
3170
	} else {
3171 3172
		err = nct6775_write_value(data, data->REG_CRITICAL_TEMP[nr],
					  data->auto_temp[nr][point]);
3173 3174
	}
	mutex_unlock(&data->update_lock);
3175
	return err ? : count;
3176 3177
}

3178 3179 3180
static umode_t nct6775_pwm_is_visible(struct kobject *kobj,
				      struct attribute *attr, int index)
{
3181
	struct device *dev = kobj_to_dev(kobj);
3182 3183 3184 3185
	struct nct6775_data *data = dev_get_drvdata(dev);
	int pwm = index / 36;	/* pwm index */
	int nr = index % 36;	/* attribute index */

3186
	if (!(data->has_pwm & BIT(pwm)))
3187 3188
		return 0;

3189 3190 3191
	if ((nr >= 14 && nr <= 18) || nr == 21)   /* weight */
		if (!data->REG_WEIGHT_TEMP_SEL[pwm])
			return 0;
3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204
	if (nr == 19 && data->REG_PWM[3] == NULL) /* pwm_max */
		return 0;
	if (nr == 20 && data->REG_PWM[4] == NULL) /* pwm_step */
		return 0;
	if (nr == 21 && data->REG_PWM[6] == NULL) /* weight_duty_base */
		return 0;

	if (nr >= 22 && nr <= 35) {		/* auto point */
		int api = (nr - 22) / 2;	/* auto point index */

		if (api > data->auto_pwm_num)
			return 0;
	}
3205
	return nct6775_attr_mode(data, attr);
3206 3207
}

3208 3209
SENSOR_TEMPLATE_2(pwm_stop_time, "pwm%d_stop_time", 0644, show_fan_time, store_fan_time, 0, 0);
SENSOR_TEMPLATE_2(pwm_step_up_time, "pwm%d_step_up_time", 0644,
3210
		  show_fan_time, store_fan_time, 0, 1);
3211
SENSOR_TEMPLATE_2(pwm_step_down_time, "pwm%d_step_down_time", 0644,
3212
		  show_fan_time, store_fan_time, 0, 2);
3213 3214 3215
SENSOR_TEMPLATE_2(pwm_start, "pwm%d_start", 0644, show_pwm, store_pwm, 0, 1);
SENSOR_TEMPLATE_2(pwm_floor, "pwm%d_floor", 0644, show_pwm, store_pwm, 0, 2);
SENSOR_TEMPLATE_2(pwm_temp_tolerance, "pwm%d_temp_tolerance", 0644,
3216 3217
		  show_temp_tolerance, store_temp_tolerance, 0, 0);
SENSOR_TEMPLATE_2(pwm_crit_temp_tolerance, "pwm%d_crit_temp_tolerance",
3218
		  0644, show_temp_tolerance, store_temp_tolerance, 0, 1);
3219

3220
SENSOR_TEMPLATE_2(pwm_max, "pwm%d_max", 0644, show_pwm, store_pwm, 0, 3);
3221

3222
SENSOR_TEMPLATE_2(pwm_step, "pwm%d_step", 0644, show_pwm, store_pwm, 0, 4);
3223 3224

SENSOR_TEMPLATE_2(pwm_auto_point1_pwm, "pwm%d_auto_point1_pwm",
3225
		  0644, show_auto_pwm, store_auto_pwm, 0, 0);
3226
SENSOR_TEMPLATE_2(pwm_auto_point1_temp, "pwm%d_auto_point1_temp",
3227
		  0644, show_auto_temp, store_auto_temp, 0, 0);
3228 3229

SENSOR_TEMPLATE_2(pwm_auto_point2_pwm, "pwm%d_auto_point2_pwm",
3230
		  0644, show_auto_pwm, store_auto_pwm, 0, 1);
3231
SENSOR_TEMPLATE_2(pwm_auto_point2_temp, "pwm%d_auto_point2_temp",
3232
		  0644, show_auto_temp, store_auto_temp, 0, 1);
3233 3234

SENSOR_TEMPLATE_2(pwm_auto_point3_pwm, "pwm%d_auto_point3_pwm",
3235
		  0644, show_auto_pwm, store_auto_pwm, 0, 2);
3236
SENSOR_TEMPLATE_2(pwm_auto_point3_temp, "pwm%d_auto_point3_temp",
3237
		  0644, show_auto_temp, store_auto_temp, 0, 2);
3238 3239

SENSOR_TEMPLATE_2(pwm_auto_point4_pwm, "pwm%d_auto_point4_pwm",
3240
		  0644, show_auto_pwm, store_auto_pwm, 0, 3);
3241
SENSOR_TEMPLATE_2(pwm_auto_point4_temp, "pwm%d_auto_point4_temp",
3242
		  0644, show_auto_temp, store_auto_temp, 0, 3);
3243 3244

SENSOR_TEMPLATE_2(pwm_auto_point5_pwm, "pwm%d_auto_point5_pwm",
3245
		  0644, show_auto_pwm, store_auto_pwm, 0, 4);
3246
SENSOR_TEMPLATE_2(pwm_auto_point5_temp, "pwm%d_auto_point5_temp",
3247
		  0644, show_auto_temp, store_auto_temp, 0, 4);
3248 3249

SENSOR_TEMPLATE_2(pwm_auto_point6_pwm, "pwm%d_auto_point6_pwm",
3250
		  0644, show_auto_pwm, store_auto_pwm, 0, 5);
3251
SENSOR_TEMPLATE_2(pwm_auto_point6_temp, "pwm%d_auto_point6_temp",
3252
		  0644, show_auto_temp, store_auto_temp, 0, 5);
3253 3254

SENSOR_TEMPLATE_2(pwm_auto_point7_pwm, "pwm%d_auto_point7_pwm",
3255
		  0644, show_auto_pwm, store_auto_pwm, 0, 6);
3256
SENSOR_TEMPLATE_2(pwm_auto_point7_temp, "pwm%d_auto_point7_temp",
3257
		  0644, show_auto_temp, store_auto_temp, 0, 6);
3258

3259
/*
3260 3261 3262
 * nct6775_pwm_is_visible uses the index into the following array
 * to determine if attributes should be created or not.
 * Any change in order or content must be matched.
3263
 */
3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278
static struct sensor_device_template *nct6775_attributes_pwm_template[] = {
	&sensor_dev_template_pwm,
	&sensor_dev_template_pwm_mode,
	&sensor_dev_template_pwm_enable,
	&sensor_dev_template_pwm_temp_sel,
	&sensor_dev_template_pwm_temp_tolerance,
	&sensor_dev_template_pwm_crit_temp_tolerance,
	&sensor_dev_template_pwm_target_temp,
	&sensor_dev_template_fan_target,
	&sensor_dev_template_fan_tolerance,
	&sensor_dev_template_pwm_stop_time,
	&sensor_dev_template_pwm_step_up_time,
	&sensor_dev_template_pwm_step_down_time,
	&sensor_dev_template_pwm_start,
	&sensor_dev_template_pwm_floor,
3279
	&sensor_dev_template_pwm_weight_temp_sel,	/* 14 */
3280 3281 3282
	&sensor_dev_template_pwm_weight_temp_step,
	&sensor_dev_template_pwm_weight_temp_step_tol,
	&sensor_dev_template_pwm_weight_temp_step_base,
3283
	&sensor_dev_template_pwm_weight_duty_step,	/* 18 */
3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304
	&sensor_dev_template_pwm_max,			/* 19 */
	&sensor_dev_template_pwm_step,			/* 20 */
	&sensor_dev_template_pwm_weight_duty_base,	/* 21 */
	&sensor_dev_template_pwm_auto_point1_pwm,	/* 22 */
	&sensor_dev_template_pwm_auto_point1_temp,
	&sensor_dev_template_pwm_auto_point2_pwm,
	&sensor_dev_template_pwm_auto_point2_temp,
	&sensor_dev_template_pwm_auto_point3_pwm,
	&sensor_dev_template_pwm_auto_point3_temp,
	&sensor_dev_template_pwm_auto_point4_pwm,
	&sensor_dev_template_pwm_auto_point4_temp,
	&sensor_dev_template_pwm_auto_point5_pwm,
	&sensor_dev_template_pwm_auto_point5_temp,
	&sensor_dev_template_pwm_auto_point6_pwm,
	&sensor_dev_template_pwm_auto_point6_temp,
	&sensor_dev_template_pwm_auto_point7_pwm,
	&sensor_dev_template_pwm_auto_point7_temp,	/* 35 */

	NULL
};

3305
static const struct sensor_template_group nct6775_pwm_template_group = {
3306 3307 3308
	.templates = nct6775_attributes_pwm_template,
	.is_visible = nct6775_pwm_is_visible,
	.base = 1,
3309 3310
};

3311
static inline int nct6775_init_device(struct nct6775_data *data)
3312
{
3313 3314
	int i, err;
	u16 tmp, diode;
3315 3316 3317

	/* Start monitoring if needed */
	if (data->REG_CONFIG) {
3318 3319 3320 3321 3322 3323 3324 3325
		err = nct6775_read_value(data, data->REG_CONFIG, &tmp);
		if (err)
			return err;
		if (!(tmp & 0x01)) {
			err = nct6775_write_value(data, data->REG_CONFIG, tmp | 0x01);
			if (err)
				return err;
		}
3326 3327
	}

3328 3329
	/* Enable temperature sensors if needed */
	for (i = 0; i < NUM_TEMP; i++) {
3330
		if (!(data->have_temp & BIT(i)))
3331 3332 3333
			continue;
		if (!data->reg_temp_config[i])
			continue;
3334 3335 3336 3337 3338 3339 3340 3341
		err = nct6775_read_value(data, data->reg_temp_config[i], &tmp);
		if (err)
			return err;
		if (tmp & 0x01) {
			err = nct6775_write_value(data, data->reg_temp_config[i], tmp & 0xfe);
			if (err)
				return err;
		}
3342 3343
	}

3344
	/* Enable VBAT monitoring if needed */
3345 3346 3347 3348 3349 3350 3351 3352
	err = nct6775_read_value(data, data->REG_VBAT, &tmp);
	if (err)
		return err;
	if (!(tmp & 0x01)) {
		err = nct6775_write_value(data, data->REG_VBAT, tmp | 0x01);
		if (err)
			return err;
	}
3353

3354 3355 3356
	err = nct6775_read_value(data, data->REG_DIODE, &diode);
	if (err)
		return err;
3357 3358

	for (i = 0; i < data->temp_fixed_num; i++) {
3359
		if (!(data->have_temp_fixed & BIT(i)))
3360
			continue;
3361 3362 3363
		if ((tmp & (data->DIODE_MASK << i)))	/* diode */
			data->temp_type[i]
			  = 3 - ((diode >> i) & data->DIODE_MASK);
3364 3365 3366
		else				/* thermistor */
			data->temp_type[i] = 4;
	}
3367 3368

	return 0;
3369 3370
}

3371 3372
static int add_temp_sensors(struct nct6775_data *data, const u16 *regp,
			    int *available, int *mask)
3373
{
3374 3375
	int i, err;
	u16 src;
3376 3377 3378 3379 3380 3381

	for (i = 0; i < data->pwm_num && *available; i++) {
		int index;

		if (!regp[i])
			continue;
3382 3383 3384
		err = nct6775_read_value(data, regp[i], &src);
		if (err)
			return err;
3385
		src &= 0x1f;
3386
		if (!src || (*mask & BIT(src)))
3387
			continue;
3388
		if (!(data->temp_mask & BIT(src)))
3389 3390 3391
			continue;

		index = __ffs(*available);
3392 3393 3394
		err = nct6775_write_value(data, data->REG_TEMP_SOURCE[index], src);
		if (err)
			return err;
3395 3396
		*available &= ~BIT(index);
		*mask |= BIT(src);
3397
	}
3398 3399

	return 0;
3400 3401
}

3402 3403
int nct6775_probe(struct device *dev, struct nct6775_data *data,
		  const struct regmap_config *regmapcfg)
3404
{
3405
	int i, s, err = 0;
3406 3407
	int mask, available;
	u16 src;
3408
	const u16 *reg_temp, *reg_temp_over, *reg_temp_hyst, *reg_temp_config;
3409
	const u16 *reg_temp_mon, *reg_temp_alternate, *reg_temp_crit;
3410
	const u16 *reg_temp_crit_l = NULL, *reg_temp_crit_h = NULL;
3411
	int num_reg_temp, num_reg_temp_mon, num_reg_tsi_temp;
3412
	struct device *hwmon_dev;
3413
	struct sensor_template_group tsi_temp_tg;
3414

3415 3416 3417 3418
	data->regmap = devm_regmap_init(dev, NULL, data, regmapcfg);
	if (IS_ERR(data->regmap))
		return PTR_ERR(data->regmap);

3419 3420 3421 3422 3423
	mutex_init(&data->update_lock);
	data->name = nct6775_device_names[data->kind];
	data->bank = 0xff;		/* Force initial bank selection */

	switch (data->kind) {
3424 3425 3426 3427 3428 3429
	case nct6106:
		data->in_num = 9;
		data->pwm_num = 3;
		data->auto_pwm_num = 4;
		data->temp_fixed_num = 3;
		data->num_temp_alarms = 6;
3430
		data->num_temp_beeps = 6;
3431 3432 3433 3434 3435

		data->fan_from_reg = fan_from_reg13;
		data->fan_from_reg_min = fan_from_reg13;

		data->temp_label = nct6776_temp_label;
3436
		data->temp_mask = NCT6776_TEMP_MASK;
3437
		data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK;
3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453

		data->REG_VBAT = NCT6106_REG_VBAT;
		data->REG_DIODE = NCT6106_REG_DIODE;
		data->DIODE_MASK = NCT6106_DIODE_MASK;
		data->REG_VIN = NCT6106_REG_IN;
		data->REG_IN_MINMAX[0] = NCT6106_REG_IN_MIN;
		data->REG_IN_MINMAX[1] = NCT6106_REG_IN_MAX;
		data->REG_TARGET = NCT6106_REG_TARGET;
		data->REG_FAN = NCT6106_REG_FAN;
		data->REG_FAN_MODE = NCT6106_REG_FAN_MODE;
		data->REG_FAN_MIN = NCT6106_REG_FAN_MIN;
		data->REG_FAN_PULSES = NCT6106_REG_FAN_PULSES;
		data->FAN_PULSE_SHIFT = NCT6106_FAN_PULSE_SHIFT;
		data->REG_FAN_TIME[0] = NCT6106_REG_FAN_STOP_TIME;
		data->REG_FAN_TIME[1] = NCT6106_REG_FAN_STEP_UP_TIME;
		data->REG_FAN_TIME[2] = NCT6106_REG_FAN_STEP_DOWN_TIME;
3454
		data->REG_TOLERANCE_H = NCT6106_REG_TOLERANCE_H;
3455
		data->REG_PWM[0] = NCT6116_REG_PWM;
3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473
		data->REG_PWM[1] = NCT6106_REG_FAN_START_OUTPUT;
		data->REG_PWM[2] = NCT6106_REG_FAN_STOP_OUTPUT;
		data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP;
		data->REG_PWM[6] = NCT6106_REG_WEIGHT_DUTY_BASE;
		data->REG_PWM_READ = NCT6106_REG_PWM_READ;
		data->REG_PWM_MODE = NCT6106_REG_PWM_MODE;
		data->PWM_MODE_MASK = NCT6106_PWM_MODE_MASK;
		data->REG_AUTO_TEMP = NCT6106_REG_AUTO_TEMP;
		data->REG_AUTO_PWM = NCT6106_REG_AUTO_PWM;
		data->REG_CRITICAL_TEMP = NCT6106_REG_CRITICAL_TEMP;
		data->REG_CRITICAL_TEMP_TOLERANCE
		  = NCT6106_REG_CRITICAL_TEMP_TOLERANCE;
		data->REG_CRITICAL_PWM_ENABLE = NCT6106_REG_CRITICAL_PWM_ENABLE;
		data->CRITICAL_PWM_ENABLE_MASK
		  = NCT6106_CRITICAL_PWM_ENABLE_MASK;
		data->REG_CRITICAL_PWM = NCT6106_REG_CRITICAL_PWM;
		data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET;
		data->REG_TEMP_SOURCE = NCT6106_REG_TEMP_SOURCE;
3474
		data->REG_TEMP_SEL = NCT6116_REG_TEMP_SEL;
3475 3476 3477 3478 3479 3480
		data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL;
		data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP;
		data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL;
		data->REG_WEIGHT_TEMP[2] = NCT6106_REG_WEIGHT_TEMP_BASE;
		data->REG_ALARM = NCT6106_REG_ALARM;
		data->ALARM_BITS = NCT6106_ALARM_BITS;
3481 3482
		data->REG_BEEP = NCT6106_REG_BEEP;
		data->BEEP_BITS = NCT6106_BEEP_BITS;
3483
		data->REG_TSI_TEMP = NCT6106_REG_TSI_TEMP;
3484 3485

		reg_temp = NCT6106_REG_TEMP;
3486
		reg_temp_mon = NCT6106_REG_TEMP_MON;
3487
		num_reg_temp = ARRAY_SIZE(NCT6106_REG_TEMP);
3488
		num_reg_temp_mon = ARRAY_SIZE(NCT6106_REG_TEMP_MON);
3489
		num_reg_tsi_temp = ARRAY_SIZE(NCT6106_REG_TSI_TEMP);
3490 3491 3492 3493 3494
		reg_temp_over = NCT6106_REG_TEMP_OVER;
		reg_temp_hyst = NCT6106_REG_TEMP_HYST;
		reg_temp_config = NCT6106_REG_TEMP_CONFIG;
		reg_temp_alternate = NCT6106_REG_TEMP_ALTERNATE;
		reg_temp_crit = NCT6106_REG_TEMP_CRIT;
3495 3496
		reg_temp_crit_l = NCT6106_REG_TEMP_CRIT_L;
		reg_temp_crit_h = NCT6106_REG_TEMP_CRIT_H;
3497

3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557
		break;
	case nct6116:
		data->in_num = 9;
		data->pwm_num = 3;
		data->auto_pwm_num = 4;
		data->temp_fixed_num = 3;
		data->num_temp_alarms = 3;
		data->num_temp_beeps = 3;

		data->fan_from_reg = fan_from_reg13;
		data->fan_from_reg_min = fan_from_reg13;

		data->temp_label = nct6776_temp_label;
		data->temp_mask = NCT6776_TEMP_MASK;
		data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK;

		data->REG_VBAT = NCT6106_REG_VBAT;
		data->REG_DIODE = NCT6106_REG_DIODE;
		data->DIODE_MASK = NCT6106_DIODE_MASK;
		data->REG_VIN = NCT6106_REG_IN;
		data->REG_IN_MINMAX[0] = NCT6106_REG_IN_MIN;
		data->REG_IN_MINMAX[1] = NCT6106_REG_IN_MAX;
		data->REG_TARGET = NCT6116_REG_TARGET;
		data->REG_FAN = NCT6116_REG_FAN;
		data->REG_FAN_MODE = NCT6116_REG_FAN_MODE;
		data->REG_FAN_MIN = NCT6116_REG_FAN_MIN;
		data->REG_FAN_PULSES = NCT6116_REG_FAN_PULSES;
		data->FAN_PULSE_SHIFT = NCT6116_FAN_PULSE_SHIFT;
		data->REG_FAN_TIME[0] = NCT6116_REG_FAN_STOP_TIME;
		data->REG_FAN_TIME[1] = NCT6116_REG_FAN_STEP_UP_TIME;
		data->REG_FAN_TIME[2] = NCT6116_REG_FAN_STEP_DOWN_TIME;
		data->REG_TOLERANCE_H = NCT6116_REG_TOLERANCE_H;
		data->REG_PWM[0] = NCT6116_REG_PWM;
		data->REG_PWM[1] = NCT6116_REG_FAN_START_OUTPUT;
		data->REG_PWM[2] = NCT6116_REG_FAN_STOP_OUTPUT;
		data->REG_PWM[5] = NCT6106_REG_WEIGHT_DUTY_STEP;
		data->REG_PWM[6] = NCT6106_REG_WEIGHT_DUTY_BASE;
		data->REG_PWM_READ = NCT6106_REG_PWM_READ;
		data->REG_PWM_MODE = NCT6106_REG_PWM_MODE;
		data->PWM_MODE_MASK = NCT6106_PWM_MODE_MASK;
		data->REG_AUTO_TEMP = NCT6116_REG_AUTO_TEMP;
		data->REG_AUTO_PWM = NCT6116_REG_AUTO_PWM;
		data->REG_CRITICAL_TEMP = NCT6116_REG_CRITICAL_TEMP;
		data->REG_CRITICAL_TEMP_TOLERANCE
		  = NCT6116_REG_CRITICAL_TEMP_TOLERANCE;
		data->REG_CRITICAL_PWM_ENABLE = NCT6116_REG_CRITICAL_PWM_ENABLE;
		data->CRITICAL_PWM_ENABLE_MASK
		  = NCT6106_CRITICAL_PWM_ENABLE_MASK;
		data->REG_CRITICAL_PWM = NCT6116_REG_CRITICAL_PWM;
		data->REG_TEMP_OFFSET = NCT6106_REG_TEMP_OFFSET;
		data->REG_TEMP_SOURCE = NCT6116_REG_TEMP_SOURCE;
		data->REG_TEMP_SEL = NCT6116_REG_TEMP_SEL;
		data->REG_WEIGHT_TEMP_SEL = NCT6106_REG_WEIGHT_TEMP_SEL;
		data->REG_WEIGHT_TEMP[0] = NCT6106_REG_WEIGHT_TEMP_STEP;
		data->REG_WEIGHT_TEMP[1] = NCT6106_REG_WEIGHT_TEMP_STEP_TOL;
		data->REG_WEIGHT_TEMP[2] = NCT6106_REG_WEIGHT_TEMP_BASE;
		data->REG_ALARM = NCT6106_REG_ALARM;
		data->ALARM_BITS = NCT6116_ALARM_BITS;
		data->REG_BEEP = NCT6106_REG_BEEP;
		data->BEEP_BITS = NCT6116_BEEP_BITS;
3558
		data->REG_TSI_TEMP = NCT6116_REG_TSI_TEMP;
3559 3560 3561 3562 3563

		reg_temp = NCT6106_REG_TEMP;
		reg_temp_mon = NCT6106_REG_TEMP_MON;
		num_reg_temp = ARRAY_SIZE(NCT6106_REG_TEMP);
		num_reg_temp_mon = ARRAY_SIZE(NCT6106_REG_TEMP_MON);
3564
		num_reg_tsi_temp = ARRAY_SIZE(NCT6116_REG_TSI_TEMP);
3565 3566 3567 3568 3569 3570 3571 3572
		reg_temp_over = NCT6106_REG_TEMP_OVER;
		reg_temp_hyst = NCT6106_REG_TEMP_HYST;
		reg_temp_config = NCT6106_REG_TEMP_CONFIG;
		reg_temp_alternate = NCT6106_REG_TEMP_ALTERNATE;
		reg_temp_crit = NCT6106_REG_TEMP_CRIT;
		reg_temp_crit_l = NCT6106_REG_TEMP_CRIT_L;
		reg_temp_crit_h = NCT6106_REG_TEMP_CRIT_H;

3573
		break;
3574 3575
	case nct6775:
		data->in_num = 9;
3576
		data->pwm_num = 3;
3577
		data->auto_pwm_num = 6;
3578
		data->has_fan_div = true;
3579
		data->temp_fixed_num = 3;
3580
		data->num_temp_alarms = 3;
3581
		data->num_temp_beeps = 3;
3582 3583

		data->ALARM_BITS = NCT6775_ALARM_BITS;
3584
		data->BEEP_BITS = NCT6775_BEEP_BITS;
3585

3586 3587
		data->fan_from_reg = fan_from_reg16;
		data->fan_from_reg_min = fan_from_reg8;
3588 3589 3590
		data->target_temp_mask = 0x7f;
		data->tolerance_mask = 0x0f;
		data->speed_tolerance_limit = 15;
3591

3592
		data->temp_label = nct6775_temp_label;
3593
		data->temp_mask = NCT6775_TEMP_MASK;
3594
		data->virt_temp_mask = NCT6775_VIRT_TEMP_MASK;
3595

3596 3597
		data->REG_CONFIG = NCT6775_REG_CONFIG;
		data->REG_VBAT = NCT6775_REG_VBAT;
3598
		data->REG_DIODE = NCT6775_REG_DIODE;
3599
		data->DIODE_MASK = NCT6775_DIODE_MASK;
3600 3601 3602
		data->REG_VIN = NCT6775_REG_IN;
		data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
		data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
3603
		data->REG_TARGET = NCT6775_REG_TARGET;
3604
		data->REG_FAN = NCT6775_REG_FAN;
3605
		data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
3606
		data->REG_FAN_MIN = NCT6775_REG_FAN_MIN;
3607
		data->REG_FAN_PULSES = NCT6775_REG_FAN_PULSES;
3608
		data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
3609 3610 3611
		data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
		data->REG_FAN_TIME[1] = NCT6775_REG_FAN_STEP_UP_TIME;
		data->REG_FAN_TIME[2] = NCT6775_REG_FAN_STEP_DOWN_TIME;
3612
		data->REG_PWM[0] = NCT6775_REG_PWM;
3613 3614 3615 3616
		data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
		data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT;
		data->REG_PWM[3] = NCT6775_REG_FAN_MAX_OUTPUT;
		data->REG_PWM[4] = NCT6775_REG_FAN_STEP_OUTPUT;
3617
		data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP;
3618 3619 3620
		data->REG_PWM_READ = NCT6775_REG_PWM_READ;
		data->REG_PWM_MODE = NCT6775_REG_PWM_MODE;
		data->PWM_MODE_MASK = NCT6775_PWM_MODE_MASK;
3621 3622 3623 3624 3625
		data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP;
		data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM;
		data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP;
		data->REG_CRITICAL_TEMP_TOLERANCE
		  = NCT6775_REG_CRITICAL_TEMP_TOLERANCE;
3626 3627
		data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET;
		data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE;
3628
		data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL;
3629 3630 3631 3632
		data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL;
		data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP;
		data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL;
		data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE;
3633
		data->REG_ALARM = NCT6775_REG_ALARM;
3634
		data->REG_BEEP = NCT6775_REG_BEEP;
3635
		data->REG_TSI_TEMP = NCT6775_REG_TSI_TEMP;
3636 3637

		reg_temp = NCT6775_REG_TEMP;
3638
		reg_temp_mon = NCT6775_REG_TEMP_MON;
3639
		num_reg_temp = ARRAY_SIZE(NCT6775_REG_TEMP);
3640
		num_reg_temp_mon = ARRAY_SIZE(NCT6775_REG_TEMP_MON);
3641
		num_reg_tsi_temp = ARRAY_SIZE(NCT6775_REG_TSI_TEMP);
3642 3643 3644 3645 3646 3647
		reg_temp_over = NCT6775_REG_TEMP_OVER;
		reg_temp_hyst = NCT6775_REG_TEMP_HYST;
		reg_temp_config = NCT6775_REG_TEMP_CONFIG;
		reg_temp_alternate = NCT6775_REG_TEMP_ALTERNATE;
		reg_temp_crit = NCT6775_REG_TEMP_CRIT;

3648 3649 3650
		break;
	case nct6776:
		data->in_num = 9;
3651
		data->pwm_num = 3;
3652
		data->auto_pwm_num = 4;
3653
		data->has_fan_div = false;
3654
		data->temp_fixed_num = 3;
3655
		data->num_temp_alarms = 3;
3656
		data->num_temp_beeps = 6;
3657 3658

		data->ALARM_BITS = NCT6776_ALARM_BITS;
3659
		data->BEEP_BITS = NCT6776_BEEP_BITS;
3660

3661 3662
		data->fan_from_reg = fan_from_reg13;
		data->fan_from_reg_min = fan_from_reg13;
3663 3664 3665
		data->target_temp_mask = 0xff;
		data->tolerance_mask = 0x07;
		data->speed_tolerance_limit = 63;
3666

3667
		data->temp_label = nct6776_temp_label;
3668
		data->temp_mask = NCT6776_TEMP_MASK;
3669
		data->virt_temp_mask = NCT6776_VIRT_TEMP_MASK;
3670

3671 3672
		data->REG_CONFIG = NCT6775_REG_CONFIG;
		data->REG_VBAT = NCT6775_REG_VBAT;
3673
		data->REG_DIODE = NCT6775_REG_DIODE;
3674
		data->DIODE_MASK = NCT6775_DIODE_MASK;
3675 3676 3677
		data->REG_VIN = NCT6775_REG_IN;
		data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
		data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
3678
		data->REG_TARGET = NCT6775_REG_TARGET;
3679
		data->REG_FAN = NCT6775_REG_FAN;
3680
		data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
3681
		data->REG_FAN_MIN = NCT6776_REG_FAN_MIN;
3682
		data->REG_FAN_PULSES = NCT6776_REG_FAN_PULSES;
3683
		data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
3684
		data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
3685 3686
		data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME;
		data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME;
3687
		data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
3688
		data->REG_PWM[0] = NCT6775_REG_PWM;
3689 3690
		data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
		data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT;
3691 3692
		data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP;
		data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE;
3693 3694 3695
		data->REG_PWM_READ = NCT6775_REG_PWM_READ;
		data->REG_PWM_MODE = NCT6776_REG_PWM_MODE;
		data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK;
3696 3697 3698 3699 3700
		data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP;
		data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM;
		data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP;
		data->REG_CRITICAL_TEMP_TOLERANCE
		  = NCT6775_REG_CRITICAL_TEMP_TOLERANCE;
3701 3702
		data->REG_TEMP_OFFSET = NCT6775_REG_TEMP_OFFSET;
		data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE;
3703
		data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL;
3704 3705 3706 3707
		data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL;
		data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP;
		data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL;
		data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE;
3708
		data->REG_ALARM = NCT6775_REG_ALARM;
3709
		data->REG_BEEP = NCT6776_REG_BEEP;
3710
		data->REG_TSI_TEMP = NCT6776_REG_TSI_TEMP;
3711 3712

		reg_temp = NCT6775_REG_TEMP;
3713
		reg_temp_mon = NCT6775_REG_TEMP_MON;
3714
		num_reg_temp = ARRAY_SIZE(NCT6775_REG_TEMP);
3715
		num_reg_temp_mon = ARRAY_SIZE(NCT6775_REG_TEMP_MON);
3716
		num_reg_tsi_temp = ARRAY_SIZE(NCT6776_REG_TSI_TEMP);
3717 3718 3719 3720 3721 3722
		reg_temp_over = NCT6775_REG_TEMP_OVER;
		reg_temp_hyst = NCT6775_REG_TEMP_HYST;
		reg_temp_config = NCT6776_REG_TEMP_CONFIG;
		reg_temp_alternate = NCT6776_REG_TEMP_ALTERNATE;
		reg_temp_crit = NCT6776_REG_TEMP_CRIT;

3723 3724 3725
		break;
	case nct6779:
		data->in_num = 15;
3726
		data->pwm_num = 5;
3727
		data->auto_pwm_num = 4;
3728
		data->has_fan_div = false;
3729
		data->temp_fixed_num = 6;
3730
		data->num_temp_alarms = 2;
3731
		data->num_temp_beeps = 2;
3732 3733

		data->ALARM_BITS = NCT6779_ALARM_BITS;
3734
		data->BEEP_BITS = NCT6779_BEEP_BITS;
3735

3736
		data->fan_from_reg = fan_from_reg_rpm;
3737
		data->fan_from_reg_min = fan_from_reg13;
3738 3739 3740
		data->target_temp_mask = 0xff;
		data->tolerance_mask = 0x07;
		data->speed_tolerance_limit = 63;
3741

3742
		data->temp_label = nct6779_temp_label;
3743
		data->temp_mask = NCT6779_TEMP_MASK;
3744
		data->virt_temp_mask = NCT6779_VIRT_TEMP_MASK;
3745

3746 3747
		data->REG_CONFIG = NCT6775_REG_CONFIG;
		data->REG_VBAT = NCT6775_REG_VBAT;
3748
		data->REG_DIODE = NCT6775_REG_DIODE;
3749
		data->DIODE_MASK = NCT6775_DIODE_MASK;
3750 3751 3752
		data->REG_VIN = NCT6779_REG_IN;
		data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
		data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
3753
		data->REG_TARGET = NCT6775_REG_TARGET;
3754
		data->REG_FAN = NCT6779_REG_FAN;
3755
		data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
3756
		data->REG_FAN_MIN = NCT6776_REG_FAN_MIN;
3757
		data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES;
3758
		data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
3759
		data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
3760 3761
		data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME;
		data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME;
3762
		data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
3763
		data->REG_PWM[0] = NCT6775_REG_PWM;
3764 3765
		data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
		data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT;
3766 3767
		data->REG_PWM[5] = NCT6775_REG_WEIGHT_DUTY_STEP;
		data->REG_PWM[6] = NCT6776_REG_WEIGHT_DUTY_BASE;
3768 3769 3770
		data->REG_PWM_READ = NCT6775_REG_PWM_READ;
		data->REG_PWM_MODE = NCT6776_REG_PWM_MODE;
		data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK;
3771 3772 3773 3774 3775
		data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP;
		data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM;
		data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP;
		data->REG_CRITICAL_TEMP_TOLERANCE
		  = NCT6775_REG_CRITICAL_TEMP_TOLERANCE;
3776 3777 3778 3779
		data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE;
		data->CRITICAL_PWM_ENABLE_MASK
		  = NCT6779_CRITICAL_PWM_ENABLE_MASK;
		data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM;
3780 3781
		data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET;
		data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE;
3782
		data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL;
3783 3784 3785 3786
		data->REG_WEIGHT_TEMP_SEL = NCT6775_REG_WEIGHT_TEMP_SEL;
		data->REG_WEIGHT_TEMP[0] = NCT6775_REG_WEIGHT_TEMP_STEP;
		data->REG_WEIGHT_TEMP[1] = NCT6775_REG_WEIGHT_TEMP_STEP_TOL;
		data->REG_WEIGHT_TEMP[2] = NCT6775_REG_WEIGHT_TEMP_BASE;
3787
		data->REG_ALARM = NCT6779_REG_ALARM;
3788
		data->REG_BEEP = NCT6776_REG_BEEP;
3789
		data->REG_TSI_TEMP = NCT6776_REG_TSI_TEMP;
3790 3791

		reg_temp = NCT6779_REG_TEMP;
3792
		reg_temp_mon = NCT6779_REG_TEMP_MON;
3793
		num_reg_temp = ARRAY_SIZE(NCT6779_REG_TEMP);
3794
		num_reg_temp_mon = ARRAY_SIZE(NCT6779_REG_TEMP_MON);
3795
		num_reg_tsi_temp = ARRAY_SIZE(NCT6776_REG_TSI_TEMP);
3796 3797 3798 3799 3800 3801
		reg_temp_over = NCT6779_REG_TEMP_OVER;
		reg_temp_hyst = NCT6779_REG_TEMP_HYST;
		reg_temp_config = NCT6779_REG_TEMP_CONFIG;
		reg_temp_alternate = NCT6779_REG_TEMP_ALTERNATE;
		reg_temp_crit = NCT6779_REG_TEMP_CRIT;

3802 3803
		break;
	case nct6791:
3804
	case nct6792:
3805
	case nct6793:
3806
	case nct6795:
3807
	case nct6796:
3808
	case nct6797:
3809
	case nct6798:
3810
		data->in_num = 15;
3811
		data->pwm_num = (data->kind == nct6796 ||
3812 3813
				 data->kind == nct6797 ||
				 data->kind == nct6798) ? 7 : 6;
3814 3815 3816 3817 3818 3819 3820 3821 3822
		data->auto_pwm_num = 4;
		data->has_fan_div = false;
		data->temp_fixed_num = 6;
		data->num_temp_alarms = 2;
		data->num_temp_beeps = 2;

		data->ALARM_BITS = NCT6791_ALARM_BITS;
		data->BEEP_BITS = NCT6779_BEEP_BITS;

3823
		data->fan_from_reg = fan_from_reg_rpm;
3824 3825 3826 3827 3828
		data->fan_from_reg_min = fan_from_reg13;
		data->target_temp_mask = 0xff;
		data->tolerance_mask = 0x07;
		data->speed_tolerance_limit = 63;

3829 3830 3831 3832
		switch (data->kind) {
		default:
		case nct6791:
			data->temp_label = nct6779_temp_label;
3833
			data->temp_mask = NCT6791_TEMP_MASK;
3834
			data->virt_temp_mask = NCT6791_VIRT_TEMP_MASK;
3835 3836 3837
			break;
		case nct6792:
			data->temp_label = nct6792_temp_label;
3838
			data->temp_mask = NCT6792_TEMP_MASK;
3839
			data->virt_temp_mask = NCT6792_VIRT_TEMP_MASK;
3840 3841 3842
			break;
		case nct6793:
			data->temp_label = nct6793_temp_label;
3843
			data->temp_mask = NCT6793_TEMP_MASK;
3844
			data->virt_temp_mask = NCT6793_VIRT_TEMP_MASK;
3845
			break;
3846
		case nct6795:
3847
		case nct6797:
3848 3849
			data->temp_label = nct6795_temp_label;
			data->temp_mask = NCT6795_TEMP_MASK;
3850
			data->virt_temp_mask = NCT6795_VIRT_TEMP_MASK;
3851
			break;
3852 3853 3854
		case nct6796:
			data->temp_label = nct6796_temp_label;
			data->temp_mask = NCT6796_TEMP_MASK;
3855
			data->virt_temp_mask = NCT6796_VIRT_TEMP_MASK;
3856
			break;
3857 3858 3859 3860 3861
		case nct6798:
			data->temp_label = nct6798_temp_label;
			data->temp_mask = NCT6798_TEMP_MASK;
			data->virt_temp_mask = NCT6798_VIRT_TEMP_MASK;
			break;
3862
		}
3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877

		data->REG_CONFIG = NCT6775_REG_CONFIG;
		data->REG_VBAT = NCT6775_REG_VBAT;
		data->REG_DIODE = NCT6775_REG_DIODE;
		data->DIODE_MASK = NCT6775_DIODE_MASK;
		data->REG_VIN = NCT6779_REG_IN;
		data->REG_IN_MINMAX[0] = NCT6775_REG_IN_MIN;
		data->REG_IN_MINMAX[1] = NCT6775_REG_IN_MAX;
		data->REG_TARGET = NCT6775_REG_TARGET;
		data->REG_FAN = NCT6779_REG_FAN;
		data->REG_FAN_MODE = NCT6775_REG_FAN_MODE;
		data->REG_FAN_MIN = NCT6776_REG_FAN_MIN;
		data->REG_FAN_PULSES = NCT6779_REG_FAN_PULSES;
		data->FAN_PULSE_SHIFT = NCT6775_FAN_PULSE_SHIFT;
		data->REG_FAN_TIME[0] = NCT6775_REG_FAN_STOP_TIME;
3878 3879
		data->REG_FAN_TIME[1] = NCT6776_REG_FAN_STEP_UP_TIME;
		data->REG_FAN_TIME[2] = NCT6776_REG_FAN_STEP_DOWN_TIME;
3880 3881 3882 3883
		data->REG_TOLERANCE_H = NCT6776_REG_TOLERANCE_H;
		data->REG_PWM[0] = NCT6775_REG_PWM;
		data->REG_PWM[1] = NCT6775_REG_FAN_START_OUTPUT;
		data->REG_PWM[2] = NCT6775_REG_FAN_STOP_OUTPUT;
3884 3885
		data->REG_PWM[5] = NCT6791_REG_WEIGHT_DUTY_STEP;
		data->REG_PWM[6] = NCT6791_REG_WEIGHT_DUTY_BASE;
3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900
		data->REG_PWM_READ = NCT6775_REG_PWM_READ;
		data->REG_PWM_MODE = NCT6776_REG_PWM_MODE;
		data->PWM_MODE_MASK = NCT6776_PWM_MODE_MASK;
		data->REG_AUTO_TEMP = NCT6775_REG_AUTO_TEMP;
		data->REG_AUTO_PWM = NCT6775_REG_AUTO_PWM;
		data->REG_CRITICAL_TEMP = NCT6775_REG_CRITICAL_TEMP;
		data->REG_CRITICAL_TEMP_TOLERANCE
		  = NCT6775_REG_CRITICAL_TEMP_TOLERANCE;
		data->REG_CRITICAL_PWM_ENABLE = NCT6779_REG_CRITICAL_PWM_ENABLE;
		data->CRITICAL_PWM_ENABLE_MASK
		  = NCT6779_CRITICAL_PWM_ENABLE_MASK;
		data->REG_CRITICAL_PWM = NCT6779_REG_CRITICAL_PWM;
		data->REG_TEMP_OFFSET = NCT6779_REG_TEMP_OFFSET;
		data->REG_TEMP_SOURCE = NCT6775_REG_TEMP_SOURCE;
		data->REG_TEMP_SEL = NCT6775_REG_TEMP_SEL;
3901 3902 3903 3904
		data->REG_WEIGHT_TEMP_SEL = NCT6791_REG_WEIGHT_TEMP_SEL;
		data->REG_WEIGHT_TEMP[0] = NCT6791_REG_WEIGHT_TEMP_STEP;
		data->REG_WEIGHT_TEMP[1] = NCT6791_REG_WEIGHT_TEMP_STEP_TOL;
		data->REG_WEIGHT_TEMP[2] = NCT6791_REG_WEIGHT_TEMP_BASE;
3905
		data->REG_ALARM = NCT6791_REG_ALARM;
3906 3907 3908 3909
		if (data->kind == nct6791)
			data->REG_BEEP = NCT6776_REG_BEEP;
		else
			data->REG_BEEP = NCT6792_REG_BEEP;
3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927
		switch (data->kind) {
		case nct6791:
		case nct6792:
		case nct6793:
			data->REG_TSI_TEMP = NCT6776_REG_TSI_TEMP;
			num_reg_tsi_temp = ARRAY_SIZE(NCT6776_REG_TSI_TEMP);
			break;
		case nct6795:
		case nct6796:
		case nct6797:
		case nct6798:
			data->REG_TSI_TEMP = NCT6796_REG_TSI_TEMP;
			num_reg_tsi_temp = ARRAY_SIZE(NCT6796_REG_TSI_TEMP);
			break;
		default:
			num_reg_tsi_temp = 0;
			break;
		}
3928 3929 3930

		reg_temp = NCT6779_REG_TEMP;
		num_reg_temp = ARRAY_SIZE(NCT6779_REG_TEMP);
3931 3932 3933 3934 3935 3936 3937
		if (data->kind == nct6791) {
			reg_temp_mon = NCT6779_REG_TEMP_MON;
			num_reg_temp_mon = ARRAY_SIZE(NCT6779_REG_TEMP_MON);
		} else {
			reg_temp_mon = NCT6792_REG_TEMP_MON;
			num_reg_temp_mon = ARRAY_SIZE(NCT6792_REG_TEMP_MON);
		}
3938 3939 3940 3941 3942 3943
		reg_temp_over = NCT6779_REG_TEMP_OVER;
		reg_temp_hyst = NCT6779_REG_TEMP_HYST;
		reg_temp_config = NCT6779_REG_TEMP_CONFIG;
		reg_temp_alternate = NCT6779_REG_TEMP_ALTERNATE;
		reg_temp_crit = NCT6779_REG_TEMP_CRIT;

3944 3945 3946 3947
		break;
	default:
		return -ENODEV;
	}
3948
	data->have_in = BIT(data->in_num) - 1;
3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964
	data->have_temp = 0;

	/*
	 * On some boards, not all available temperature sources are monitored,
	 * even though some of the monitoring registers are unused.
	 * Get list of unused monitoring registers, then detect if any fan
	 * controls are configured to use unmonitored temperature sources.
	 * If so, assign the unmonitored temperature sources to available
	 * monitoring registers.
	 */
	mask = 0;
	available = 0;
	for (i = 0; i < num_reg_temp; i++) {
		if (reg_temp[i] == 0)
			continue;

3965 3966 3967 3968
		err = nct6775_read_value(data, data->REG_TEMP_SOURCE[i], &src);
		if (err)
			return err;
		src &= 0x1f;
3969 3970
		if (!src || (mask & BIT(src)))
			available |= BIT(i);
3971

3972
		mask |= BIT(src);
3973 3974
	}

3975 3976 3977 3978
	/*
	 * Now find unmonitored temperature registers and enable monitoring
	 * if additional monitoring registers are available.
	 */
3979 3980 3981 3982 3983 3984
	err = add_temp_sensors(data, data->REG_TEMP_SEL, &available, &mask);
	if (err)
		return err;
	err = add_temp_sensors(data, data->REG_WEIGHT_TEMP_SEL, &available, &mask);
	if (err)
		return err;
3985

3986 3987 3988 3989 3990 3991
	mask = 0;
	s = NUM_TEMP_FIXED;	/* First dynamic temperature attribute */
	for (i = 0; i < num_reg_temp; i++) {
		if (reg_temp[i] == 0)
			continue;

3992 3993 3994 3995
		err = nct6775_read_value(data, data->REG_TEMP_SOURCE[i], &src);
		if (err)
			return err;
		src &= 0x1f;
3996
		if (!src || (mask & BIT(src)))
3997 3998
			continue;

3999
		if (!(data->temp_mask & BIT(src))) {
4000 4001 4002 4003 4004 4005
			dev_info(dev,
				 "Invalid temperature source %d at index %d, source register 0x%x, temp register 0x%x\n",
				 src, i, data->REG_TEMP_SOURCE[i], reg_temp[i]);
			continue;
		}

4006
		mask |= BIT(src);
4007 4008 4009

		/* Use fixed index for SYSTIN(1), CPUTIN(2), AUXTIN(3) */
		if (src <= data->temp_fixed_num) {
4010 4011
			data->have_temp |= BIT(src - 1);
			data->have_temp_fixed |= BIT(src - 1);
4012 4013 4014
			data->reg_temp[0][src - 1] = reg_temp[i];
			data->reg_temp[1][src - 1] = reg_temp_over[i];
			data->reg_temp[2][src - 1] = reg_temp_hyst[i];
4015 4016 4017 4018 4019 4020 4021
			if (reg_temp_crit_h && reg_temp_crit_h[i])
				data->reg_temp[3][src - 1] = reg_temp_crit_h[i];
			else if (reg_temp_crit[src - 1])
				data->reg_temp[3][src - 1]
				  = reg_temp_crit[src - 1];
			if (reg_temp_crit_l && reg_temp_crit_l[i])
				data->reg_temp[4][src - 1] = reg_temp_crit_l[i];
4022 4023 4024 4025 4026 4027 4028 4029 4030
			data->reg_temp_config[src - 1] = reg_temp_config[i];
			data->temp_src[src - 1] = src;
			continue;
		}

		if (s >= NUM_TEMP)
			continue;

		/* Use dynamic index for other sources */
4031
		data->have_temp |= BIT(s);
4032 4033 4034 4035
		data->reg_temp[0][s] = reg_temp[i];
		data->reg_temp[1][s] = reg_temp_over[i];
		data->reg_temp[2][s] = reg_temp_hyst[i];
		data->reg_temp_config[s] = reg_temp_config[i];
4036 4037 4038
		if (reg_temp_crit_h && reg_temp_crit_h[i])
			data->reg_temp[3][s] = reg_temp_crit_h[i];
		else if (reg_temp_crit[src - 1])
4039
			data->reg_temp[3][s] = reg_temp_crit[src - 1];
4040 4041
		if (reg_temp_crit_l && reg_temp_crit_l[i])
			data->reg_temp[4][s] = reg_temp_crit_l[i];
4042 4043 4044 4045 4046

		data->temp_src[s] = src;
		s++;
	}

4047 4048 4049 4050 4051 4052 4053 4054
	/*
	 * Repeat with temperatures used for fan control.
	 * This set of registers does not support limits.
	 */
	for (i = 0; i < num_reg_temp_mon; i++) {
		if (reg_temp_mon[i] == 0)
			continue;

4055 4056 4057 4058
		err = nct6775_read_value(data, data->REG_TEMP_SEL[i], &src);
		if (err)
			return err;
		src &= 0x1f;
4059
		if (!src)
4060 4061
			continue;

4062
		if (!(data->temp_mask & BIT(src))) {
4063 4064 4065 4066 4067 4068 4069
			dev_info(dev,
				 "Invalid temperature source %d at index %d, source register 0x%x, temp register 0x%x\n",
				 src, i, data->REG_TEMP_SEL[i],
				 reg_temp_mon[i]);
			continue;
		}

4070 4071 4072 4073 4074
		/*
		 * For virtual temperature sources, the 'virtual' temperature
		 * for each fan reflects a different temperature, and there
		 * are no duplicates.
		 */
4075
		if (!(data->virt_temp_mask & BIT(src))) {
4076
			if (mask & BIT(src))
4077
				continue;
4078
			mask |= BIT(src);
4079
		}
4080 4081 4082

		/* Use fixed index for SYSTIN(1), CPUTIN(2), AUXTIN(3) */
		if (src <= data->temp_fixed_num) {
4083
			if (data->have_temp & BIT(src - 1))
4084
				continue;
4085 4086
			data->have_temp |= BIT(src - 1);
			data->have_temp_fixed |= BIT(src - 1);
4087 4088 4089 4090 4091 4092 4093 4094 4095
			data->reg_temp[0][src - 1] = reg_temp_mon[i];
			data->temp_src[src - 1] = src;
			continue;
		}

		if (s >= NUM_TEMP)
			continue;

		/* Use dynamic index for other sources */
4096
		data->have_temp |= BIT(s);
4097 4098 4099 4100 4101
		data->reg_temp[0][s] = reg_temp_mon[i];
		data->temp_src[s] = src;
		s++;
	}

4102 4103 4104 4105 4106 4107 4108
#ifdef USE_ALTERNATE
	/*
	 * Go through the list of alternate temp registers and enable
	 * if possible.
	 * The temperature is already monitored if the respective bit in <mask>
	 * is set.
	 */
4109
	for (i = 0; i < 31; i++) {
4110 4111
		if (!(data->temp_mask & BIT(i + 1)))
			continue;
4112 4113
		if (!reg_temp_alternate[i])
			continue;
4114
		if (mask & BIT(i + 1))
4115 4116
			continue;
		if (i < data->temp_fixed_num) {
4117
			if (data->have_temp & BIT(i))
4118
				continue;
4119 4120
			data->have_temp |= BIT(i);
			data->have_temp_fixed |= BIT(i);
4121
			data->reg_temp[0][i] = reg_temp_alternate[i];
4122 4123 4124 4125
			if (i < num_reg_temp) {
				data->reg_temp[1][i] = reg_temp_over[i];
				data->reg_temp[2][i] = reg_temp_hyst[i];
			}
4126 4127 4128 4129 4130 4131 4132
			data->temp_src[i] = i + 1;
			continue;
		}

		if (s >= NUM_TEMP)	/* Abort if no more space */
			break;

4133
		data->have_temp |= BIT(s);
4134 4135 4136 4137 4138 4139
		data->reg_temp[0][s] = reg_temp_alternate[i];
		data->temp_src[s] = i + 1;
		s++;
	}
#endif /* USE_ALTERNATE */

4140 4141
	/* Check which TSIx_TEMP registers are active */
	for (i = 0; i < num_reg_tsi_temp; i++) {
4142 4143 4144 4145 4146 4147
		u16 tmp;

		err = nct6775_read_value(data, data->REG_TSI_TEMP[i], &tmp);
		if (err)
			return err;
		if (tmp)
4148 4149 4150
			data->have_tsi_temp |= BIT(i);
	}

4151
	/* Initialize the chip */
4152 4153 4154
	err = nct6775_init_device(data);
	if (err)
		return err;
4155

4156 4157 4158 4159
	if (data->driver_init) {
		err = data->driver_init(data);
		if (err)
			return err;
4160 4161
	}

4162
	/* Read fan clock dividers immediately */
4163 4164 4165
	err = nct6775_init_fan_common(dev, data);
	if (err)
		return err;
4166

4167
	/* Register sysfs hooks */
4168 4169 4170 4171
	err = nct6775_add_template_attr_group(dev, data, &nct6775_pwm_template_group,
					      data->pwm_num);
	if (err)
		return err;
4172

4173 4174 4175 4176
	err = nct6775_add_template_attr_group(dev, data, &nct6775_in_template_group,
					      fls(data->have_in));
	if (err)
		return err;
4177

4178 4179 4180 4181
	err = nct6775_add_template_attr_group(dev, data, &nct6775_fan_template_group,
					      fls(data->has_fan));
	if (err)
		return err;
4182

4183 4184 4185 4186
	err = nct6775_add_template_attr_group(dev, data, &nct6775_temp_template_group,
					      fls(data->have_temp));
	if (err)
		return err;
4187 4188 4189 4190 4191

	if (data->have_tsi_temp) {
		tsi_temp_tg.templates = nct6775_tsi_temp_template;
		tsi_temp_tg.is_visible = nct6775_tsi_temp_is_visible;
		tsi_temp_tg.base = fls(data->have_temp) + 1;
4192 4193 4194 4195
		err = nct6775_add_template_attr_group(dev, data, &tsi_temp_tg,
						      fls(data->have_tsi_temp));
		if (err)
			return err;
4196 4197
	}

4198 4199
	hwmon_dev = devm_hwmon_device_register_with_groups(dev, data->name,
							   data, data->groups);
4200
	return PTR_ERR_OR_ZERO(hwmon_dev);
4201
}
4202
EXPORT_SYMBOL_GPL(nct6775_probe);
4203 4204

MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
4205
MODULE_DESCRIPTION("Core driver for NCT6775F and compatible chips");
4206
MODULE_LICENSE("GPL");