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