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