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, ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®_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], ®); 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), ®); 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), ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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], ®); 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");