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