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