Merge branch 'parisc-4.9-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller...
[cascardo/linux.git] / drivers / hwmon / nct6683.c
1 /*
2  * nct6683 - Driver for the hardware monitoring functionality of
3  *           Nuvoton NCT6683D eSIO
4  *
5  * Copyright (C) 2013  Guenter Roeck <linux@roeck-us.net>
6  *
7  * Derived from nct6775 driver
8  * Copyright (C) 2012, 2013  Guenter Roeck <linux@roeck-us.net>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * Supports the following chips:
21  *
22  * Chip        #vin    #fan    #pwm    #temp  chip ID
23  * nct6683d     21(1)   16      8       32(1) 0xc730
24  *
25  * Notes:
26  *      (1) Total number of vin and temp inputs is 32.
27  */
28
29 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
30
31 #include <linux/acpi.h>
32 #include <linux/delay.h>
33 #include <linux/err.h>
34 #include <linux/init.h>
35 #include <linux/io.h>
36 #include <linux/jiffies.h>
37 #include <linux/hwmon.h>
38 #include <linux/hwmon-sysfs.h>
39 #include <linux/module.h>
40 #include <linux/mutex.h>
41 #include <linux/platform_device.h>
42 #include <linux/slab.h>
43
44 enum kinds { nct6683 };
45
46 static bool force;
47 module_param(force, bool, 0);
48 MODULE_PARM_DESC(force, "Set to one to enable support for unknown vendors");
49
50 static const char * const nct6683_device_names[] = {
51         "nct6683",
52 };
53
54 static const char * const nct6683_chip_names[] = {
55         "NCT6683D",
56 };
57
58 #define DRVNAME "nct6683"
59
60 /*
61  * Super-I/O constants and functions
62  */
63
64 #define NCT6683_LD_ACPI         0x0a
65 #define NCT6683_LD_HWM          0x0b
66 #define NCT6683_LD_VID          0x0d
67
68 #define SIO_REG_LDSEL           0x07    /* Logical device select */
69 #define SIO_REG_DEVID           0x20    /* Device ID (2 bytes) */
70 #define SIO_REG_ENABLE          0x30    /* Logical device enable */
71 #define SIO_REG_ADDR            0x60    /* Logical device address (2 bytes) */
72
73 #define SIO_NCT6681_ID          0xb270  /* for later */
74 #define SIO_NCT6683_ID          0xc730
75 #define SIO_ID_MASK             0xFFF0
76
77 static inline void
78 superio_outb(int ioreg, int reg, int val)
79 {
80         outb(reg, ioreg);
81         outb(val, ioreg + 1);
82 }
83
84 static inline int
85 superio_inb(int ioreg, int reg)
86 {
87         outb(reg, ioreg);
88         return inb(ioreg + 1);
89 }
90
91 static inline void
92 superio_select(int ioreg, int ld)
93 {
94         outb(SIO_REG_LDSEL, ioreg);
95         outb(ld, ioreg + 1);
96 }
97
98 static inline int
99 superio_enter(int ioreg)
100 {
101         /*
102          * Try to reserve <ioreg> and <ioreg + 1> for exclusive access.
103          */
104         if (!request_muxed_region(ioreg, 2, DRVNAME))
105                 return -EBUSY;
106
107         outb(0x87, ioreg);
108         outb(0x87, ioreg);
109
110         return 0;
111 }
112
113 static inline void
114 superio_exit(int ioreg)
115 {
116         outb(0xaa, ioreg);
117         outb(0x02, ioreg);
118         outb(0x02, ioreg + 1);
119         release_region(ioreg, 2);
120 }
121
122 /*
123  * ISA constants
124  */
125
126 #define IOREGION_ALIGNMENT      (~7)
127 #define IOREGION_OFFSET         4       /* Use EC port 1 */
128 #define IOREGION_LENGTH         4
129
130 #define EC_PAGE_REG             0
131 #define EC_INDEX_REG            1
132 #define EC_DATA_REG             2
133 #define EC_EVENT_REG            3
134
135 /* Common and NCT6683 specific data */
136
137 #define NCT6683_NUM_REG_MON             32
138 #define NCT6683_NUM_REG_FAN             16
139 #define NCT6683_NUM_REG_PWM             8
140
141 #define NCT6683_REG_MON(x)              (0x100 + (x) * 2)
142 #define NCT6683_REG_FAN_RPM(x)          (0x140 + (x) * 2)
143 #define NCT6683_REG_PWM(x)              (0x160 + (x))
144 #define NCT6683_REG_PWM_WRITE(x)        (0xa28 + (x))
145
146 #define NCT6683_REG_MON_STS(x)          (0x174 + (x))
147 #define NCT6683_REG_IDLE(x)             (0x178 + (x))
148
149 #define NCT6683_REG_FAN_STS(x)          (0x17c + (x))
150 #define NCT6683_REG_FAN_ERRSTS          0x17e
151 #define NCT6683_REG_FAN_INITSTS         0x17f
152
153 #define NCT6683_HWM_CFG                 0x180
154
155 #define NCT6683_REG_MON_CFG(x)          (0x1a0 + (x))
156 #define NCT6683_REG_FANIN_CFG(x)        (0x1c0 + (x))
157 #define NCT6683_REG_FANOUT_CFG(x)       (0x1d0 + (x))
158
159 #define NCT6683_REG_INTEL_TEMP_MAX(x)   (0x901 + (x) * 16)
160 #define NCT6683_REG_INTEL_TEMP_CRIT(x)  (0x90d + (x) * 16)
161
162 #define NCT6683_REG_TEMP_HYST(x)        (0x330 + (x))           /* 8 bit */
163 #define NCT6683_REG_TEMP_MAX(x)         (0x350 + (x))           /* 8 bit */
164 #define NCT6683_REG_MON_HIGH(x)         (0x370 + (x) * 2)       /* 8 bit */
165 #define NCT6683_REG_MON_LOW(x)          (0x371 + (x) * 2)       /* 8 bit */
166
167 #define NCT6683_REG_FAN_MIN(x)          (0x3b8 + (x) * 2)       /* 16 bit */
168
169 #define NCT6683_REG_FAN_CFG_CTRL        0xa01
170 #define NCT6683_FAN_CFG_REQ             0x80
171 #define NCT6683_FAN_CFG_DONE            0x40
172
173 #define NCT6683_REG_CUSTOMER_ID         0x602
174 #define NCT6683_CUSTOMER_ID_INTEL       0x805
175 #define NCT6683_CUSTOMER_ID_MITAC       0xa0e
176
177 #define NCT6683_REG_BUILD_YEAR          0x604
178 #define NCT6683_REG_BUILD_MONTH         0x605
179 #define NCT6683_REG_BUILD_DAY           0x606
180 #define NCT6683_REG_SERIAL              0x607
181 #define NCT6683_REG_VERSION_HI          0x608
182 #define NCT6683_REG_VERSION_LO          0x609
183
184 #define NCT6683_REG_CR_CASEOPEN         0xe8
185 #define NCT6683_CR_CASEOPEN_MASK        (1 << 7)
186
187 #define NCT6683_REG_CR_BEEP             0xe0
188 #define NCT6683_CR_BEEP_MASK            (1 << 6)
189
190 static const char *const nct6683_mon_label[] = {
191         NULL,   /* disabled */
192         "Local",
193         "Diode 0 (curr)",
194         "Diode 1 (curr)",
195         "Diode 2 (curr)",
196         "Diode 0 (volt)",
197         "Diode 1 (volt)",
198         "Diode 2 (volt)",
199         "Thermistor 14",
200         "Thermistor 15",
201         "Thermistor 16",
202         "Thermistor 0",
203         "Thermistor 1",
204         "Thermistor 2",
205         "Thermistor 3",
206         "Thermistor 4",
207         "Thermistor 5",         /* 0x10 */
208         "Thermistor 6",
209         "Thermistor 7",
210         "Thermistor 8",
211         "Thermistor 9",
212         "Thermistor 10",
213         "Thermistor 11",
214         "Thermistor 12",
215         "Thermistor 13",
216         NULL, NULL, NULL, NULL, NULL, NULL, NULL,
217         "PECI 0.0",             /* 0x20 */
218         "PECI 1.0",
219         "PECI 2.0",
220         "PECI 3.0",
221         "PECI 0.1",
222         "PECI 1.1",
223         "PECI 2.1",
224         "PECI 3.1",
225         "PECI DIMM 0",
226         "PECI DIMM 1",
227         "PECI DIMM 2",
228         "PECI DIMM 3",
229         NULL, NULL, NULL, NULL,
230         "PCH CPU",              /* 0x30 */
231         "PCH CHIP",
232         "PCH CHIP CPU MAX",
233         "PCH MCH",
234         "PCH DIMM 0",
235         "PCH DIMM 1",
236         "PCH DIMM 2",
237         "PCH DIMM 3",
238         "SMBus 0",
239         "SMBus 1",
240         "SMBus 2",
241         "SMBus 3",
242         "SMBus 4",
243         "SMBus 5",
244         "DIMM 0",
245         "DIMM 1",
246         "DIMM 2",               /* 0x40 */
247         "DIMM 3",
248         "AMD TSI Addr 90h",
249         "AMD TSI Addr 92h",
250         "AMD TSI Addr 94h",
251         "AMD TSI Addr 96h",
252         "AMD TSI Addr 98h",
253         "AMD TSI Addr 9ah",
254         "AMD TSI Addr 9ch",
255         "AMD TSI Addr 9dh",
256         NULL, NULL, NULL, NULL, NULL, NULL,
257         "Virtual 0",            /* 0x50 */
258         "Virtual 1",
259         "Virtual 2",
260         "Virtual 3",
261         "Virtual 4",
262         "Virtual 5",
263         "Virtual 6",
264         "Virtual 7",
265         NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
266         "VCC",                  /* 0x60 voltage sensors */
267         "VSB",
268         "AVSB",
269         "VTT",
270         "VBAT",
271         "VREF",
272         "VIN0",
273         "VIN1",
274         "VIN2",
275         "VIN3",
276         "VIN4",
277         "VIN5",
278         "VIN6",
279         "VIN7",
280         "VIN8",
281         "VIN9",
282         "VIN10",
283         "VIN11",
284         "VIN12",
285         "VIN13",
286         "VIN14",
287         "VIN15",
288         "VIN16",
289 };
290
291 #define NUM_MON_LABELS          ARRAY_SIZE(nct6683_mon_label)
292 #define MON_VOLTAGE_START       0x60
293
294 /* ------------------------------------------------------- */
295
296 struct nct6683_data {
297         int addr;               /* IO base of EC space */
298         int sioreg;             /* SIO register */
299         enum kinds kind;
300         u16 customer_id;
301
302         struct device *hwmon_dev;
303         const struct attribute_group *groups[6];
304
305         int temp_num;                   /* number of temperature attributes */
306         u8 temp_index[NCT6683_NUM_REG_MON];
307         u8 temp_src[NCT6683_NUM_REG_MON];
308
309         u8 in_num;                      /* number of voltage attributes */
310         u8 in_index[NCT6683_NUM_REG_MON];
311         u8 in_src[NCT6683_NUM_REG_MON];
312
313         struct mutex update_lock;       /* used to protect sensor updates */
314         bool valid;                     /* true if following fields are valid */
315         unsigned long last_updated;     /* In jiffies */
316
317         /* Voltage attribute values */
318         u8 in[3][NCT6683_NUM_REG_MON];  /* [0]=in, [1]=in_max, [2]=in_min */
319
320         /* Temperature attribute values */
321         s16 temp_in[NCT6683_NUM_REG_MON];
322         s8 temp[4][NCT6683_NUM_REG_MON];/* [0]=min, [1]=max, [2]=hyst,
323                                          * [3]=crit
324                                          */
325
326         /* Fan attribute values */
327         unsigned int rpm[NCT6683_NUM_REG_FAN];
328         u16 fan_min[NCT6683_NUM_REG_FAN];
329         u8 fanin_cfg[NCT6683_NUM_REG_FAN];
330         u8 fanout_cfg[NCT6683_NUM_REG_FAN];
331         u16 have_fan;                   /* some fan inputs can be disabled */
332
333         u8 have_pwm;
334         u8 pwm[NCT6683_NUM_REG_PWM];
335
336 #ifdef CONFIG_PM
337         /* Remember extra register values over suspend/resume */
338         u8 hwm_cfg;
339 #endif
340 };
341
342 struct nct6683_sio_data {
343         int sioreg;
344         enum kinds kind;
345 };
346
347 struct sensor_device_template {
348         struct device_attribute dev_attr;
349         union {
350                 struct {
351                         u8 nr;
352                         u8 index;
353                 } s;
354                 int index;
355         } u;
356         bool s2;        /* true if both index and nr are used */
357 };
358
359 struct sensor_device_attr_u {
360         union {
361                 struct sensor_device_attribute a1;
362                 struct sensor_device_attribute_2 a2;
363         } u;
364         char name[32];
365 };
366
367 #define __TEMPLATE_ATTR(_template, _mode, _show, _store) {      \
368         .attr = {.name = _template, .mode = _mode },            \
369         .show   = _show,                                        \
370         .store  = _store,                                       \
371 }
372
373 #define SENSOR_DEVICE_TEMPLATE(_template, _mode, _show, _store, _index) \
374         { .dev_attr = __TEMPLATE_ATTR(_template, _mode, _show, _store), \
375           .u.index = _index,                                            \
376           .s2 = false }
377
378 #define SENSOR_DEVICE_TEMPLATE_2(_template, _mode, _show, _store,       \
379                                  _nr, _index)                           \
380         { .dev_attr = __TEMPLATE_ATTR(_template, _mode, _show, _store), \
381           .u.s.index = _index,                                          \
382           .u.s.nr = _nr,                                                \
383           .s2 = true }
384
385 #define SENSOR_TEMPLATE(_name, _template, _mode, _show, _store, _index) \
386 static struct sensor_device_template sensor_dev_template_##_name        \
387         = SENSOR_DEVICE_TEMPLATE(_template, _mode, _show, _store,       \
388                                  _index)
389
390 #define SENSOR_TEMPLATE_2(_name, _template, _mode, _show, _store,       \
391                           _nr, _index)                                  \
392 static struct sensor_device_template sensor_dev_template_##_name        \
393         = SENSOR_DEVICE_TEMPLATE_2(_template, _mode, _show, _store,     \
394                                  _nr, _index)
395
396 struct sensor_template_group {
397         struct sensor_device_template **templates;
398         umode_t (*is_visible)(struct kobject *, struct attribute *, int);
399         int base;
400 };
401
402 static struct attribute_group *
403 nct6683_create_attr_group(struct device *dev,
404                           const struct sensor_template_group *tg,
405                           int repeat)
406 {
407         struct sensor_device_attribute_2 *a2;
408         struct sensor_device_attribute *a;
409         struct sensor_device_template **t;
410         struct sensor_device_attr_u *su;
411         struct attribute_group *group;
412         struct attribute **attrs;
413         int i, j, count;
414
415         if (repeat <= 0)
416                 return ERR_PTR(-EINVAL);
417
418         t = tg->templates;
419         for (count = 0; *t; t++, count++)
420                 ;
421
422         if (count == 0)
423                 return ERR_PTR(-EINVAL);
424
425         group = devm_kzalloc(dev, sizeof(*group), GFP_KERNEL);
426         if (group == NULL)
427                 return ERR_PTR(-ENOMEM);
428
429         attrs = devm_kzalloc(dev, sizeof(*attrs) * (repeat * count + 1),
430                              GFP_KERNEL);
431         if (attrs == NULL)
432                 return ERR_PTR(-ENOMEM);
433
434         su = devm_kzalloc(dev, sizeof(*su) * repeat * count,
435                           GFP_KERNEL);
436         if (su == NULL)
437                 return ERR_PTR(-ENOMEM);
438
439         group->attrs = attrs;
440         group->is_visible = tg->is_visible;
441
442         for (i = 0; i < repeat; i++) {
443                 t = tg->templates;
444                 for (j = 0; *t != NULL; j++) {
445                         snprintf(su->name, sizeof(su->name),
446                                  (*t)->dev_attr.attr.name, tg->base + i);
447                         if ((*t)->s2) {
448                                 a2 = &su->u.a2;
449                                 sysfs_attr_init(&a2->dev_attr.attr);
450                                 a2->dev_attr.attr.name = su->name;
451                                 a2->nr = (*t)->u.s.nr + i;
452                                 a2->index = (*t)->u.s.index;
453                                 a2->dev_attr.attr.mode =
454                                   (*t)->dev_attr.attr.mode;
455                                 a2->dev_attr.show = (*t)->dev_attr.show;
456                                 a2->dev_attr.store = (*t)->dev_attr.store;
457                                 *attrs = &a2->dev_attr.attr;
458                         } else {
459                                 a = &su->u.a1;
460                                 sysfs_attr_init(&a->dev_attr.attr);
461                                 a->dev_attr.attr.name = su->name;
462                                 a->index = (*t)->u.index + i;
463                                 a->dev_attr.attr.mode =
464                                   (*t)->dev_attr.attr.mode;
465                                 a->dev_attr.show = (*t)->dev_attr.show;
466                                 a->dev_attr.store = (*t)->dev_attr.store;
467                                 *attrs = &a->dev_attr.attr;
468                         }
469                         attrs++;
470                         su++;
471                         t++;
472                 }
473         }
474
475         return group;
476 }
477
478 /* LSB is 16 mV, except for the following sources, where it is 32 mV */
479 #define MON_SRC_VCC     0x60
480 #define MON_SRC_VSB     0x61
481 #define MON_SRC_AVSB    0x62
482 #define MON_SRC_VBAT    0x64
483
484 static inline long in_from_reg(u16 reg, u8 src)
485 {
486         int scale = 16;
487
488         if (src == MON_SRC_VCC || src == MON_SRC_VSB || src == MON_SRC_AVSB ||
489             src == MON_SRC_VBAT)
490                 scale <<= 1;
491         return reg * scale;
492 }
493
494 static inline u16 in_to_reg(u32 val, u8 src)
495 {
496         int scale = 16;
497
498         if (src == MON_SRC_VCC || src == MON_SRC_VSB || src == MON_SRC_AVSB ||
499             src == MON_SRC_VBAT)
500                 scale <<= 1;
501
502         return clamp_val(DIV_ROUND_CLOSEST(val, scale), 0, 127);
503 }
504
505 static u16 nct6683_read(struct nct6683_data *data, u16 reg)
506 {
507         int res;
508
509         outb_p(0xff, data->addr + EC_PAGE_REG);         /* unlock */
510         outb_p(reg >> 8, data->addr + EC_PAGE_REG);
511         outb_p(reg & 0xff, data->addr + EC_INDEX_REG);
512         res = inb_p(data->addr + EC_DATA_REG);
513         return res;
514 }
515
516 static u16 nct6683_read16(struct nct6683_data *data, u16 reg)
517 {
518         return (nct6683_read(data, reg) << 8) | nct6683_read(data, reg + 1);
519 }
520
521 static void nct6683_write(struct nct6683_data *data, u16 reg, u16 value)
522 {
523         outb_p(0xff, data->addr + EC_PAGE_REG);         /* unlock */
524         outb_p(reg >> 8, data->addr + EC_PAGE_REG);
525         outb_p(reg & 0xff, data->addr + EC_INDEX_REG);
526         outb_p(value & 0xff, data->addr + EC_DATA_REG);
527 }
528
529 static int get_in_reg(struct nct6683_data *data, int nr, int index)
530 {
531         int ch = data->in_index[index];
532         int reg = -EINVAL;
533
534         switch (nr) {
535         case 0:
536                 reg = NCT6683_REG_MON(ch);
537                 break;
538         case 1:
539                 if (data->customer_id != NCT6683_CUSTOMER_ID_INTEL)
540                         reg = NCT6683_REG_MON_LOW(ch);
541                 break;
542         case 2:
543                 if (data->customer_id != NCT6683_CUSTOMER_ID_INTEL)
544                         reg = NCT6683_REG_MON_HIGH(ch);
545                 break;
546         default:
547                 break;
548         }
549         return reg;
550 }
551
552 static int get_temp_reg(struct nct6683_data *data, int nr, int index)
553 {
554         int ch = data->temp_index[index];
555         int reg = -EINVAL;
556
557         switch (data->customer_id) {
558         case NCT6683_CUSTOMER_ID_INTEL:
559                 switch (nr) {
560                 default:
561                 case 1: /* max */
562                         reg = NCT6683_REG_INTEL_TEMP_MAX(ch);
563                         break;
564                 case 3: /* crit */
565                         reg = NCT6683_REG_INTEL_TEMP_CRIT(ch);
566                         break;
567                 }
568                 break;
569         case NCT6683_CUSTOMER_ID_MITAC:
570         default:
571                 switch (nr) {
572                 default:
573                 case 0: /* min */
574                         reg = NCT6683_REG_MON_LOW(ch);
575                         break;
576                 case 1: /* max */
577                         reg = NCT6683_REG_TEMP_MAX(ch);
578                         break;
579                 case 2: /* hyst */
580                         reg = NCT6683_REG_TEMP_HYST(ch);
581                         break;
582                 case 3: /* crit */
583                         reg = NCT6683_REG_MON_HIGH(ch);
584                         break;
585                 }
586                 break;
587         }
588         return reg;
589 }
590
591 static void nct6683_update_pwm(struct device *dev)
592 {
593         struct nct6683_data *data = dev_get_drvdata(dev);
594         int i;
595
596         for (i = 0; i < NCT6683_NUM_REG_PWM; i++) {
597                 if (!(data->have_pwm & (1 << i)))
598                         continue;
599                 data->pwm[i] = nct6683_read(data, NCT6683_REG_PWM(i));
600         }
601 }
602
603 static struct nct6683_data *nct6683_update_device(struct device *dev)
604 {
605         struct nct6683_data *data = dev_get_drvdata(dev);
606         int i, j;
607
608         mutex_lock(&data->update_lock);
609
610         if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
611                 /* Measured voltages and limits */
612                 for (i = 0; i < data->in_num; i++) {
613                         for (j = 0; j < 3; j++) {
614                                 int reg = get_in_reg(data, j, i);
615
616                                 if (reg >= 0)
617                                         data->in[j][i] =
618                                                 nct6683_read(data, reg);
619                         }
620                 }
621
622                 /* Measured temperatures and limits */
623                 for (i = 0; i < data->temp_num; i++) {
624                         u8 ch = data->temp_index[i];
625
626                         data->temp_in[i] = nct6683_read16(data,
627                                                           NCT6683_REG_MON(ch));
628                         for (j = 0; j < 4; j++) {
629                                 int reg = get_temp_reg(data, j, i);
630
631                                 if (reg >= 0)
632                                         data->temp[j][i] =
633                                                 nct6683_read(data, reg);
634                         }
635                 }
636
637                 /* Measured fan speeds and limits */
638                 for (i = 0; i < ARRAY_SIZE(data->rpm); i++) {
639                         if (!(data->have_fan & (1 << i)))
640                                 continue;
641
642                         data->rpm[i] = nct6683_read16(data,
643                                                 NCT6683_REG_FAN_RPM(i));
644                         data->fan_min[i] = nct6683_read16(data,
645                                                 NCT6683_REG_FAN_MIN(i));
646                 }
647
648                 nct6683_update_pwm(dev);
649
650                 data->last_updated = jiffies;
651                 data->valid = true;
652         }
653
654         mutex_unlock(&data->update_lock);
655         return data;
656 }
657
658 /*
659  * Sysfs callback functions
660  */
661 static ssize_t
662 show_in_label(struct device *dev, struct device_attribute *attr, char *buf)
663 {
664         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
665         struct nct6683_data *data = nct6683_update_device(dev);
666         int nr = sattr->index;
667
668         return sprintf(buf, "%s\n", nct6683_mon_label[data->in_src[nr]]);
669 }
670
671 static ssize_t
672 show_in_reg(struct device *dev, struct device_attribute *attr, char *buf)
673 {
674         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
675         struct nct6683_data *data = nct6683_update_device(dev);
676         int index = sattr->index;
677         int nr = sattr->nr;
678
679         return sprintf(buf, "%ld\n",
680                        in_from_reg(data->in[index][nr], data->in_index[index]));
681 }
682
683 static umode_t nct6683_in_is_visible(struct kobject *kobj,
684                                      struct attribute *attr, int index)
685 {
686         struct device *dev = container_of(kobj, struct device, kobj);
687         struct nct6683_data *data = dev_get_drvdata(dev);
688         int nr = index % 4;     /* attribute */
689
690         /*
691          * Voltage limits exist for Intel boards,
692          * but register location and encoding is unknown
693          */
694         if ((nr == 2 || nr == 3) &&
695             data->customer_id == NCT6683_CUSTOMER_ID_INTEL)
696                 return 0;
697
698         return attr->mode;
699 }
700
701 SENSOR_TEMPLATE(in_label, "in%d_label", S_IRUGO, show_in_label, NULL, 0);
702 SENSOR_TEMPLATE_2(in_input, "in%d_input", S_IRUGO, show_in_reg, NULL, 0, 0);
703 SENSOR_TEMPLATE_2(in_min, "in%d_min", S_IRUGO, show_in_reg, NULL, 0, 1);
704 SENSOR_TEMPLATE_2(in_max, "in%d_max", S_IRUGO, show_in_reg, NULL, 0, 2);
705
706 static struct sensor_device_template *nct6683_attributes_in_template[] = {
707         &sensor_dev_template_in_label,
708         &sensor_dev_template_in_input,
709         &sensor_dev_template_in_min,
710         &sensor_dev_template_in_max,
711         NULL
712 };
713
714 static const struct sensor_template_group nct6683_in_template_group = {
715         .templates = nct6683_attributes_in_template,
716         .is_visible = nct6683_in_is_visible,
717 };
718
719 static ssize_t
720 show_fan(struct device *dev, struct device_attribute *attr, char *buf)
721 {
722         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
723         struct nct6683_data *data = nct6683_update_device(dev);
724
725         return sprintf(buf, "%d\n", data->rpm[sattr->index]);
726 }
727
728 static ssize_t
729 show_fan_min(struct device *dev, struct device_attribute *attr, char *buf)
730 {
731         struct nct6683_data *data = nct6683_update_device(dev);
732         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
733         int nr = sattr->index;
734
735         return sprintf(buf, "%d\n", data->fan_min[nr]);
736 }
737
738 static ssize_t
739 show_fan_pulses(struct device *dev, struct device_attribute *attr, char *buf)
740 {
741         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
742         struct nct6683_data *data = nct6683_update_device(dev);
743
744         return sprintf(buf, "%d\n",
745                        ((data->fanin_cfg[sattr->index] >> 5) & 0x03) + 1);
746 }
747
748 static umode_t nct6683_fan_is_visible(struct kobject *kobj,
749                                       struct attribute *attr, int index)
750 {
751         struct device *dev = container_of(kobj, struct device, kobj);
752         struct nct6683_data *data = dev_get_drvdata(dev);
753         int fan = index / 3;    /* fan index */
754         int nr = index % 3;     /* attribute index */
755
756         if (!(data->have_fan & (1 << fan)))
757                 return 0;
758
759         /*
760          * Intel may have minimum fan speed limits,
761          * but register location and encoding are unknown.
762          */
763         if (nr == 2 && data->customer_id == NCT6683_CUSTOMER_ID_INTEL)
764                 return 0;
765
766         return attr->mode;
767 }
768
769 SENSOR_TEMPLATE(fan_input, "fan%d_input", S_IRUGO, show_fan, NULL, 0);
770 SENSOR_TEMPLATE(fan_pulses, "fan%d_pulses", S_IRUGO, show_fan_pulses, NULL, 0);
771 SENSOR_TEMPLATE(fan_min, "fan%d_min", S_IRUGO, show_fan_min, NULL, 0);
772
773 /*
774  * nct6683_fan_is_visible uses the index into the following array
775  * to determine if attributes should be created or not.
776  * Any change in order or content must be matched.
777  */
778 static struct sensor_device_template *nct6683_attributes_fan_template[] = {
779         &sensor_dev_template_fan_input,
780         &sensor_dev_template_fan_pulses,
781         &sensor_dev_template_fan_min,
782         NULL
783 };
784
785 static const struct sensor_template_group nct6683_fan_template_group = {
786         .templates = nct6683_attributes_fan_template,
787         .is_visible = nct6683_fan_is_visible,
788         .base = 1,
789 };
790
791 static ssize_t
792 show_temp_label(struct device *dev, struct device_attribute *attr, char *buf)
793 {
794         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
795         struct nct6683_data *data = nct6683_update_device(dev);
796         int nr = sattr->index;
797
798         return sprintf(buf, "%s\n", nct6683_mon_label[data->temp_src[nr]]);
799 }
800
801 static ssize_t
802 show_temp8(struct device *dev, struct device_attribute *attr, char *buf)
803 {
804         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
805         struct nct6683_data *data = nct6683_update_device(dev);
806         int index = sattr->index;
807         int nr = sattr->nr;
808
809         return sprintf(buf, "%d\n", data->temp[index][nr] * 1000);
810 }
811
812 static ssize_t
813 show_temp_hyst(struct device *dev, struct device_attribute *attr, char *buf)
814 {
815         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
816         struct nct6683_data *data = nct6683_update_device(dev);
817         int nr = sattr->index;
818         int temp = data->temp[1][nr] - data->temp[2][nr];
819
820         return sprintf(buf, "%d\n", temp * 1000);
821 }
822
823 static ssize_t
824 show_temp16(struct device *dev, struct device_attribute *attr, char *buf)
825 {
826         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
827         struct nct6683_data *data = nct6683_update_device(dev);
828         int index = sattr->index;
829
830         return sprintf(buf, "%d\n", (data->temp_in[index] / 128) * 500);
831 }
832
833 /*
834  * Temperature sensor type is determined by temperature source
835  * and can not be modified.
836  * 0x02..0x07: Thermal diode
837  * 0x08..0x18: Thermistor
838  * 0x20..0x2b: Intel PECI
839  * 0x42..0x49: AMD TSI
840  * Others are unspecified (not visible)
841  */
842
843 static int get_temp_type(u8 src)
844 {
845         if (src >= 0x02 && src <= 0x07)
846                 return 3;       /* thermal diode */
847         else if (src >= 0x08 && src <= 0x18)
848                 return 4;       /* thermistor */
849         else if (src >= 0x20 && src <= 0x2b)
850                 return 6;       /* PECI */
851         else if (src >= 0x42 && src <= 0x49)
852                 return 5;
853
854         return 0;
855 }
856
857 static ssize_t
858 show_temp_type(struct device *dev, struct device_attribute *attr, char *buf)
859 {
860         struct nct6683_data *data = nct6683_update_device(dev);
861         struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
862         int nr = sattr->index;
863         return sprintf(buf, "%d\n", get_temp_type(data->temp_src[nr]));
864 }
865
866 static umode_t nct6683_temp_is_visible(struct kobject *kobj,
867                                        struct attribute *attr, int index)
868 {
869         struct device *dev = container_of(kobj, struct device, kobj);
870         struct nct6683_data *data = dev_get_drvdata(dev);
871         int temp = index / 7;   /* temp index */
872         int nr = index % 7;     /* attribute index */
873
874         /*
875          * Intel does not have low temperature limits or temperature hysteresis
876          * registers, or at least register location and encoding is unknown.
877          */
878         if ((nr == 2 || nr == 4) &&
879             data->customer_id == NCT6683_CUSTOMER_ID_INTEL)
880                 return 0;
881
882         if (nr == 6 && get_temp_type(data->temp_src[temp]) == 0)
883                 return 0;                               /* type */
884
885         return attr->mode;
886 }
887
888 SENSOR_TEMPLATE(temp_input, "temp%d_input", S_IRUGO, show_temp16, NULL, 0);
889 SENSOR_TEMPLATE(temp_label, "temp%d_label", S_IRUGO, show_temp_label, NULL, 0);
890 SENSOR_TEMPLATE_2(temp_min, "temp%d_min", S_IRUGO, show_temp8, NULL, 0, 0);
891 SENSOR_TEMPLATE_2(temp_max, "temp%d_max", S_IRUGO, show_temp8, NULL, 0, 1);
892 SENSOR_TEMPLATE(temp_max_hyst, "temp%d_max_hyst", S_IRUGO, show_temp_hyst, NULL,
893                 0);
894 SENSOR_TEMPLATE_2(temp_crit, "temp%d_crit", S_IRUGO, show_temp8, NULL, 0, 3);
895 SENSOR_TEMPLATE(temp_type, "temp%d_type", S_IRUGO, show_temp_type, NULL, 0);
896
897 /*
898  * nct6683_temp_is_visible uses the index into the following array
899  * to determine if attributes should be created or not.
900  * Any change in order or content must be matched.
901  */
902 static struct sensor_device_template *nct6683_attributes_temp_template[] = {
903         &sensor_dev_template_temp_input,
904         &sensor_dev_template_temp_label,
905         &sensor_dev_template_temp_min,          /* 2 */
906         &sensor_dev_template_temp_max,          /* 3 */
907         &sensor_dev_template_temp_max_hyst,     /* 4 */
908         &sensor_dev_template_temp_crit,         /* 5 */
909         &sensor_dev_template_temp_type,         /* 6 */
910         NULL
911 };
912
913 static const struct sensor_template_group nct6683_temp_template_group = {
914         .templates = nct6683_attributes_temp_template,
915         .is_visible = nct6683_temp_is_visible,
916         .base = 1,
917 };
918
919 static ssize_t
920 show_pwm(struct device *dev, struct device_attribute *attr, char *buf)
921 {
922         struct nct6683_data *data = nct6683_update_device(dev);
923         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
924         int index = sattr->index;
925
926         return sprintf(buf, "%d\n", data->pwm[index]);
927 }
928
929 static ssize_t
930 store_pwm(struct device *dev, struct device_attribute *attr, const char *buf,
931           size_t count)
932 {
933         struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
934         struct nct6683_data *data = dev_get_drvdata(dev);
935         int index = sattr->index;
936         unsigned long val;
937
938         if (kstrtoul(buf, 10, &val) || val > 255)
939                 return -EINVAL;
940
941         mutex_lock(&data->update_lock);
942         nct6683_write(data, NCT6683_REG_FAN_CFG_CTRL, NCT6683_FAN_CFG_REQ);
943         usleep_range(1000, 2000);
944         nct6683_write(data, NCT6683_REG_PWM_WRITE(index), val);
945         nct6683_write(data, NCT6683_REG_FAN_CFG_CTRL, NCT6683_FAN_CFG_DONE);
946         mutex_unlock(&data->update_lock);
947
948         return count;
949 }
950
951 SENSOR_TEMPLATE(pwm, "pwm%d", S_IRUGO, show_pwm, store_pwm, 0);
952
953 static umode_t nct6683_pwm_is_visible(struct kobject *kobj,
954                                       struct attribute *attr, int index)
955 {
956         struct device *dev = container_of(kobj, struct device, kobj);
957         struct nct6683_data *data = dev_get_drvdata(dev);
958         int pwm = index;        /* pwm index */
959
960         if (!(data->have_pwm & (1 << pwm)))
961                 return 0;
962
963         /* Only update pwm values for Mitac boards */
964         if (data->customer_id == NCT6683_CUSTOMER_ID_MITAC)
965                 return attr->mode | S_IWUSR;
966
967         return attr->mode;
968 }
969
970 static struct sensor_device_template *nct6683_attributes_pwm_template[] = {
971         &sensor_dev_template_pwm,
972         NULL
973 };
974
975 static const struct sensor_template_group nct6683_pwm_template_group = {
976         .templates = nct6683_attributes_pwm_template,
977         .is_visible = nct6683_pwm_is_visible,
978         .base = 1,
979 };
980
981 static ssize_t
982 show_global_beep(struct device *dev, struct device_attribute *attr, char *buf)
983 {
984         struct nct6683_data *data = dev_get_drvdata(dev);
985         int ret;
986         u8 reg;
987
988         mutex_lock(&data->update_lock);
989
990         ret = superio_enter(data->sioreg);
991         if (ret)
992                 goto error;
993         superio_select(data->sioreg, NCT6683_LD_HWM);
994         reg = superio_inb(data->sioreg, NCT6683_REG_CR_BEEP);
995         superio_exit(data->sioreg);
996
997         mutex_unlock(&data->update_lock);
998
999         return sprintf(buf, "%u\n", !!(reg & NCT6683_CR_BEEP_MASK));
1000
1001 error:
1002         mutex_unlock(&data->update_lock);
1003         return ret;
1004 }
1005
1006 static ssize_t
1007 store_global_beep(struct device *dev, struct device_attribute *attr,
1008                   const char *buf, size_t count)
1009 {
1010         struct nct6683_data *data = dev_get_drvdata(dev);
1011         unsigned long val;
1012         u8 reg;
1013         int ret;
1014
1015         if (kstrtoul(buf, 10, &val) || (val != 0 && val != 1))
1016                 return -EINVAL;
1017
1018         mutex_lock(&data->update_lock);
1019
1020         ret = superio_enter(data->sioreg);
1021         if (ret) {
1022                 count = ret;
1023                 goto error;
1024         }
1025
1026         superio_select(data->sioreg, NCT6683_LD_HWM);
1027         reg = superio_inb(data->sioreg, NCT6683_REG_CR_BEEP);
1028         if (val)
1029                 reg |= NCT6683_CR_BEEP_MASK;
1030         else
1031                 reg &= ~NCT6683_CR_BEEP_MASK;
1032         superio_outb(data->sioreg, NCT6683_REG_CR_BEEP, reg);
1033         superio_exit(data->sioreg);
1034 error:
1035         mutex_unlock(&data->update_lock);
1036         return count;
1037 }
1038
1039 /* Case open detection */
1040
1041 static ssize_t
1042 show_caseopen(struct device *dev, struct device_attribute *attr, char *buf)
1043 {
1044         struct nct6683_data *data = dev_get_drvdata(dev);
1045         int ret;
1046         u8 reg;
1047
1048         mutex_lock(&data->update_lock);
1049
1050         ret = superio_enter(data->sioreg);
1051         if (ret)
1052                 goto error;
1053         superio_select(data->sioreg, NCT6683_LD_ACPI);
1054         reg = superio_inb(data->sioreg, NCT6683_REG_CR_CASEOPEN);
1055         superio_exit(data->sioreg);
1056
1057         mutex_unlock(&data->update_lock);
1058
1059         return sprintf(buf, "%u\n", !(reg & NCT6683_CR_CASEOPEN_MASK));
1060
1061 error:
1062         mutex_unlock(&data->update_lock);
1063         return ret;
1064 }
1065
1066 static ssize_t
1067 clear_caseopen(struct device *dev, struct device_attribute *attr,
1068                const char *buf, size_t count)
1069 {
1070         struct nct6683_data *data = dev_get_drvdata(dev);
1071         unsigned long val;
1072         u8 reg;
1073         int ret;
1074
1075         if (kstrtoul(buf, 10, &val) || val != 0)
1076                 return -EINVAL;
1077
1078         mutex_lock(&data->update_lock);
1079
1080         /*
1081          * Use CR registers to clear caseopen status.
1082          * Caseopen is activ low, clear by writing 1 into the register.
1083          */
1084
1085         ret = superio_enter(data->sioreg);
1086         if (ret) {
1087                 count = ret;
1088                 goto error;
1089         }
1090
1091         superio_select(data->sioreg, NCT6683_LD_ACPI);
1092         reg = superio_inb(data->sioreg, NCT6683_REG_CR_CASEOPEN);
1093         reg |= NCT6683_CR_CASEOPEN_MASK;
1094         superio_outb(data->sioreg, NCT6683_REG_CR_CASEOPEN, reg);
1095         reg &= ~NCT6683_CR_CASEOPEN_MASK;
1096         superio_outb(data->sioreg, NCT6683_REG_CR_CASEOPEN, reg);
1097         superio_exit(data->sioreg);
1098
1099         data->valid = false;    /* Force cache refresh */
1100 error:
1101         mutex_unlock(&data->update_lock);
1102         return count;
1103 }
1104
1105 static DEVICE_ATTR(intrusion0_alarm, S_IWUSR | S_IRUGO, show_caseopen,
1106                    clear_caseopen);
1107 static DEVICE_ATTR(beep_enable, S_IWUSR | S_IRUGO, show_global_beep,
1108                    store_global_beep);
1109
1110 static struct attribute *nct6683_attributes_other[] = {
1111         &dev_attr_intrusion0_alarm.attr,
1112         &dev_attr_beep_enable.attr,
1113         NULL
1114 };
1115
1116 static const struct attribute_group nct6683_group_other = {
1117         .attrs = nct6683_attributes_other,
1118 };
1119
1120 /* Get the monitoring functions started */
1121 static inline void nct6683_init_device(struct nct6683_data *data)
1122 {
1123         u8 tmp;
1124
1125         /* Start hardware monitoring if needed */
1126         tmp = nct6683_read(data, NCT6683_HWM_CFG);
1127         if (!(tmp & 0x80))
1128                 nct6683_write(data, NCT6683_HWM_CFG, tmp | 0x80);
1129 }
1130
1131 /*
1132  * There are a total of 24 fan inputs. Each can be configured as input
1133  * or as output. A maximum of 16 inputs and 8 outputs is configurable.
1134  */
1135 static void
1136 nct6683_setup_fans(struct nct6683_data *data)
1137 {
1138         int i;
1139         u8 reg;
1140
1141         for (i = 0; i < NCT6683_NUM_REG_FAN; i++) {
1142                 reg = nct6683_read(data, NCT6683_REG_FANIN_CFG(i));
1143                 if (reg & 0x80)
1144                         data->have_fan |= 1 << i;
1145                 data->fanin_cfg[i] = reg;
1146         }
1147         for (i = 0; i < NCT6683_NUM_REG_PWM; i++) {
1148                 reg = nct6683_read(data, NCT6683_REG_FANOUT_CFG(i));
1149                 if (reg & 0x80)
1150                         data->have_pwm |= 1 << i;
1151                 data->fanout_cfg[i] = reg;
1152         }
1153 }
1154
1155 /*
1156  * Translation from monitoring register to temperature and voltage attributes
1157  * ==========================================================================
1158  *
1159  * There are a total of 32 monitoring registers. Each can be assigned to either
1160  * a temperature or voltage monitoring source.
1161  * NCT6683_REG_MON_CFG(x) defines assignment for each monitoring source.
1162  *
1163  * Temperature and voltage attribute mapping is determined by walking through
1164  * the NCT6683_REG_MON_CFG registers. If the assigned source is
1165  * a temperature, temp_index[n] is set to the monitor register index, and
1166  * temp_src[n] is set to the temperature source. If the assigned source is
1167  * a voltage, the respective values are stored in in_index[] and in_src[],
1168  * respectively.
1169  */
1170
1171 static void nct6683_setup_sensors(struct nct6683_data *data)
1172 {
1173         u8 reg;
1174         int i;
1175
1176         data->temp_num = 0;
1177         data->in_num = 0;
1178         for (i = 0; i < NCT6683_NUM_REG_MON; i++) {
1179                 reg = nct6683_read(data, NCT6683_REG_MON_CFG(i)) & 0x7f;
1180                 /* Ignore invalid assignments */
1181                 if (reg >= NUM_MON_LABELS)
1182                         continue;
1183                 /* Skip if disabled or reserved */
1184                 if (nct6683_mon_label[reg] == NULL)
1185                         continue;
1186                 if (reg < MON_VOLTAGE_START) {
1187                         data->temp_index[data->temp_num] = i;
1188                         data->temp_src[data->temp_num] = reg;
1189                         data->temp_num++;
1190                 } else {
1191                         data->in_index[data->in_num] = i;
1192                         data->in_src[data->in_num] = reg;
1193                         data->in_num++;
1194                 }
1195         }
1196 }
1197
1198 static int nct6683_probe(struct platform_device *pdev)
1199 {
1200         struct device *dev = &pdev->dev;
1201         struct nct6683_sio_data *sio_data = dev->platform_data;
1202         struct attribute_group *group;
1203         struct nct6683_data *data;
1204         struct device *hwmon_dev;
1205         struct resource *res;
1206         int groups = 0;
1207         char build[16];
1208
1209         res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1210         if (!devm_request_region(dev, res->start, IOREGION_LENGTH, DRVNAME))
1211                 return -EBUSY;
1212
1213         data = devm_kzalloc(dev, sizeof(struct nct6683_data), GFP_KERNEL);
1214         if (!data)
1215                 return -ENOMEM;
1216
1217         data->kind = sio_data->kind;
1218         data->sioreg = sio_data->sioreg;
1219         data->addr = res->start;
1220         mutex_init(&data->update_lock);
1221         platform_set_drvdata(pdev, data);
1222
1223         data->customer_id = nct6683_read16(data, NCT6683_REG_CUSTOMER_ID);
1224
1225         /* By default only instantiate driver if the customer ID is known */
1226         switch (data->customer_id) {
1227         case NCT6683_CUSTOMER_ID_INTEL:
1228                 break;
1229         case NCT6683_CUSTOMER_ID_MITAC:
1230                 break;
1231         default:
1232                 if (!force)
1233                         return -ENODEV;
1234         }
1235
1236         nct6683_init_device(data);
1237         nct6683_setup_fans(data);
1238         nct6683_setup_sensors(data);
1239
1240         /* Register sysfs hooks */
1241
1242         if (data->have_pwm) {
1243                 group = nct6683_create_attr_group(dev,
1244                                                   &nct6683_pwm_template_group,
1245                                                   fls(data->have_pwm));
1246                 if (IS_ERR(group))
1247                         return PTR_ERR(group);
1248                 data->groups[groups++] = group;
1249         }
1250
1251         if (data->in_num) {
1252                 group = nct6683_create_attr_group(dev,
1253                                                   &nct6683_in_template_group,
1254                                                   data->in_num);
1255                 if (IS_ERR(group))
1256                         return PTR_ERR(group);
1257                 data->groups[groups++] = group;
1258         }
1259
1260         if (data->have_fan) {
1261                 group = nct6683_create_attr_group(dev,
1262                                                   &nct6683_fan_template_group,
1263                                                   fls(data->have_fan));
1264                 if (IS_ERR(group))
1265                         return PTR_ERR(group);
1266                 data->groups[groups++] = group;
1267         }
1268
1269         if (data->temp_num) {
1270                 group = nct6683_create_attr_group(dev,
1271                                                   &nct6683_temp_template_group,
1272                                                   data->temp_num);
1273                 if (IS_ERR(group))
1274                         return PTR_ERR(group);
1275                 data->groups[groups++] = group;
1276         }
1277         data->groups[groups++] = &nct6683_group_other;
1278
1279         if (data->customer_id == NCT6683_CUSTOMER_ID_INTEL)
1280                 scnprintf(build, sizeof(build), "%02x/%02x/%02x",
1281                           nct6683_read(data, NCT6683_REG_BUILD_MONTH),
1282                           nct6683_read(data, NCT6683_REG_BUILD_DAY),
1283                           nct6683_read(data, NCT6683_REG_BUILD_YEAR));
1284         else
1285                 scnprintf(build, sizeof(build), "%02d/%02d/%02d",
1286                           nct6683_read(data, NCT6683_REG_BUILD_MONTH),
1287                           nct6683_read(data, NCT6683_REG_BUILD_DAY),
1288                           nct6683_read(data, NCT6683_REG_BUILD_YEAR));
1289
1290         dev_info(dev, "%s EC firmware version %d.%d build %s\n",
1291                  nct6683_chip_names[data->kind],
1292                  nct6683_read(data, NCT6683_REG_VERSION_HI),
1293                  nct6683_read(data, NCT6683_REG_VERSION_LO),
1294                  build);
1295
1296         hwmon_dev = devm_hwmon_device_register_with_groups(dev,
1297                         nct6683_device_names[data->kind], data, data->groups);
1298         return PTR_ERR_OR_ZERO(hwmon_dev);
1299 }
1300
1301 #ifdef CONFIG_PM
1302 static int nct6683_suspend(struct device *dev)
1303 {
1304         struct nct6683_data *data = nct6683_update_device(dev);
1305
1306         mutex_lock(&data->update_lock);
1307         data->hwm_cfg = nct6683_read(data, NCT6683_HWM_CFG);
1308         mutex_unlock(&data->update_lock);
1309
1310         return 0;
1311 }
1312
1313 static int nct6683_resume(struct device *dev)
1314 {
1315         struct nct6683_data *data = dev_get_drvdata(dev);
1316
1317         mutex_lock(&data->update_lock);
1318
1319         nct6683_write(data, NCT6683_HWM_CFG, data->hwm_cfg);
1320
1321         /* Force re-reading all values */
1322         data->valid = false;
1323         mutex_unlock(&data->update_lock);
1324
1325         return 0;
1326 }
1327
1328 static const struct dev_pm_ops nct6683_dev_pm_ops = {
1329         .suspend = nct6683_suspend,
1330         .resume = nct6683_resume,
1331         .freeze = nct6683_suspend,
1332         .restore = nct6683_resume,
1333 };
1334
1335 #define NCT6683_DEV_PM_OPS      (&nct6683_dev_pm_ops)
1336 #else
1337 #define NCT6683_DEV_PM_OPS      NULL
1338 #endif /* CONFIG_PM */
1339
1340 static struct platform_driver nct6683_driver = {
1341         .driver = {
1342                 .name   = DRVNAME,
1343                 .pm     = NCT6683_DEV_PM_OPS,
1344         },
1345         .probe          = nct6683_probe,
1346 };
1347
1348 static int __init nct6683_find(int sioaddr, struct nct6683_sio_data *sio_data)
1349 {
1350         int addr;
1351         u16 val;
1352         int err;
1353
1354         err = superio_enter(sioaddr);
1355         if (err)
1356                 return err;
1357
1358         val = (superio_inb(sioaddr, SIO_REG_DEVID) << 8)
1359                | superio_inb(sioaddr, SIO_REG_DEVID + 1);
1360
1361         switch (val & SIO_ID_MASK) {
1362         case SIO_NCT6683_ID:
1363                 sio_data->kind = nct6683;
1364                 break;
1365         default:
1366                 if (val != 0xffff)
1367                         pr_debug("unsupported chip ID: 0x%04x\n", val);
1368                 goto fail;
1369         }
1370
1371         /* We have a known chip, find the HWM I/O address */
1372         superio_select(sioaddr, NCT6683_LD_HWM);
1373         val = (superio_inb(sioaddr, SIO_REG_ADDR) << 8)
1374             | superio_inb(sioaddr, SIO_REG_ADDR + 1);
1375         addr = val & IOREGION_ALIGNMENT;
1376         if (addr == 0) {
1377                 pr_err("EC base I/O port unconfigured\n");
1378                 goto fail;
1379         }
1380
1381         /* Activate logical device if needed */
1382         val = superio_inb(sioaddr, SIO_REG_ENABLE);
1383         if (!(val & 0x01)) {
1384                 pr_err("EC is disabled\n");
1385                 goto fail;
1386         }
1387
1388         superio_exit(sioaddr);
1389         pr_info("Found %s or compatible chip at %#x:%#x\n",
1390                 nct6683_chip_names[sio_data->kind], sioaddr, addr);
1391         sio_data->sioreg = sioaddr;
1392
1393         return addr;
1394
1395 fail:
1396         superio_exit(sioaddr);
1397         return -ENODEV;
1398 }
1399
1400 /*
1401  * when Super-I/O functions move to a separate file, the Super-I/O
1402  * bus will manage the lifetime of the device and this module will only keep
1403  * track of the nct6683 driver. But since we use platform_device_alloc(), we
1404  * must keep track of the device
1405  */
1406 static struct platform_device *pdev[2];
1407
1408 static int __init sensors_nct6683_init(void)
1409 {
1410         struct nct6683_sio_data sio_data;
1411         int sioaddr[2] = { 0x2e, 0x4e };
1412         struct resource res;
1413         bool found = false;
1414         int address;
1415         int i, err;
1416
1417         err = platform_driver_register(&nct6683_driver);
1418         if (err)
1419                 return err;
1420
1421         /*
1422          * initialize sio_data->kind and sio_data->sioreg.
1423          *
1424          * when Super-I/O functions move to a separate file, the Super-I/O
1425          * driver will probe 0x2e and 0x4e and auto-detect the presence of a
1426          * nct6683 hardware monitor, and call probe()
1427          */
1428         for (i = 0; i < ARRAY_SIZE(pdev); i++) {
1429                 address = nct6683_find(sioaddr[i], &sio_data);
1430                 if (address <= 0)
1431                         continue;
1432
1433                 found = true;
1434
1435                 pdev[i] = platform_device_alloc(DRVNAME, address);
1436                 if (!pdev[i]) {
1437                         err = -ENOMEM;
1438                         goto exit_device_unregister;
1439                 }
1440
1441                 err = platform_device_add_data(pdev[i], &sio_data,
1442                                                sizeof(struct nct6683_sio_data));
1443                 if (err)
1444                         goto exit_device_put;
1445
1446                 memset(&res, 0, sizeof(res));
1447                 res.name = DRVNAME;
1448                 res.start = address + IOREGION_OFFSET;
1449                 res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1;
1450                 res.flags = IORESOURCE_IO;
1451
1452                 err = acpi_check_resource_conflict(&res);
1453                 if (err) {
1454                         platform_device_put(pdev[i]);
1455                         pdev[i] = NULL;
1456                         continue;
1457                 }
1458
1459                 err = platform_device_add_resources(pdev[i], &res, 1);
1460                 if (err)
1461                         goto exit_device_put;
1462
1463                 /* platform_device_add calls probe() */
1464                 err = platform_device_add(pdev[i]);
1465                 if (err)
1466                         goto exit_device_put;
1467         }
1468         if (!found) {
1469                 err = -ENODEV;
1470                 goto exit_unregister;
1471         }
1472
1473         return 0;
1474
1475 exit_device_put:
1476         platform_device_put(pdev[i]);
1477 exit_device_unregister:
1478         while (--i >= 0) {
1479                 if (pdev[i])
1480                         platform_device_unregister(pdev[i]);
1481         }
1482 exit_unregister:
1483         platform_driver_unregister(&nct6683_driver);
1484         return err;
1485 }
1486
1487 static void __exit sensors_nct6683_exit(void)
1488 {
1489         int i;
1490
1491         for (i = 0; i < ARRAY_SIZE(pdev); i++) {
1492                 if (pdev[i])
1493                         platform_device_unregister(pdev[i]);
1494         }
1495         platform_driver_unregister(&nct6683_driver);
1496 }
1497
1498 MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
1499 MODULE_DESCRIPTION("NCT6683D driver");
1500 MODULE_LICENSE("GPL");
1501
1502 module_init(sensors_nct6683_init);
1503 module_exit(sensors_nct6683_exit);