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