aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hwmon/w83627ehf.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hwmon/w83627ehf.c')
-rw-r--r--drivers/hwmon/w83627ehf.c1351
1 files changed, 1023 insertions, 328 deletions
diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c
index 073eabedc432..f2b377c56a3a 100644
--- a/drivers/hwmon/w83627ehf.c
+++ b/drivers/hwmon/w83627ehf.c
@@ -1,11 +1,12 @@
1/* 1/*
2 w83627ehf - Driver for the hardware monitoring functionality of 2 w83627ehf - Driver for the hardware monitoring functionality of
3 the Winbond W83627EHF Super-I/O chip 3 the Winbond W83627EHF Super-I/O chip
4 Copyright (C) 2005 Jean Delvare <khali@linux-fr.org> 4 Copyright (C) 2005 Jean Delvare <khali@linux-fr.org>
5 Copyright (C) 2006 Yuan Mu (Winbond), 5 Copyright (C) 2006 Yuan Mu (Winbond),
6 Rudolf Marek <r.marek@assembler.cz> 6 Rudolf Marek <r.marek@assembler.cz>
7 David Hubbard <david.c.hubbard@gmail.com> 7 David Hubbard <david.c.hubbard@gmail.com>
8 Daniel J Blueman <daniel.blueman@gmail.com> 8 Daniel J Blueman <daniel.blueman@gmail.com>
9 Copyright (C) 2010 Sheng-Yuan Huang (Nuvoton) (PS00)
9 10
10 Shamelessly ripped from the w83627hf driver 11 Shamelessly ripped from the w83627hf driver
11 Copyright (C) 2003 Mark Studebaker 12 Copyright (C) 2003 Mark Studebaker
@@ -35,11 +36,13 @@
35 36
36 Chip #vin #fan #pwm #temp chip IDs man ID 37 Chip #vin #fan #pwm #temp chip IDs man ID
37 w83627ehf 10 5 4 3 0x8850 0x88 0x5ca3 38 w83627ehf 10 5 4 3 0x8850 0x88 0x5ca3
38 0x8860 0xa1 39 0x8860 0xa1
39 w83627dhg 9 5 4 3 0xa020 0xc1 0x5ca3 40 w83627dhg 9 5 4 3 0xa020 0xc1 0x5ca3
40 w83627dhg-p 9 5 4 3 0xb070 0xc1 0x5ca3 41 w83627dhg-p 9 5 4 3 0xb070 0xc1 0x5ca3
41 w83667hg 9 5 3 3 0xa510 0xc1 0x5ca3 42 w83667hg 9 5 3 3 0xa510 0xc1 0x5ca3
42 w83667hg-b 9 5 3 3 0xb350 0xc1 0x5ca3 43 w83667hg-b 9 5 3 4 0xb350 0xc1 0x5ca3
44 nct6775f 9 4 3 9 0xb470 0xc1 0x5ca3
45 nct6776f 9 5 3 9 0xC330 0xc1 0x5ca3
43*/ 46*/
44 47
45#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 48#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
@@ -58,21 +61,28 @@
58#include <linux/io.h> 61#include <linux/io.h>
59#include "lm75.h" 62#include "lm75.h"
60 63
61enum kinds { w83627ehf, w83627dhg, w83627dhg_p, w83667hg, w83667hg_b }; 64enum kinds { w83627ehf, w83627dhg, w83627dhg_p, w83667hg, w83667hg_b, nct6775,
65 nct6776 };
62 66
63/* used to set data->name = w83627ehf_device_names[data->sio_kind] */ 67/* used to set data->name = w83627ehf_device_names[data->sio_kind] */
64static const char * w83627ehf_device_names[] = { 68static const char * const w83627ehf_device_names[] = {
65 "w83627ehf", 69 "w83627ehf",
66 "w83627dhg", 70 "w83627dhg",
67 "w83627dhg", 71 "w83627dhg",
68 "w83667hg", 72 "w83667hg",
69 "w83667hg", 73 "w83667hg",
74 "nct6775",
75 "nct6776",
70}; 76};
71 77
72static unsigned short force_id; 78static unsigned short force_id;
73module_param(force_id, ushort, 0); 79module_param(force_id, ushort, 0);
74MODULE_PARM_DESC(force_id, "Override the detected device ID"); 80MODULE_PARM_DESC(force_id, "Override the detected device ID");
75 81
82static unsigned short fan_debounce;
83module_param(fan_debounce, ushort, 0);
84MODULE_PARM_DESC(fan_debounce, "Enable debouncing for fan RPM signal");
85
76#define DRVNAME "w83627ehf" 86#define DRVNAME "w83627ehf"
77 87
78/* 88/*
@@ -80,7 +90,7 @@ MODULE_PARM_DESC(force_id, "Override the detected device ID");
80 */ 90 */
81 91
82#define W83627EHF_LD_HWM 0x0b 92#define W83627EHF_LD_HWM 0x0b
83#define W83667HG_LD_VID 0x0d 93#define W83667HG_LD_VID 0x0d
84 94
85#define SIO_REG_LDSEL 0x07 /* Logical device select */ 95#define SIO_REG_LDSEL 0x07 /* Logical device select */
86#define SIO_REG_DEVID 0x20 /* Device ID (2 bytes) */ 96#define SIO_REG_DEVID 0x20 /* Device ID (2 bytes) */
@@ -94,8 +104,10 @@ MODULE_PARM_DESC(force_id, "Override the detected device ID");
94#define SIO_W83627EHG_ID 0x8860 104#define SIO_W83627EHG_ID 0x8860
95#define SIO_W83627DHG_ID 0xa020 105#define SIO_W83627DHG_ID 0xa020
96#define SIO_W83627DHG_P_ID 0xb070 106#define SIO_W83627DHG_P_ID 0xb070
97#define SIO_W83667HG_ID 0xa510 107#define SIO_W83667HG_ID 0xa510
98#define SIO_W83667HG_B_ID 0xb350 108#define SIO_W83667HG_B_ID 0xb350
109#define SIO_NCT6775_ID 0xb470
110#define SIO_NCT6776_ID 0xc330
99#define SIO_ID_MASK 0xFFF0 111#define SIO_ID_MASK 0xFFF0
100 112
101static inline void 113static inline void
@@ -138,7 +150,7 @@ superio_exit(int ioreg)
138 * ISA constants 150 * ISA constants
139 */ 151 */
140 152
141#define IOREGION_ALIGNMENT ~7 153#define IOREGION_ALIGNMENT (~7)
142#define IOREGION_OFFSET 5 154#define IOREGION_OFFSET 5
143#define IOREGION_LENGTH 2 155#define IOREGION_LENGTH 2
144#define ADDR_REG_OFFSET 0 156#define ADDR_REG_OFFSET 0
@@ -164,13 +176,10 @@ static const u16 W83627EHF_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d, 0x3e, 0x55c };
164#define W83627EHF_REG_IN(nr) ((nr < 7) ? (0x20 + (nr)) : \ 176#define W83627EHF_REG_IN(nr) ((nr < 7) ? (0x20 + (nr)) : \
165 (0x550 + (nr) - 7)) 177 (0x550 + (nr) - 7))
166 178
167#define W83627EHF_REG_TEMP1 0x27 179static const u16 W83627EHF_REG_TEMP[] = { 0x27, 0x150, 0x250, 0x7e };
168#define W83627EHF_REG_TEMP1_HYST 0x3a 180static const u16 W83627EHF_REG_TEMP_HYST[] = { 0x3a, 0x153, 0x253, 0 };
169#define W83627EHF_REG_TEMP1_OVER 0x39 181static const u16 W83627EHF_REG_TEMP_OVER[] = { 0x39, 0x155, 0x255, 0 };
170static const u16 W83627EHF_REG_TEMP[] = { 0x150, 0x250 }; 182static const u16 W83627EHF_REG_TEMP_CONFIG[] = { 0, 0x152, 0x252, 0 };
171static const u16 W83627EHF_REG_TEMP_HYST[] = { 0x153, 0x253 };
172static const u16 W83627EHF_REG_TEMP_OVER[] = { 0x155, 0x255 };
173static const u16 W83627EHF_REG_TEMP_CONFIG[] = { 0x152, 0x252 };
174 183
175/* Fan clock dividers are spread over the following five registers */ 184/* Fan clock dividers are spread over the following five registers */
176#define W83627EHF_REG_FANDIV1 0x47 185#define W83627EHF_REG_FANDIV1 0x47
@@ -179,6 +188,11 @@ static const u16 W83627EHF_REG_TEMP_CONFIG[] = { 0x152, 0x252 };
179#define W83627EHF_REG_DIODE 0x59 188#define W83627EHF_REG_DIODE 0x59
180#define W83627EHF_REG_SMI_OVT 0x4C 189#define W83627EHF_REG_SMI_OVT 0x4C
181 190
191/* NCT6775F has its own fan divider registers */
192#define NCT6775_REG_FANDIV1 0x506
193#define NCT6775_REG_FANDIV2 0x507
194#define NCT6775_REG_FAN_DEBOUNCE 0xf0
195
182#define W83627EHF_REG_ALARM1 0x459 196#define W83627EHF_REG_ALARM1 0x459
183#define W83627EHF_REG_ALARM2 0x45A 197#define W83627EHF_REG_ALARM2 0x45A
184#define W83627EHF_REG_ALARM3 0x45B 198#define W83627EHF_REG_ALARM3 0x45B
@@ -199,22 +213,123 @@ static const u8 W83627EHF_PWM_MODE_SHIFT[] = { 0, 1, 0, 6 };
199static const u8 W83627EHF_PWM_ENABLE_SHIFT[] = { 2, 4, 1, 4 }; 213static const u8 W83627EHF_PWM_ENABLE_SHIFT[] = { 2, 4, 1, 4 };
200 214
201/* FAN Duty Cycle, be used to control */ 215/* FAN Duty Cycle, be used to control */
202static const u8 W83627EHF_REG_PWM[] = { 0x01, 0x03, 0x11, 0x61 }; 216static const u16 W83627EHF_REG_PWM[] = { 0x01, 0x03, 0x11, 0x61 };
203static const u8 W83627EHF_REG_TARGET[] = { 0x05, 0x06, 0x13, 0x63 }; 217static const u16 W83627EHF_REG_TARGET[] = { 0x05, 0x06, 0x13, 0x63 };
204static const u8 W83627EHF_REG_TOLERANCE[] = { 0x07, 0x07, 0x14, 0x62 }; 218static const u8 W83627EHF_REG_TOLERANCE[] = { 0x07, 0x07, 0x14, 0x62 };
205 219
206/* Advanced Fan control, some values are common for all fans */ 220/* Advanced Fan control, some values are common for all fans */
207static const u8 W83627EHF_REG_FAN_START_OUTPUT[] = { 0x0a, 0x0b, 0x16, 0x65 }; 221static const u16 W83627EHF_REG_FAN_START_OUTPUT[] = { 0x0a, 0x0b, 0x16, 0x65 };
208static const u8 W83627EHF_REG_FAN_STOP_OUTPUT[] = { 0x08, 0x09, 0x15, 0x64 }; 222static const u16 W83627EHF_REG_FAN_STOP_OUTPUT[] = { 0x08, 0x09, 0x15, 0x64 };
209static const u8 W83627EHF_REG_FAN_STOP_TIME[] = { 0x0c, 0x0d, 0x17, 0x66 }; 223static const u16 W83627EHF_REG_FAN_STOP_TIME[] = { 0x0c, 0x0d, 0x17, 0x66 };
210 224
211static const u8 W83627EHF_REG_FAN_MAX_OUTPUT_COMMON[] 225static const u16 W83627EHF_REG_FAN_MAX_OUTPUT_COMMON[]
212 = { 0xff, 0x67, 0xff, 0x69 }; 226 = { 0xff, 0x67, 0xff, 0x69 };
213static const u8 W83627EHF_REG_FAN_STEP_OUTPUT_COMMON[] 227static const u16 W83627EHF_REG_FAN_STEP_OUTPUT_COMMON[]
214 = { 0xff, 0x68, 0xff, 0x6a }; 228 = { 0xff, 0x68, 0xff, 0x6a };
215 229
216static const u8 W83627EHF_REG_FAN_MAX_OUTPUT_W83667_B[] = { 0x67, 0x69, 0x6b }; 230static const u16 W83627EHF_REG_FAN_MAX_OUTPUT_W83667_B[] = { 0x67, 0x69, 0x6b };
217static const u8 W83627EHF_REG_FAN_STEP_OUTPUT_W83667_B[] = { 0x68, 0x6a, 0x6c }; 231static const u16 W83627EHF_REG_FAN_STEP_OUTPUT_W83667_B[]
232 = { 0x68, 0x6a, 0x6c };
233
234static const u16 NCT6775_REG_TARGET[] = { 0x101, 0x201, 0x301 };
235static const u16 NCT6775_REG_FAN_MODE[] = { 0x102, 0x202, 0x302 };
236static const u16 NCT6775_REG_FAN_STOP_OUTPUT[] = { 0x105, 0x205, 0x305 };
237static const u16 NCT6775_REG_FAN_START_OUTPUT[] = { 0x106, 0x206, 0x306 };
238static const u16 NCT6775_REG_FAN_STOP_TIME[] = { 0x107, 0x207, 0x307 };
239static const u16 NCT6775_REG_PWM[] = { 0x109, 0x209, 0x309 };
240static const u16 NCT6775_REG_FAN_MAX_OUTPUT[] = { 0x10a, 0x20a, 0x30a };
241static const u16 NCT6775_REG_FAN_STEP_OUTPUT[] = { 0x10b, 0x20b, 0x30b };
242static const u16 NCT6775_REG_FAN[] = { 0x630, 0x632, 0x634, 0x636, 0x638 };
243static const u16 NCT6776_REG_FAN_MIN[] = { 0x63a, 0x63c, 0x63e, 0x640, 0x642};
244
245static const u16 NCT6775_REG_TEMP[]
246 = { 0x27, 0x150, 0x250, 0x73, 0x75, 0x77, 0x62b, 0x62c, 0x62d };
247static const u16 NCT6775_REG_TEMP_CONFIG[]
248 = { 0, 0x152, 0x252, 0, 0, 0, 0x628, 0x629, 0x62A };
249static const u16 NCT6775_REG_TEMP_HYST[]
250 = { 0x3a, 0x153, 0x253, 0, 0, 0, 0x673, 0x678, 0x67D };
251static const u16 NCT6775_REG_TEMP_OVER[]
252 = { 0x39, 0x155, 0x255, 0, 0, 0, 0x672, 0x677, 0x67C };
253static const u16 NCT6775_REG_TEMP_SOURCE[]
254 = { 0x621, 0x622, 0x623, 0x100, 0x200, 0x300, 0x624, 0x625, 0x626 };
255
256static const char *const w83667hg_b_temp_label[] = {
257 "SYSTIN",
258 "CPUTIN",
259 "AUXTIN",
260 "AMDTSI",
261 "PECI Agent 1",
262 "PECI Agent 2",
263 "PECI Agent 3",
264 "PECI Agent 4"
265};
266
267static const char *const nct6775_temp_label[] = {
268 "",
269 "SYSTIN",
270 "CPUTIN",
271 "AUXTIN",
272 "AMD SB-TSI",
273 "PECI Agent 0",
274 "PECI Agent 1",
275 "PECI Agent 2",
276 "PECI Agent 3",
277 "PECI Agent 4",
278 "PECI Agent 5",
279 "PECI Agent 6",
280 "PECI Agent 7",
281 "PCH_CHIP_CPU_MAX_TEMP",
282 "PCH_CHIP_TEMP",
283 "PCH_CPU_TEMP",
284 "PCH_MCH_TEMP",
285 "PCH_DIM0_TEMP",
286 "PCH_DIM1_TEMP",
287 "PCH_DIM2_TEMP",
288 "PCH_DIM3_TEMP"
289};
290
291static const char *const nct6776_temp_label[] = {
292 "",
293 "SYSTIN",
294 "CPUTIN",
295 "AUXTIN",
296 "SMBUSMASTER 0",
297 "SMBUSMASTER 1",
298 "SMBUSMASTER 2",
299 "SMBUSMASTER 3",
300 "SMBUSMASTER 4",
301 "SMBUSMASTER 5",
302 "SMBUSMASTER 6",
303 "SMBUSMASTER 7",
304 "PECI Agent 0",
305 "PECI Agent 1",
306 "PCH_CHIP_CPU_MAX_TEMP",
307 "PCH_CHIP_TEMP",
308 "PCH_CPU_TEMP",
309 "PCH_MCH_TEMP",
310 "PCH_DIM0_TEMP",
311 "PCH_DIM1_TEMP",
312 "PCH_DIM2_TEMP",
313 "PCH_DIM3_TEMP",
314 "BYTE_TEMP"
315};
316
317#define NUM_REG_TEMP ARRAY_SIZE(NCT6775_REG_TEMP)
318
319static inline int is_word_sized(u16 reg)
320{
321 return ((((reg & 0xff00) == 0x100
322 || (reg & 0xff00) == 0x200)
323 && ((reg & 0x00ff) == 0x50
324 || (reg & 0x00ff) == 0x53
325 || (reg & 0x00ff) == 0x55))
326 || (reg & 0xfff0) == 0x630
327 || reg == 0x640 || reg == 0x642
328 || ((reg & 0xfff0) == 0x650
329 && (reg & 0x000f) >= 0x06)
330 || reg == 0x73 || reg == 0x75 || reg == 0x77
331 );
332}
218 333
219/* 334/*
220 * Conversions 335 * Conversions
@@ -232,12 +347,36 @@ static inline u8 step_time_to_reg(unsigned int msec, u8 mode)
232 (msec + 200) / 400), 1, 255); 347 (msec + 200) / 400), 1, 255);
233} 348}
234 349
235static inline unsigned int 350static unsigned int fan_from_reg8(u16 reg, unsigned int divreg)
236fan_from_reg(u8 reg, unsigned int div)
237{ 351{
238 if (reg == 0 || reg == 255) 352 if (reg == 0 || reg == 255)
239 return 0; 353 return 0;
240 return 1350000U / (reg * div); 354 return 1350000U / (reg << divreg);
355}
356
357static unsigned int fan_from_reg13(u16 reg, unsigned int divreg)
358{
359 if ((reg & 0xff1f) == 0xff1f)
360 return 0;
361
362 reg = (reg & 0x1f) | ((reg & 0xff00) >> 3);
363
364 if (reg == 0)
365 return 0;
366
367 return 1350000U / reg;
368}
369
370static unsigned int fan_from_reg16(u16 reg, unsigned int divreg)
371{
372 if (reg == 0 || reg == 0xffff)
373 return 0;
374
375 /*
376 * Even though the registers are 16 bit wide, the fan divisor
377 * still applies.
378 */
379 return 1350000U / (reg << divreg);
241} 380}
242 381
243static inline unsigned int 382static inline unsigned int
@@ -247,21 +386,19 @@ div_from_reg(u8 reg)
247} 386}
248 387
249static inline int 388static inline int
250temp1_from_reg(s8 reg) 389temp_from_reg(u16 reg, s16 regval)
251{ 390{
252 return reg * 1000; 391 if (is_word_sized(reg))
392 return LM75_TEMP_FROM_REG(regval);
393 return regval * 1000;
253} 394}
254 395
255static inline s8 396static inline u16
256temp1_to_reg(long temp, int min, int max) 397temp_to_reg(u16 reg, long temp)
257{ 398{
258 if (temp <= min) 399 if (is_word_sized(reg))
259 return min / 1000; 400 return LM75_TEMP_TO_REG(temp);
260 if (temp >= max) 401 return DIV_ROUND_CLOSEST(SENSORS_LIMIT(temp, -127000, 128000), 1000);
261 return max / 1000;
262 if (temp < 0)
263 return (temp - 500) / 1000;
264 return (temp + 500) / 1000;
265} 402}
266 403
267/* Some of analog inputs have internal scaling (2x), 8mV is ADC LSB */ 404/* Some of analog inputs have internal scaling (2x), 8mV is ADC LSB */
@@ -275,7 +412,8 @@ static inline long in_from_reg(u8 reg, u8 nr)
275 412
276static inline u8 in_to_reg(u32 val, u8 nr) 413static inline u8 in_to_reg(u32 val, u8 nr)
277{ 414{
278 return SENSORS_LIMIT(((val + (scale_in[nr] / 2)) / scale_in[nr]), 0, 255); 415 return SENSORS_LIMIT(((val + (scale_in[nr] / 2)) / scale_in[nr]), 0,
416 255);
279} 417}
280 418
281/* 419/*
@@ -289,38 +427,57 @@ struct w83627ehf_data {
289 struct device *hwmon_dev; 427 struct device *hwmon_dev;
290 struct mutex lock; 428 struct mutex lock;
291 429
292 const u8 *REG_FAN_START_OUTPUT; 430 u16 reg_temp[NUM_REG_TEMP];
293 const u8 *REG_FAN_STOP_OUTPUT; 431 u16 reg_temp_over[NUM_REG_TEMP];
294 const u8 *REG_FAN_MAX_OUTPUT; 432 u16 reg_temp_hyst[NUM_REG_TEMP];
295 const u8 *REG_FAN_STEP_OUTPUT; 433 u16 reg_temp_config[NUM_REG_TEMP];
434 u8 temp_src[NUM_REG_TEMP];
435 const char * const *temp_label;
436
437 const u16 *REG_PWM;
438 const u16 *REG_TARGET;
439 const u16 *REG_FAN;
440 const u16 *REG_FAN_MIN;
441 const u16 *REG_FAN_START_OUTPUT;
442 const u16 *REG_FAN_STOP_OUTPUT;
443 const u16 *REG_FAN_STOP_TIME;
444 const u16 *REG_FAN_MAX_OUTPUT;
445 const u16 *REG_FAN_STEP_OUTPUT;
446
447 unsigned int (*fan_from_reg)(u16 reg, unsigned int divreg);
448 unsigned int (*fan_from_reg_min)(u16 reg, unsigned int divreg);
296 449
297 struct mutex update_lock; 450 struct mutex update_lock;
298 char valid; /* !=0 if following fields are valid */ 451 char valid; /* !=0 if following fields are valid */
299 unsigned long last_updated; /* In jiffies */ 452 unsigned long last_updated; /* In jiffies */
300 453
301 /* Register values */ 454 /* Register values */
455 u8 bank; /* current register bank */
302 u8 in_num; /* number of in inputs we have */ 456 u8 in_num; /* number of in inputs we have */
303 u8 in[10]; /* Register value */ 457 u8 in[10]; /* Register value */
304 u8 in_max[10]; /* Register value */ 458 u8 in_max[10]; /* Register value */
305 u8 in_min[10]; /* Register value */ 459 u8 in_min[10]; /* Register value */
306 u8 fan[5]; 460 unsigned int rpm[5];
307 u8 fan_min[5]; 461 u16 fan_min[5];
308 u8 fan_div[5]; 462 u8 fan_div[5];
309 u8 has_fan; /* some fan inputs can be disabled */ 463 u8 has_fan; /* some fan inputs can be disabled */
464 u8 has_fan_min; /* some fans don't have min register */
465 bool has_fan_div;
310 u8 temp_type[3]; 466 u8 temp_type[3];
311 s8 temp1; 467 s16 temp[9];
312 s8 temp1_max; 468 s16 temp_max[9];
313 s8 temp1_max_hyst; 469 s16 temp_max_hyst[9];
314 s16 temp[2];
315 s16 temp_max[2];
316 s16 temp_max_hyst[2];
317 u32 alarms; 470 u32 alarms;
318 471
319 u8 pwm_mode[4]; /* 0->DC variable voltage, 1->PWM variable duty cycle */ 472 u8 pwm_mode[4]; /* 0->DC variable voltage, 1->PWM variable duty cycle */
320 u8 pwm_enable[4]; /* 1->manual 473 u8 pwm_enable[4]; /* 1->manual
321 2->thermal cruise mode (also called SmartFan I) 474 2->thermal cruise mode (also called SmartFan I)
322 3->fan speed cruise mode 475 3->fan speed cruise mode
323 4->variable thermal cruise (also called SmartFan III) */ 476 4->variable thermal cruise (also called
477 SmartFan III)
478 5->enhanced variable thermal cruise (also called
479 SmartFan IV) */
480 u8 pwm_enable_orig[4]; /* original value of pwm_enable */
324 u8 pwm_num; /* number of pwm */ 481 u8 pwm_num; /* number of pwm */
325 u8 pwm[4]; 482 u8 pwm[4];
326 u8 target_temp[4]; 483 u8 target_temp[4];
@@ -335,7 +492,7 @@ struct w83627ehf_data {
335 u8 vid; 492 u8 vid;
336 u8 vrm; 493 u8 vrm;
337 494
338 u8 temp3_disable; 495 u16 have_temp;
339 u8 in6_skip; 496 u8 in6_skip;
340}; 497};
341 498
@@ -344,30 +501,19 @@ struct w83627ehf_sio_data {
344 enum kinds kind; 501 enum kinds kind;
345}; 502};
346 503
347static inline int is_word_sized(u16 reg) 504/*
348{ 505 * On older chips, only registers 0x50-0x5f are banked.
349 return (((reg & 0xff00) == 0x100 506 * On more recent chips, all registers are banked.
350 || (reg & 0xff00) == 0x200) 507 * Assume that is the case and set the bank number for each access.
351 && ((reg & 0x00ff) == 0x50 508 * Cache the bank number so it only needs to be set if it changes.
352 || (reg & 0x00ff) == 0x53 509 */
353 || (reg & 0x00ff) == 0x55));
354}
355
356/* Registers 0x50-0x5f are banked */
357static inline void w83627ehf_set_bank(struct w83627ehf_data *data, u16 reg) 510static inline void w83627ehf_set_bank(struct w83627ehf_data *data, u16 reg)
358{ 511{
359 if ((reg & 0x00f0) == 0x50) { 512 u8 bank = reg >> 8;
513 if (data->bank != bank) {
360 outb_p(W83627EHF_REG_BANK, data->addr + ADDR_REG_OFFSET); 514 outb_p(W83627EHF_REG_BANK, data->addr + ADDR_REG_OFFSET);
361 outb_p(reg >> 8, data->addr + DATA_REG_OFFSET); 515 outb_p(bank, data->addr + DATA_REG_OFFSET);
362 } 516 data->bank = bank;
363}
364
365/* Not strictly necessary, but play it safe for now */
366static inline void w83627ehf_reset_bank(struct w83627ehf_data *data, u16 reg)
367{
368 if (reg & 0xff00) {
369 outb_p(W83627EHF_REG_BANK, data->addr + ADDR_REG_OFFSET);
370 outb_p(0, data->addr + DATA_REG_OFFSET);
371 } 517 }
372} 518}
373 519
@@ -385,14 +531,13 @@ static u16 w83627ehf_read_value(struct w83627ehf_data *data, u16 reg)
385 data->addr + ADDR_REG_OFFSET); 531 data->addr + ADDR_REG_OFFSET);
386 res = (res << 8) + inb_p(data->addr + DATA_REG_OFFSET); 532 res = (res << 8) + inb_p(data->addr + DATA_REG_OFFSET);
387 } 533 }
388 w83627ehf_reset_bank(data, reg);
389 534
390 mutex_unlock(&data->lock); 535 mutex_unlock(&data->lock);
391
392 return res; 536 return res;
393} 537}
394 538
395static int w83627ehf_write_value(struct w83627ehf_data *data, u16 reg, u16 value) 539static int w83627ehf_write_value(struct w83627ehf_data *data, u16 reg,
540 u16 value)
396{ 541{
397 int word_sized = is_word_sized(reg); 542 int word_sized = is_word_sized(reg);
398 543
@@ -406,13 +551,40 @@ static int w83627ehf_write_value(struct w83627ehf_data *data, u16 reg, u16 value
406 data->addr + ADDR_REG_OFFSET); 551 data->addr + ADDR_REG_OFFSET);
407 } 552 }
408 outb_p(value & 0xff, data->addr + DATA_REG_OFFSET); 553 outb_p(value & 0xff, data->addr + DATA_REG_OFFSET);
409 w83627ehf_reset_bank(data, reg);
410 554
411 mutex_unlock(&data->lock); 555 mutex_unlock(&data->lock);
412 return 0; 556 return 0;
413} 557}
414 558
415/* This function assumes that the caller holds data->update_lock */ 559/* This function assumes that the caller holds data->update_lock */
560static void nct6775_write_fan_div(struct w83627ehf_data *data, int nr)
561{
562 u8 reg;
563
564 switch (nr) {
565 case 0:
566 reg = (w83627ehf_read_value(data, NCT6775_REG_FANDIV1) & 0x70)
567 | (data->fan_div[0] & 0x7);
568 w83627ehf_write_value(data, NCT6775_REG_FANDIV1, reg);
569 break;
570 case 1:
571 reg = (w83627ehf_read_value(data, NCT6775_REG_FANDIV1) & 0x7)
572 | ((data->fan_div[1] << 4) & 0x70);
573 w83627ehf_write_value(data, NCT6775_REG_FANDIV1, reg);
574 case 2:
575 reg = (w83627ehf_read_value(data, NCT6775_REG_FANDIV2) & 0x70)
576 | (data->fan_div[2] & 0x7);
577 w83627ehf_write_value(data, NCT6775_REG_FANDIV2, reg);
578 break;
579 case 3:
580 reg = (w83627ehf_read_value(data, NCT6775_REG_FANDIV2) & 0x7)
581 | ((data->fan_div[3] << 4) & 0x70);
582 w83627ehf_write_value(data, NCT6775_REG_FANDIV2, reg);
583 break;
584 }
585}
586
587/* This function assumes that the caller holds data->update_lock */
416static void w83627ehf_write_fan_div(struct w83627ehf_data *data, int nr) 588static void w83627ehf_write_fan_div(struct w83627ehf_data *data, int nr)
417{ 589{
418 u8 reg; 590 u8 reg;
@@ -463,6 +635,32 @@ static void w83627ehf_write_fan_div(struct w83627ehf_data *data, int nr)
463 } 635 }
464} 636}
465 637
638static void w83627ehf_write_fan_div_common(struct device *dev,
639 struct w83627ehf_data *data, int nr)
640{
641 struct w83627ehf_sio_data *sio_data = dev->platform_data;
642
643 if (sio_data->kind == nct6776)
644 ; /* no dividers, do nothing */
645 else if (sio_data->kind == nct6775)
646 nct6775_write_fan_div(data, nr);
647 else
648 w83627ehf_write_fan_div(data, nr);
649}
650
651static void nct6775_update_fan_div(struct w83627ehf_data *data)
652{
653 u8 i;
654
655 i = w83627ehf_read_value(data, NCT6775_REG_FANDIV1);
656 data->fan_div[0] = i & 0x7;
657 data->fan_div[1] = (i & 0x70) >> 4;
658 i = w83627ehf_read_value(data, NCT6775_REG_FANDIV2);
659 data->fan_div[2] = i & 0x7;
660 if (data->has_fan & (1<<3))
661 data->fan_div[3] = (i & 0x70) >> 4;
662}
663
466static void w83627ehf_update_fan_div(struct w83627ehf_data *data) 664static void w83627ehf_update_fan_div(struct w83627ehf_data *data)
467{ 665{
468 int i; 666 int i;
@@ -488,10 +686,79 @@ static void w83627ehf_update_fan_div(struct w83627ehf_data *data)
488 } 686 }
489} 687}
490 688
689static void w83627ehf_update_fan_div_common(struct device *dev,
690 struct w83627ehf_data *data)
691{
692 struct w83627ehf_sio_data *sio_data = dev->platform_data;
693
694 if (sio_data->kind == nct6776)
695 ; /* no dividers, do nothing */
696 else if (sio_data->kind == nct6775)
697 nct6775_update_fan_div(data);
698 else
699 w83627ehf_update_fan_div(data);
700}
701
702static void nct6775_update_pwm(struct w83627ehf_data *data)
703{
704 int i;
705 int pwmcfg, fanmodecfg;
706
707 for (i = 0; i < data->pwm_num; i++) {
708 pwmcfg = w83627ehf_read_value(data,
709 W83627EHF_REG_PWM_ENABLE[i]);
710 fanmodecfg = w83627ehf_read_value(data,
711 NCT6775_REG_FAN_MODE[i]);
712 data->pwm_mode[i] =
713 ((pwmcfg >> W83627EHF_PWM_MODE_SHIFT[i]) & 1) ? 0 : 1;
714 data->pwm_enable[i] = ((fanmodecfg >> 4) & 7) + 1;
715 data->tolerance[i] = fanmodecfg & 0x0f;
716 data->pwm[i] = w83627ehf_read_value(data, data->REG_PWM[i]);
717 }
718}
719
720static void w83627ehf_update_pwm(struct w83627ehf_data *data)
721{
722 int i;
723 int pwmcfg = 0, tolerance = 0; /* shut up the compiler */
724
725 for (i = 0; i < data->pwm_num; i++) {
726 if (!(data->has_fan & (1 << i)))
727 continue;
728
729 /* pwmcfg, tolerance mapped for i=0, i=1 to same reg */
730 if (i != 1) {
731 pwmcfg = w83627ehf_read_value(data,
732 W83627EHF_REG_PWM_ENABLE[i]);
733 tolerance = w83627ehf_read_value(data,
734 W83627EHF_REG_TOLERANCE[i]);
735 }
736 data->pwm_mode[i] =
737 ((pwmcfg >> W83627EHF_PWM_MODE_SHIFT[i]) & 1) ? 0 : 1;
738 data->pwm_enable[i] = ((pwmcfg >> W83627EHF_PWM_ENABLE_SHIFT[i])
739 & 3) + 1;
740 data->pwm[i] = w83627ehf_read_value(data, data->REG_PWM[i]);
741
742 data->tolerance[i] = (tolerance >> (i == 1 ? 4 : 0)) & 0x0f;
743 }
744}
745
746static void w83627ehf_update_pwm_common(struct device *dev,
747 struct w83627ehf_data *data)
748{
749 struct w83627ehf_sio_data *sio_data = dev->platform_data;
750
751 if (sio_data->kind == nct6775 || sio_data->kind == nct6776)
752 nct6775_update_pwm(data);
753 else
754 w83627ehf_update_pwm(data);
755}
756
491static struct w83627ehf_data *w83627ehf_update_device(struct device *dev) 757static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
492{ 758{
493 struct w83627ehf_data *data = dev_get_drvdata(dev); 759 struct w83627ehf_data *data = dev_get_drvdata(dev);
494 int pwmcfg = 0, tolerance = 0; /* shut up the compiler */ 760 struct w83627ehf_sio_data *sio_data = dev->platform_data;
761
495 int i; 762 int i;
496 763
497 mutex_lock(&data->update_lock); 764 mutex_lock(&data->update_lock);
@@ -499,7 +766,7 @@ static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
499 if (time_after(jiffies, data->last_updated + HZ + HZ/2) 766 if (time_after(jiffies, data->last_updated + HZ + HZ/2)
500 || !data->valid) { 767 || !data->valid) {
501 /* Fan clock dividers */ 768 /* Fan clock dividers */
502 w83627ehf_update_fan_div(data); 769 w83627ehf_update_fan_div_common(dev, data);
503 770
504 /* Measured voltages and limits */ 771 /* Measured voltages and limits */
505 for (i = 0; i < data->in_num; i++) { 772 for (i = 0; i < data->in_num; i++) {
@@ -513,92 +780,90 @@ static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
513 780
514 /* Measured fan speeds and limits */ 781 /* Measured fan speeds and limits */
515 for (i = 0; i < 5; i++) { 782 for (i = 0; i < 5; i++) {
783 u16 reg;
784
516 if (!(data->has_fan & (1 << i))) 785 if (!(data->has_fan & (1 << i)))
517 continue; 786 continue;
518 787
519 data->fan[i] = w83627ehf_read_value(data, 788 reg = w83627ehf_read_value(data, data->REG_FAN[i]);
520 W83627EHF_REG_FAN[i]); 789 data->rpm[i] = data->fan_from_reg(reg,
521 data->fan_min[i] = w83627ehf_read_value(data, 790 data->fan_div[i]);
522 W83627EHF_REG_FAN_MIN[i]); 791
792 if (data->has_fan_min & (1 << i))
793 data->fan_min[i] = w83627ehf_read_value(data,
794 data->REG_FAN_MIN[i]);
523 795
524 /* If we failed to measure the fan speed and clock 796 /* If we failed to measure the fan speed and clock
525 divider can be increased, let's try that for next 797 divider can be increased, let's try that for next
526 time */ 798 time */
527 if (data->fan[i] == 0xff 799 if (data->has_fan_div
528 && data->fan_div[i] < 0x07) { 800 && (reg >= 0xff || (sio_data->kind == nct6775
529 dev_dbg(dev, "Increasing fan%d " 801 && reg == 0x00))
802 && data->fan_div[i] < 0x07) {
803 dev_dbg(dev, "Increasing fan%d "
530 "clock divider from %u to %u\n", 804 "clock divider from %u to %u\n",
531 i + 1, div_from_reg(data->fan_div[i]), 805 i + 1, div_from_reg(data->fan_div[i]),
532 div_from_reg(data->fan_div[i] + 1)); 806 div_from_reg(data->fan_div[i] + 1));
533 data->fan_div[i]++; 807 data->fan_div[i]++;
534 w83627ehf_write_fan_div(data, i); 808 w83627ehf_write_fan_div_common(dev, data, i);
535 /* Preserve min limit if possible */ 809 /* Preserve min limit if possible */
536 if (data->fan_min[i] >= 2 810 if ((data->has_fan_min & (1 << i))
811 && data->fan_min[i] >= 2
537 && data->fan_min[i] != 255) 812 && data->fan_min[i] != 255)
538 w83627ehf_write_value(data, 813 w83627ehf_write_value(data,
539 W83627EHF_REG_FAN_MIN[i], 814 data->REG_FAN_MIN[i],
540 (data->fan_min[i] /= 2)); 815 (data->fan_min[i] /= 2));
541 } 816 }
542 } 817 }
543 818
819 w83627ehf_update_pwm_common(dev, data);
820
544 for (i = 0; i < data->pwm_num; i++) { 821 for (i = 0; i < data->pwm_num; i++) {
545 if (!(data->has_fan & (1 << i))) 822 if (!(data->has_fan & (1 << i)))
546 continue; 823 continue;
547 824
548 /* pwmcfg, tolerance mapped for i=0, i=1 to same reg */ 825 data->fan_start_output[i] =
549 if (i != 1) { 826 w83627ehf_read_value(data,
550 pwmcfg = w83627ehf_read_value(data, 827 data->REG_FAN_START_OUTPUT[i]);
551 W83627EHF_REG_PWM_ENABLE[i]); 828 data->fan_stop_output[i] =
552 tolerance = w83627ehf_read_value(data, 829 w83627ehf_read_value(data,
553 W83627EHF_REG_TOLERANCE[i]); 830 data->REG_FAN_STOP_OUTPUT[i]);
554 } 831 data->fan_stop_time[i] =
555 data->pwm_mode[i] = 832 w83627ehf_read_value(data,
556 ((pwmcfg >> W83627EHF_PWM_MODE_SHIFT[i]) & 1) 833 data->REG_FAN_STOP_TIME[i]);
557 ? 0 : 1; 834
558 data->pwm_enable[i] = 835 if (data->REG_FAN_MAX_OUTPUT &&
559 ((pwmcfg >> W83627EHF_PWM_ENABLE_SHIFT[i]) 836 data->REG_FAN_MAX_OUTPUT[i] != 0xff)
560 & 3) + 1;
561 data->pwm[i] = w83627ehf_read_value(data,
562 W83627EHF_REG_PWM[i]);
563 data->fan_start_output[i] = w83627ehf_read_value(data,
564 W83627EHF_REG_FAN_START_OUTPUT[i]);
565 data->fan_stop_output[i] = w83627ehf_read_value(data,
566 W83627EHF_REG_FAN_STOP_OUTPUT[i]);
567 data->fan_stop_time[i] = w83627ehf_read_value(data,
568 W83627EHF_REG_FAN_STOP_TIME[i]);
569
570 if (data->REG_FAN_MAX_OUTPUT[i] != 0xff)
571 data->fan_max_output[i] = 837 data->fan_max_output[i] =
572 w83627ehf_read_value(data, 838 w83627ehf_read_value(data,
573 data->REG_FAN_MAX_OUTPUT[i]); 839 data->REG_FAN_MAX_OUTPUT[i]);
574 840
575 if (data->REG_FAN_STEP_OUTPUT[i] != 0xff) 841 if (data->REG_FAN_STEP_OUTPUT &&
842 data->REG_FAN_STEP_OUTPUT[i] != 0xff)
576 data->fan_step_output[i] = 843 data->fan_step_output[i] =
577 w83627ehf_read_value(data, 844 w83627ehf_read_value(data,
578 data->REG_FAN_STEP_OUTPUT[i]); 845 data->REG_FAN_STEP_OUTPUT[i]);
579 846
580 data->target_temp[i] = 847 data->target_temp[i] =
581 w83627ehf_read_value(data, 848 w83627ehf_read_value(data,
582 W83627EHF_REG_TARGET[i]) & 849 data->REG_TARGET[i]) &
583 (data->pwm_mode[i] == 1 ? 0x7f : 0xff); 850 (data->pwm_mode[i] == 1 ? 0x7f : 0xff);
584 data->tolerance[i] = (tolerance >> (i == 1 ? 4 : 0))
585 & 0x0f;
586 } 851 }
587 852
588 /* Measured temperatures and limits */ 853 /* Measured temperatures and limits */
589 data->temp1 = w83627ehf_read_value(data, 854 for (i = 0; i < NUM_REG_TEMP; i++) {
590 W83627EHF_REG_TEMP1); 855 if (!(data->have_temp & (1 << i)))
591 data->temp1_max = w83627ehf_read_value(data, 856 continue;
592 W83627EHF_REG_TEMP1_OVER);
593 data->temp1_max_hyst = w83627ehf_read_value(data,
594 W83627EHF_REG_TEMP1_HYST);
595 for (i = 0; i < 2; i++) {
596 data->temp[i] = w83627ehf_read_value(data, 857 data->temp[i] = w83627ehf_read_value(data,
597 W83627EHF_REG_TEMP[i]); 858 data->reg_temp[i]);
598 data->temp_max[i] = w83627ehf_read_value(data, 859 if (data->reg_temp_over[i])
599 W83627EHF_REG_TEMP_OVER[i]); 860 data->temp_max[i]
600 data->temp_max_hyst[i] = w83627ehf_read_value(data, 861 = w83627ehf_read_value(data,
601 W83627EHF_REG_TEMP_HYST[i]); 862 data->reg_temp_over[i]);
863 if (data->reg_temp_hyst[i])
864 data->temp_max_hyst[i]
865 = w83627ehf_read_value(data,
866 data->reg_temp_hyst[i]);
602 } 867 }
603 868
604 data->alarms = w83627ehf_read_value(data, 869 data->alarms = w83627ehf_read_value(data,
@@ -625,7 +890,8 @@ show_##reg(struct device *dev, struct device_attribute *attr, \
625 char *buf) \ 890 char *buf) \
626{ \ 891{ \
627 struct w83627ehf_data *data = w83627ehf_update_device(dev); \ 892 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
628 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ 893 struct sensor_device_attribute *sensor_attr = \
894 to_sensor_dev_attr(attr); \
629 int nr = sensor_attr->index; \ 895 int nr = sensor_attr->index; \
630 return sprintf(buf, "%ld\n", in_from_reg(data->reg[nr], nr)); \ 896 return sprintf(buf, "%ld\n", in_from_reg(data->reg[nr], nr)); \
631} 897}
@@ -635,14 +901,18 @@ show_in_reg(in_max)
635 901
636#define store_in_reg(REG, reg) \ 902#define store_in_reg(REG, reg) \
637static ssize_t \ 903static ssize_t \
638store_in_##reg (struct device *dev, struct device_attribute *attr, \ 904store_in_##reg(struct device *dev, struct device_attribute *attr, \
639 const char *buf, size_t count) \ 905 const char *buf, size_t count) \
640{ \ 906{ \
641 struct w83627ehf_data *data = dev_get_drvdata(dev); \ 907 struct w83627ehf_data *data = dev_get_drvdata(dev); \
642 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ 908 struct sensor_device_attribute *sensor_attr = \
909 to_sensor_dev_attr(attr); \
643 int nr = sensor_attr->index; \ 910 int nr = sensor_attr->index; \
644 u32 val = simple_strtoul(buf, NULL, 10); \ 911 unsigned long val; \
645 \ 912 int err; \
913 err = strict_strtoul(buf, 10, &val); \
914 if (err < 0) \
915 return err; \
646 mutex_lock(&data->update_lock); \ 916 mutex_lock(&data->update_lock); \
647 data->in_##reg[nr] = in_to_reg(val, nr); \ 917 data->in_##reg[nr] = in_to_reg(val, nr); \
648 w83627ehf_write_value(data, W83627EHF_REG_IN_##REG(nr), \ 918 w83627ehf_write_value(data, W83627EHF_REG_IN_##REG(nr), \
@@ -654,7 +924,8 @@ store_in_##reg (struct device *dev, struct device_attribute *attr, \
654store_in_reg(MIN, min) 924store_in_reg(MIN, min)
655store_in_reg(MAX, max) 925store_in_reg(MAX, max)
656 926
657static ssize_t show_alarm(struct device *dev, struct device_attribute *attr, char *buf) 927static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
928 char *buf)
658{ 929{
659 struct w83627ehf_data *data = w83627ehf_update_device(dev); 930 struct w83627ehf_data *data = w83627ehf_update_device(dev);
660 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 931 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
@@ -689,45 +960,50 @@ static struct sensor_device_attribute sda_in_alarm[] = {
689}; 960};
690 961
691static struct sensor_device_attribute sda_in_min[] = { 962static struct sensor_device_attribute sda_in_min[] = {
692 SENSOR_ATTR(in0_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 0), 963 SENSOR_ATTR(in0_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 0),
693 SENSOR_ATTR(in1_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 1), 964 SENSOR_ATTR(in1_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 1),
694 SENSOR_ATTR(in2_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 2), 965 SENSOR_ATTR(in2_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 2),
695 SENSOR_ATTR(in3_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 3), 966 SENSOR_ATTR(in3_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 3),
696 SENSOR_ATTR(in4_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 4), 967 SENSOR_ATTR(in4_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 4),
697 SENSOR_ATTR(in5_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 5), 968 SENSOR_ATTR(in5_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 5),
698 SENSOR_ATTR(in6_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 6), 969 SENSOR_ATTR(in6_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 6),
699 SENSOR_ATTR(in7_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 7), 970 SENSOR_ATTR(in7_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 7),
700 SENSOR_ATTR(in8_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 8), 971 SENSOR_ATTR(in8_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 8),
701 SENSOR_ATTR(in9_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 9), 972 SENSOR_ATTR(in9_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 9),
702}; 973};
703 974
704static struct sensor_device_attribute sda_in_max[] = { 975static struct sensor_device_attribute sda_in_max[] = {
705 SENSOR_ATTR(in0_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 0), 976 SENSOR_ATTR(in0_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 0),
706 SENSOR_ATTR(in1_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 1), 977 SENSOR_ATTR(in1_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 1),
707 SENSOR_ATTR(in2_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 2), 978 SENSOR_ATTR(in2_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 2),
708 SENSOR_ATTR(in3_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 3), 979 SENSOR_ATTR(in3_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 3),
709 SENSOR_ATTR(in4_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 4), 980 SENSOR_ATTR(in4_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 4),
710 SENSOR_ATTR(in5_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 5), 981 SENSOR_ATTR(in5_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 5),
711 SENSOR_ATTR(in6_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 6), 982 SENSOR_ATTR(in6_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 6),
712 SENSOR_ATTR(in7_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 7), 983 SENSOR_ATTR(in7_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 7),
713 SENSOR_ATTR(in8_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 8), 984 SENSOR_ATTR(in8_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 8),
714 SENSOR_ATTR(in9_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 9), 985 SENSOR_ATTR(in9_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 9),
715}; 986};
716 987
717#define show_fan_reg(reg) \ 988static ssize_t
718static ssize_t \ 989show_fan(struct device *dev, struct device_attribute *attr, char *buf)
719show_##reg(struct device *dev, struct device_attribute *attr, \ 990{
720 char *buf) \ 991 struct w83627ehf_data *data = w83627ehf_update_device(dev);
721{ \ 992 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
722 struct w83627ehf_data *data = w83627ehf_update_device(dev); \ 993 int nr = sensor_attr->index;
723 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ 994 return sprintf(buf, "%d\n", data->rpm[nr]);
724 int nr = sensor_attr->index; \ 995}
725 return sprintf(buf, "%d\n", \ 996
726 fan_from_reg(data->reg[nr], \ 997static ssize_t
727 div_from_reg(data->fan_div[nr]))); \ 998show_fan_min(struct device *dev, struct device_attribute *attr, char *buf)
999{
1000 struct w83627ehf_data *data = w83627ehf_update_device(dev);
1001 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1002 int nr = sensor_attr->index;
1003 return sprintf(buf, "%d\n",
1004 data->fan_from_reg_min(data->fan_min[nr],
1005 data->fan_div[nr]));
728} 1006}
729show_fan_reg(fan);
730show_fan_reg(fan_min);
731 1007
732static ssize_t 1008static ssize_t
733show_fan_div(struct device *dev, struct device_attribute *attr, 1009show_fan_div(struct device *dev, struct device_attribute *attr,
@@ -746,11 +1022,32 @@ store_fan_min(struct device *dev, struct device_attribute *attr,
746 struct w83627ehf_data *data = dev_get_drvdata(dev); 1022 struct w83627ehf_data *data = dev_get_drvdata(dev);
747 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 1023 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
748 int nr = sensor_attr->index; 1024 int nr = sensor_attr->index;
749 unsigned int val = simple_strtoul(buf, NULL, 10); 1025 unsigned long val;
1026 int err;
750 unsigned int reg; 1027 unsigned int reg;
751 u8 new_div; 1028 u8 new_div;
752 1029
1030 err = strict_strtoul(buf, 10, &val);
1031 if (err < 0)
1032 return err;
1033
753 mutex_lock(&data->update_lock); 1034 mutex_lock(&data->update_lock);
1035 if (!data->has_fan_div) {
1036 /*
1037 * Only NCT6776F for now, so we know that this is a 13 bit
1038 * register
1039 */
1040 if (!val) {
1041 val = 0xff1f;
1042 } else {
1043 if (val > 1350000U)
1044 val = 135000U;
1045 val = 1350000U / val;
1046 val = (val & 0x1f) | ((val << 3) & 0xff00);
1047 }
1048 data->fan_min[nr] = val;
1049 goto done; /* Leave fan divider alone */
1050 }
754 if (!val) { 1051 if (!val) {
755 /* No min limit, alarm disabled */ 1052 /* No min limit, alarm disabled */
756 data->fan_min[nr] = 255; 1053 data->fan_min[nr] = 255;
@@ -761,15 +1058,17 @@ store_fan_min(struct device *dev, struct device_attribute *attr,
761 even with the highest divider (128) */ 1058 even with the highest divider (128) */
762 data->fan_min[nr] = 254; 1059 data->fan_min[nr] = 254;
763 new_div = 7; /* 128 == (1 << 7) */ 1060 new_div = 7; /* 128 == (1 << 7) */
764 dev_warn(dev, "fan%u low limit %u below minimum %u, set to " 1061 dev_warn(dev, "fan%u low limit %lu below minimum %u, set to "
765 "minimum\n", nr + 1, val, fan_from_reg(254, 128)); 1062 "minimum\n", nr + 1, val,
1063 data->fan_from_reg_min(254, 7));
766 } else if (!reg) { 1064 } else if (!reg) {
767 /* Speed above this value cannot possibly be represented, 1065 /* Speed above this value cannot possibly be represented,
768 even with the lowest divider (1) */ 1066 even with the lowest divider (1) */
769 data->fan_min[nr] = 1; 1067 data->fan_min[nr] = 1;
770 new_div = 0; /* 1 == (1 << 0) */ 1068 new_div = 0; /* 1 == (1 << 0) */
771 dev_warn(dev, "fan%u low limit %u above maximum %u, set to " 1069 dev_warn(dev, "fan%u low limit %lu above maximum %u, set to "
772 "maximum\n", nr + 1, val, fan_from_reg(1, 1)); 1070 "maximum\n", nr + 1, val,
1071 data->fan_from_reg_min(1, 0));
773 } else { 1072 } else {
774 /* Automatically pick the best divider, i.e. the one such 1073 /* Automatically pick the best divider, i.e. the one such
775 that the min limit will correspond to a register value 1074 that the min limit will correspond to a register value
@@ -785,25 +1084,16 @@ store_fan_min(struct device *dev, struct device_attribute *attr,
785 /* Write both the fan clock divider (if it changed) and the new 1084 /* Write both the fan clock divider (if it changed) and the new
786 fan min (unconditionally) */ 1085 fan min (unconditionally) */
787 if (new_div != data->fan_div[nr]) { 1086 if (new_div != data->fan_div[nr]) {
788 /* Preserve the fan speed reading */
789 if (data->fan[nr] != 0xff) {
790 if (new_div > data->fan_div[nr])
791 data->fan[nr] >>= new_div - data->fan_div[nr];
792 else if (data->fan[nr] & 0x80)
793 data->fan[nr] = 0xff;
794 else
795 data->fan[nr] <<= data->fan_div[nr] - new_div;
796 }
797
798 dev_dbg(dev, "fan%u clock divider changed from %u to %u\n", 1087 dev_dbg(dev, "fan%u clock divider changed from %u to %u\n",
799 nr + 1, div_from_reg(data->fan_div[nr]), 1088 nr + 1, div_from_reg(data->fan_div[nr]),
800 div_from_reg(new_div)); 1089 div_from_reg(new_div));
801 data->fan_div[nr] = new_div; 1090 data->fan_div[nr] = new_div;
802 w83627ehf_write_fan_div(data, nr); 1091 w83627ehf_write_fan_div_common(dev, data, nr);
803 /* Give the chip time to sample a new speed value */ 1092 /* Give the chip time to sample a new speed value */
804 data->last_updated = jiffies; 1093 data->last_updated = jiffies;
805 } 1094 }
806 w83627ehf_write_value(data, W83627EHF_REG_FAN_MIN[nr], 1095done:
1096 w83627ehf_write_value(data, data->REG_FAN_MIN[nr],
807 data->fan_min[nr]); 1097 data->fan_min[nr]);
808 mutex_unlock(&data->update_lock); 1098 mutex_unlock(&data->update_lock);
809 1099
@@ -847,70 +1137,54 @@ static struct sensor_device_attribute sda_fan_div[] = {
847 SENSOR_ATTR(fan5_div, S_IRUGO, show_fan_div, NULL, 4), 1137 SENSOR_ATTR(fan5_div, S_IRUGO, show_fan_div, NULL, 4),
848}; 1138};
849 1139
850#define show_temp1_reg(reg) \ 1140static ssize_t
851static ssize_t \ 1141show_temp_label(struct device *dev, struct device_attribute *attr, char *buf)
852show_##reg(struct device *dev, struct device_attribute *attr, \ 1142{
853 char *buf) \ 1143 struct w83627ehf_data *data = w83627ehf_update_device(dev);
854{ \ 1144 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
855 struct w83627ehf_data *data = w83627ehf_update_device(dev); \ 1145 int nr = sensor_attr->index;
856 return sprintf(buf, "%d\n", temp1_from_reg(data->reg)); \ 1146 return sprintf(buf, "%s\n", data->temp_label[data->temp_src[nr]]);
857}
858show_temp1_reg(temp1);
859show_temp1_reg(temp1_max);
860show_temp1_reg(temp1_max_hyst);
861
862#define store_temp1_reg(REG, reg) \
863static ssize_t \
864store_temp1_##reg(struct device *dev, struct device_attribute *attr, \
865 const char *buf, size_t count) \
866{ \
867 struct w83627ehf_data *data = dev_get_drvdata(dev); \
868 long val = simple_strtol(buf, NULL, 10); \
869 \
870 mutex_lock(&data->update_lock); \
871 data->temp1_##reg = temp1_to_reg(val, -128000, 127000); \
872 w83627ehf_write_value(data, W83627EHF_REG_TEMP1_##REG, \
873 data->temp1_##reg); \
874 mutex_unlock(&data->update_lock); \
875 return count; \
876} 1147}
877store_temp1_reg(OVER, max);
878store_temp1_reg(HYST, max_hyst);
879 1148
880#define show_temp_reg(reg) \ 1149#define show_temp_reg(addr, reg) \
881static ssize_t \ 1150static ssize_t \
882show_##reg(struct device *dev, struct device_attribute *attr, \ 1151show_##reg(struct device *dev, struct device_attribute *attr, \
883 char *buf) \ 1152 char *buf) \
884{ \ 1153{ \
885 struct w83627ehf_data *data = w83627ehf_update_device(dev); \ 1154 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
886 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ 1155 struct sensor_device_attribute *sensor_attr = \
1156 to_sensor_dev_attr(attr); \
887 int nr = sensor_attr->index; \ 1157 int nr = sensor_attr->index; \
888 return sprintf(buf, "%d\n", \ 1158 return sprintf(buf, "%d\n", \
889 LM75_TEMP_FROM_REG(data->reg[nr])); \ 1159 temp_from_reg(data->addr[nr], data->reg[nr])); \
890} 1160}
891show_temp_reg(temp); 1161show_temp_reg(reg_temp, temp);
892show_temp_reg(temp_max); 1162show_temp_reg(reg_temp_over, temp_max);
893show_temp_reg(temp_max_hyst); 1163show_temp_reg(reg_temp_hyst, temp_max_hyst);
894 1164
895#define store_temp_reg(REG, reg) \ 1165#define store_temp_reg(addr, reg) \
896static ssize_t \ 1166static ssize_t \
897store_##reg(struct device *dev, struct device_attribute *attr, \ 1167store_##reg(struct device *dev, struct device_attribute *attr, \
898 const char *buf, size_t count) \ 1168 const char *buf, size_t count) \
899{ \ 1169{ \
900 struct w83627ehf_data *data = dev_get_drvdata(dev); \ 1170 struct w83627ehf_data *data = dev_get_drvdata(dev); \
901 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ 1171 struct sensor_device_attribute *sensor_attr = \
1172 to_sensor_dev_attr(attr); \
902 int nr = sensor_attr->index; \ 1173 int nr = sensor_attr->index; \
903 long val = simple_strtol(buf, NULL, 10); \ 1174 int err; \
904 \ 1175 long val; \
1176 err = strict_strtol(buf, 10, &val); \
1177 if (err < 0) \
1178 return err; \
905 mutex_lock(&data->update_lock); \ 1179 mutex_lock(&data->update_lock); \
906 data->reg[nr] = LM75_TEMP_TO_REG(val); \ 1180 data->reg[nr] = temp_to_reg(data->addr[nr], val); \
907 w83627ehf_write_value(data, W83627EHF_REG_TEMP_##REG[nr], \ 1181 w83627ehf_write_value(data, data->addr[nr], \
908 data->reg[nr]); \ 1182 data->reg[nr]); \
909 mutex_unlock(&data->update_lock); \ 1183 mutex_unlock(&data->update_lock); \
910 return count; \ 1184 return count; \
911} 1185}
912store_temp_reg(OVER, temp_max); 1186store_temp_reg(reg_temp_over, temp_max);
913store_temp_reg(HYST, temp_max_hyst); 1187store_temp_reg(reg_temp_hyst, temp_max_hyst);
914 1188
915static ssize_t 1189static ssize_t
916show_temp_type(struct device *dev, struct device_attribute *attr, char *buf) 1190show_temp_type(struct device *dev, struct device_attribute *attr, char *buf)
@@ -922,27 +1196,69 @@ show_temp_type(struct device *dev, struct device_attribute *attr, char *buf)
922} 1196}
923 1197
924static struct sensor_device_attribute sda_temp_input[] = { 1198static struct sensor_device_attribute sda_temp_input[] = {
925 SENSOR_ATTR(temp1_input, S_IRUGO, show_temp1, NULL, 0), 1199 SENSOR_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0),
926 SENSOR_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 0), 1200 SENSOR_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1),
927 SENSOR_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 1), 1201 SENSOR_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2),
1202 SENSOR_ATTR(temp4_input, S_IRUGO, show_temp, NULL, 3),
1203 SENSOR_ATTR(temp5_input, S_IRUGO, show_temp, NULL, 4),
1204 SENSOR_ATTR(temp6_input, S_IRUGO, show_temp, NULL, 5),
1205 SENSOR_ATTR(temp7_input, S_IRUGO, show_temp, NULL, 6),
1206 SENSOR_ATTR(temp8_input, S_IRUGO, show_temp, NULL, 7),
1207 SENSOR_ATTR(temp9_input, S_IRUGO, show_temp, NULL, 8),
1208};
1209
1210static struct sensor_device_attribute sda_temp_label[] = {
1211 SENSOR_ATTR(temp1_label, S_IRUGO, show_temp_label, NULL, 0),
1212 SENSOR_ATTR(temp2_label, S_IRUGO, show_temp_label, NULL, 1),
1213 SENSOR_ATTR(temp3_label, S_IRUGO, show_temp_label, NULL, 2),
1214 SENSOR_ATTR(temp4_label, S_IRUGO, show_temp_label, NULL, 3),
1215 SENSOR_ATTR(temp5_label, S_IRUGO, show_temp_label, NULL, 4),
1216 SENSOR_ATTR(temp6_label, S_IRUGO, show_temp_label, NULL, 5),
1217 SENSOR_ATTR(temp7_label, S_IRUGO, show_temp_label, NULL, 6),
1218 SENSOR_ATTR(temp8_label, S_IRUGO, show_temp_label, NULL, 7),
1219 SENSOR_ATTR(temp9_label, S_IRUGO, show_temp_label, NULL, 8),
928}; 1220};
929 1221
930static struct sensor_device_attribute sda_temp_max[] = { 1222static struct sensor_device_attribute sda_temp_max[] = {
931 SENSOR_ATTR(temp1_max, S_IRUGO | S_IWUSR, show_temp1_max, 1223 SENSOR_ATTR(temp1_max, S_IRUGO | S_IWUSR, show_temp_max,
932 store_temp1_max, 0),
933 SENSOR_ATTR(temp2_max, S_IRUGO | S_IWUSR, show_temp_max,
934 store_temp_max, 0), 1224 store_temp_max, 0),
935 SENSOR_ATTR(temp3_max, S_IRUGO | S_IWUSR, show_temp_max, 1225 SENSOR_ATTR(temp2_max, S_IRUGO | S_IWUSR, show_temp_max,
936 store_temp_max, 1), 1226 store_temp_max, 1),
1227 SENSOR_ATTR(temp3_max, S_IRUGO | S_IWUSR, show_temp_max,
1228 store_temp_max, 2),
1229 SENSOR_ATTR(temp4_max, S_IRUGO | S_IWUSR, show_temp_max,
1230 store_temp_max, 3),
1231 SENSOR_ATTR(temp5_max, S_IRUGO | S_IWUSR, show_temp_max,
1232 store_temp_max, 4),
1233 SENSOR_ATTR(temp6_max, S_IRUGO | S_IWUSR, show_temp_max,
1234 store_temp_max, 5),
1235 SENSOR_ATTR(temp7_max, S_IRUGO | S_IWUSR, show_temp_max,
1236 store_temp_max, 6),
1237 SENSOR_ATTR(temp8_max, S_IRUGO | S_IWUSR, show_temp_max,
1238 store_temp_max, 7),
1239 SENSOR_ATTR(temp9_max, S_IRUGO | S_IWUSR, show_temp_max,
1240 store_temp_max, 8),
937}; 1241};
938 1242
939static struct sensor_device_attribute sda_temp_max_hyst[] = { 1243static struct sensor_device_attribute sda_temp_max_hyst[] = {
940 SENSOR_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, show_temp1_max_hyst, 1244 SENSOR_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
941 store_temp1_max_hyst, 0),
942 SENSOR_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
943 store_temp_max_hyst, 0), 1245 store_temp_max_hyst, 0),
944 SENSOR_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst, 1246 SENSOR_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
945 store_temp_max_hyst, 1), 1247 store_temp_max_hyst, 1),
1248 SENSOR_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1249 store_temp_max_hyst, 2),
1250 SENSOR_ATTR(temp4_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1251 store_temp_max_hyst, 3),
1252 SENSOR_ATTR(temp5_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1253 store_temp_max_hyst, 4),
1254 SENSOR_ATTR(temp6_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1255 store_temp_max_hyst, 5),
1256 SENSOR_ATTR(temp7_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1257 store_temp_max_hyst, 6),
1258 SENSOR_ATTR(temp8_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1259 store_temp_max_hyst, 7),
1260 SENSOR_ATTR(temp9_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1261 store_temp_max_hyst, 8),
946}; 1262};
947 1263
948static struct sensor_device_attribute sda_temp_alarm[] = { 1264static struct sensor_device_attribute sda_temp_alarm[] = {
@@ -958,11 +1274,12 @@ static struct sensor_device_attribute sda_temp_type[] = {
958}; 1274};
959 1275
960#define show_pwm_reg(reg) \ 1276#define show_pwm_reg(reg) \
961static ssize_t show_##reg (struct device *dev, struct device_attribute *attr, \ 1277static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
962 char *buf) \ 1278 char *buf) \
963{ \ 1279{ \
964 struct w83627ehf_data *data = w83627ehf_update_device(dev); \ 1280 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
965 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ 1281 struct sensor_device_attribute *sensor_attr = \
1282 to_sensor_dev_attr(attr); \
966 int nr = sensor_attr->index; \ 1283 int nr = sensor_attr->index; \
967 return sprintf(buf, "%d\n", data->reg[nr]); \ 1284 return sprintf(buf, "%d\n", data->reg[nr]); \
968} 1285}
@@ -978,9 +1295,14 @@ store_pwm_mode(struct device *dev, struct device_attribute *attr,
978 struct w83627ehf_data *data = dev_get_drvdata(dev); 1295 struct w83627ehf_data *data = dev_get_drvdata(dev);
979 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 1296 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
980 int nr = sensor_attr->index; 1297 int nr = sensor_attr->index;
981 u32 val = simple_strtoul(buf, NULL, 10); 1298 unsigned long val;
1299 int err;
982 u16 reg; 1300 u16 reg;
983 1301
1302 err = strict_strtoul(buf, 10, &val);
1303 if (err < 0)
1304 return err;
1305
984 if (val > 1) 1306 if (val > 1)
985 return -EINVAL; 1307 return -EINVAL;
986 mutex_lock(&data->update_lock); 1308 mutex_lock(&data->update_lock);
@@ -1001,11 +1323,18 @@ store_pwm(struct device *dev, struct device_attribute *attr,
1001 struct w83627ehf_data *data = dev_get_drvdata(dev); 1323 struct w83627ehf_data *data = dev_get_drvdata(dev);
1002 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 1324 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1003 int nr = sensor_attr->index; 1325 int nr = sensor_attr->index;
1004 u32 val = SENSORS_LIMIT(simple_strtoul(buf, NULL, 10), 0, 255); 1326 unsigned long val;
1327 int err;
1328
1329 err = strict_strtoul(buf, 10, &val);
1330 if (err < 0)
1331 return err;
1332
1333 val = SENSORS_LIMIT(val, 0, 255);
1005 1334
1006 mutex_lock(&data->update_lock); 1335 mutex_lock(&data->update_lock);
1007 data->pwm[nr] = val; 1336 data->pwm[nr] = val;
1008 w83627ehf_write_value(data, W83627EHF_REG_PWM[nr], val); 1337 w83627ehf_write_value(data, data->REG_PWM[nr], val);
1009 mutex_unlock(&data->update_lock); 1338 mutex_unlock(&data->update_lock);
1010 return count; 1339 return count;
1011} 1340}
@@ -1015,19 +1344,38 @@ store_pwm_enable(struct device *dev, struct device_attribute *attr,
1015 const char *buf, size_t count) 1344 const char *buf, size_t count)
1016{ 1345{
1017 struct w83627ehf_data *data = dev_get_drvdata(dev); 1346 struct w83627ehf_data *data = dev_get_drvdata(dev);
1347 struct w83627ehf_sio_data *sio_data = dev->platform_data;
1018 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 1348 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1019 int nr = sensor_attr->index; 1349 int nr = sensor_attr->index;
1020 u32 val = simple_strtoul(buf, NULL, 10); 1350 unsigned long val;
1351 int err;
1021 u16 reg; 1352 u16 reg;
1022 1353
1023 if (!val || (val > 4)) 1354 err = strict_strtoul(buf, 10, &val);
1355 if (err < 0)
1356 return err;
1357
1358 if (!val || (val > 4 && val != data->pwm_enable_orig[nr]))
1024 return -EINVAL; 1359 return -EINVAL;
1360 /* SmartFan III mode is not supported on NCT6776F */
1361 if (sio_data->kind == nct6776 && val == 4)
1362 return -EINVAL;
1363
1025 mutex_lock(&data->update_lock); 1364 mutex_lock(&data->update_lock);
1026 reg = w83627ehf_read_value(data, W83627EHF_REG_PWM_ENABLE[nr]);
1027 data->pwm_enable[nr] = val; 1365 data->pwm_enable[nr] = val;
1028 reg &= ~(0x03 << W83627EHF_PWM_ENABLE_SHIFT[nr]); 1366 if (sio_data->kind == nct6775 || sio_data->kind == nct6776) {
1029 reg |= (val - 1) << W83627EHF_PWM_ENABLE_SHIFT[nr]; 1367 reg = w83627ehf_read_value(data,
1030 w83627ehf_write_value(data, W83627EHF_REG_PWM_ENABLE[nr], reg); 1368 NCT6775_REG_FAN_MODE[nr]);
1369 reg &= 0x0f;
1370 reg |= (val - 1) << 4;
1371 w83627ehf_write_value(data,
1372 NCT6775_REG_FAN_MODE[nr], reg);
1373 } else {
1374 reg = w83627ehf_read_value(data, W83627EHF_REG_PWM_ENABLE[nr]);
1375 reg &= ~(0x03 << W83627EHF_PWM_ENABLE_SHIFT[nr]);
1376 reg |= (val - 1) << W83627EHF_PWM_ENABLE_SHIFT[nr];
1377 w83627ehf_write_value(data, W83627EHF_REG_PWM_ENABLE[nr], reg);
1378 }
1031 mutex_unlock(&data->update_lock); 1379 mutex_unlock(&data->update_lock);
1032 return count; 1380 return count;
1033} 1381}
@@ -1038,9 +1386,10 @@ static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
1038 char *buf) \ 1386 char *buf) \
1039{ \ 1387{ \
1040 struct w83627ehf_data *data = w83627ehf_update_device(dev); \ 1388 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
1041 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ 1389 struct sensor_device_attribute *sensor_attr = \
1390 to_sensor_dev_attr(attr); \
1042 int nr = sensor_attr->index; \ 1391 int nr = sensor_attr->index; \
1043 return sprintf(buf, "%d\n", temp1_from_reg(data->reg[nr])); \ 1392 return sprintf(buf, "%d\n", data->reg[nr] * 1000); \
1044} 1393}
1045 1394
1046show_tol_temp(tolerance) 1395show_tol_temp(tolerance)
@@ -1053,11 +1402,18 @@ store_target_temp(struct device *dev, struct device_attribute *attr,
1053 struct w83627ehf_data *data = dev_get_drvdata(dev); 1402 struct w83627ehf_data *data = dev_get_drvdata(dev);
1054 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 1403 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1055 int nr = sensor_attr->index; 1404 int nr = sensor_attr->index;
1056 u8 val = temp1_to_reg(simple_strtoul(buf, NULL, 10), 0, 127000); 1405 long val;
1406 int err;
1407
1408 err = strict_strtol(buf, 10, &val);
1409 if (err < 0)
1410 return err;
1411
1412 val = SENSORS_LIMIT(DIV_ROUND_CLOSEST(val, 1000), 0, 127);
1057 1413
1058 mutex_lock(&data->update_lock); 1414 mutex_lock(&data->update_lock);
1059 data->target_temp[nr] = val; 1415 data->target_temp[nr] = val;
1060 w83627ehf_write_value(data, W83627EHF_REG_TARGET[nr], val); 1416 w83627ehf_write_value(data, data->REG_TARGET[nr], val);
1061 mutex_unlock(&data->update_lock); 1417 mutex_unlock(&data->update_lock);
1062 return count; 1418 return count;
1063} 1419}
@@ -1067,20 +1423,37 @@ store_tolerance(struct device *dev, struct device_attribute *attr,
1067 const char *buf, size_t count) 1423 const char *buf, size_t count)
1068{ 1424{
1069 struct w83627ehf_data *data = dev_get_drvdata(dev); 1425 struct w83627ehf_data *data = dev_get_drvdata(dev);
1426 struct w83627ehf_sio_data *sio_data = dev->platform_data;
1070 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); 1427 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1071 int nr = sensor_attr->index; 1428 int nr = sensor_attr->index;
1072 u16 reg; 1429 u16 reg;
1430 long val;
1431 int err;
1432
1433 err = strict_strtol(buf, 10, &val);
1434 if (err < 0)
1435 return err;
1436
1073 /* Limit the temp to 0C - 15C */ 1437 /* Limit the temp to 0C - 15C */
1074 u8 val = temp1_to_reg(simple_strtoul(buf, NULL, 10), 0, 15000); 1438 val = SENSORS_LIMIT(DIV_ROUND_CLOSEST(val, 1000), 0, 15);
1075 1439
1076 mutex_lock(&data->update_lock); 1440 mutex_lock(&data->update_lock);
1077 reg = w83627ehf_read_value(data, W83627EHF_REG_TOLERANCE[nr]); 1441 if (sio_data->kind == nct6775 || sio_data->kind == nct6776) {
1078 data->tolerance[nr] = val; 1442 /* Limit tolerance further for NCT6776F */
1079 if (nr == 1) 1443 if (sio_data->kind == nct6776 && val > 7)
1080 reg = (reg & 0x0f) | (val << 4); 1444 val = 7;
1081 else 1445 reg = w83627ehf_read_value(data, NCT6775_REG_FAN_MODE[nr]);
1082 reg = (reg & 0xf0) | val; 1446 reg = (reg & 0xf0) | val;
1083 w83627ehf_write_value(data, W83627EHF_REG_TOLERANCE[nr], reg); 1447 w83627ehf_write_value(data, NCT6775_REG_FAN_MODE[nr], reg);
1448 } else {
1449 reg = w83627ehf_read_value(data, W83627EHF_REG_TOLERANCE[nr]);
1450 if (nr == 1)
1451 reg = (reg & 0x0f) | (val << 4);
1452 else
1453 reg = (reg & 0xf0) | val;
1454 w83627ehf_write_value(data, W83627EHF_REG_TOLERANCE[nr], reg);
1455 }
1456 data->tolerance[nr] = val;
1084 mutex_unlock(&data->update_lock); 1457 mutex_unlock(&data->update_lock);
1085 return count; 1458 return count;
1086} 1459}
@@ -1143,18 +1516,25 @@ static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
1143 char *buf) \ 1516 char *buf) \
1144{ \ 1517{ \
1145 struct w83627ehf_data *data = w83627ehf_update_device(dev); \ 1518 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
1146 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ 1519 struct sensor_device_attribute *sensor_attr = \
1520 to_sensor_dev_attr(attr); \
1147 int nr = sensor_attr->index; \ 1521 int nr = sensor_attr->index; \
1148 return sprintf(buf, "%d\n", data->reg[nr]); \ 1522 return sprintf(buf, "%d\n", data->reg[nr]); \
1149}\ 1523} \
1150static ssize_t \ 1524static ssize_t \
1151store_##reg(struct device *dev, struct device_attribute *attr, \ 1525store_##reg(struct device *dev, struct device_attribute *attr, \
1152 const char *buf, size_t count) \ 1526 const char *buf, size_t count) \
1153{\ 1527{ \
1154 struct w83627ehf_data *data = dev_get_drvdata(dev); \ 1528 struct w83627ehf_data *data = dev_get_drvdata(dev); \
1155 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ 1529 struct sensor_device_attribute *sensor_attr = \
1530 to_sensor_dev_attr(attr); \
1156 int nr = sensor_attr->index; \ 1531 int nr = sensor_attr->index; \
1157 u32 val = SENSORS_LIMIT(simple_strtoul(buf, NULL, 10), 1, 255); \ 1532 unsigned long val; \
1533 int err; \
1534 err = strict_strtoul(buf, 10, &val); \
1535 if (err < 0) \
1536 return err; \
1537 val = SENSORS_LIMIT(val, 1, 255); \
1158 mutex_lock(&data->update_lock); \ 1538 mutex_lock(&data->update_lock); \
1159 data->reg[nr] = val; \ 1539 data->reg[nr] = val; \
1160 w83627ehf_write_value(data, data->REG_##REG[nr], val); \ 1540 w83627ehf_write_value(data, data->REG_##REG[nr], val); \
@@ -1172,10 +1552,12 @@ static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
1172 char *buf) \ 1552 char *buf) \
1173{ \ 1553{ \
1174 struct w83627ehf_data *data = w83627ehf_update_device(dev); \ 1554 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
1175 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ 1555 struct sensor_device_attribute *sensor_attr = \
1556 to_sensor_dev_attr(attr); \
1176 int nr = sensor_attr->index; \ 1557 int nr = sensor_attr->index; \
1177 return sprintf(buf, "%d\n", \ 1558 return sprintf(buf, "%d\n", \
1178 step_time_from_reg(data->reg[nr], data->pwm_mode[nr])); \ 1559 step_time_from_reg(data->reg[nr], \
1560 data->pwm_mode[nr])); \
1179} \ 1561} \
1180\ 1562\
1181static ssize_t \ 1563static ssize_t \
@@ -1183,10 +1565,15 @@ store_##reg(struct device *dev, struct device_attribute *attr, \
1183 const char *buf, size_t count) \ 1565 const char *buf, size_t count) \
1184{ \ 1566{ \
1185 struct w83627ehf_data *data = dev_get_drvdata(dev); \ 1567 struct w83627ehf_data *data = dev_get_drvdata(dev); \
1186 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); \ 1568 struct sensor_device_attribute *sensor_attr = \
1569 to_sensor_dev_attr(attr); \
1187 int nr = sensor_attr->index; \ 1570 int nr = sensor_attr->index; \
1188 u8 val = step_time_to_reg(simple_strtoul(buf, NULL, 10), \ 1571 unsigned long val; \
1189 data->pwm_mode[nr]); \ 1572 int err; \
1573 err = strict_strtoul(buf, 10, &val); \
1574 if (err < 0) \
1575 return err; \
1576 val = step_time_to_reg(val, data->pwm_mode[nr]); \
1190 mutex_lock(&data->update_lock); \ 1577 mutex_lock(&data->update_lock); \
1191 data->reg[nr] = val; \ 1578 data->reg[nr] = val; \
1192 w83627ehf_write_value(data, W83627EHF_REG_##REG[nr], val); \ 1579 w83627ehf_write_value(data, W83627EHF_REG_##REG[nr], val); \
@@ -1283,7 +1670,8 @@ static void w83627ehf_device_remove_files(struct device *dev)
1283 for (i = 0; i < ARRAY_SIZE(sda_sf3_max_step_arrays); i++) { 1670 for (i = 0; i < ARRAY_SIZE(sda_sf3_max_step_arrays); i++) {
1284 struct sensor_device_attribute *attr = 1671 struct sensor_device_attribute *attr =
1285 &sda_sf3_max_step_arrays[i]; 1672 &sda_sf3_max_step_arrays[i];
1286 if (data->REG_FAN_STEP_OUTPUT[attr->index] != 0xff) 1673 if (data->REG_FAN_STEP_OUTPUT &&
1674 data->REG_FAN_STEP_OUTPUT[attr->index] != 0xff)
1287 device_remove_file(dev, &attr->dev_attr); 1675 device_remove_file(dev, &attr->dev_attr);
1288 } 1676 }
1289 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays_fan4); i++) 1677 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays_fan4); i++)
@@ -1309,12 +1697,15 @@ static void w83627ehf_device_remove_files(struct device *dev)
1309 device_remove_file(dev, &sda_target_temp[i].dev_attr); 1697 device_remove_file(dev, &sda_target_temp[i].dev_attr);
1310 device_remove_file(dev, &sda_tolerance[i].dev_attr); 1698 device_remove_file(dev, &sda_tolerance[i].dev_attr);
1311 } 1699 }
1312 for (i = 0; i < 3; i++) { 1700 for (i = 0; i < NUM_REG_TEMP; i++) {
1313 if ((i == 2) && data->temp3_disable) 1701 if (!(data->have_temp & (1 << i)))
1314 continue; 1702 continue;
1315 device_remove_file(dev, &sda_temp_input[i].dev_attr); 1703 device_remove_file(dev, &sda_temp_input[i].dev_attr);
1704 device_remove_file(dev, &sda_temp_label[i].dev_attr);
1316 device_remove_file(dev, &sda_temp_max[i].dev_attr); 1705 device_remove_file(dev, &sda_temp_max[i].dev_attr);
1317 device_remove_file(dev, &sda_temp_max_hyst[i].dev_attr); 1706 device_remove_file(dev, &sda_temp_max_hyst[i].dev_attr);
1707 if (i > 2)
1708 continue;
1318 device_remove_file(dev, &sda_temp_alarm[i].dev_attr); 1709 device_remove_file(dev, &sda_temp_alarm[i].dev_attr);
1319 device_remove_file(dev, &sda_temp_type[i].dev_attr); 1710 device_remove_file(dev, &sda_temp_type[i].dev_attr);
1320 } 1711 }
@@ -1335,15 +1726,17 @@ static inline void __devinit w83627ehf_init_device(struct w83627ehf_data *data)
1335 w83627ehf_write_value(data, W83627EHF_REG_CONFIG, 1726 w83627ehf_write_value(data, W83627EHF_REG_CONFIG,
1336 tmp | 0x01); 1727 tmp | 0x01);
1337 1728
1338 /* Enable temp2 and temp3 if needed */ 1729 /* Enable temperature sensors if needed */
1339 for (i = 0; i < 2; i++) { 1730 for (i = 0; i < NUM_REG_TEMP; i++) {
1340 tmp = w83627ehf_read_value(data, 1731 if (!(data->have_temp & (1 << i)))
1341 W83627EHF_REG_TEMP_CONFIG[i]); 1732 continue;
1342 if ((i == 1) && data->temp3_disable) 1733 if (!data->reg_temp_config[i])
1343 continue; 1734 continue;
1735 tmp = w83627ehf_read_value(data,
1736 data->reg_temp_config[i]);
1344 if (tmp & 0x01) 1737 if (tmp & 0x01)
1345 w83627ehf_write_value(data, 1738 w83627ehf_write_value(data,
1346 W83627EHF_REG_TEMP_CONFIG[i], 1739 data->reg_temp_config[i],
1347 tmp & 0xfe); 1740 tmp & 0xfe);
1348 } 1741 }
1349 1742
@@ -1362,13 +1755,39 @@ static inline void __devinit w83627ehf_init_device(struct w83627ehf_data *data)
1362 } 1755 }
1363} 1756}
1364 1757
1758static void w82627ehf_swap_tempreg(struct w83627ehf_data *data,
1759 int r1, int r2)
1760{
1761 u16 tmp;
1762
1763 tmp = data->temp_src[r1];
1764 data->temp_src[r1] = data->temp_src[r2];
1765 data->temp_src[r2] = tmp;
1766
1767 tmp = data->reg_temp[r1];
1768 data->reg_temp[r1] = data->reg_temp[r2];
1769 data->reg_temp[r2] = tmp;
1770
1771 tmp = data->reg_temp_over[r1];
1772 data->reg_temp_over[r1] = data->reg_temp_over[r2];
1773 data->reg_temp_over[r2] = tmp;
1774
1775 tmp = data->reg_temp_hyst[r1];
1776 data->reg_temp_hyst[r1] = data->reg_temp_hyst[r2];
1777 data->reg_temp_hyst[r2] = tmp;
1778
1779 tmp = data->reg_temp_config[r1];
1780 data->reg_temp_config[r1] = data->reg_temp_config[r2];
1781 data->reg_temp_config[r2] = tmp;
1782}
1783
1365static int __devinit w83627ehf_probe(struct platform_device *pdev) 1784static int __devinit w83627ehf_probe(struct platform_device *pdev)
1366{ 1785{
1367 struct device *dev = &pdev->dev; 1786 struct device *dev = &pdev->dev;
1368 struct w83627ehf_sio_data *sio_data = dev->platform_data; 1787 struct w83627ehf_sio_data *sio_data = dev->platform_data;
1369 struct w83627ehf_data *data; 1788 struct w83627ehf_data *data;
1370 struct resource *res; 1789 struct resource *res;
1371 u8 fan4pin, fan5pin, en_vrm10; 1790 u8 fan3pin, fan4pin, fan4min, fan5pin, en_vrm10;
1372 int i, err = 0; 1791 int i, err = 0;
1373 1792
1374 res = platform_get_resource(pdev, IORESOURCE_IO, 0); 1793 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
@@ -1380,7 +1799,8 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)
1380 goto exit; 1799 goto exit;
1381 } 1800 }
1382 1801
1383 if (!(data = kzalloc(sizeof(struct w83627ehf_data), GFP_KERNEL))) { 1802 data = kzalloc(sizeof(struct w83627ehf_data), GFP_KERNEL);
1803 if (!data) {
1384 err = -ENOMEM; 1804 err = -ENOMEM;
1385 goto exit_release; 1805 goto exit_release;
1386 } 1806 }
@@ -1393,25 +1813,202 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)
1393 1813
1394 /* 627EHG and 627EHF have 10 voltage inputs; 627DHG and 667HG have 9 */ 1814 /* 627EHG and 627EHF have 10 voltage inputs; 627DHG and 667HG have 9 */
1395 data->in_num = (sio_data->kind == w83627ehf) ? 10 : 9; 1815 data->in_num = (sio_data->kind == w83627ehf) ? 10 : 9;
1396 /* 667HG has 3 pwms */ 1816 /* 667HG, NCT6775F, and NCT6776F have 3 pwms */
1397 data->pwm_num = (sio_data->kind == w83667hg 1817 data->pwm_num = (sio_data->kind == w83667hg
1398 || sio_data->kind == w83667hg_b) ? 3 : 4; 1818 || sio_data->kind == w83667hg_b
1819 || sio_data->kind == nct6775
1820 || sio_data->kind == nct6776) ? 3 : 4;
1399 1821
1822 data->have_temp = 0x07;
1400 /* Check temp3 configuration bit for 667HG */ 1823 /* Check temp3 configuration bit for 667HG */
1401 if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b) { 1824 if (sio_data->kind == w83667hg) {
1402 data->temp3_disable = w83627ehf_read_value(data, 1825 u8 reg;
1403 W83627EHF_REG_TEMP_CONFIG[1]) & 0x01; 1826
1404 data->in6_skip = !data->temp3_disable; 1827 reg = w83627ehf_read_value(data, W83627EHF_REG_TEMP_CONFIG[2]);
1828 if (reg & 0x01)
1829 data->have_temp &= ~(1 << 2);
1830 else
1831 data->in6_skip = 1; /* either temp3 or in6 */
1832 }
1833
1834 /* Deal with temperature register setup first. */
1835 if (sio_data->kind == nct6775 || sio_data->kind == nct6776) {
1836 int mask = 0;
1837
1838 /*
1839 * Display temperature sensor output only if it monitors
1840 * a source other than one already reported. Always display
1841 * first three temperature registers, though.
1842 */
1843 for (i = 0; i < NUM_REG_TEMP; i++) {
1844 u8 src;
1845
1846 data->reg_temp[i] = NCT6775_REG_TEMP[i];
1847 data->reg_temp_over[i] = NCT6775_REG_TEMP_OVER[i];
1848 data->reg_temp_hyst[i] = NCT6775_REG_TEMP_HYST[i];
1849 data->reg_temp_config[i] = NCT6775_REG_TEMP_CONFIG[i];
1850
1851 src = w83627ehf_read_value(data,
1852 NCT6775_REG_TEMP_SOURCE[i]);
1853 src &= 0x1f;
1854 if (src && !(mask & (1 << src))) {
1855 data->have_temp |= 1 << i;
1856 mask |= 1 << src;
1857 }
1858
1859 data->temp_src[i] = src;
1860
1861 /*
1862 * Now do some register swapping if index 0..2 don't
1863 * point to SYSTIN(1), CPUIN(2), and AUXIN(3).
1864 * Idea is to have the first three attributes
1865 * report SYSTIN, CPUIN, and AUXIN if possible
1866 * without overriding the basic system configuration.
1867 */
1868 if (i > 0 && data->temp_src[0] != 1
1869 && data->temp_src[i] == 1)
1870 w82627ehf_swap_tempreg(data, 0, i);
1871 if (i > 1 && data->temp_src[1] != 2
1872 && data->temp_src[i] == 2)
1873 w82627ehf_swap_tempreg(data, 1, i);
1874 if (i > 2 && data->temp_src[2] != 3
1875 && data->temp_src[i] == 3)
1876 w82627ehf_swap_tempreg(data, 2, i);
1877 }
1878 if (sio_data->kind == nct6776) {
1879 /*
1880 * On NCT6776, AUXTIN and VIN3 pins are shared.
1881 * Only way to detect it is to check if AUXTIN is used
1882 * as a temperature source, and if that source is
1883 * enabled.
1884 *
1885 * If that is the case, disable in6, which reports VIN3.
1886 * Otherwise disable temp3.
1887 */
1888 if (data->temp_src[2] == 3) {
1889 u8 reg;
1890
1891 if (data->reg_temp_config[2])
1892 reg = w83627ehf_read_value(data,
1893 data->reg_temp_config[2]);
1894 else
1895 reg = 0; /* Assume AUXTIN is used */
1896
1897 if (reg & 0x01)
1898 data->have_temp &= ~(1 << 2);
1899 else
1900 data->in6_skip = 1;
1901 }
1902 data->temp_label = nct6776_temp_label;
1903 } else {
1904 data->temp_label = nct6775_temp_label;
1905 }
1906 } else if (sio_data->kind == w83667hg_b) {
1907 u8 reg;
1908
1909 /*
1910 * Temperature sources are selected with bank 0, registers 0x49
1911 * and 0x4a.
1912 */
1913 for (i = 0; i < ARRAY_SIZE(W83627EHF_REG_TEMP); i++) {
1914 data->reg_temp[i] = W83627EHF_REG_TEMP[i];
1915 data->reg_temp_over[i] = W83627EHF_REG_TEMP_OVER[i];
1916 data->reg_temp_hyst[i] = W83627EHF_REG_TEMP_HYST[i];
1917 data->reg_temp_config[i] = W83627EHF_REG_TEMP_CONFIG[i];
1918 }
1919 reg = w83627ehf_read_value(data, 0x4a);
1920 data->temp_src[0] = reg >> 5;
1921 reg = w83627ehf_read_value(data, 0x49);
1922 data->temp_src[1] = reg & 0x07;
1923 data->temp_src[2] = (reg >> 4) & 0x07;
1924
1925 /*
1926 * W83667HG-B has another temperature register at 0x7e.
1927 * The temperature source is selected with register 0x7d.
1928 * Support it if the source differs from already reported
1929 * sources.
1930 */
1931 reg = w83627ehf_read_value(data, 0x7d);
1932 reg &= 0x07;
1933 if (reg != data->temp_src[0] && reg != data->temp_src[1]
1934 && reg != data->temp_src[2]) {
1935 data->temp_src[3] = reg;
1936 data->have_temp |= 1 << 3;
1937 }
1938
1939 /*
1940 * Chip supports either AUXTIN or VIN3. Try to find out which
1941 * one.
1942 */
1943 reg = w83627ehf_read_value(data, W83627EHF_REG_TEMP_CONFIG[2]);
1944 if (data->temp_src[2] == 2 && (reg & 0x01))
1945 data->have_temp &= ~(1 << 2);
1946
1947 if ((data->temp_src[2] == 2 && (data->have_temp & (1 << 2)))
1948 || (data->temp_src[3] == 2 && (data->have_temp & (1 << 3))))
1949 data->in6_skip = 1;
1950
1951 data->temp_label = w83667hg_b_temp_label;
1952 } else {
1953 /* Temperature sources are fixed */
1954 for (i = 0; i < 3; i++) {
1955 data->reg_temp[i] = W83627EHF_REG_TEMP[i];
1956 data->reg_temp_over[i] = W83627EHF_REG_TEMP_OVER[i];
1957 data->reg_temp_hyst[i] = W83627EHF_REG_TEMP_HYST[i];
1958 data->reg_temp_config[i] = W83627EHF_REG_TEMP_CONFIG[i];
1959 }
1405 } 1960 }
1406 1961
1407 data->REG_FAN_START_OUTPUT = W83627EHF_REG_FAN_START_OUTPUT; 1962 if (sio_data->kind == nct6775) {
1408 data->REG_FAN_STOP_OUTPUT = W83627EHF_REG_FAN_STOP_OUTPUT; 1963 data->has_fan_div = true;
1409 if (sio_data->kind == w83667hg_b) { 1964 data->fan_from_reg = fan_from_reg16;
1965 data->fan_from_reg_min = fan_from_reg8;
1966 data->REG_PWM = NCT6775_REG_PWM;
1967 data->REG_TARGET = NCT6775_REG_TARGET;
1968 data->REG_FAN = NCT6775_REG_FAN;
1969 data->REG_FAN_MIN = W83627EHF_REG_FAN_MIN;
1970 data->REG_FAN_START_OUTPUT = NCT6775_REG_FAN_START_OUTPUT;
1971 data->REG_FAN_STOP_OUTPUT = NCT6775_REG_FAN_STOP_OUTPUT;
1972 data->REG_FAN_STOP_TIME = NCT6775_REG_FAN_STOP_TIME;
1973 data->REG_FAN_MAX_OUTPUT = NCT6775_REG_FAN_MAX_OUTPUT;
1974 data->REG_FAN_STEP_OUTPUT = NCT6775_REG_FAN_STEP_OUTPUT;
1975 } else if (sio_data->kind == nct6776) {
1976 data->has_fan_div = false;
1977 data->fan_from_reg = fan_from_reg13;
1978 data->fan_from_reg_min = fan_from_reg13;
1979 data->REG_PWM = NCT6775_REG_PWM;
1980 data->REG_TARGET = NCT6775_REG_TARGET;
1981 data->REG_FAN = NCT6775_REG_FAN;
1982 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN;
1983 data->REG_FAN_START_OUTPUT = NCT6775_REG_FAN_START_OUTPUT;
1984 data->REG_FAN_STOP_OUTPUT = NCT6775_REG_FAN_STOP_OUTPUT;
1985 data->REG_FAN_STOP_TIME = NCT6775_REG_FAN_STOP_TIME;
1986 } else if (sio_data->kind == w83667hg_b) {
1987 data->has_fan_div = true;
1988 data->fan_from_reg = fan_from_reg8;
1989 data->fan_from_reg_min = fan_from_reg8;
1990 data->REG_PWM = W83627EHF_REG_PWM;
1991 data->REG_TARGET = W83627EHF_REG_TARGET;
1992 data->REG_FAN = W83627EHF_REG_FAN;
1993 data->REG_FAN_MIN = W83627EHF_REG_FAN_MIN;
1994 data->REG_FAN_START_OUTPUT = W83627EHF_REG_FAN_START_OUTPUT;
1995 data->REG_FAN_STOP_OUTPUT = W83627EHF_REG_FAN_STOP_OUTPUT;
1996 data->REG_FAN_STOP_TIME = W83627EHF_REG_FAN_STOP_TIME;
1410 data->REG_FAN_MAX_OUTPUT = 1997 data->REG_FAN_MAX_OUTPUT =
1411 W83627EHF_REG_FAN_MAX_OUTPUT_W83667_B; 1998 W83627EHF_REG_FAN_MAX_OUTPUT_W83667_B;
1412 data->REG_FAN_STEP_OUTPUT = 1999 data->REG_FAN_STEP_OUTPUT =
1413 W83627EHF_REG_FAN_STEP_OUTPUT_W83667_B; 2000 W83627EHF_REG_FAN_STEP_OUTPUT_W83667_B;
1414 } else { 2001 } else {
2002 data->has_fan_div = true;
2003 data->fan_from_reg = fan_from_reg8;
2004 data->fan_from_reg_min = fan_from_reg8;
2005 data->REG_PWM = W83627EHF_REG_PWM;
2006 data->REG_TARGET = W83627EHF_REG_TARGET;
2007 data->REG_FAN = W83627EHF_REG_FAN;
2008 data->REG_FAN_MIN = W83627EHF_REG_FAN_MIN;
2009 data->REG_FAN_START_OUTPUT = W83627EHF_REG_FAN_START_OUTPUT;
2010 data->REG_FAN_STOP_OUTPUT = W83627EHF_REG_FAN_STOP_OUTPUT;
2011 data->REG_FAN_STOP_TIME = W83627EHF_REG_FAN_STOP_TIME;
1415 data->REG_FAN_MAX_OUTPUT = 2012 data->REG_FAN_MAX_OUTPUT =
1416 W83627EHF_REG_FAN_MAX_OUTPUT_COMMON; 2013 W83627EHF_REG_FAN_MAX_OUTPUT_COMMON;
1417 data->REG_FAN_STEP_OUTPUT = 2014 data->REG_FAN_STEP_OUTPUT =
@@ -1424,7 +2021,8 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)
1424 data->vrm = vid_which_vrm(); 2021 data->vrm = vid_which_vrm();
1425 superio_enter(sio_data->sioreg); 2022 superio_enter(sio_data->sioreg);
1426 /* Read VID value */ 2023 /* Read VID value */
1427 if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b) { 2024 if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b ||
2025 sio_data->kind == nct6775 || sio_data->kind == nct6776) {
1428 /* W83667HG has different pins for VID input and output, so 2026 /* W83667HG has different pins for VID input and output, so
1429 we can get the VID input values directly at logical device D 2027 we can get the VID input values directly at logical device D
1430 0xe3. */ 2028 0xe3. */
@@ -1475,13 +2073,44 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)
1475 } 2073 }
1476 2074
1477 /* fan4 and fan5 share some pins with the GPIO and serial flash */ 2075 /* fan4 and fan5 share some pins with the GPIO and serial flash */
1478 if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b) { 2076 if (sio_data->kind == nct6775) {
1479 fan5pin = superio_inb(sio_data->sioreg, 0x27) & 0x20; 2077 /* On NCT6775, fan4 shares pins with the fdc interface */
2078 fan3pin = 1;
2079 fan4pin = !(superio_inb(sio_data->sioreg, 0x2A) & 0x80);
2080 fan4min = 0;
2081 fan5pin = 0;
2082 } else if (sio_data->kind == nct6776) {
2083 fan3pin = !(superio_inb(sio_data->sioreg, 0x24) & 0x40);
2084 fan4pin = !!(superio_inb(sio_data->sioreg, 0x1C) & 0x01);
2085 fan5pin = !!(superio_inb(sio_data->sioreg, 0x1C) & 0x02);
2086 fan4min = fan4pin;
2087 } else if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b) {
2088 fan3pin = 1;
1480 fan4pin = superio_inb(sio_data->sioreg, 0x27) & 0x40; 2089 fan4pin = superio_inb(sio_data->sioreg, 0x27) & 0x40;
2090 fan5pin = superio_inb(sio_data->sioreg, 0x27) & 0x20;
2091 fan4min = fan4pin;
1481 } else { 2092 } else {
1482 fan5pin = !(superio_inb(sio_data->sioreg, 0x24) & 0x02); 2093 fan3pin = 1;
1483 fan4pin = !(superio_inb(sio_data->sioreg, 0x29) & 0x06); 2094 fan4pin = !(superio_inb(sio_data->sioreg, 0x29) & 0x06);
2095 fan5pin = !(superio_inb(sio_data->sioreg, 0x24) & 0x02);
2096 fan4min = fan4pin;
1484 } 2097 }
2098
2099 if (fan_debounce &&
2100 (sio_data->kind == nct6775 || sio_data->kind == nct6776)) {
2101 u8 tmp;
2102
2103 superio_select(sio_data->sioreg, W83627EHF_LD_HWM);
2104 tmp = superio_inb(sio_data->sioreg, NCT6775_REG_FAN_DEBOUNCE);
2105 if (sio_data->kind == nct6776)
2106 superio_outb(sio_data->sioreg, NCT6775_REG_FAN_DEBOUNCE,
2107 0x3e | tmp);
2108 else
2109 superio_outb(sio_data->sioreg, NCT6775_REG_FAN_DEBOUNCE,
2110 0x1e | tmp);
2111 pr_info("Enabled fan debounce for chip %s\n", data->name);
2112 }
2113
1485 superio_exit(sio_data->sioreg); 2114 superio_exit(sio_data->sioreg);
1486 2115
1487 /* It looks like fan4 and fan5 pins can be alternatively used 2116 /* It looks like fan4 and fan5 pins can be alternatively used
@@ -1490,26 +2119,54 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)
1490 connected fan5 as input unless they are emitting log 1, which 2119 connected fan5 as input unless they are emitting log 1, which
1491 is not the default. */ 2120 is not the default. */
1492 2121
1493 data->has_fan = 0x07; /* fan1, fan2 and fan3 */ 2122 data->has_fan = data->has_fan_min = 0x03; /* fan1 and fan2 */
1494 i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV1); 2123
1495 if ((i & (1 << 2)) && fan4pin) 2124 data->has_fan |= (fan3pin << 2);
1496 data->has_fan |= (1 << 3); 2125 data->has_fan_min |= (fan3pin << 2);
1497 if (!(i & (1 << 1)) && fan5pin) 2126
1498 data->has_fan |= (1 << 4); 2127 /*
2128 * NCT6775F and NCT6776F don't have the W83627EHF_REG_FANDIV1 register
2129 */
2130 if (sio_data->kind == nct6775 || sio_data->kind == nct6776) {
2131 data->has_fan |= (fan4pin << 3) | (fan5pin << 4);
2132 data->has_fan_min |= (fan4min << 3) | (fan5pin << 4);
2133 } else {
2134 i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV1);
2135 if ((i & (1 << 2)) && fan4pin) {
2136 data->has_fan |= (1 << 3);
2137 data->has_fan_min |= (1 << 3);
2138 }
2139 if (!(i & (1 << 1)) && fan5pin) {
2140 data->has_fan |= (1 << 4);
2141 data->has_fan_min |= (1 << 4);
2142 }
2143 }
1499 2144
1500 /* Read fan clock dividers immediately */ 2145 /* Read fan clock dividers immediately */
1501 w83627ehf_update_fan_div(data); 2146 w83627ehf_update_fan_div_common(dev, data);
2147
2148 /* Read pwm data to save original values */
2149 w83627ehf_update_pwm_common(dev, data);
2150 for (i = 0; i < data->pwm_num; i++)
2151 data->pwm_enable_orig[i] = data->pwm_enable[i];
2152
2153 /* Read pwm data to save original values */
2154 w83627ehf_update_pwm_common(dev, data);
2155 for (i = 0; i < data->pwm_num; i++)
2156 data->pwm_enable_orig[i] = data->pwm_enable[i];
1502 2157
1503 /* Register sysfs hooks */ 2158 /* Register sysfs hooks */
1504 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays); i++) 2159 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays); i++) {
1505 if ((err = device_create_file(dev, 2160 err = device_create_file(dev, &sda_sf3_arrays[i].dev_attr);
1506 &sda_sf3_arrays[i].dev_attr))) 2161 if (err)
1507 goto exit_remove; 2162 goto exit_remove;
2163 }
1508 2164
1509 for (i = 0; i < ARRAY_SIZE(sda_sf3_max_step_arrays); i++) { 2165 for (i = 0; i < ARRAY_SIZE(sda_sf3_max_step_arrays); i++) {
1510 struct sensor_device_attribute *attr = 2166 struct sensor_device_attribute *attr =
1511 &sda_sf3_max_step_arrays[i]; 2167 &sda_sf3_max_step_arrays[i];
1512 if (data->REG_FAN_STEP_OUTPUT[attr->index] != 0xff) { 2168 if (data->REG_FAN_STEP_OUTPUT &&
2169 data->REG_FAN_STEP_OUTPUT[attr->index] != 0xff) {
1513 err = device_create_file(dev, &attr->dev_attr); 2170 err = device_create_file(dev, &attr->dev_attr);
1514 if (err) 2171 if (err)
1515 goto exit_remove; 2172 goto exit_remove;
@@ -1518,8 +2175,9 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)
1518 /* if fan4 is enabled create the sf3 files for it */ 2175 /* if fan4 is enabled create the sf3 files for it */
1519 if ((data->has_fan & (1 << 3)) && data->pwm_num >= 4) 2176 if ((data->has_fan & (1 << 3)) && data->pwm_num >= 4)
1520 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays_fan4); i++) { 2177 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays_fan4); i++) {
1521 if ((err = device_create_file(dev, 2178 err = device_create_file(dev,
1522 &sda_sf3_arrays_fan4[i].dev_attr))) 2179 &sda_sf3_arrays_fan4[i].dev_attr);
2180 if (err)
1523 goto exit_remove; 2181 goto exit_remove;
1524 } 2182 }
1525 2183
@@ -1541,12 +2199,20 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)
1541 if ((err = device_create_file(dev, 2199 if ((err = device_create_file(dev,
1542 &sda_fan_input[i].dev_attr)) 2200 &sda_fan_input[i].dev_attr))
1543 || (err = device_create_file(dev, 2201 || (err = device_create_file(dev,
1544 &sda_fan_alarm[i].dev_attr)) 2202 &sda_fan_alarm[i].dev_attr)))
1545 || (err = device_create_file(dev,
1546 &sda_fan_div[i].dev_attr))
1547 || (err = device_create_file(dev,
1548 &sda_fan_min[i].dev_attr)))
1549 goto exit_remove; 2203 goto exit_remove;
2204 if (sio_data->kind != nct6776) {
2205 err = device_create_file(dev,
2206 &sda_fan_div[i].dev_attr);
2207 if (err)
2208 goto exit_remove;
2209 }
2210 if (data->has_fan_min & (1 << i)) {
2211 err = device_create_file(dev,
2212 &sda_fan_min[i].dev_attr);
2213 if (err)
2214 goto exit_remove;
2215 }
1550 if (i < data->pwm_num && 2216 if (i < data->pwm_num &&
1551 ((err = device_create_file(dev, 2217 ((err = device_create_file(dev,
1552 &sda_pwm[i].dev_attr)) 2218 &sda_pwm[i].dev_attr))
@@ -1562,16 +2228,33 @@ static int __devinit w83627ehf_probe(struct platform_device *pdev)
1562 } 2228 }
1563 } 2229 }
1564 2230
1565 for (i = 0; i < 3; i++) { 2231 for (i = 0; i < NUM_REG_TEMP; i++) {
1566 if ((i == 2) && data->temp3_disable) 2232 if (!(data->have_temp & (1 << i)))
2233 continue;
2234 err = device_create_file(dev, &sda_temp_input[i].dev_attr);
2235 if (err)
2236 goto exit_remove;
2237 if (data->temp_label) {
2238 err = device_create_file(dev,
2239 &sda_temp_label[i].dev_attr);
2240 if (err)
2241 goto exit_remove;
2242 }
2243 if (data->reg_temp_over[i]) {
2244 err = device_create_file(dev,
2245 &sda_temp_max[i].dev_attr);
2246 if (err)
2247 goto exit_remove;
2248 }
2249 if (data->reg_temp_hyst[i]) {
2250 err = device_create_file(dev,
2251 &sda_temp_max_hyst[i].dev_attr);
2252 if (err)
2253 goto exit_remove;
2254 }
2255 if (i > 2)
1567 continue; 2256 continue;
1568 if ((err = device_create_file(dev, 2257 if ((err = device_create_file(dev,
1569 &sda_temp_input[i].dev_attr))
1570 || (err = device_create_file(dev,
1571 &sda_temp_max[i].dev_attr))
1572 || (err = device_create_file(dev,
1573 &sda_temp_max_hyst[i].dev_attr))
1574 || (err = device_create_file(dev,
1575 &sda_temp_alarm[i].dev_attr)) 2258 &sda_temp_alarm[i].dev_attr))
1576 || (err = device_create_file(dev, 2259 || (err = device_create_file(dev,
1577 &sda_temp_type[i].dev_attr))) 2260 &sda_temp_type[i].dev_attr)))
@@ -1632,6 +2315,8 @@ static int __init w83627ehf_find(int sioaddr, unsigned short *addr,
1632 static const char __initdata sio_name_W83627DHG_P[] = "W83627DHG-P"; 2315 static const char __initdata sio_name_W83627DHG_P[] = "W83627DHG-P";
1633 static const char __initdata sio_name_W83667HG[] = "W83667HG"; 2316 static const char __initdata sio_name_W83667HG[] = "W83667HG";
1634 static const char __initdata sio_name_W83667HG_B[] = "W83667HG-B"; 2317 static const char __initdata sio_name_W83667HG_B[] = "W83667HG-B";
2318 static const char __initdata sio_name_NCT6775[] = "NCT6775F";
2319 static const char __initdata sio_name_NCT6776[] = "NCT6776F";
1635 2320
1636 u16 val; 2321 u16 val;
1637 const char *sio_name; 2322 const char *sio_name;
@@ -1668,6 +2353,14 @@ static int __init w83627ehf_find(int sioaddr, unsigned short *addr,
1668 sio_data->kind = w83667hg_b; 2353 sio_data->kind = w83667hg_b;
1669 sio_name = sio_name_W83667HG_B; 2354 sio_name = sio_name_W83667HG_B;
1670 break; 2355 break;
2356 case SIO_NCT6775_ID:
2357 sio_data->kind = nct6775;
2358 sio_name = sio_name_NCT6775;
2359 break;
2360 case SIO_NCT6776_ID:
2361 sio_data->kind = nct6776;
2362 sio_name = sio_name_NCT6776;
2363 break;
1671 default: 2364 default:
1672 if (val != 0xffff) 2365 if (val != 0xffff)
1673 pr_debug("unsupported chip ID: 0x%04x\n", val); 2366 pr_debug("unsupported chip ID: 0x%04x\n", val);
@@ -1689,7 +2382,8 @@ static int __init w83627ehf_find(int sioaddr, unsigned short *addr,
1689 /* Activate logical device if needed */ 2382 /* Activate logical device if needed */
1690 val = superio_inb(sioaddr, SIO_REG_ENABLE); 2383 val = superio_inb(sioaddr, SIO_REG_ENABLE);
1691 if (!(val & 0x01)) { 2384 if (!(val & 0x01)) {
1692 pr_warn("Forcibly enabling Super-I/O. Sensor is probably unusable.\n"); 2385 pr_warn("Forcibly enabling Super-I/O. "
2386 "Sensor is probably unusable.\n");
1693 superio_outb(sioaddr, SIO_REG_ENABLE, val | 0x01); 2387 superio_outb(sioaddr, SIO_REG_ENABLE, val | 0x01);
1694 } 2388 }
1695 2389
@@ -1726,7 +2420,8 @@ static int __init sensors_w83627ehf_init(void)
1726 if (err) 2420 if (err)
1727 goto exit; 2421 goto exit;
1728 2422
1729 if (!(pdev = platform_device_alloc(DRVNAME, address))) { 2423 pdev = platform_device_alloc(DRVNAME, address);
2424 if (!pdev) {
1730 err = -ENOMEM; 2425 err = -ENOMEM;
1731 pr_err("Device allocation failed\n"); 2426 pr_err("Device allocation failed\n");
1732 goto exit_unregister; 2427 goto exit_unregister;