1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
36
37#include <linux/module.h>
38#include <linux/init.h>
39#include <linux/slab.h>
40#include <linux/jiffies.h>
41#include <linux/platform_device.h>
42#include <linux/hwmon.h>
43#include <linux/hwmon-sysfs.h>
44#include <linux/hwmon-vid.h>
45#include <linux/err.h>
46#include <linux/mutex.h>
47#include <linux/acpi.h>
48#include <linux/io.h>
49#include "lm75.h"
50
51enum kinds {
52 w83627ehf, w83627dhg, w83627dhg_p, w83627uhg,
53 w83667hg, w83667hg_b, nct6775, nct6776,
54};
55
56
57static const char * const w83627ehf_device_names[] = {
58 "w83627ehf",
59 "w83627dhg",
60 "w83627dhg",
61 "w83627uhg",
62 "w83667hg",
63 "w83667hg",
64 "nct6775",
65 "nct6776",
66};
67
68static unsigned short force_id;
69module_param(force_id, ushort, 0);
70MODULE_PARM_DESC(force_id, "Override the detected device ID");
71
72static unsigned short fan_debounce;
73module_param(fan_debounce, ushort, 0);
74MODULE_PARM_DESC(fan_debounce, "Enable debouncing for fan RPM signal");
75
76#define DRVNAME "w83627ehf"
77
78
79
80
81
82#define W83627EHF_LD_HWM 0x0b
83#define W83667HG_LD_VID 0x0d
84
85#define SIO_REG_LDSEL 0x07
86#define SIO_REG_DEVID 0x20
87#define SIO_REG_EN_VRM10 0x2C
88#define SIO_REG_ENABLE 0x30
89#define SIO_REG_ADDR 0x60
90#define SIO_REG_VID_CTRL 0xF0
91#define SIO_REG_VID_DATA 0xF1
92
93#define SIO_W83627EHF_ID 0x8850
94#define SIO_W83627EHG_ID 0x8860
95#define SIO_W83627DHG_ID 0xa020
96#define SIO_W83627DHG_P_ID 0xb070
97#define SIO_W83627UHG_ID 0xa230
98#define SIO_W83667HG_ID 0xa510
99#define SIO_W83667HG_B_ID 0xb350
100#define SIO_NCT6775_ID 0xb470
101#define SIO_NCT6776_ID 0xc330
102#define SIO_ID_MASK 0xFFF0
103
104static inline void
105superio_outb(int ioreg, int reg, int val)
106{
107 outb(reg, ioreg);
108 outb(val, ioreg + 1);
109}
110
111static inline int
112superio_inb(int ioreg, int reg)
113{
114 outb(reg, ioreg);
115 return inb(ioreg + 1);
116}
117
118static inline void
119superio_select(int ioreg, int ld)
120{
121 outb(SIO_REG_LDSEL, ioreg);
122 outb(ld, ioreg + 1);
123}
124
125static inline int
126superio_enter(int ioreg)
127{
128 if (!request_muxed_region(ioreg, 2, DRVNAME))
129 return -EBUSY;
130
131 outb(0x87, ioreg);
132 outb(0x87, ioreg);
133
134 return 0;
135}
136
137static inline void
138superio_exit(int ioreg)
139{
140 outb(0xaa, ioreg);
141 outb(0x02, ioreg);
142 outb(0x02, ioreg + 1);
143 release_region(ioreg, 2);
144}
145
146
147
148
149
150#define IOREGION_ALIGNMENT (~7)
151#define IOREGION_OFFSET 5
152#define IOREGION_LENGTH 2
153#define ADDR_REG_OFFSET 0
154#define DATA_REG_OFFSET 1
155
156#define W83627EHF_REG_BANK 0x4E
157#define W83627EHF_REG_CONFIG 0x40
158
159
160
161
162
163
164
165
166
167static const u16 W83627EHF_REG_FAN[] = { 0x28, 0x29, 0x2a, 0x3f, 0x553 };
168static const u16 W83627EHF_REG_FAN_MIN[] = { 0x3b, 0x3c, 0x3d, 0x3e, 0x55c };
169
170
171#define W83627EHF_REG_IN_MAX(nr) ((nr < 7) ? (0x2b + (nr) * 2) : \
172 (0x554 + (((nr) - 7) * 2)))
173#define W83627EHF_REG_IN_MIN(nr) ((nr < 7) ? (0x2c + (nr) * 2) : \
174 (0x555 + (((nr) - 7) * 2)))
175#define W83627EHF_REG_IN(nr) ((nr < 7) ? (0x20 + (nr)) : \
176 (0x550 + (nr) - 7))
177
178static const u16 W83627EHF_REG_TEMP[] = { 0x27, 0x150, 0x250, 0x7e };
179static const u16 W83627EHF_REG_TEMP_HYST[] = { 0x3a, 0x153, 0x253, 0 };
180static const u16 W83627EHF_REG_TEMP_OVER[] = { 0x39, 0x155, 0x255, 0 };
181static const u16 W83627EHF_REG_TEMP_CONFIG[] = { 0, 0x152, 0x252, 0 };
182
183
184#define W83627EHF_REG_FANDIV1 0x47
185#define W83627EHF_REG_FANDIV2 0x4B
186#define W83627EHF_REG_VBAT 0x5D
187#define W83627EHF_REG_DIODE 0x59
188#define W83627EHF_REG_SMI_OVT 0x4C
189
190
191#define NCT6775_REG_FANDIV1 0x506
192#define NCT6775_REG_FANDIV2 0x507
193#define NCT6775_REG_FAN_DEBOUNCE 0xf0
194
195#define W83627EHF_REG_ALARM1 0x459
196#define W83627EHF_REG_ALARM2 0x45A
197#define W83627EHF_REG_ALARM3 0x45B
198
199#define W83627EHF_REG_CASEOPEN_DET 0x42
200#define W83627EHF_REG_CASEOPEN_CLR 0x46
201
202
203#define W83627EHF_REG_FAN_STEPUP_TIME 0x0f
204#define W83627EHF_REG_FAN_STEPDOWN_TIME 0x0e
205
206
207static const u8 W83627EHF_REG_PWM_ENABLE[] = {
208 0x04,
209 0x04,
210 0x12,
211 0x62,
212};
213
214static const u8 W83627EHF_PWM_MODE_SHIFT[] = { 0, 1, 0, 6 };
215static const u8 W83627EHF_PWM_ENABLE_SHIFT[] = { 2, 4, 1, 4 };
216
217
218static const u16 W83627EHF_REG_PWM[] = { 0x01, 0x03, 0x11, 0x61 };
219static const u16 W83627EHF_REG_TARGET[] = { 0x05, 0x06, 0x13, 0x63 };
220static const u8 W83627EHF_REG_TOLERANCE[] = { 0x07, 0x07, 0x14, 0x62 };
221
222
223static const u16 W83627EHF_REG_FAN_START_OUTPUT[] = { 0x0a, 0x0b, 0x16, 0x65 };
224static const u16 W83627EHF_REG_FAN_STOP_OUTPUT[] = { 0x08, 0x09, 0x15, 0x64 };
225static const u16 W83627EHF_REG_FAN_STOP_TIME[] = { 0x0c, 0x0d, 0x17, 0x66 };
226
227static const u16 W83627EHF_REG_FAN_MAX_OUTPUT_COMMON[]
228 = { 0xff, 0x67, 0xff, 0x69 };
229static const u16 W83627EHF_REG_FAN_STEP_OUTPUT_COMMON[]
230 = { 0xff, 0x68, 0xff, 0x6a };
231
232static const u16 W83627EHF_REG_FAN_MAX_OUTPUT_W83667_B[] = { 0x67, 0x69, 0x6b };
233static const u16 W83627EHF_REG_FAN_STEP_OUTPUT_W83667_B[]
234 = { 0x68, 0x6a, 0x6c };
235
236static const u16 W83627EHF_REG_TEMP_OFFSET[] = { 0x454, 0x455, 0x456 };
237
238static const u16 NCT6775_REG_TARGET[] = { 0x101, 0x201, 0x301 };
239static const u16 NCT6775_REG_FAN_MODE[] = { 0x102, 0x202, 0x302 };
240static const u16 NCT6775_REG_FAN_STOP_OUTPUT[] = { 0x105, 0x205, 0x305 };
241static const u16 NCT6775_REG_FAN_START_OUTPUT[] = { 0x106, 0x206, 0x306 };
242static const u16 NCT6775_REG_FAN_STOP_TIME[] = { 0x107, 0x207, 0x307 };
243static const u16 NCT6775_REG_PWM[] = { 0x109, 0x209, 0x309 };
244static const u16 NCT6775_REG_FAN_MAX_OUTPUT[] = { 0x10a, 0x20a, 0x30a };
245static const u16 NCT6775_REG_FAN_STEP_OUTPUT[] = { 0x10b, 0x20b, 0x30b };
246static const u16 NCT6775_REG_FAN[] = { 0x630, 0x632, 0x634, 0x636, 0x638 };
247static const u16 NCT6776_REG_FAN_MIN[] = { 0x63a, 0x63c, 0x63e, 0x640, 0x642};
248
249static const u16 NCT6775_REG_TEMP[]
250 = { 0x27, 0x150, 0x250, 0x73, 0x75, 0x77, 0x62b, 0x62c, 0x62d };
251static const u16 NCT6775_REG_TEMP_CONFIG[]
252 = { 0, 0x152, 0x252, 0, 0, 0, 0x628, 0x629, 0x62A };
253static const u16 NCT6775_REG_TEMP_HYST[]
254 = { 0x3a, 0x153, 0x253, 0, 0, 0, 0x673, 0x678, 0x67D };
255static const u16 NCT6775_REG_TEMP_OVER[]
256 = { 0x39, 0x155, 0x255, 0, 0, 0, 0x672, 0x677, 0x67C };
257static const u16 NCT6775_REG_TEMP_SOURCE[]
258 = { 0x621, 0x622, 0x623, 0x100, 0x200, 0x300, 0x624, 0x625, 0x626 };
259
260static const char *const w83667hg_b_temp_label[] = {
261 "SYSTIN",
262 "CPUTIN",
263 "AUXTIN",
264 "AMDTSI",
265 "PECI Agent 1",
266 "PECI Agent 2",
267 "PECI Agent 3",
268 "PECI Agent 4"
269};
270
271static const char *const nct6775_temp_label[] = {
272 "",
273 "SYSTIN",
274 "CPUTIN",
275 "AUXTIN",
276 "AMD SB-TSI",
277 "PECI Agent 0",
278 "PECI Agent 1",
279 "PECI Agent 2",
280 "PECI Agent 3",
281 "PECI Agent 4",
282 "PECI Agent 5",
283 "PECI Agent 6",
284 "PECI Agent 7",
285 "PCH_CHIP_CPU_MAX_TEMP",
286 "PCH_CHIP_TEMP",
287 "PCH_CPU_TEMP",
288 "PCH_MCH_TEMP",
289 "PCH_DIM0_TEMP",
290 "PCH_DIM1_TEMP",
291 "PCH_DIM2_TEMP",
292 "PCH_DIM3_TEMP"
293};
294
295static const char *const nct6776_temp_label[] = {
296 "",
297 "SYSTIN",
298 "CPUTIN",
299 "AUXTIN",
300 "SMBUSMASTER 0",
301 "SMBUSMASTER 1",
302 "SMBUSMASTER 2",
303 "SMBUSMASTER 3",
304 "SMBUSMASTER 4",
305 "SMBUSMASTER 5",
306 "SMBUSMASTER 6",
307 "SMBUSMASTER 7",
308 "PECI Agent 0",
309 "PECI Agent 1",
310 "PCH_CHIP_CPU_MAX_TEMP",
311 "PCH_CHIP_TEMP",
312 "PCH_CPU_TEMP",
313 "PCH_MCH_TEMP",
314 "PCH_DIM0_TEMP",
315 "PCH_DIM1_TEMP",
316 "PCH_DIM2_TEMP",
317 "PCH_DIM3_TEMP",
318 "BYTE_TEMP"
319};
320
321#define NUM_REG_TEMP ARRAY_SIZE(NCT6775_REG_TEMP)
322
323static int is_word_sized(u16 reg)
324{
325 return ((((reg & 0xff00) == 0x100
326 || (reg & 0xff00) == 0x200)
327 && ((reg & 0x00ff) == 0x50
328 || (reg & 0x00ff) == 0x53
329 || (reg & 0x00ff) == 0x55))
330 || (reg & 0xfff0) == 0x630
331 || reg == 0x640 || reg == 0x642
332 || ((reg & 0xfff0) == 0x650
333 && (reg & 0x000f) >= 0x06)
334 || reg == 0x73 || reg == 0x75 || reg == 0x77
335 );
336}
337
338
339
340
341
342
343static inline unsigned int step_time_from_reg(u8 reg, u8 mode)
344{
345 return mode ? 100 * reg : 400 * reg;
346}
347
348static inline u8 step_time_to_reg(unsigned int msec, u8 mode)
349{
350 return clamp_val((mode ? (msec + 50) / 100 : (msec + 200) / 400),
351 1, 255);
352}
353
354static unsigned int fan_from_reg8(u16 reg, unsigned int divreg)
355{
356 if (reg == 0 || reg == 255)
357 return 0;
358 return 1350000U / (reg << divreg);
359}
360
361static unsigned int fan_from_reg13(u16 reg, unsigned int divreg)
362{
363 if ((reg & 0xff1f) == 0xff1f)
364 return 0;
365
366 reg = (reg & 0x1f) | ((reg & 0xff00) >> 3);
367
368 if (reg == 0)
369 return 0;
370
371 return 1350000U / reg;
372}
373
374static unsigned int fan_from_reg16(u16 reg, unsigned int divreg)
375{
376 if (reg == 0 || reg == 0xffff)
377 return 0;
378
379
380
381
382
383 return 1350000U / (reg << divreg);
384}
385
386static inline unsigned int
387div_from_reg(u8 reg)
388{
389 return 1 << reg;
390}
391
392
393
394
395
396static const u16 scale_in_common[10] = {
397 800, 800, 1600, 1600, 800, 800, 800, 1600, 1600, 800
398};
399static const u16 scale_in_w83627uhg[9] = {
400 800, 800, 3328, 3424, 800, 800, 0, 3328, 3400
401};
402
403static inline long in_from_reg(u8 reg, u8 nr, const u16 *scale_in)
404{
405 return DIV_ROUND_CLOSEST(reg * scale_in[nr], 100);
406}
407
408static inline u8 in_to_reg(u32 val, u8 nr, const u16 *scale_in)
409{
410 return clamp_val(DIV_ROUND_CLOSEST(val * 100, scale_in[nr]), 0, 255);
411}
412
413
414
415
416
417struct w83627ehf_data {
418 int addr;
419 const char *name;
420
421 struct device *hwmon_dev;
422 struct mutex lock;
423
424 u16 reg_temp[NUM_REG_TEMP];
425 u16 reg_temp_over[NUM_REG_TEMP];
426 u16 reg_temp_hyst[NUM_REG_TEMP];
427 u16 reg_temp_config[NUM_REG_TEMP];
428 u8 temp_src[NUM_REG_TEMP];
429 const char * const *temp_label;
430
431 const u16 *REG_PWM;
432 const u16 *REG_TARGET;
433 const u16 *REG_FAN;
434 const u16 *REG_FAN_MIN;
435 const u16 *REG_FAN_START_OUTPUT;
436 const u16 *REG_FAN_STOP_OUTPUT;
437 const u16 *REG_FAN_STOP_TIME;
438 const u16 *REG_FAN_MAX_OUTPUT;
439 const u16 *REG_FAN_STEP_OUTPUT;
440 const u16 *scale_in;
441
442 unsigned int (*fan_from_reg)(u16 reg, unsigned int divreg);
443 unsigned int (*fan_from_reg_min)(u16 reg, unsigned int divreg);
444
445 struct mutex update_lock;
446 char valid;
447 unsigned long last_updated;
448
449
450 u8 bank;
451 u8 in_num;
452 u8 in[10];
453 u8 in_max[10];
454 u8 in_min[10];
455 unsigned int rpm[5];
456 u16 fan_min[5];
457 u8 fan_div[5];
458 u8 has_fan;
459 u8 has_fan_min;
460 bool has_fan_div;
461 u8 temp_type[3];
462 s8 temp_offset[3];
463 s16 temp[9];
464 s16 temp_max[9];
465 s16 temp_max_hyst[9];
466 u32 alarms;
467 u8 caseopen;
468
469 u8 pwm_mode[4];
470 u8 pwm_enable[4];
471
472
473
474
475
476
477
478 u8 pwm_enable_orig[4];
479 u8 pwm_num;
480 u8 pwm[4];
481 u8 target_temp[4];
482 u8 tolerance[4];
483
484 u8 fan_start_output[4];
485 u8 fan_stop_output[4];
486 u8 fan_stop_time[4];
487 u8 fan_max_output[4];
488 u8 fan_step_output[4];
489
490 u8 vid;
491 u8 vrm;
492
493 u16 have_temp;
494 u16 have_temp_offset;
495 u8 in6_skip:1;
496 u8 temp3_val_only:1;
497
498#ifdef CONFIG_PM
499
500 u8 vbat;
501 u8 fandiv1;
502 u8 fandiv2;
503#endif
504};
505
506struct w83627ehf_sio_data {
507 int sioreg;
508 enum kinds kind;
509};
510
511
512
513
514
515
516
517static inline void w83627ehf_set_bank(struct w83627ehf_data *data, u16 reg)
518{
519 u8 bank = reg >> 8;
520 if (data->bank != bank) {
521 outb_p(W83627EHF_REG_BANK, data->addr + ADDR_REG_OFFSET);
522 outb_p(bank, data->addr + DATA_REG_OFFSET);
523 data->bank = bank;
524 }
525}
526
527static u16 w83627ehf_read_value(struct w83627ehf_data *data, u16 reg)
528{
529 int res, word_sized = is_word_sized(reg);
530
531 mutex_lock(&data->lock);
532
533 w83627ehf_set_bank(data, reg);
534 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET);
535 res = inb_p(data->addr + DATA_REG_OFFSET);
536 if (word_sized) {
537 outb_p((reg & 0xff) + 1,
538 data->addr + ADDR_REG_OFFSET);
539 res = (res << 8) + inb_p(data->addr + DATA_REG_OFFSET);
540 }
541
542 mutex_unlock(&data->lock);
543 return res;
544}
545
546static int w83627ehf_write_value(struct w83627ehf_data *data, u16 reg,
547 u16 value)
548{
549 int word_sized = is_word_sized(reg);
550
551 mutex_lock(&data->lock);
552
553 w83627ehf_set_bank(data, reg);
554 outb_p(reg & 0xff, data->addr + ADDR_REG_OFFSET);
555 if (word_sized) {
556 outb_p(value >> 8, data->addr + DATA_REG_OFFSET);
557 outb_p((reg & 0xff) + 1,
558 data->addr + ADDR_REG_OFFSET);
559 }
560 outb_p(value & 0xff, data->addr + DATA_REG_OFFSET);
561
562 mutex_unlock(&data->lock);
563 return 0;
564}
565
566
567static u16 w83627ehf_read_temp(struct w83627ehf_data *data, u16 reg)
568{
569 u16 res;
570
571 res = w83627ehf_read_value(data, reg);
572 if (!is_word_sized(reg))
573 res <<= 8;
574
575 return res;
576}
577
578static int w83627ehf_write_temp(struct w83627ehf_data *data, u16 reg,
579 u16 value)
580{
581 if (!is_word_sized(reg))
582 value >>= 8;
583 return w83627ehf_write_value(data, reg, value);
584}
585
586
587static void nct6775_write_fan_div(struct w83627ehf_data *data, int nr)
588{
589 u8 reg;
590
591 switch (nr) {
592 case 0:
593 reg = (w83627ehf_read_value(data, NCT6775_REG_FANDIV1) & 0x70)
594 | (data->fan_div[0] & 0x7);
595 w83627ehf_write_value(data, NCT6775_REG_FANDIV1, reg);
596 break;
597 case 1:
598 reg = (w83627ehf_read_value(data, NCT6775_REG_FANDIV1) & 0x7)
599 | ((data->fan_div[1] << 4) & 0x70);
600 w83627ehf_write_value(data, NCT6775_REG_FANDIV1, reg);
601 break;
602 case 2:
603 reg = (w83627ehf_read_value(data, NCT6775_REG_FANDIV2) & 0x70)
604 | (data->fan_div[2] & 0x7);
605 w83627ehf_write_value(data, NCT6775_REG_FANDIV2, reg);
606 break;
607 case 3:
608 reg = (w83627ehf_read_value(data, NCT6775_REG_FANDIV2) & 0x7)
609 | ((data->fan_div[3] << 4) & 0x70);
610 w83627ehf_write_value(data, NCT6775_REG_FANDIV2, reg);
611 break;
612 }
613}
614
615
616static void w83627ehf_write_fan_div(struct w83627ehf_data *data, int nr)
617{
618 u8 reg;
619
620 switch (nr) {
621 case 0:
622 reg = (w83627ehf_read_value(data, W83627EHF_REG_FANDIV1) & 0xcf)
623 | ((data->fan_div[0] & 0x03) << 4);
624
625 reg |= (data->has_fan & (1 << 4)) ? 1 : 0;
626 w83627ehf_write_value(data, W83627EHF_REG_FANDIV1, reg);
627 reg = (w83627ehf_read_value(data, W83627EHF_REG_VBAT) & 0xdf)
628 | ((data->fan_div[0] & 0x04) << 3);
629 w83627ehf_write_value(data, W83627EHF_REG_VBAT, reg);
630 break;
631 case 1:
632 reg = (w83627ehf_read_value(data, W83627EHF_REG_FANDIV1) & 0x3f)
633 | ((data->fan_div[1] & 0x03) << 6);
634
635 reg |= (data->has_fan & (1 << 4)) ? 1 : 0;
636 w83627ehf_write_value(data, W83627EHF_REG_FANDIV1, reg);
637 reg = (w83627ehf_read_value(data, W83627EHF_REG_VBAT) & 0xbf)
638 | ((data->fan_div[1] & 0x04) << 4);
639 w83627ehf_write_value(data, W83627EHF_REG_VBAT, reg);
640 break;
641 case 2:
642 reg = (w83627ehf_read_value(data, W83627EHF_REG_FANDIV2) & 0x3f)
643 | ((data->fan_div[2] & 0x03) << 6);
644 w83627ehf_write_value(data, W83627EHF_REG_FANDIV2, reg);
645 reg = (w83627ehf_read_value(data, W83627EHF_REG_VBAT) & 0x7f)
646 | ((data->fan_div[2] & 0x04) << 5);
647 w83627ehf_write_value(data, W83627EHF_REG_VBAT, reg);
648 break;
649 case 3:
650 reg = (w83627ehf_read_value(data, W83627EHF_REG_DIODE) & 0xfc)
651 | (data->fan_div[3] & 0x03);
652 w83627ehf_write_value(data, W83627EHF_REG_DIODE, reg);
653 reg = (w83627ehf_read_value(data, W83627EHF_REG_SMI_OVT) & 0x7f)
654 | ((data->fan_div[3] & 0x04) << 5);
655 w83627ehf_write_value(data, W83627EHF_REG_SMI_OVT, reg);
656 break;
657 case 4:
658 reg = (w83627ehf_read_value(data, W83627EHF_REG_DIODE) & 0x73)
659 | ((data->fan_div[4] & 0x03) << 2)
660 | ((data->fan_div[4] & 0x04) << 5);
661 w83627ehf_write_value(data, W83627EHF_REG_DIODE, reg);
662 break;
663 }
664}
665
666static void w83627ehf_write_fan_div_common(struct device *dev,
667 struct w83627ehf_data *data, int nr)
668{
669 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
670
671 if (sio_data->kind == nct6776)
672 ;
673 else if (sio_data->kind == nct6775)
674 nct6775_write_fan_div(data, nr);
675 else
676 w83627ehf_write_fan_div(data, nr);
677}
678
679static void nct6775_update_fan_div(struct w83627ehf_data *data)
680{
681 u8 i;
682
683 i = w83627ehf_read_value(data, NCT6775_REG_FANDIV1);
684 data->fan_div[0] = i & 0x7;
685 data->fan_div[1] = (i & 0x70) >> 4;
686 i = w83627ehf_read_value(data, NCT6775_REG_FANDIV2);
687 data->fan_div[2] = i & 0x7;
688 if (data->has_fan & (1<<3))
689 data->fan_div[3] = (i & 0x70) >> 4;
690}
691
692static void w83627ehf_update_fan_div(struct w83627ehf_data *data)
693{
694 int i;
695
696 i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV1);
697 data->fan_div[0] = (i >> 4) & 0x03;
698 data->fan_div[1] = (i >> 6) & 0x03;
699 i = w83627ehf_read_value(data, W83627EHF_REG_FANDIV2);
700 data->fan_div[2] = (i >> 6) & 0x03;
701 i = w83627ehf_read_value(data, W83627EHF_REG_VBAT);
702 data->fan_div[0] |= (i >> 3) & 0x04;
703 data->fan_div[1] |= (i >> 4) & 0x04;
704 data->fan_div[2] |= (i >> 5) & 0x04;
705 if (data->has_fan & ((1 << 3) | (1 << 4))) {
706 i = w83627ehf_read_value(data, W83627EHF_REG_DIODE);
707 data->fan_div[3] = i & 0x03;
708 data->fan_div[4] = ((i >> 2) & 0x03)
709 | ((i >> 5) & 0x04);
710 }
711 if (data->has_fan & (1 << 3)) {
712 i = w83627ehf_read_value(data, W83627EHF_REG_SMI_OVT);
713 data->fan_div[3] |= (i >> 5) & 0x04;
714 }
715}
716
717static void w83627ehf_update_fan_div_common(struct device *dev,
718 struct w83627ehf_data *data)
719{
720 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
721
722 if (sio_data->kind == nct6776)
723 ;
724 else if (sio_data->kind == nct6775)
725 nct6775_update_fan_div(data);
726 else
727 w83627ehf_update_fan_div(data);
728}
729
730static void nct6775_update_pwm(struct w83627ehf_data *data)
731{
732 int i;
733 int pwmcfg, fanmodecfg;
734
735 for (i = 0; i < data->pwm_num; i++) {
736 pwmcfg = w83627ehf_read_value(data,
737 W83627EHF_REG_PWM_ENABLE[i]);
738 fanmodecfg = w83627ehf_read_value(data,
739 NCT6775_REG_FAN_MODE[i]);
740 data->pwm_mode[i] =
741 ((pwmcfg >> W83627EHF_PWM_MODE_SHIFT[i]) & 1) ? 0 : 1;
742 data->pwm_enable[i] = ((fanmodecfg >> 4) & 7) + 1;
743 data->tolerance[i] = fanmodecfg & 0x0f;
744 data->pwm[i] = w83627ehf_read_value(data, data->REG_PWM[i]);
745 }
746}
747
748static void w83627ehf_update_pwm(struct w83627ehf_data *data)
749{
750 int i;
751 int pwmcfg = 0, tolerance = 0;
752
753 for (i = 0; i < data->pwm_num; i++) {
754 if (!(data->has_fan & (1 << i)))
755 continue;
756
757
758 if (i != 1) {
759 pwmcfg = w83627ehf_read_value(data,
760 W83627EHF_REG_PWM_ENABLE[i]);
761 tolerance = w83627ehf_read_value(data,
762 W83627EHF_REG_TOLERANCE[i]);
763 }
764 data->pwm_mode[i] =
765 ((pwmcfg >> W83627EHF_PWM_MODE_SHIFT[i]) & 1) ? 0 : 1;
766 data->pwm_enable[i] = ((pwmcfg >> W83627EHF_PWM_ENABLE_SHIFT[i])
767 & 3) + 1;
768 data->pwm[i] = w83627ehf_read_value(data, data->REG_PWM[i]);
769
770 data->tolerance[i] = (tolerance >> (i == 1 ? 4 : 0)) & 0x0f;
771 }
772}
773
774static void w83627ehf_update_pwm_common(struct device *dev,
775 struct w83627ehf_data *data)
776{
777 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
778
779 if (sio_data->kind == nct6775 || sio_data->kind == nct6776)
780 nct6775_update_pwm(data);
781 else
782 w83627ehf_update_pwm(data);
783}
784
785static struct w83627ehf_data *w83627ehf_update_device(struct device *dev)
786{
787 struct w83627ehf_data *data = dev_get_drvdata(dev);
788 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
789
790 int i;
791
792 mutex_lock(&data->update_lock);
793
794 if (time_after(jiffies, data->last_updated + HZ + HZ/2)
795 || !data->valid) {
796
797 w83627ehf_update_fan_div_common(dev, data);
798
799
800 for (i = 0; i < data->in_num; i++) {
801 if ((i == 6) && data->in6_skip)
802 continue;
803
804 data->in[i] = w83627ehf_read_value(data,
805 W83627EHF_REG_IN(i));
806 data->in_min[i] = w83627ehf_read_value(data,
807 W83627EHF_REG_IN_MIN(i));
808 data->in_max[i] = w83627ehf_read_value(data,
809 W83627EHF_REG_IN_MAX(i));
810 }
811
812
813 for (i = 0; i < 5; i++) {
814 u16 reg;
815
816 if (!(data->has_fan & (1 << i)))
817 continue;
818
819 reg = w83627ehf_read_value(data, data->REG_FAN[i]);
820 data->rpm[i] = data->fan_from_reg(reg,
821 data->fan_div[i]);
822
823 if (data->has_fan_min & (1 << i))
824 data->fan_min[i] = w83627ehf_read_value(data,
825 data->REG_FAN_MIN[i]);
826
827
828
829
830
831
832 if (data->has_fan_div
833 && (reg >= 0xff || (sio_data->kind == nct6775
834 && reg == 0x00))
835 && data->fan_div[i] < 0x07) {
836 dev_dbg(dev,
837 "Increasing fan%d clock divider from %u to %u\n",
838 i + 1, div_from_reg(data->fan_div[i]),
839 div_from_reg(data->fan_div[i] + 1));
840 data->fan_div[i]++;
841 w83627ehf_write_fan_div_common(dev, data, i);
842
843 if ((data->has_fan_min & (1 << i))
844 && data->fan_min[i] >= 2
845 && data->fan_min[i] != 255)
846 w83627ehf_write_value(data,
847 data->REG_FAN_MIN[i],
848 (data->fan_min[i] /= 2));
849 }
850 }
851
852 w83627ehf_update_pwm_common(dev, data);
853
854 for (i = 0; i < data->pwm_num; i++) {
855 if (!(data->has_fan & (1 << i)))
856 continue;
857
858 data->fan_start_output[i] =
859 w83627ehf_read_value(data,
860 data->REG_FAN_START_OUTPUT[i]);
861 data->fan_stop_output[i] =
862 w83627ehf_read_value(data,
863 data->REG_FAN_STOP_OUTPUT[i]);
864 data->fan_stop_time[i] =
865 w83627ehf_read_value(data,
866 data->REG_FAN_STOP_TIME[i]);
867
868 if (data->REG_FAN_MAX_OUTPUT &&
869 data->REG_FAN_MAX_OUTPUT[i] != 0xff)
870 data->fan_max_output[i] =
871 w83627ehf_read_value(data,
872 data->REG_FAN_MAX_OUTPUT[i]);
873
874 if (data->REG_FAN_STEP_OUTPUT &&
875 data->REG_FAN_STEP_OUTPUT[i] != 0xff)
876 data->fan_step_output[i] =
877 w83627ehf_read_value(data,
878 data->REG_FAN_STEP_OUTPUT[i]);
879
880 data->target_temp[i] =
881 w83627ehf_read_value(data,
882 data->REG_TARGET[i]) &
883 (data->pwm_mode[i] == 1 ? 0x7f : 0xff);
884 }
885
886
887 for (i = 0; i < NUM_REG_TEMP; i++) {
888 if (!(data->have_temp & (1 << i)))
889 continue;
890 data->temp[i] = w83627ehf_read_temp(data,
891 data->reg_temp[i]);
892 if (data->reg_temp_over[i])
893 data->temp_max[i]
894 = w83627ehf_read_temp(data,
895 data->reg_temp_over[i]);
896 if (data->reg_temp_hyst[i])
897 data->temp_max_hyst[i]
898 = w83627ehf_read_temp(data,
899 data->reg_temp_hyst[i]);
900 if (i > 2)
901 continue;
902 if (data->have_temp_offset & (1 << i))
903 data->temp_offset[i]
904 = w83627ehf_read_value(data,
905 W83627EHF_REG_TEMP_OFFSET[i]);
906 }
907
908 data->alarms = w83627ehf_read_value(data,
909 W83627EHF_REG_ALARM1) |
910 (w83627ehf_read_value(data,
911 W83627EHF_REG_ALARM2) << 8) |
912 (w83627ehf_read_value(data,
913 W83627EHF_REG_ALARM3) << 16);
914
915 data->caseopen = w83627ehf_read_value(data,
916 W83627EHF_REG_CASEOPEN_DET);
917
918 data->last_updated = jiffies;
919 data->valid = 1;
920 }
921
922 mutex_unlock(&data->update_lock);
923 return data;
924}
925
926
927
928
929#define show_in_reg(reg) \
930static ssize_t \
931show_##reg(struct device *dev, struct device_attribute *attr, \
932 char *buf) \
933{ \
934 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
935 struct sensor_device_attribute *sensor_attr = \
936 to_sensor_dev_attr(attr); \
937 int nr = sensor_attr->index; \
938 return sprintf(buf, "%ld\n", in_from_reg(data->reg[nr], nr, \
939 data->scale_in)); \
940}
941show_in_reg(in)
942show_in_reg(in_min)
943show_in_reg(in_max)
944
945#define store_in_reg(REG, reg) \
946static ssize_t \
947store_in_##reg(struct device *dev, struct device_attribute *attr, \
948 const char *buf, size_t count) \
949{ \
950 struct w83627ehf_data *data = dev_get_drvdata(dev); \
951 struct sensor_device_attribute *sensor_attr = \
952 to_sensor_dev_attr(attr); \
953 int nr = sensor_attr->index; \
954 unsigned long val; \
955 int err; \
956 err = kstrtoul(buf, 10, &val); \
957 if (err < 0) \
958 return err; \
959 mutex_lock(&data->update_lock); \
960 data->in_##reg[nr] = in_to_reg(val, nr, data->scale_in); \
961 w83627ehf_write_value(data, W83627EHF_REG_IN_##REG(nr), \
962 data->in_##reg[nr]); \
963 mutex_unlock(&data->update_lock); \
964 return count; \
965}
966
967store_in_reg(MIN, min)
968store_in_reg(MAX, max)
969
970static ssize_t show_alarm(struct device *dev, struct device_attribute *attr,
971 char *buf)
972{
973 struct w83627ehf_data *data = w83627ehf_update_device(dev);
974 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
975 int nr = sensor_attr->index;
976 return sprintf(buf, "%u\n", (data->alarms >> nr) & 0x01);
977}
978
979static struct sensor_device_attribute sda_in_input[] = {
980 SENSOR_ATTR(in0_input, S_IRUGO, show_in, NULL, 0),
981 SENSOR_ATTR(in1_input, S_IRUGO, show_in, NULL, 1),
982 SENSOR_ATTR(in2_input, S_IRUGO, show_in, NULL, 2),
983 SENSOR_ATTR(in3_input, S_IRUGO, show_in, NULL, 3),
984 SENSOR_ATTR(in4_input, S_IRUGO, show_in, NULL, 4),
985 SENSOR_ATTR(in5_input, S_IRUGO, show_in, NULL, 5),
986 SENSOR_ATTR(in6_input, S_IRUGO, show_in, NULL, 6),
987 SENSOR_ATTR(in7_input, S_IRUGO, show_in, NULL, 7),
988 SENSOR_ATTR(in8_input, S_IRUGO, show_in, NULL, 8),
989 SENSOR_ATTR(in9_input, S_IRUGO, show_in, NULL, 9),
990};
991
992static struct sensor_device_attribute sda_in_alarm[] = {
993 SENSOR_ATTR(in0_alarm, S_IRUGO, show_alarm, NULL, 0),
994 SENSOR_ATTR(in1_alarm, S_IRUGO, show_alarm, NULL, 1),
995 SENSOR_ATTR(in2_alarm, S_IRUGO, show_alarm, NULL, 2),
996 SENSOR_ATTR(in3_alarm, S_IRUGO, show_alarm, NULL, 3),
997 SENSOR_ATTR(in4_alarm, S_IRUGO, show_alarm, NULL, 8),
998 SENSOR_ATTR(in5_alarm, S_IRUGO, show_alarm, NULL, 21),
999 SENSOR_ATTR(in6_alarm, S_IRUGO, show_alarm, NULL, 20),
1000 SENSOR_ATTR(in7_alarm, S_IRUGO, show_alarm, NULL, 16),
1001 SENSOR_ATTR(in8_alarm, S_IRUGO, show_alarm, NULL, 17),
1002 SENSOR_ATTR(in9_alarm, S_IRUGO, show_alarm, NULL, 19),
1003};
1004
1005static struct sensor_device_attribute sda_in_min[] = {
1006 SENSOR_ATTR(in0_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 0),
1007 SENSOR_ATTR(in1_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 1),
1008 SENSOR_ATTR(in2_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 2),
1009 SENSOR_ATTR(in3_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 3),
1010 SENSOR_ATTR(in4_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 4),
1011 SENSOR_ATTR(in5_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 5),
1012 SENSOR_ATTR(in6_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 6),
1013 SENSOR_ATTR(in7_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 7),
1014 SENSOR_ATTR(in8_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 8),
1015 SENSOR_ATTR(in9_min, S_IWUSR | S_IRUGO, show_in_min, store_in_min, 9),
1016};
1017
1018static struct sensor_device_attribute sda_in_max[] = {
1019 SENSOR_ATTR(in0_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 0),
1020 SENSOR_ATTR(in1_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 1),
1021 SENSOR_ATTR(in2_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 2),
1022 SENSOR_ATTR(in3_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 3),
1023 SENSOR_ATTR(in4_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 4),
1024 SENSOR_ATTR(in5_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 5),
1025 SENSOR_ATTR(in6_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 6),
1026 SENSOR_ATTR(in7_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 7),
1027 SENSOR_ATTR(in8_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 8),
1028 SENSOR_ATTR(in9_max, S_IWUSR | S_IRUGO, show_in_max, store_in_max, 9),
1029};
1030
1031static ssize_t
1032show_fan(struct device *dev, struct device_attribute *attr, char *buf)
1033{
1034 struct w83627ehf_data *data = w83627ehf_update_device(dev);
1035 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1036 int nr = sensor_attr->index;
1037 return sprintf(buf, "%d\n", data->rpm[nr]);
1038}
1039
1040static ssize_t
1041show_fan_min(struct device *dev, struct device_attribute *attr, char *buf)
1042{
1043 struct w83627ehf_data *data = w83627ehf_update_device(dev);
1044 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1045 int nr = sensor_attr->index;
1046 return sprintf(buf, "%d\n",
1047 data->fan_from_reg_min(data->fan_min[nr],
1048 data->fan_div[nr]));
1049}
1050
1051static ssize_t
1052show_fan_div(struct device *dev, struct device_attribute *attr,
1053 char *buf)
1054{
1055 struct w83627ehf_data *data = w83627ehf_update_device(dev);
1056 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1057 int nr = sensor_attr->index;
1058 return sprintf(buf, "%u\n", div_from_reg(data->fan_div[nr]));
1059}
1060
1061static ssize_t
1062store_fan_min(struct device *dev, struct device_attribute *attr,
1063 const char *buf, size_t count)
1064{
1065 struct w83627ehf_data *data = dev_get_drvdata(dev);
1066 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1067 int nr = sensor_attr->index;
1068 unsigned long val;
1069 int err;
1070 unsigned int reg;
1071 u8 new_div;
1072
1073 err = kstrtoul(buf, 10, &val);
1074 if (err < 0)
1075 return err;
1076
1077 mutex_lock(&data->update_lock);
1078 if (!data->has_fan_div) {
1079
1080
1081
1082
1083 if (!val) {
1084 val = 0xff1f;
1085 } else {
1086 if (val > 1350000U)
1087 val = 135000U;
1088 val = 1350000U / val;
1089 val = (val & 0x1f) | ((val << 3) & 0xff00);
1090 }
1091 data->fan_min[nr] = val;
1092 goto done;
1093 }
1094 if (!val) {
1095
1096 data->fan_min[nr] = 255;
1097 new_div = data->fan_div[nr];
1098 dev_info(dev, "fan%u low limit and alarm disabled\n", nr + 1);
1099 } else if ((reg = 1350000U / val) >= 128 * 255) {
1100
1101
1102
1103
1104 data->fan_min[nr] = 254;
1105 new_div = 7;
1106 dev_warn(dev,
1107 "fan%u low limit %lu below minimum %u, set to minimum\n",
1108 nr + 1, val, data->fan_from_reg_min(254, 7));
1109 } else if (!reg) {
1110
1111
1112
1113
1114 data->fan_min[nr] = 1;
1115 new_div = 0;
1116 dev_warn(dev,
1117 "fan%u low limit %lu above maximum %u, set to maximum\n",
1118 nr + 1, val, data->fan_from_reg_min(1, 0));
1119 } else {
1120
1121
1122
1123
1124
1125 new_div = 0;
1126 while (reg > 192 && new_div < 7) {
1127 reg >>= 1;
1128 new_div++;
1129 }
1130 data->fan_min[nr] = reg;
1131 }
1132
1133
1134
1135
1136
1137 if (new_div != data->fan_div[nr]) {
1138 dev_dbg(dev, "fan%u clock divider changed from %u to %u\n",
1139 nr + 1, div_from_reg(data->fan_div[nr]),
1140 div_from_reg(new_div));
1141 data->fan_div[nr] = new_div;
1142 w83627ehf_write_fan_div_common(dev, data, nr);
1143
1144 data->last_updated = jiffies;
1145 }
1146done:
1147 w83627ehf_write_value(data, data->REG_FAN_MIN[nr],
1148 data->fan_min[nr]);
1149 mutex_unlock(&data->update_lock);
1150
1151 return count;
1152}
1153
1154static struct sensor_device_attribute sda_fan_input[] = {
1155 SENSOR_ATTR(fan1_input, S_IRUGO, show_fan, NULL, 0),
1156 SENSOR_ATTR(fan2_input, S_IRUGO, show_fan, NULL, 1),
1157 SENSOR_ATTR(fan3_input, S_IRUGO, show_fan, NULL, 2),
1158 SENSOR_ATTR(fan4_input, S_IRUGO, show_fan, NULL, 3),
1159 SENSOR_ATTR(fan5_input, S_IRUGO, show_fan, NULL, 4),
1160};
1161
1162static struct sensor_device_attribute sda_fan_alarm[] = {
1163 SENSOR_ATTR(fan1_alarm, S_IRUGO, show_alarm, NULL, 6),
1164 SENSOR_ATTR(fan2_alarm, S_IRUGO, show_alarm, NULL, 7),
1165 SENSOR_ATTR(fan3_alarm, S_IRUGO, show_alarm, NULL, 11),
1166 SENSOR_ATTR(fan4_alarm, S_IRUGO, show_alarm, NULL, 10),
1167 SENSOR_ATTR(fan5_alarm, S_IRUGO, show_alarm, NULL, 23),
1168};
1169
1170static struct sensor_device_attribute sda_fan_min[] = {
1171 SENSOR_ATTR(fan1_min, S_IWUSR | S_IRUGO, show_fan_min,
1172 store_fan_min, 0),
1173 SENSOR_ATTR(fan2_min, S_IWUSR | S_IRUGO, show_fan_min,
1174 store_fan_min, 1),
1175 SENSOR_ATTR(fan3_min, S_IWUSR | S_IRUGO, show_fan_min,
1176 store_fan_min, 2),
1177 SENSOR_ATTR(fan4_min, S_IWUSR | S_IRUGO, show_fan_min,
1178 store_fan_min, 3),
1179 SENSOR_ATTR(fan5_min, S_IWUSR | S_IRUGO, show_fan_min,
1180 store_fan_min, 4),
1181};
1182
1183static struct sensor_device_attribute sda_fan_div[] = {
1184 SENSOR_ATTR(fan1_div, S_IRUGO, show_fan_div, NULL, 0),
1185 SENSOR_ATTR(fan2_div, S_IRUGO, show_fan_div, NULL, 1),
1186 SENSOR_ATTR(fan3_div, S_IRUGO, show_fan_div, NULL, 2),
1187 SENSOR_ATTR(fan4_div, S_IRUGO, show_fan_div, NULL, 3),
1188 SENSOR_ATTR(fan5_div, S_IRUGO, show_fan_div, NULL, 4),
1189};
1190
1191static ssize_t
1192show_temp_label(struct device *dev, struct device_attribute *attr, char *buf)
1193{
1194 struct w83627ehf_data *data = w83627ehf_update_device(dev);
1195 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1196 int nr = sensor_attr->index;
1197 return sprintf(buf, "%s\n", data->temp_label[data->temp_src[nr]]);
1198}
1199
1200#define show_temp_reg(addr, reg) \
1201static ssize_t \
1202show_##reg(struct device *dev, struct device_attribute *attr, \
1203 char *buf) \
1204{ \
1205 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
1206 struct sensor_device_attribute *sensor_attr = \
1207 to_sensor_dev_attr(attr); \
1208 int nr = sensor_attr->index; \
1209 return sprintf(buf, "%d\n", LM75_TEMP_FROM_REG(data->reg[nr])); \
1210}
1211show_temp_reg(reg_temp, temp);
1212show_temp_reg(reg_temp_over, temp_max);
1213show_temp_reg(reg_temp_hyst, temp_max_hyst);
1214
1215#define store_temp_reg(addr, reg) \
1216static ssize_t \
1217store_##reg(struct device *dev, struct device_attribute *attr, \
1218 const char *buf, size_t count) \
1219{ \
1220 struct w83627ehf_data *data = dev_get_drvdata(dev); \
1221 struct sensor_device_attribute *sensor_attr = \
1222 to_sensor_dev_attr(attr); \
1223 int nr = sensor_attr->index; \
1224 int err; \
1225 long val; \
1226 err = kstrtol(buf, 10, &val); \
1227 if (err < 0) \
1228 return err; \
1229 mutex_lock(&data->update_lock); \
1230 data->reg[nr] = LM75_TEMP_TO_REG(val); \
1231 w83627ehf_write_temp(data, data->addr[nr], data->reg[nr]); \
1232 mutex_unlock(&data->update_lock); \
1233 return count; \
1234}
1235store_temp_reg(reg_temp_over, temp_max);
1236store_temp_reg(reg_temp_hyst, temp_max_hyst);
1237
1238static ssize_t
1239show_temp_offset(struct device *dev, struct device_attribute *attr, char *buf)
1240{
1241 struct w83627ehf_data *data = w83627ehf_update_device(dev);
1242 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1243
1244 return sprintf(buf, "%d\n",
1245 data->temp_offset[sensor_attr->index] * 1000);
1246}
1247
1248static ssize_t
1249store_temp_offset(struct device *dev, struct device_attribute *attr,
1250 const char *buf, size_t count)
1251{
1252 struct w83627ehf_data *data = dev_get_drvdata(dev);
1253 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1254 int nr = sensor_attr->index;
1255 long val;
1256 int err;
1257
1258 err = kstrtol(buf, 10, &val);
1259 if (err < 0)
1260 return err;
1261
1262 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), -128, 127);
1263
1264 mutex_lock(&data->update_lock);
1265 data->temp_offset[nr] = val;
1266 w83627ehf_write_value(data, W83627EHF_REG_TEMP_OFFSET[nr], val);
1267 mutex_unlock(&data->update_lock);
1268 return count;
1269}
1270
1271static ssize_t
1272show_temp_type(struct device *dev, struct device_attribute *attr, char *buf)
1273{
1274 struct w83627ehf_data *data = w83627ehf_update_device(dev);
1275 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1276 int nr = sensor_attr->index;
1277 return sprintf(buf, "%d\n", (int)data->temp_type[nr]);
1278}
1279
1280static struct sensor_device_attribute sda_temp_input[] = {
1281 SENSOR_ATTR(temp1_input, S_IRUGO, show_temp, NULL, 0),
1282 SENSOR_ATTR(temp2_input, S_IRUGO, show_temp, NULL, 1),
1283 SENSOR_ATTR(temp3_input, S_IRUGO, show_temp, NULL, 2),
1284 SENSOR_ATTR(temp4_input, S_IRUGO, show_temp, NULL, 3),
1285 SENSOR_ATTR(temp5_input, S_IRUGO, show_temp, NULL, 4),
1286 SENSOR_ATTR(temp6_input, S_IRUGO, show_temp, NULL, 5),
1287 SENSOR_ATTR(temp7_input, S_IRUGO, show_temp, NULL, 6),
1288 SENSOR_ATTR(temp8_input, S_IRUGO, show_temp, NULL, 7),
1289 SENSOR_ATTR(temp9_input, S_IRUGO, show_temp, NULL, 8),
1290};
1291
1292static struct sensor_device_attribute sda_temp_label[] = {
1293 SENSOR_ATTR(temp1_label, S_IRUGO, show_temp_label, NULL, 0),
1294 SENSOR_ATTR(temp2_label, S_IRUGO, show_temp_label, NULL, 1),
1295 SENSOR_ATTR(temp3_label, S_IRUGO, show_temp_label, NULL, 2),
1296 SENSOR_ATTR(temp4_label, S_IRUGO, show_temp_label, NULL, 3),
1297 SENSOR_ATTR(temp5_label, S_IRUGO, show_temp_label, NULL, 4),
1298 SENSOR_ATTR(temp6_label, S_IRUGO, show_temp_label, NULL, 5),
1299 SENSOR_ATTR(temp7_label, S_IRUGO, show_temp_label, NULL, 6),
1300 SENSOR_ATTR(temp8_label, S_IRUGO, show_temp_label, NULL, 7),
1301 SENSOR_ATTR(temp9_label, S_IRUGO, show_temp_label, NULL, 8),
1302};
1303
1304static struct sensor_device_attribute sda_temp_max[] = {
1305 SENSOR_ATTR(temp1_max, S_IRUGO | S_IWUSR, show_temp_max,
1306 store_temp_max, 0),
1307 SENSOR_ATTR(temp2_max, S_IRUGO | S_IWUSR, show_temp_max,
1308 store_temp_max, 1),
1309 SENSOR_ATTR(temp3_max, S_IRUGO | S_IWUSR, show_temp_max,
1310 store_temp_max, 2),
1311 SENSOR_ATTR(temp4_max, S_IRUGO | S_IWUSR, show_temp_max,
1312 store_temp_max, 3),
1313 SENSOR_ATTR(temp5_max, S_IRUGO | S_IWUSR, show_temp_max,
1314 store_temp_max, 4),
1315 SENSOR_ATTR(temp6_max, S_IRUGO | S_IWUSR, show_temp_max,
1316 store_temp_max, 5),
1317 SENSOR_ATTR(temp7_max, S_IRUGO | S_IWUSR, show_temp_max,
1318 store_temp_max, 6),
1319 SENSOR_ATTR(temp8_max, S_IRUGO | S_IWUSR, show_temp_max,
1320 store_temp_max, 7),
1321 SENSOR_ATTR(temp9_max, S_IRUGO | S_IWUSR, show_temp_max,
1322 store_temp_max, 8),
1323};
1324
1325static struct sensor_device_attribute sda_temp_max_hyst[] = {
1326 SENSOR_ATTR(temp1_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1327 store_temp_max_hyst, 0),
1328 SENSOR_ATTR(temp2_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1329 store_temp_max_hyst, 1),
1330 SENSOR_ATTR(temp3_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1331 store_temp_max_hyst, 2),
1332 SENSOR_ATTR(temp4_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1333 store_temp_max_hyst, 3),
1334 SENSOR_ATTR(temp5_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1335 store_temp_max_hyst, 4),
1336 SENSOR_ATTR(temp6_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1337 store_temp_max_hyst, 5),
1338 SENSOR_ATTR(temp7_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1339 store_temp_max_hyst, 6),
1340 SENSOR_ATTR(temp8_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1341 store_temp_max_hyst, 7),
1342 SENSOR_ATTR(temp9_max_hyst, S_IRUGO | S_IWUSR, show_temp_max_hyst,
1343 store_temp_max_hyst, 8),
1344};
1345
1346static struct sensor_device_attribute sda_temp_alarm[] = {
1347 SENSOR_ATTR(temp1_alarm, S_IRUGO, show_alarm, NULL, 4),
1348 SENSOR_ATTR(temp2_alarm, S_IRUGO, show_alarm, NULL, 5),
1349 SENSOR_ATTR(temp3_alarm, S_IRUGO, show_alarm, NULL, 13),
1350};
1351
1352static struct sensor_device_attribute sda_temp_type[] = {
1353 SENSOR_ATTR(temp1_type, S_IRUGO, show_temp_type, NULL, 0),
1354 SENSOR_ATTR(temp2_type, S_IRUGO, show_temp_type, NULL, 1),
1355 SENSOR_ATTR(temp3_type, S_IRUGO, show_temp_type, NULL, 2),
1356};
1357
1358static struct sensor_device_attribute sda_temp_offset[] = {
1359 SENSOR_ATTR(temp1_offset, S_IRUGO | S_IWUSR, show_temp_offset,
1360 store_temp_offset, 0),
1361 SENSOR_ATTR(temp2_offset, S_IRUGO | S_IWUSR, show_temp_offset,
1362 store_temp_offset, 1),
1363 SENSOR_ATTR(temp3_offset, S_IRUGO | S_IWUSR, show_temp_offset,
1364 store_temp_offset, 2),
1365};
1366
1367#define show_pwm_reg(reg) \
1368static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
1369 char *buf) \
1370{ \
1371 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
1372 struct sensor_device_attribute *sensor_attr = \
1373 to_sensor_dev_attr(attr); \
1374 int nr = sensor_attr->index; \
1375 return sprintf(buf, "%d\n", data->reg[nr]); \
1376}
1377
1378show_pwm_reg(pwm_mode)
1379show_pwm_reg(pwm_enable)
1380show_pwm_reg(pwm)
1381
1382static ssize_t
1383store_pwm_mode(struct device *dev, struct device_attribute *attr,
1384 const char *buf, size_t count)
1385{
1386 struct w83627ehf_data *data = dev_get_drvdata(dev);
1387 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1388 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
1389 int nr = sensor_attr->index;
1390 unsigned long val;
1391 int err;
1392 u16 reg;
1393
1394 err = kstrtoul(buf, 10, &val);
1395 if (err < 0)
1396 return err;
1397
1398 if (val > 1)
1399 return -EINVAL;
1400
1401
1402 if (sio_data->kind == nct6776 && nr && val != 1)
1403 return -EINVAL;
1404
1405 mutex_lock(&data->update_lock);
1406 reg = w83627ehf_read_value(data, W83627EHF_REG_PWM_ENABLE[nr]);
1407 data->pwm_mode[nr] = val;
1408 reg &= ~(1 << W83627EHF_PWM_MODE_SHIFT[nr]);
1409 if (!val)
1410 reg |= 1 << W83627EHF_PWM_MODE_SHIFT[nr];
1411 w83627ehf_write_value(data, W83627EHF_REG_PWM_ENABLE[nr], reg);
1412 mutex_unlock(&data->update_lock);
1413 return count;
1414}
1415
1416static ssize_t
1417store_pwm(struct device *dev, struct device_attribute *attr,
1418 const char *buf, size_t count)
1419{
1420 struct w83627ehf_data *data = dev_get_drvdata(dev);
1421 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1422 int nr = sensor_attr->index;
1423 unsigned long val;
1424 int err;
1425
1426 err = kstrtoul(buf, 10, &val);
1427 if (err < 0)
1428 return err;
1429
1430 val = clamp_val(val, 0, 255);
1431
1432 mutex_lock(&data->update_lock);
1433 data->pwm[nr] = val;
1434 w83627ehf_write_value(data, data->REG_PWM[nr], val);
1435 mutex_unlock(&data->update_lock);
1436 return count;
1437}
1438
1439static ssize_t
1440store_pwm_enable(struct device *dev, struct device_attribute *attr,
1441 const char *buf, size_t count)
1442{
1443 struct w83627ehf_data *data = dev_get_drvdata(dev);
1444 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
1445 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1446 int nr = sensor_attr->index;
1447 unsigned long val;
1448 int err;
1449 u16 reg;
1450
1451 err = kstrtoul(buf, 10, &val);
1452 if (err < 0)
1453 return err;
1454
1455 if (!val || (val > 4 && val != data->pwm_enable_orig[nr]))
1456 return -EINVAL;
1457
1458 if (sio_data->kind == nct6776 && val == 4)
1459 return -EINVAL;
1460
1461 mutex_lock(&data->update_lock);
1462 data->pwm_enable[nr] = val;
1463 if (sio_data->kind == nct6775 || sio_data->kind == nct6776) {
1464 reg = w83627ehf_read_value(data,
1465 NCT6775_REG_FAN_MODE[nr]);
1466 reg &= 0x0f;
1467 reg |= (val - 1) << 4;
1468 w83627ehf_write_value(data,
1469 NCT6775_REG_FAN_MODE[nr], reg);
1470 } else {
1471 reg = w83627ehf_read_value(data, W83627EHF_REG_PWM_ENABLE[nr]);
1472 reg &= ~(0x03 << W83627EHF_PWM_ENABLE_SHIFT[nr]);
1473 reg |= (val - 1) << W83627EHF_PWM_ENABLE_SHIFT[nr];
1474 w83627ehf_write_value(data, W83627EHF_REG_PWM_ENABLE[nr], reg);
1475 }
1476 mutex_unlock(&data->update_lock);
1477 return count;
1478}
1479
1480
1481#define show_tol_temp(reg) \
1482static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
1483 char *buf) \
1484{ \
1485 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
1486 struct sensor_device_attribute *sensor_attr = \
1487 to_sensor_dev_attr(attr); \
1488 int nr = sensor_attr->index; \
1489 return sprintf(buf, "%d\n", data->reg[nr] * 1000); \
1490}
1491
1492show_tol_temp(tolerance)
1493show_tol_temp(target_temp)
1494
1495static ssize_t
1496store_target_temp(struct device *dev, struct device_attribute *attr,
1497 const char *buf, size_t count)
1498{
1499 struct w83627ehf_data *data = dev_get_drvdata(dev);
1500 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1501 int nr = sensor_attr->index;
1502 long val;
1503 int err;
1504
1505 err = kstrtol(buf, 10, &val);
1506 if (err < 0)
1507 return err;
1508
1509 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, 127);
1510
1511 mutex_lock(&data->update_lock);
1512 data->target_temp[nr] = val;
1513 w83627ehf_write_value(data, data->REG_TARGET[nr], val);
1514 mutex_unlock(&data->update_lock);
1515 return count;
1516}
1517
1518static ssize_t
1519store_tolerance(struct device *dev, struct device_attribute *attr,
1520 const char *buf, size_t count)
1521{
1522 struct w83627ehf_data *data = dev_get_drvdata(dev);
1523 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
1524 struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr);
1525 int nr = sensor_attr->index;
1526 u16 reg;
1527 long val;
1528 int err;
1529
1530 err = kstrtol(buf, 10, &val);
1531 if (err < 0)
1532 return err;
1533
1534
1535 val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, 15);
1536
1537 mutex_lock(&data->update_lock);
1538 if (sio_data->kind == nct6775 || sio_data->kind == nct6776) {
1539
1540 if (sio_data->kind == nct6776 && val > 7)
1541 val = 7;
1542 reg = w83627ehf_read_value(data, NCT6775_REG_FAN_MODE[nr]);
1543 reg = (reg & 0xf0) | val;
1544 w83627ehf_write_value(data, NCT6775_REG_FAN_MODE[nr], reg);
1545 } else {
1546 reg = w83627ehf_read_value(data, W83627EHF_REG_TOLERANCE[nr]);
1547 if (nr == 1)
1548 reg = (reg & 0x0f) | (val << 4);
1549 else
1550 reg = (reg & 0xf0) | val;
1551 w83627ehf_write_value(data, W83627EHF_REG_TOLERANCE[nr], reg);
1552 }
1553 data->tolerance[nr] = val;
1554 mutex_unlock(&data->update_lock);
1555 return count;
1556}
1557
1558static struct sensor_device_attribute sda_pwm[] = {
1559 SENSOR_ATTR(pwm1, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 0),
1560 SENSOR_ATTR(pwm2, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 1),
1561 SENSOR_ATTR(pwm3, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 2),
1562 SENSOR_ATTR(pwm4, S_IWUSR | S_IRUGO, show_pwm, store_pwm, 3),
1563};
1564
1565static struct sensor_device_attribute sda_pwm_mode[] = {
1566 SENSOR_ATTR(pwm1_mode, S_IWUSR | S_IRUGO, show_pwm_mode,
1567 store_pwm_mode, 0),
1568 SENSOR_ATTR(pwm2_mode, S_IWUSR | S_IRUGO, show_pwm_mode,
1569 store_pwm_mode, 1),
1570 SENSOR_ATTR(pwm3_mode, S_IWUSR | S_IRUGO, show_pwm_mode,
1571 store_pwm_mode, 2),
1572 SENSOR_ATTR(pwm4_mode, S_IWUSR | S_IRUGO, show_pwm_mode,
1573 store_pwm_mode, 3),
1574};
1575
1576static struct sensor_device_attribute sda_pwm_enable[] = {
1577 SENSOR_ATTR(pwm1_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
1578 store_pwm_enable, 0),
1579 SENSOR_ATTR(pwm2_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
1580 store_pwm_enable, 1),
1581 SENSOR_ATTR(pwm3_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
1582 store_pwm_enable, 2),
1583 SENSOR_ATTR(pwm4_enable, S_IWUSR | S_IRUGO, show_pwm_enable,
1584 store_pwm_enable, 3),
1585};
1586
1587static struct sensor_device_attribute sda_target_temp[] = {
1588 SENSOR_ATTR(pwm1_target, S_IWUSR | S_IRUGO, show_target_temp,
1589 store_target_temp, 0),
1590 SENSOR_ATTR(pwm2_target, S_IWUSR | S_IRUGO, show_target_temp,
1591 store_target_temp, 1),
1592 SENSOR_ATTR(pwm3_target, S_IWUSR | S_IRUGO, show_target_temp,
1593 store_target_temp, 2),
1594 SENSOR_ATTR(pwm4_target, S_IWUSR | S_IRUGO, show_target_temp,
1595 store_target_temp, 3),
1596};
1597
1598static struct sensor_device_attribute sda_tolerance[] = {
1599 SENSOR_ATTR(pwm1_tolerance, S_IWUSR | S_IRUGO, show_tolerance,
1600 store_tolerance, 0),
1601 SENSOR_ATTR(pwm2_tolerance, S_IWUSR | S_IRUGO, show_tolerance,
1602 store_tolerance, 1),
1603 SENSOR_ATTR(pwm3_tolerance, S_IWUSR | S_IRUGO, show_tolerance,
1604 store_tolerance, 2),
1605 SENSOR_ATTR(pwm4_tolerance, S_IWUSR | S_IRUGO, show_tolerance,
1606 store_tolerance, 3),
1607};
1608
1609
1610
1611#define fan_functions(reg, REG) \
1612static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
1613 char *buf) \
1614{ \
1615 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
1616 struct sensor_device_attribute *sensor_attr = \
1617 to_sensor_dev_attr(attr); \
1618 int nr = sensor_attr->index; \
1619 return sprintf(buf, "%d\n", data->reg[nr]); \
1620} \
1621static ssize_t \
1622store_##reg(struct device *dev, struct device_attribute *attr, \
1623 const char *buf, size_t count) \
1624{ \
1625 struct w83627ehf_data *data = dev_get_drvdata(dev); \
1626 struct sensor_device_attribute *sensor_attr = \
1627 to_sensor_dev_attr(attr); \
1628 int nr = sensor_attr->index; \
1629 unsigned long val; \
1630 int err; \
1631 err = kstrtoul(buf, 10, &val); \
1632 if (err < 0) \
1633 return err; \
1634 val = clamp_val(val, 1, 255); \
1635 mutex_lock(&data->update_lock); \
1636 data->reg[nr] = val; \
1637 w83627ehf_write_value(data, data->REG_##REG[nr], val); \
1638 mutex_unlock(&data->update_lock); \
1639 return count; \
1640}
1641
1642fan_functions(fan_start_output, FAN_START_OUTPUT)
1643fan_functions(fan_stop_output, FAN_STOP_OUTPUT)
1644fan_functions(fan_max_output, FAN_MAX_OUTPUT)
1645fan_functions(fan_step_output, FAN_STEP_OUTPUT)
1646
1647#define fan_time_functions(reg, REG) \
1648static ssize_t show_##reg(struct device *dev, struct device_attribute *attr, \
1649 char *buf) \
1650{ \
1651 struct w83627ehf_data *data = w83627ehf_update_device(dev); \
1652 struct sensor_device_attribute *sensor_attr = \
1653 to_sensor_dev_attr(attr); \
1654 int nr = sensor_attr->index; \
1655 return sprintf(buf, "%d\n", \
1656 step_time_from_reg(data->reg[nr], \
1657 data->pwm_mode[nr])); \
1658} \
1659\
1660static ssize_t \
1661store_##reg(struct device *dev, struct device_attribute *attr, \
1662 const char *buf, size_t count) \
1663{ \
1664 struct w83627ehf_data *data = dev_get_drvdata(dev); \
1665 struct sensor_device_attribute *sensor_attr = \
1666 to_sensor_dev_attr(attr); \
1667 int nr = sensor_attr->index; \
1668 unsigned long val; \
1669 int err; \
1670 err = kstrtoul(buf, 10, &val); \
1671 if (err < 0) \
1672 return err; \
1673 val = step_time_to_reg(val, data->pwm_mode[nr]); \
1674 mutex_lock(&data->update_lock); \
1675 data->reg[nr] = val; \
1676 w83627ehf_write_value(data, data->REG_##REG[nr], val); \
1677 mutex_unlock(&data->update_lock); \
1678 return count; \
1679} \
1680
1681fan_time_functions(fan_stop_time, FAN_STOP_TIME)
1682
1683static ssize_t name_show(struct device *dev, struct device_attribute *attr,
1684 char *buf)
1685{
1686 struct w83627ehf_data *data = dev_get_drvdata(dev);
1687
1688 return sprintf(buf, "%s\n", data->name);
1689}
1690static DEVICE_ATTR_RO(name);
1691
1692static struct sensor_device_attribute sda_sf3_arrays_fan4[] = {
1693 SENSOR_ATTR(pwm4_stop_time, S_IWUSR | S_IRUGO, show_fan_stop_time,
1694 store_fan_stop_time, 3),
1695 SENSOR_ATTR(pwm4_start_output, S_IWUSR | S_IRUGO, show_fan_start_output,
1696 store_fan_start_output, 3),
1697 SENSOR_ATTR(pwm4_stop_output, S_IWUSR | S_IRUGO, show_fan_stop_output,
1698 store_fan_stop_output, 3),
1699 SENSOR_ATTR(pwm4_max_output, S_IWUSR | S_IRUGO, show_fan_max_output,
1700 store_fan_max_output, 3),
1701 SENSOR_ATTR(pwm4_step_output, S_IWUSR | S_IRUGO, show_fan_step_output,
1702 store_fan_step_output, 3),
1703};
1704
1705static struct sensor_device_attribute sda_sf3_arrays_fan3[] = {
1706 SENSOR_ATTR(pwm3_stop_time, S_IWUSR | S_IRUGO, show_fan_stop_time,
1707 store_fan_stop_time, 2),
1708 SENSOR_ATTR(pwm3_start_output, S_IWUSR | S_IRUGO, show_fan_start_output,
1709 store_fan_start_output, 2),
1710 SENSOR_ATTR(pwm3_stop_output, S_IWUSR | S_IRUGO, show_fan_stop_output,
1711 store_fan_stop_output, 2),
1712};
1713
1714static struct sensor_device_attribute sda_sf3_arrays[] = {
1715 SENSOR_ATTR(pwm1_stop_time, S_IWUSR | S_IRUGO, show_fan_stop_time,
1716 store_fan_stop_time, 0),
1717 SENSOR_ATTR(pwm2_stop_time, S_IWUSR | S_IRUGO, show_fan_stop_time,
1718 store_fan_stop_time, 1),
1719 SENSOR_ATTR(pwm1_start_output, S_IWUSR | S_IRUGO, show_fan_start_output,
1720 store_fan_start_output, 0),
1721 SENSOR_ATTR(pwm2_start_output, S_IWUSR | S_IRUGO, show_fan_start_output,
1722 store_fan_start_output, 1),
1723 SENSOR_ATTR(pwm1_stop_output, S_IWUSR | S_IRUGO, show_fan_stop_output,
1724 store_fan_stop_output, 0),
1725 SENSOR_ATTR(pwm2_stop_output, S_IWUSR | S_IRUGO, show_fan_stop_output,
1726 store_fan_stop_output, 1),
1727};
1728
1729
1730
1731
1732
1733
1734static struct sensor_device_attribute sda_sf3_max_step_arrays[] = {
1735 SENSOR_ATTR(pwm1_max_output, S_IWUSR | S_IRUGO, show_fan_max_output,
1736 store_fan_max_output, 0),
1737 SENSOR_ATTR(pwm1_step_output, S_IWUSR | S_IRUGO, show_fan_step_output,
1738 store_fan_step_output, 0),
1739 SENSOR_ATTR(pwm2_max_output, S_IWUSR | S_IRUGO, show_fan_max_output,
1740 store_fan_max_output, 1),
1741 SENSOR_ATTR(pwm2_step_output, S_IWUSR | S_IRUGO, show_fan_step_output,
1742 store_fan_step_output, 1),
1743 SENSOR_ATTR(pwm3_max_output, S_IWUSR | S_IRUGO, show_fan_max_output,
1744 store_fan_max_output, 2),
1745 SENSOR_ATTR(pwm3_step_output, S_IWUSR | S_IRUGO, show_fan_step_output,
1746 store_fan_step_output, 2),
1747};
1748
1749static ssize_t
1750cpu0_vid_show(struct device *dev, struct device_attribute *attr, char *buf)
1751{
1752 struct w83627ehf_data *data = dev_get_drvdata(dev);
1753 return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm));
1754}
1755static DEVICE_ATTR_RO(cpu0_vid);
1756
1757
1758
1759
1760static ssize_t
1761show_caseopen(struct device *dev, struct device_attribute *attr, char *buf)
1762{
1763 struct w83627ehf_data *data = w83627ehf_update_device(dev);
1764
1765 return sprintf(buf, "%d\n",
1766 !!(data->caseopen & to_sensor_dev_attr_2(attr)->index));
1767}
1768
1769static ssize_t
1770clear_caseopen(struct device *dev, struct device_attribute *attr,
1771 const char *buf, size_t count)
1772{
1773 struct w83627ehf_data *data = dev_get_drvdata(dev);
1774 unsigned long val;
1775 u16 reg, mask;
1776
1777 if (kstrtoul(buf, 10, &val) || val != 0)
1778 return -EINVAL;
1779
1780 mask = to_sensor_dev_attr_2(attr)->nr;
1781
1782 mutex_lock(&data->update_lock);
1783 reg = w83627ehf_read_value(data, W83627EHF_REG_CASEOPEN_CLR);
1784 w83627ehf_write_value(data, W83627EHF_REG_CASEOPEN_CLR, reg | mask);
1785 w83627ehf_write_value(data, W83627EHF_REG_CASEOPEN_CLR, reg & ~mask);
1786 data->valid = 0;
1787 mutex_unlock(&data->update_lock);
1788
1789 return count;
1790}
1791
1792static struct sensor_device_attribute_2 sda_caseopen[] = {
1793 SENSOR_ATTR_2(intrusion0_alarm, S_IWUSR | S_IRUGO, show_caseopen,
1794 clear_caseopen, 0x80, 0x10),
1795 SENSOR_ATTR_2(intrusion1_alarm, S_IWUSR | S_IRUGO, show_caseopen,
1796 clear_caseopen, 0x40, 0x40),
1797};
1798
1799
1800
1801
1802
1803static void w83627ehf_device_remove_files(struct device *dev)
1804{
1805
1806
1807
1808
1809 int i;
1810 struct w83627ehf_data *data = dev_get_drvdata(dev);
1811
1812 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays); i++)
1813 device_remove_file(dev, &sda_sf3_arrays[i].dev_attr);
1814 for (i = 0; i < ARRAY_SIZE(sda_sf3_max_step_arrays); i++) {
1815 struct sensor_device_attribute *attr =
1816 &sda_sf3_max_step_arrays[i];
1817 if (data->REG_FAN_STEP_OUTPUT &&
1818 data->REG_FAN_STEP_OUTPUT[attr->index] != 0xff)
1819 device_remove_file(dev, &attr->dev_attr);
1820 }
1821 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays_fan3); i++)
1822 device_remove_file(dev, &sda_sf3_arrays_fan3[i].dev_attr);
1823 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays_fan4); i++)
1824 device_remove_file(dev, &sda_sf3_arrays_fan4[i].dev_attr);
1825 for (i = 0; i < data->in_num; i++) {
1826 if ((i == 6) && data->in6_skip)
1827 continue;
1828 device_remove_file(dev, &sda_in_input[i].dev_attr);
1829 device_remove_file(dev, &sda_in_alarm[i].dev_attr);
1830 device_remove_file(dev, &sda_in_min[i].dev_attr);
1831 device_remove_file(dev, &sda_in_max[i].dev_attr);
1832 }
1833 for (i = 0; i < 5; i++) {
1834 device_remove_file(dev, &sda_fan_input[i].dev_attr);
1835 device_remove_file(dev, &sda_fan_alarm[i].dev_attr);
1836 device_remove_file(dev, &sda_fan_div[i].dev_attr);
1837 device_remove_file(dev, &sda_fan_min[i].dev_attr);
1838 }
1839 for (i = 0; i < data->pwm_num; i++) {
1840 device_remove_file(dev, &sda_pwm[i].dev_attr);
1841 device_remove_file(dev, &sda_pwm_mode[i].dev_attr);
1842 device_remove_file(dev, &sda_pwm_enable[i].dev_attr);
1843 device_remove_file(dev, &sda_target_temp[i].dev_attr);
1844 device_remove_file(dev, &sda_tolerance[i].dev_attr);
1845 }
1846 for (i = 0; i < NUM_REG_TEMP; i++) {
1847 if (!(data->have_temp & (1 << i)))
1848 continue;
1849 device_remove_file(dev, &sda_temp_input[i].dev_attr);
1850 device_remove_file(dev, &sda_temp_label[i].dev_attr);
1851 if (i == 2 && data->temp3_val_only)
1852 continue;
1853 device_remove_file(dev, &sda_temp_max[i].dev_attr);
1854 device_remove_file(dev, &sda_temp_max_hyst[i].dev_attr);
1855 if (i > 2)
1856 continue;
1857 device_remove_file(dev, &sda_temp_alarm[i].dev_attr);
1858 device_remove_file(dev, &sda_temp_type[i].dev_attr);
1859 device_remove_file(dev, &sda_temp_offset[i].dev_attr);
1860 }
1861
1862 device_remove_file(dev, &sda_caseopen[0].dev_attr);
1863 device_remove_file(dev, &sda_caseopen[1].dev_attr);
1864
1865 device_remove_file(dev, &dev_attr_name);
1866 device_remove_file(dev, &dev_attr_cpu0_vid);
1867}
1868
1869
1870static inline void w83627ehf_init_device(struct w83627ehf_data *data,
1871 enum kinds kind)
1872{
1873 int i;
1874 u8 tmp, diode;
1875
1876
1877 tmp = w83627ehf_read_value(data, W83627EHF_REG_CONFIG);
1878 if (!(tmp & 0x01))
1879 w83627ehf_write_value(data, W83627EHF_REG_CONFIG,
1880 tmp | 0x01);
1881
1882
1883 for (i = 0; i < NUM_REG_TEMP; i++) {
1884 if (!(data->have_temp & (1 << i)))
1885 continue;
1886 if (!data->reg_temp_config[i])
1887 continue;
1888 tmp = w83627ehf_read_value(data,
1889 data->reg_temp_config[i]);
1890 if (tmp & 0x01)
1891 w83627ehf_write_value(data,
1892 data->reg_temp_config[i],
1893 tmp & 0xfe);
1894 }
1895
1896
1897 tmp = w83627ehf_read_value(data, W83627EHF_REG_VBAT);
1898 if (!(tmp & 0x01))
1899 w83627ehf_write_value(data, W83627EHF_REG_VBAT, tmp | 0x01);
1900
1901
1902 switch (kind) {
1903 case w83627ehf:
1904 diode = w83627ehf_read_value(data, W83627EHF_REG_DIODE);
1905 break;
1906 case w83627uhg:
1907 diode = 0x00;
1908 break;
1909 default:
1910 diode = 0x70;
1911 }
1912 for (i = 0; i < 3; i++) {
1913 const char *label = NULL;
1914
1915 if (data->temp_label)
1916 label = data->temp_label[data->temp_src[i]];
1917
1918
1919 if (label && strncmp(label, "PECI", 4) == 0)
1920 data->temp_type[i] = 6;
1921 else if (label && strncmp(label, "AMD", 3) == 0)
1922 data->temp_type[i] = 5;
1923 else if ((tmp & (0x02 << i)))
1924 data->temp_type[i] = (diode & (0x10 << i)) ? 1 : 3;
1925 else
1926 data->temp_type[i] = 4;
1927 }
1928}
1929
1930static void w82627ehf_swap_tempreg(struct w83627ehf_data *data,
1931 int r1, int r2)
1932{
1933 swap(data->temp_src[r1], data->temp_src[r2]);
1934 swap(data->reg_temp[r1], data->reg_temp[r2]);
1935 swap(data->reg_temp_over[r1], data->reg_temp_over[r2]);
1936 swap(data->reg_temp_hyst[r1], data->reg_temp_hyst[r2]);
1937 swap(data->reg_temp_config[r1], data->reg_temp_config[r2]);
1938}
1939
1940static void
1941w83627ehf_set_temp_reg_ehf(struct w83627ehf_data *data, int n_temp)
1942{
1943 int i;
1944
1945 for (i = 0; i < n_temp; i++) {
1946 data->reg_temp[i] = W83627EHF_REG_TEMP[i];
1947 data->reg_temp_over[i] = W83627EHF_REG_TEMP_OVER[i];
1948 data->reg_temp_hyst[i] = W83627EHF_REG_TEMP_HYST[i];
1949 data->reg_temp_config[i] = W83627EHF_REG_TEMP_CONFIG[i];
1950 }
1951}
1952
1953static void
1954w83627ehf_check_fan_inputs(const struct w83627ehf_sio_data *sio_data,
1955 struct w83627ehf_data *data)
1956{
1957 int fan3pin, fan4pin, fan4min, fan5pin, regval;
1958
1959
1960 if (sio_data->kind == w83627uhg) {
1961 data->has_fan = 0x03;
1962 data->has_fan_min = 0x03;
1963 return;
1964 }
1965
1966
1967 if (sio_data->kind == nct6775) {
1968
1969 fan3pin = 1;
1970 fan4pin = !(superio_inb(sio_data->sioreg, 0x2A) & 0x80);
1971 fan4min = 0;
1972 fan5pin = 0;
1973 } else if (sio_data->kind == nct6776) {
1974 bool gpok = superio_inb(sio_data->sioreg, 0x27) & 0x80;
1975
1976 superio_select(sio_data->sioreg, W83627EHF_LD_HWM);
1977 regval = superio_inb(sio_data->sioreg, SIO_REG_ENABLE);
1978
1979 if (regval & 0x80)
1980 fan3pin = gpok;
1981 else
1982 fan3pin = !(superio_inb(sio_data->sioreg, 0x24) & 0x40);
1983
1984 if (regval & 0x40)
1985 fan4pin = gpok;
1986 else
1987 fan4pin = !!(superio_inb(sio_data->sioreg, 0x1C) & 0x01);
1988
1989 if (regval & 0x20)
1990 fan5pin = gpok;
1991 else
1992 fan5pin = !!(superio_inb(sio_data->sioreg, 0x1C) & 0x02);
1993
1994 fan4min = fan4pin;
1995 } else if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b) {
1996 fan3pin = 1;
1997 fan4pin = superio_inb(sio_data->sioreg, 0x27) & 0x40;
1998 fan5pin = superio_inb(sio_data->sioreg, 0x27) & 0x20;
1999 fan4min = fan4pin;
2000 } else {
2001 fan3pin = 1;
2002 fan4pin = !(superio_inb(sio_data->sioreg, 0x29) & 0x06);
2003 fan5pin = !(superio_inb(sio_data->sioreg, 0x24) & 0x02);
2004 fan4min = fan4pin;
2005 }
2006
2007 data->has_fan = data->has_fan_min = 0x03;
2008 data->has_fan |= (fan3pin << 2);
2009 data->has_fan_min |= (fan3pin << 2);
2010
2011 if (sio_data->kind == nct6775 || sio_data->kind == nct6776) {
2012
2013
2014
2015
2016 data->has_fan |= (fan4pin << 3) | (fan5pin << 4);
2017 data->has_fan_min |= (fan4min << 3) | (fan5pin << 4);
2018 } else {
2019
2020
2021
2022
2023
2024
2025
2026 regval = w83627ehf_read_value(data, W83627EHF_REG_FANDIV1);
2027 if ((regval & (1 << 2)) && fan4pin) {
2028 data->has_fan |= (1 << 3);
2029 data->has_fan_min |= (1 << 3);
2030 }
2031 if (!(regval & (1 << 1)) && fan5pin) {
2032 data->has_fan |= (1 << 4);
2033 data->has_fan_min |= (1 << 4);
2034 }
2035 }
2036}
2037
2038static int w83627ehf_probe(struct platform_device *pdev)
2039{
2040 struct device *dev = &pdev->dev;
2041 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
2042 struct w83627ehf_data *data;
2043 struct resource *res;
2044 u8 en_vrm10;
2045 int i, err = 0;
2046
2047 res = platform_get_resource(pdev, IORESOURCE_IO, 0);
2048 if (!request_region(res->start, IOREGION_LENGTH, DRVNAME)) {
2049 err = -EBUSY;
2050 dev_err(dev, "Failed to request region 0x%lx-0x%lx\n",
2051 (unsigned long)res->start,
2052 (unsigned long)res->start + IOREGION_LENGTH - 1);
2053 goto exit;
2054 }
2055
2056 data = devm_kzalloc(&pdev->dev, sizeof(struct w83627ehf_data),
2057 GFP_KERNEL);
2058 if (!data) {
2059 err = -ENOMEM;
2060 goto exit_release;
2061 }
2062
2063 data->addr = res->start;
2064 mutex_init(&data->lock);
2065 mutex_init(&data->update_lock);
2066 data->name = w83627ehf_device_names[sio_data->kind];
2067 data->bank = 0xff;
2068 platform_set_drvdata(pdev, data);
2069
2070
2071 data->in_num = (sio_data->kind == w83627ehf) ? 10 : 9;
2072
2073 switch (sio_data->kind) {
2074 default:
2075 data->pwm_num = 4;
2076 break;
2077 case w83667hg:
2078 case w83667hg_b:
2079 case nct6775:
2080 case nct6776:
2081 data->pwm_num = 3;
2082 break;
2083 case w83627uhg:
2084 data->pwm_num = 2;
2085 break;
2086 }
2087
2088
2089 data->have_temp = 0x07;
2090
2091
2092 if (sio_data->kind == nct6775 || sio_data->kind == nct6776) {
2093 int mask = 0;
2094
2095
2096
2097
2098
2099
2100 for (i = 0; i < NUM_REG_TEMP; i++) {
2101 u8 src;
2102
2103 data->reg_temp[i] = NCT6775_REG_TEMP[i];
2104 data->reg_temp_over[i] = NCT6775_REG_TEMP_OVER[i];
2105 data->reg_temp_hyst[i] = NCT6775_REG_TEMP_HYST[i];
2106 data->reg_temp_config[i] = NCT6775_REG_TEMP_CONFIG[i];
2107
2108 src = w83627ehf_read_value(data,
2109 NCT6775_REG_TEMP_SOURCE[i]);
2110 src &= 0x1f;
2111 if (src && !(mask & (1 << src))) {
2112 data->have_temp |= 1 << i;
2113 mask |= 1 << src;
2114 }
2115
2116 data->temp_src[i] = src;
2117
2118
2119
2120
2121
2122
2123
2124
2125 if (i > 0 && data->temp_src[0] != 1
2126 && data->temp_src[i] == 1)
2127 w82627ehf_swap_tempreg(data, 0, i);
2128 if (i > 1 && data->temp_src[1] != 2
2129 && data->temp_src[i] == 2)
2130 w82627ehf_swap_tempreg(data, 1, i);
2131 if (i > 2 && data->temp_src[2] != 3
2132 && data->temp_src[i] == 3)
2133 w82627ehf_swap_tempreg(data, 2, i);
2134 }
2135 if (sio_data->kind == nct6776) {
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145 if (data->temp_src[2] == 3) {
2146 u8 reg;
2147
2148 if (data->reg_temp_config[2])
2149 reg = w83627ehf_read_value(data,
2150 data->reg_temp_config[2]);
2151 else
2152 reg = 0;
2153
2154 if (reg & 0x01)
2155 data->have_temp &= ~(1 << 2);
2156 else
2157 data->in6_skip = 1;
2158 }
2159 data->temp_label = nct6776_temp_label;
2160 } else {
2161 data->temp_label = nct6775_temp_label;
2162 }
2163 data->have_temp_offset = data->have_temp & 0x07;
2164 for (i = 0; i < 3; i++) {
2165 if (data->temp_src[i] > 3)
2166 data->have_temp_offset &= ~(1 << i);
2167 }
2168 } else if (sio_data->kind == w83667hg_b) {
2169 u8 reg;
2170
2171 w83627ehf_set_temp_reg_ehf(data, 4);
2172
2173
2174
2175
2176
2177 reg = w83627ehf_read_value(data, 0x4a);
2178 data->temp_src[0] = reg >> 5;
2179 reg = w83627ehf_read_value(data, 0x49);
2180 data->temp_src[1] = reg & 0x07;
2181 data->temp_src[2] = (reg >> 4) & 0x07;
2182
2183
2184
2185
2186
2187
2188
2189 reg = w83627ehf_read_value(data, 0x7d);
2190 reg &= 0x07;
2191 if (reg != data->temp_src[0] && reg != data->temp_src[1]
2192 && reg != data->temp_src[2]) {
2193 data->temp_src[3] = reg;
2194 data->have_temp |= 1 << 3;
2195 }
2196
2197
2198
2199
2200
2201 reg = w83627ehf_read_value(data, W83627EHF_REG_TEMP_CONFIG[2]);
2202 if (data->temp_src[2] == 2 && (reg & 0x01))
2203 data->have_temp &= ~(1 << 2);
2204
2205 if ((data->temp_src[2] == 2 && (data->have_temp & (1 << 2)))
2206 || (data->temp_src[3] == 2 && (data->have_temp & (1 << 3))))
2207 data->in6_skip = 1;
2208
2209 data->temp_label = w83667hg_b_temp_label;
2210 data->have_temp_offset = data->have_temp & 0x07;
2211 for (i = 0; i < 3; i++) {
2212 if (data->temp_src[i] > 2)
2213 data->have_temp_offset &= ~(1 << i);
2214 }
2215 } else if (sio_data->kind == w83627uhg) {
2216 u8 reg;
2217
2218 w83627ehf_set_temp_reg_ehf(data, 3);
2219
2220
2221
2222
2223
2224 data->temp_src[0] = 0;
2225 reg = w83627ehf_read_value(data, 0x49) & 0x07;
2226
2227 if (reg == 0)
2228 data->temp_src[1] = 1;
2229 else if (reg >= 2 && reg <= 5)
2230 data->temp_src[1] = reg + 2;
2231 else
2232 data->have_temp &= ~(1 << 1);
2233 reg = w83627ehf_read_value(data, 0x4a);
2234 data->temp_src[2] = reg >> 5;
2235
2236
2237
2238
2239
2240 if (data->temp_src[2] == 2 || data->temp_src[2] == 3 ||
2241 data->temp_src[2] == data->temp_src[0] ||
2242 ((data->have_temp & (1 << 1)) &&
2243 data->temp_src[2] == data->temp_src[1]))
2244 data->have_temp &= ~(1 << 2);
2245 else
2246 data->temp3_val_only = 1;
2247
2248 data->in6_skip = 1;
2249
2250 data->temp_label = w83667hg_b_temp_label;
2251 data->have_temp_offset = data->have_temp & 0x03;
2252 for (i = 0; i < 3; i++) {
2253 if (data->temp_src[i] > 1)
2254 data->have_temp_offset &= ~(1 << i);
2255 }
2256 } else {
2257 w83627ehf_set_temp_reg_ehf(data, 3);
2258
2259
2260
2261 if (sio_data->kind == w83667hg) {
2262 u8 reg;
2263
2264
2265
2266
2267
2268 reg = w83627ehf_read_value(data,
2269 W83627EHF_REG_TEMP_CONFIG[2]);
2270 if (reg & 0x01)
2271 data->have_temp &= ~(1 << 2);
2272 else
2273 data->in6_skip = 1;
2274 }
2275 data->have_temp_offset = data->have_temp & 0x07;
2276 }
2277
2278 if (sio_data->kind == nct6775) {
2279 data->has_fan_div = true;
2280 data->fan_from_reg = fan_from_reg16;
2281 data->fan_from_reg_min = fan_from_reg8;
2282 data->REG_PWM = NCT6775_REG_PWM;
2283 data->REG_TARGET = NCT6775_REG_TARGET;
2284 data->REG_FAN = NCT6775_REG_FAN;
2285 data->REG_FAN_MIN = W83627EHF_REG_FAN_MIN;
2286 data->REG_FAN_START_OUTPUT = NCT6775_REG_FAN_START_OUTPUT;
2287 data->REG_FAN_STOP_OUTPUT = NCT6775_REG_FAN_STOP_OUTPUT;
2288 data->REG_FAN_STOP_TIME = NCT6775_REG_FAN_STOP_TIME;
2289 data->REG_FAN_MAX_OUTPUT = NCT6775_REG_FAN_MAX_OUTPUT;
2290 data->REG_FAN_STEP_OUTPUT = NCT6775_REG_FAN_STEP_OUTPUT;
2291 } else if (sio_data->kind == nct6776) {
2292 data->has_fan_div = false;
2293 data->fan_from_reg = fan_from_reg13;
2294 data->fan_from_reg_min = fan_from_reg13;
2295 data->REG_PWM = NCT6775_REG_PWM;
2296 data->REG_TARGET = NCT6775_REG_TARGET;
2297 data->REG_FAN = NCT6775_REG_FAN;
2298 data->REG_FAN_MIN = NCT6776_REG_FAN_MIN;
2299 data->REG_FAN_START_OUTPUT = NCT6775_REG_FAN_START_OUTPUT;
2300 data->REG_FAN_STOP_OUTPUT = NCT6775_REG_FAN_STOP_OUTPUT;
2301 data->REG_FAN_STOP_TIME = NCT6775_REG_FAN_STOP_TIME;
2302 } else if (sio_data->kind == w83667hg_b) {
2303 data->has_fan_div = true;
2304 data->fan_from_reg = fan_from_reg8;
2305 data->fan_from_reg_min = fan_from_reg8;
2306 data->REG_PWM = W83627EHF_REG_PWM;
2307 data->REG_TARGET = W83627EHF_REG_TARGET;
2308 data->REG_FAN = W83627EHF_REG_FAN;
2309 data->REG_FAN_MIN = W83627EHF_REG_FAN_MIN;
2310 data->REG_FAN_START_OUTPUT = W83627EHF_REG_FAN_START_OUTPUT;
2311 data->REG_FAN_STOP_OUTPUT = W83627EHF_REG_FAN_STOP_OUTPUT;
2312 data->REG_FAN_STOP_TIME = W83627EHF_REG_FAN_STOP_TIME;
2313 data->REG_FAN_MAX_OUTPUT =
2314 W83627EHF_REG_FAN_MAX_OUTPUT_W83667_B;
2315 data->REG_FAN_STEP_OUTPUT =
2316 W83627EHF_REG_FAN_STEP_OUTPUT_W83667_B;
2317 } else {
2318 data->has_fan_div = true;
2319 data->fan_from_reg = fan_from_reg8;
2320 data->fan_from_reg_min = fan_from_reg8;
2321 data->REG_PWM = W83627EHF_REG_PWM;
2322 data->REG_TARGET = W83627EHF_REG_TARGET;
2323 data->REG_FAN = W83627EHF_REG_FAN;
2324 data->REG_FAN_MIN = W83627EHF_REG_FAN_MIN;
2325 data->REG_FAN_START_OUTPUT = W83627EHF_REG_FAN_START_OUTPUT;
2326 data->REG_FAN_STOP_OUTPUT = W83627EHF_REG_FAN_STOP_OUTPUT;
2327 data->REG_FAN_STOP_TIME = W83627EHF_REG_FAN_STOP_TIME;
2328 data->REG_FAN_MAX_OUTPUT =
2329 W83627EHF_REG_FAN_MAX_OUTPUT_COMMON;
2330 data->REG_FAN_STEP_OUTPUT =
2331 W83627EHF_REG_FAN_STEP_OUTPUT_COMMON;
2332 }
2333
2334
2335 if (sio_data->kind == w83627uhg)
2336 data->scale_in = scale_in_w83627uhg;
2337 else
2338 data->scale_in = scale_in_common;
2339
2340
2341 w83627ehf_init_device(data, sio_data->kind);
2342
2343 data->vrm = vid_which_vrm();
2344
2345 err = superio_enter(sio_data->sioreg);
2346 if (err)
2347 goto exit_release;
2348
2349
2350 if (sio_data->kind == w83667hg || sio_data->kind == w83667hg_b ||
2351 sio_data->kind == nct6775 || sio_data->kind == nct6776) {
2352
2353
2354
2355
2356
2357 superio_select(sio_data->sioreg, W83667HG_LD_VID);
2358 data->vid = superio_inb(sio_data->sioreg, 0xe3);
2359 err = device_create_file(dev, &dev_attr_cpu0_vid);
2360 if (err) {
2361 superio_exit(sio_data->sioreg);
2362 goto exit_release;
2363 }
2364 } else if (sio_data->kind != w83627uhg) {
2365 superio_select(sio_data->sioreg, W83627EHF_LD_HWM);
2366 if (superio_inb(sio_data->sioreg, SIO_REG_VID_CTRL) & 0x80) {
2367
2368
2369
2370
2371
2372
2373
2374 if (sio_data->kind == w83627ehf) {
2375 en_vrm10 = superio_inb(sio_data->sioreg,
2376 SIO_REG_EN_VRM10);
2377 if ((en_vrm10 & 0x08) && data->vrm == 90) {
2378 dev_warn(dev,
2379 "Setting VID input voltage to TTL\n");
2380 superio_outb(sio_data->sioreg,
2381 SIO_REG_EN_VRM10,
2382 en_vrm10 & ~0x08);
2383 } else if (!(en_vrm10 & 0x08)
2384 && data->vrm == 100) {
2385 dev_warn(dev,
2386 "Setting VID input voltage to VRM10\n");
2387 superio_outb(sio_data->sioreg,
2388 SIO_REG_EN_VRM10,
2389 en_vrm10 | 0x08);
2390 }
2391 }
2392
2393 data->vid = superio_inb(sio_data->sioreg,
2394 SIO_REG_VID_DATA);
2395 if (sio_data->kind == w83627ehf)
2396 data->vid &= 0x3f;
2397
2398 err = device_create_file(dev, &dev_attr_cpu0_vid);
2399 if (err) {
2400 superio_exit(sio_data->sioreg);
2401 goto exit_release;
2402 }
2403 } else {
2404 dev_info(dev,
2405 "VID pins in output mode, CPU VID not available\n");
2406 }
2407 }
2408
2409 if (fan_debounce &&
2410 (sio_data->kind == nct6775 || sio_data->kind == nct6776)) {
2411 u8 tmp;
2412
2413 superio_select(sio_data->sioreg, W83627EHF_LD_HWM);
2414 tmp = superio_inb(sio_data->sioreg, NCT6775_REG_FAN_DEBOUNCE);
2415 if (sio_data->kind == nct6776)
2416 superio_outb(sio_data->sioreg, NCT6775_REG_FAN_DEBOUNCE,
2417 0x3e | tmp);
2418 else
2419 superio_outb(sio_data->sioreg, NCT6775_REG_FAN_DEBOUNCE,
2420 0x1e | tmp);
2421 pr_info("Enabled fan debounce for chip %s\n", data->name);
2422 }
2423
2424 w83627ehf_check_fan_inputs(sio_data, data);
2425
2426 superio_exit(sio_data->sioreg);
2427
2428
2429 w83627ehf_update_fan_div_common(dev, data);
2430
2431
2432 w83627ehf_update_pwm_common(dev, data);
2433 for (i = 0; i < data->pwm_num; i++)
2434 data->pwm_enable_orig[i] = data->pwm_enable[i];
2435
2436
2437 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays); i++) {
2438 err = device_create_file(dev, &sda_sf3_arrays[i].dev_attr);
2439 if (err)
2440 goto exit_remove;
2441 }
2442
2443 for (i = 0; i < ARRAY_SIZE(sda_sf3_max_step_arrays); i++) {
2444 struct sensor_device_attribute *attr =
2445 &sda_sf3_max_step_arrays[i];
2446 if (data->REG_FAN_STEP_OUTPUT &&
2447 data->REG_FAN_STEP_OUTPUT[attr->index] != 0xff) {
2448 err = device_create_file(dev, &attr->dev_attr);
2449 if (err)
2450 goto exit_remove;
2451 }
2452 }
2453
2454 if ((data->has_fan & (1 << 2)) && data->pwm_num >= 3)
2455 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays_fan3); i++) {
2456 err = device_create_file(dev,
2457 &sda_sf3_arrays_fan3[i].dev_attr);
2458 if (err)
2459 goto exit_remove;
2460 }
2461 if ((data->has_fan & (1 << 3)) && data->pwm_num >= 4)
2462 for (i = 0; i < ARRAY_SIZE(sda_sf3_arrays_fan4); i++) {
2463 err = device_create_file(dev,
2464 &sda_sf3_arrays_fan4[i].dev_attr);
2465 if (err)
2466 goto exit_remove;
2467 }
2468
2469 for (i = 0; i < data->in_num; i++) {
2470 if ((i == 6) && data->in6_skip)
2471 continue;
2472 if ((err = device_create_file(dev, &sda_in_input[i].dev_attr))
2473 || (err = device_create_file(dev,
2474 &sda_in_alarm[i].dev_attr))
2475 || (err = device_create_file(dev,
2476 &sda_in_min[i].dev_attr))
2477 || (err = device_create_file(dev,
2478 &sda_in_max[i].dev_attr)))
2479 goto exit_remove;
2480 }
2481
2482 for (i = 0; i < 5; i++) {
2483 if (data->has_fan & (1 << i)) {
2484 if ((err = device_create_file(dev,
2485 &sda_fan_input[i].dev_attr))
2486 || (err = device_create_file(dev,
2487 &sda_fan_alarm[i].dev_attr)))
2488 goto exit_remove;
2489 if (sio_data->kind != nct6776) {
2490 err = device_create_file(dev,
2491 &sda_fan_div[i].dev_attr);
2492 if (err)
2493 goto exit_remove;
2494 }
2495 if (data->has_fan_min & (1 << i)) {
2496 err = device_create_file(dev,
2497 &sda_fan_min[i].dev_attr);
2498 if (err)
2499 goto exit_remove;
2500 }
2501 if (i < data->pwm_num &&
2502 ((err = device_create_file(dev,
2503 &sda_pwm[i].dev_attr))
2504 || (err = device_create_file(dev,
2505 &sda_pwm_mode[i].dev_attr))
2506 || (err = device_create_file(dev,
2507 &sda_pwm_enable[i].dev_attr))
2508 || (err = device_create_file(dev,
2509 &sda_target_temp[i].dev_attr))
2510 || (err = device_create_file(dev,
2511 &sda_tolerance[i].dev_attr))))
2512 goto exit_remove;
2513 }
2514 }
2515
2516 for (i = 0; i < NUM_REG_TEMP; i++) {
2517 if (!(data->have_temp & (1 << i)))
2518 continue;
2519 err = device_create_file(dev, &sda_temp_input[i].dev_attr);
2520 if (err)
2521 goto exit_remove;
2522 if (data->temp_label) {
2523 err = device_create_file(dev,
2524 &sda_temp_label[i].dev_attr);
2525 if (err)
2526 goto exit_remove;
2527 }
2528 if (i == 2 && data->temp3_val_only)
2529 continue;
2530 if (data->reg_temp_over[i]) {
2531 err = device_create_file(dev,
2532 &sda_temp_max[i].dev_attr);
2533 if (err)
2534 goto exit_remove;
2535 }
2536 if (data->reg_temp_hyst[i]) {
2537 err = device_create_file(dev,
2538 &sda_temp_max_hyst[i].dev_attr);
2539 if (err)
2540 goto exit_remove;
2541 }
2542 if (i > 2)
2543 continue;
2544 if ((err = device_create_file(dev,
2545 &sda_temp_alarm[i].dev_attr))
2546 || (err = device_create_file(dev,
2547 &sda_temp_type[i].dev_attr)))
2548 goto exit_remove;
2549 if (data->have_temp_offset & (1 << i)) {
2550 err = device_create_file(dev,
2551 &sda_temp_offset[i].dev_attr);
2552 if (err)
2553 goto exit_remove;
2554 }
2555 }
2556
2557 err = device_create_file(dev, &sda_caseopen[0].dev_attr);
2558 if (err)
2559 goto exit_remove;
2560
2561 if (sio_data->kind == nct6776) {
2562 err = device_create_file(dev, &sda_caseopen[1].dev_attr);
2563 if (err)
2564 goto exit_remove;
2565 }
2566
2567 err = device_create_file(dev, &dev_attr_name);
2568 if (err)
2569 goto exit_remove;
2570
2571 data->hwmon_dev = hwmon_device_register(dev);
2572 if (IS_ERR(data->hwmon_dev)) {
2573 err = PTR_ERR(data->hwmon_dev);
2574 goto exit_remove;
2575 }
2576
2577 return 0;
2578
2579exit_remove:
2580 w83627ehf_device_remove_files(dev);
2581exit_release:
2582 release_region(res->start, IOREGION_LENGTH);
2583exit:
2584 return err;
2585}
2586
2587static int w83627ehf_remove(struct platform_device *pdev)
2588{
2589 struct w83627ehf_data *data = platform_get_drvdata(pdev);
2590
2591 hwmon_device_unregister(data->hwmon_dev);
2592 w83627ehf_device_remove_files(&pdev->dev);
2593 release_region(data->addr, IOREGION_LENGTH);
2594
2595 return 0;
2596}
2597
2598#ifdef CONFIG_PM
2599static int w83627ehf_suspend(struct device *dev)
2600{
2601 struct w83627ehf_data *data = w83627ehf_update_device(dev);
2602 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
2603
2604 mutex_lock(&data->update_lock);
2605 data->vbat = w83627ehf_read_value(data, W83627EHF_REG_VBAT);
2606 if (sio_data->kind == nct6775) {
2607 data->fandiv1 = w83627ehf_read_value(data, NCT6775_REG_FANDIV1);
2608 data->fandiv2 = w83627ehf_read_value(data, NCT6775_REG_FANDIV2);
2609 }
2610 mutex_unlock(&data->update_lock);
2611
2612 return 0;
2613}
2614
2615static int w83627ehf_resume(struct device *dev)
2616{
2617 struct w83627ehf_data *data = dev_get_drvdata(dev);
2618 struct w83627ehf_sio_data *sio_data = dev_get_platdata(dev);
2619 int i;
2620
2621 mutex_lock(&data->update_lock);
2622 data->bank = 0xff;
2623
2624
2625 for (i = 0; i < data->in_num; i++) {
2626 if ((i == 6) && data->in6_skip)
2627 continue;
2628
2629 w83627ehf_write_value(data, W83627EHF_REG_IN_MIN(i),
2630 data->in_min[i]);
2631 w83627ehf_write_value(data, W83627EHF_REG_IN_MAX(i),
2632 data->in_max[i]);
2633 }
2634
2635 for (i = 0; i < 5; i++) {
2636 if (!(data->has_fan_min & (1 << i)))
2637 continue;
2638
2639 w83627ehf_write_value(data, data->REG_FAN_MIN[i],
2640 data->fan_min[i]);
2641 }
2642
2643 for (i = 0; i < NUM_REG_TEMP; i++) {
2644 if (!(data->have_temp & (1 << i)))
2645 continue;
2646
2647 if (data->reg_temp_over[i])
2648 w83627ehf_write_temp(data, data->reg_temp_over[i],
2649 data->temp_max[i]);
2650 if (data->reg_temp_hyst[i])
2651 w83627ehf_write_temp(data, data->reg_temp_hyst[i],
2652 data->temp_max_hyst[i]);
2653 if (i > 2)
2654 continue;
2655 if (data->have_temp_offset & (1 << i))
2656 w83627ehf_write_value(data,
2657 W83627EHF_REG_TEMP_OFFSET[i],
2658 data->temp_offset[i]);
2659 }
2660
2661
2662 w83627ehf_write_value(data, W83627EHF_REG_VBAT, data->vbat);
2663 if (sio_data->kind == nct6775) {
2664 w83627ehf_write_value(data, NCT6775_REG_FANDIV1, data->fandiv1);
2665 w83627ehf_write_value(data, NCT6775_REG_FANDIV2, data->fandiv2);
2666 }
2667
2668
2669 data->valid = 0;
2670 mutex_unlock(&data->update_lock);
2671
2672 return 0;
2673}
2674
2675static const struct dev_pm_ops w83627ehf_dev_pm_ops = {
2676 .suspend = w83627ehf_suspend,
2677 .resume = w83627ehf_resume,
2678 .freeze = w83627ehf_suspend,
2679 .restore = w83627ehf_resume,
2680};
2681
2682#define W83627EHF_DEV_PM_OPS (&w83627ehf_dev_pm_ops)
2683#else
2684#define W83627EHF_DEV_PM_OPS NULL
2685#endif
2686
2687static struct platform_driver w83627ehf_driver = {
2688 .driver = {
2689 .name = DRVNAME,
2690 .pm = W83627EHF_DEV_PM_OPS,
2691 },
2692 .probe = w83627ehf_probe,
2693 .remove = w83627ehf_remove,
2694};
2695
2696
2697static int __init w83627ehf_find(int sioaddr, unsigned short *addr,
2698 struct w83627ehf_sio_data *sio_data)
2699{
2700 static const char sio_name_W83627EHF[] __initconst = "W83627EHF";
2701 static const char sio_name_W83627EHG[] __initconst = "W83627EHG";
2702 static const char sio_name_W83627DHG[] __initconst = "W83627DHG";
2703 static const char sio_name_W83627DHG_P[] __initconst = "W83627DHG-P";
2704 static const char sio_name_W83627UHG[] __initconst = "W83627UHG";
2705 static const char sio_name_W83667HG[] __initconst = "W83667HG";
2706 static const char sio_name_W83667HG_B[] __initconst = "W83667HG-B";
2707 static const char sio_name_NCT6775[] __initconst = "NCT6775F";
2708 static const char sio_name_NCT6776[] __initconst = "NCT6776F";
2709
2710 u16 val;
2711 const char *sio_name;
2712 int err;
2713
2714 err = superio_enter(sioaddr);
2715 if (err)
2716 return err;
2717
2718 if (force_id)
2719 val = force_id;
2720 else
2721 val = (superio_inb(sioaddr, SIO_REG_DEVID) << 8)
2722 | superio_inb(sioaddr, SIO_REG_DEVID + 1);
2723 switch (val & SIO_ID_MASK) {
2724 case SIO_W83627EHF_ID:
2725 sio_data->kind = w83627ehf;
2726 sio_name = sio_name_W83627EHF;
2727 break;
2728 case SIO_W83627EHG_ID:
2729 sio_data->kind = w83627ehf;
2730 sio_name = sio_name_W83627EHG;
2731 break;
2732 case SIO_W83627DHG_ID:
2733 sio_data->kind = w83627dhg;
2734 sio_name = sio_name_W83627DHG;
2735 break;
2736 case SIO_W83627DHG_P_ID:
2737 sio_data->kind = w83627dhg_p;
2738 sio_name = sio_name_W83627DHG_P;
2739 break;
2740 case SIO_W83627UHG_ID:
2741 sio_data->kind = w83627uhg;
2742 sio_name = sio_name_W83627UHG;
2743 break;
2744 case SIO_W83667HG_ID:
2745 sio_data->kind = w83667hg;
2746 sio_name = sio_name_W83667HG;
2747 break;
2748 case SIO_W83667HG_B_ID:
2749 sio_data->kind = w83667hg_b;
2750 sio_name = sio_name_W83667HG_B;
2751 break;
2752 case SIO_NCT6775_ID:
2753 sio_data->kind = nct6775;
2754 sio_name = sio_name_NCT6775;
2755 break;
2756 case SIO_NCT6776_ID:
2757 sio_data->kind = nct6776;
2758 sio_name = sio_name_NCT6776;
2759 break;
2760 default:
2761 if (val != 0xffff)
2762 pr_debug("unsupported chip ID: 0x%04x\n", val);
2763 superio_exit(sioaddr);
2764 return -ENODEV;
2765 }
2766
2767
2768 superio_select(sioaddr, W83627EHF_LD_HWM);
2769 val = (superio_inb(sioaddr, SIO_REG_ADDR) << 8)
2770 | superio_inb(sioaddr, SIO_REG_ADDR + 1);
2771 *addr = val & IOREGION_ALIGNMENT;
2772 if (*addr == 0) {
2773 pr_err("Refusing to enable a Super-I/O device with a base I/O port 0\n");
2774 superio_exit(sioaddr);
2775 return -ENODEV;
2776 }
2777
2778
2779 val = superio_inb(sioaddr, SIO_REG_ENABLE);
2780 if (!(val & 0x01)) {
2781 pr_warn("Forcibly enabling Super-I/O. Sensor is probably unusable.\n");
2782 superio_outb(sioaddr, SIO_REG_ENABLE, val | 0x01);
2783 }
2784
2785 superio_exit(sioaddr);
2786 pr_info("Found %s chip at %#x\n", sio_name, *addr);
2787 sio_data->sioreg = sioaddr;
2788
2789 return 0;
2790}
2791
2792
2793
2794
2795
2796
2797
2798static struct platform_device *pdev;
2799
2800static int __init sensors_w83627ehf_init(void)
2801{
2802 int err;
2803 unsigned short address;
2804 struct resource res;
2805 struct w83627ehf_sio_data sio_data;
2806
2807
2808
2809
2810
2811
2812
2813
2814 if (w83627ehf_find(0x2e, &address, &sio_data) &&
2815 w83627ehf_find(0x4e, &address, &sio_data))
2816 return -ENODEV;
2817
2818 err = platform_driver_register(&w83627ehf_driver);
2819 if (err)
2820 goto exit;
2821
2822 pdev = platform_device_alloc(DRVNAME, address);
2823 if (!pdev) {
2824 err = -ENOMEM;
2825 pr_err("Device allocation failed\n");
2826 goto exit_unregister;
2827 }
2828
2829 err = platform_device_add_data(pdev, &sio_data,
2830 sizeof(struct w83627ehf_sio_data));
2831 if (err) {
2832 pr_err("Platform data allocation failed\n");
2833 goto exit_device_put;
2834 }
2835
2836 memset(&res, 0, sizeof(res));
2837 res.name = DRVNAME;
2838 res.start = address + IOREGION_OFFSET;
2839 res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1;
2840 res.flags = IORESOURCE_IO;
2841
2842 err = acpi_check_resource_conflict(&res);
2843 if (err)
2844 goto exit_device_put;
2845
2846 err = platform_device_add_resources(pdev, &res, 1);
2847 if (err) {
2848 pr_err("Device resource addition failed (%d)\n", err);
2849 goto exit_device_put;
2850 }
2851
2852
2853 err = platform_device_add(pdev);
2854 if (err) {
2855 pr_err("Device addition failed (%d)\n", err);
2856 goto exit_device_put;
2857 }
2858
2859 return 0;
2860
2861exit_device_put:
2862 platform_device_put(pdev);
2863exit_unregister:
2864 platform_driver_unregister(&w83627ehf_driver);
2865exit:
2866 return err;
2867}
2868
2869static void __exit sensors_w83627ehf_exit(void)
2870{
2871 platform_device_unregister(pdev);
2872 platform_driver_unregister(&w83627ehf_driver);
2873}
2874
2875MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>");
2876MODULE_DESCRIPTION("W83627EHF driver");
2877MODULE_LICENSE("GPL");
2878
2879module_init(sensors_w83627ehf_init);
2880module_exit(sensors_w83627ehf_exit);
2881