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