cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

nct6775-core.c (121040B)


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