xref: /openbmc/linux/drivers/hwmon/nct6683.c (revision 94c7b6fc)
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 				a2->dev_attr.attr.name = su->name;
443 				a2->nr = (*t)->u.s.nr + i;
444 				a2->index = (*t)->u.s.index;
445 				a2->dev_attr.attr.mode =
446 				  (*t)->dev_attr.attr.mode;
447 				a2->dev_attr.show = (*t)->dev_attr.show;
448 				a2->dev_attr.store = (*t)->dev_attr.store;
449 				*attrs = &a2->dev_attr.attr;
450 			} else {
451 				a = &su->u.a1;
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 	default:
561 		switch (nr) {
562 		default:
563 		case 0:	/* min */
564 			reg = NCT6683_REG_MON_LOW(ch);
565 			break;
566 		case 1:	/* max */
567 			reg = NCT6683_REG_TEMP_MAX(ch);
568 			break;
569 		case 2:	/* hyst */
570 			reg = NCT6683_REG_TEMP_HYST(ch);
571 			break;
572 		case 3:	/* crit */
573 			reg = NCT6683_REG_MON_HIGH(ch);
574 			break;
575 		}
576 		break;
577 	}
578 	return reg;
579 }
580 
581 static void nct6683_update_pwm(struct device *dev)
582 {
583 	struct nct6683_data *data = dev_get_drvdata(dev);
584 	int i;
585 
586 	for (i = 0; i < NCT6683_NUM_REG_PWM; i++) {
587 		if (!(data->have_pwm & (1 << i)))
588 			continue;
589 		data->pwm[i] = nct6683_read(data, NCT6683_REG_PWM(i));
590 	}
591 }
592 
593 static struct nct6683_data *nct6683_update_device(struct device *dev)
594 {
595 	struct nct6683_data *data = dev_get_drvdata(dev);
596 	int i, j;
597 
598 	mutex_lock(&data->update_lock);
599 
600 	if (time_after(jiffies, data->last_updated + HZ) || !data->valid) {
601 		/* Measured voltages and limits */
602 		for (i = 0; i < data->in_num; i++) {
603 			for (j = 0; j < 3; j++) {
604 				int reg = get_in_reg(data, j, i);
605 
606 				if (reg >= 0)
607 					data->in[j][i] =
608 						nct6683_read(data, reg);
609 			}
610 		}
611 
612 		/* Measured temperatures and limits */
613 		for (i = 0; i < data->temp_num; i++) {
614 			u8 ch = data->temp_index[i];
615 
616 			data->temp_in[i] = nct6683_read16(data,
617 							  NCT6683_REG_MON(ch));
618 			for (j = 0; j < 4; j++) {
619 				int reg = get_temp_reg(data, j, i);
620 
621 				if (reg >= 0)
622 					data->temp[j][i] =
623 						nct6683_read(data, reg);
624 			}
625 		}
626 
627 		/* Measured fan speeds and limits */
628 		for (i = 0; i < ARRAY_SIZE(data->rpm); i++) {
629 			if (!(data->have_fan & (1 << i)))
630 				continue;
631 
632 			data->rpm[i] = nct6683_read16(data,
633 						NCT6683_REG_FAN_RPM(i));
634 			data->fan_min[i] = nct6683_read16(data,
635 						NCT6683_REG_FAN_MIN(i));
636 		}
637 
638 		nct6683_update_pwm(dev);
639 
640 		data->last_updated = jiffies;
641 		data->valid = true;
642 	}
643 
644 	mutex_unlock(&data->update_lock);
645 	return data;
646 }
647 
648 /*
649  * Sysfs callback functions
650  */
651 static ssize_t
652 show_in_label(struct device *dev, struct device_attribute *attr, char *buf)
653 {
654 	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
655 	struct nct6683_data *data = nct6683_update_device(dev);
656 	int nr = sattr->index;
657 
658 	return sprintf(buf, "%s\n", nct6683_mon_label[data->in_src[nr]]);
659 }
660 
661 static ssize_t
662 show_in_reg(struct device *dev, struct device_attribute *attr, char *buf)
663 {
664 	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
665 	struct nct6683_data *data = nct6683_update_device(dev);
666 	int index = sattr->index;
667 	int nr = sattr->nr;
668 
669 	return sprintf(buf, "%ld\n",
670 		       in_from_reg(data->in[index][nr], data->in_index[index]));
671 }
672 
673 static umode_t nct6683_in_is_visible(struct kobject *kobj,
674 				     struct attribute *attr, int index)
675 {
676 	struct device *dev = container_of(kobj, struct device, kobj);
677 	struct nct6683_data *data = dev_get_drvdata(dev);
678 	int nr = index % 4;	/* attribute */
679 
680 	/*
681 	 * Voltage limits exist for Intel boards,
682 	 * but register location and encoding is unknown
683 	 */
684 	if ((nr == 2 || nr == 3) &&
685 	    data->customer_id == NCT6683_CUSTOMER_ID_INTEL)
686 		return 0;
687 
688 	return attr->mode;
689 }
690 
691 SENSOR_TEMPLATE(in_label, "in%d_label", S_IRUGO, show_in_label, NULL, 0);
692 SENSOR_TEMPLATE_2(in_input, "in%d_input", S_IRUGO, show_in_reg, NULL, 0, 0);
693 SENSOR_TEMPLATE_2(in_min, "in%d_min", S_IRUGO, show_in_reg, NULL, 0, 1);
694 SENSOR_TEMPLATE_2(in_max, "in%d_max", S_IRUGO, show_in_reg, NULL, 0, 2);
695 
696 static struct sensor_device_template *nct6683_attributes_in_template[] = {
697 	&sensor_dev_template_in_label,
698 	&sensor_dev_template_in_input,
699 	&sensor_dev_template_in_min,
700 	&sensor_dev_template_in_max,
701 	NULL
702 };
703 
704 static struct sensor_template_group nct6683_in_template_group = {
705 	.templates = nct6683_attributes_in_template,
706 	.is_visible = nct6683_in_is_visible,
707 };
708 
709 static ssize_t
710 show_fan(struct device *dev, struct device_attribute *attr, char *buf)
711 {
712 	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
713 	struct nct6683_data *data = nct6683_update_device(dev);
714 
715 	return sprintf(buf, "%d\n", data->rpm[sattr->index]);
716 }
717 
718 static ssize_t
719 show_fan_min(struct device *dev, struct device_attribute *attr, char *buf)
720 {
721 	struct nct6683_data *data = nct6683_update_device(dev);
722 	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
723 	int nr = sattr->index;
724 
725 	return sprintf(buf, "%d\n", data->fan_min[nr]);
726 }
727 
728 static ssize_t
729 show_fan_pulses(struct device *dev, struct device_attribute *attr, char *buf)
730 {
731 	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
732 	struct nct6683_data *data = nct6683_update_device(dev);
733 
734 	return sprintf(buf, "%d\n",
735 		       ((data->fanin_cfg[sattr->index] >> 5) & 0x03) + 1);
736 }
737 
738 static umode_t nct6683_fan_is_visible(struct kobject *kobj,
739 				      struct attribute *attr, int index)
740 {
741 	struct device *dev = container_of(kobj, struct device, kobj);
742 	struct nct6683_data *data = dev_get_drvdata(dev);
743 	int fan = index / 3;	/* fan index */
744 	int nr = index % 3;	/* attribute index */
745 
746 	if (!(data->have_fan & (1 << fan)))
747 		return 0;
748 
749 	/*
750 	 * Intel may have minimum fan speed limits,
751 	 * but register location and encoding are unknown.
752 	 */
753 	if (nr == 2 && data->customer_id == NCT6683_CUSTOMER_ID_INTEL)
754 		return 0;
755 
756 	return attr->mode;
757 }
758 
759 SENSOR_TEMPLATE(fan_input, "fan%d_input", S_IRUGO, show_fan, NULL, 0);
760 SENSOR_TEMPLATE(fan_pulses, "fan%d_pulses", S_IRUGO, show_fan_pulses, NULL, 0);
761 SENSOR_TEMPLATE(fan_min, "fan%d_min", S_IRUGO, show_fan_min, NULL, 0);
762 
763 /*
764  * nct6683_fan_is_visible uses the index into the following array
765  * to determine if attributes should be created or not.
766  * Any change in order or content must be matched.
767  */
768 static struct sensor_device_template *nct6683_attributes_fan_template[] = {
769 	&sensor_dev_template_fan_input,
770 	&sensor_dev_template_fan_pulses,
771 	&sensor_dev_template_fan_min,
772 	NULL
773 };
774 
775 static struct sensor_template_group nct6683_fan_template_group = {
776 	.templates = nct6683_attributes_fan_template,
777 	.is_visible = nct6683_fan_is_visible,
778 	.base = 1,
779 };
780 
781 static ssize_t
782 show_temp_label(struct device *dev, struct device_attribute *attr, char *buf)
783 {
784 	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
785 	struct nct6683_data *data = nct6683_update_device(dev);
786 	int nr = sattr->index;
787 
788 	return sprintf(buf, "%s\n", nct6683_mon_label[data->temp_src[nr]]);
789 }
790 
791 static ssize_t
792 show_temp8(struct device *dev, struct device_attribute *attr, char *buf)
793 {
794 	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
795 	struct nct6683_data *data = nct6683_update_device(dev);
796 	int index = sattr->index;
797 	int nr = sattr->nr;
798 
799 	return sprintf(buf, "%d\n", data->temp[index][nr] * 1000);
800 }
801 
802 static ssize_t
803 show_temp_hyst(struct device *dev, struct device_attribute *attr, char *buf)
804 {
805 	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
806 	struct nct6683_data *data = nct6683_update_device(dev);
807 	int nr = sattr->index;
808 	int temp = data->temp[1][nr] - data->temp[2][nr];
809 
810 	return sprintf(buf, "%d\n", temp * 1000);
811 }
812 
813 static ssize_t
814 show_temp16(struct device *dev, struct device_attribute *attr, char *buf)
815 {
816 	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
817 	struct nct6683_data *data = nct6683_update_device(dev);
818 	int index = sattr->index;
819 
820 	return sprintf(buf, "%d\n", (data->temp_in[index] / 128) * 500);
821 }
822 
823 /*
824  * Temperature sensor type is determined by temperature source
825  * and can not be modified.
826  * 0x02..0x07: Thermal diode
827  * 0x08..0x18: Thermistor
828  * 0x20..0x2b: Intel PECI
829  * 0x42..0x49: AMD TSI
830  * Others are unspecified (not visible)
831  */
832 
833 static int get_temp_type(u8 src)
834 {
835 	if (src >= 0x02 && src <= 0x07)
836 		return 3;	/* thermal diode */
837 	else if (src >= 0x08 && src <= 0x18)
838 		return 4;	/* thermistor */
839 	else if (src >= 0x20 && src <= 0x2b)
840 		return 6;	/* PECI */
841 	else if (src >= 0x42 && src <= 0x49)
842 		return 5;
843 
844 	return 0;
845 }
846 
847 static ssize_t
848 show_temp_type(struct device *dev, struct device_attribute *attr, char *buf)
849 {
850 	struct nct6683_data *data = nct6683_update_device(dev);
851 	struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr);
852 	int nr = sattr->index;
853 	return sprintf(buf, "%d\n", get_temp_type(data->temp_src[nr]));
854 }
855 
856 static umode_t nct6683_temp_is_visible(struct kobject *kobj,
857 				       struct attribute *attr, int index)
858 {
859 	struct device *dev = container_of(kobj, struct device, kobj);
860 	struct nct6683_data *data = dev_get_drvdata(dev);
861 	int temp = index / 7;	/* temp index */
862 	int nr = index % 7;	/* attribute index */
863 
864 	/*
865 	 * Intel does not have low temperature limits or temperature hysteresis
866 	 * registers, or at least register location and encoding is unknown.
867 	 */
868 	if ((nr == 2 || nr == 4) &&
869 	    data->customer_id == NCT6683_CUSTOMER_ID_INTEL)
870 		return 0;
871 
872 	if (nr == 6 && get_temp_type(data->temp_src[temp]) == 0)
873 		return 0;				/* type */
874 
875 	return attr->mode;
876 }
877 
878 SENSOR_TEMPLATE(temp_input, "temp%d_input", S_IRUGO, show_temp16, NULL, 0);
879 SENSOR_TEMPLATE(temp_label, "temp%d_label", S_IRUGO, show_temp_label, NULL, 0);
880 SENSOR_TEMPLATE_2(temp_min, "temp%d_min", S_IRUGO, show_temp8, NULL, 0, 0);
881 SENSOR_TEMPLATE_2(temp_max, "temp%d_max", S_IRUGO, show_temp8, NULL, 0, 1);
882 SENSOR_TEMPLATE(temp_max_hyst, "temp%d_max_hyst", S_IRUGO, show_temp_hyst, NULL,
883 		0);
884 SENSOR_TEMPLATE_2(temp_crit, "temp%d_crit", S_IRUGO, show_temp8, NULL, 0, 3);
885 SENSOR_TEMPLATE(temp_type, "temp%d_type", S_IRUGO, show_temp_type, NULL, 0);
886 
887 /*
888  * nct6683_temp_is_visible uses the index into the following array
889  * to determine if attributes should be created or not.
890  * Any change in order or content must be matched.
891  */
892 static struct sensor_device_template *nct6683_attributes_temp_template[] = {
893 	&sensor_dev_template_temp_input,
894 	&sensor_dev_template_temp_label,
895 	&sensor_dev_template_temp_min,		/* 2 */
896 	&sensor_dev_template_temp_max,		/* 3 */
897 	&sensor_dev_template_temp_max_hyst,	/* 4 */
898 	&sensor_dev_template_temp_crit,		/* 5 */
899 	&sensor_dev_template_temp_type,		/* 6 */
900 	NULL
901 };
902 
903 static struct sensor_template_group nct6683_temp_template_group = {
904 	.templates = nct6683_attributes_temp_template,
905 	.is_visible = nct6683_temp_is_visible,
906 	.base = 1,
907 };
908 
909 static ssize_t
910 show_pwm(struct device *dev, struct device_attribute *attr, char *buf)
911 {
912 	struct nct6683_data *data = nct6683_update_device(dev);
913 	struct sensor_device_attribute_2 *sattr = to_sensor_dev_attr_2(attr);
914 	int index = sattr->index;
915 
916 	return sprintf(buf, "%d\n", data->pwm[index]);
917 }
918 
919 SENSOR_TEMPLATE(pwm, "pwm%d", S_IRUGO, show_pwm, NULL, 0);
920 
921 static umode_t nct6683_pwm_is_visible(struct kobject *kobj,
922 				      struct attribute *attr, int index)
923 {
924 	struct device *dev = container_of(kobj, struct device, kobj);
925 	struct nct6683_data *data = dev_get_drvdata(dev);
926 	int pwm = index;	/* pwm index */
927 
928 	if (!(data->have_pwm & (1 << pwm)))
929 		return 0;
930 
931 	return attr->mode;
932 }
933 
934 static struct sensor_device_template *nct6683_attributes_pwm_template[] = {
935 	&sensor_dev_template_pwm,
936 	NULL
937 };
938 
939 static struct sensor_template_group nct6683_pwm_template_group = {
940 	.templates = nct6683_attributes_pwm_template,
941 	.is_visible = nct6683_pwm_is_visible,
942 	.base = 1,
943 };
944 
945 static ssize_t
946 show_global_beep(struct device *dev, struct device_attribute *attr, char *buf)
947 {
948 	struct nct6683_data *data = dev_get_drvdata(dev);
949 	int ret;
950 	u8 reg;
951 
952 	mutex_lock(&data->update_lock);
953 
954 	ret = superio_enter(data->sioreg);
955 	if (ret)
956 		goto error;
957 	superio_select(data->sioreg, NCT6683_LD_HWM);
958 	reg = superio_inb(data->sioreg, NCT6683_REG_CR_BEEP);
959 	superio_exit(data->sioreg);
960 
961 	mutex_unlock(&data->update_lock);
962 
963 	return sprintf(buf, "%u\n", !!(reg & NCT6683_CR_BEEP_MASK));
964 
965 error:
966 	mutex_unlock(&data->update_lock);
967 	return ret;
968 }
969 
970 static ssize_t
971 store_global_beep(struct device *dev, struct device_attribute *attr,
972 		  const char *buf, size_t count)
973 {
974 	struct nct6683_data *data = dev_get_drvdata(dev);
975 	unsigned long val;
976 	u8 reg;
977 	int ret;
978 
979 	if (kstrtoul(buf, 10, &val) || (val != 0 && val != 1))
980 		return -EINVAL;
981 
982 	mutex_lock(&data->update_lock);
983 
984 	ret = superio_enter(data->sioreg);
985 	if (ret) {
986 		count = ret;
987 		goto error;
988 	}
989 
990 	superio_select(data->sioreg, NCT6683_LD_HWM);
991 	reg = superio_inb(data->sioreg, NCT6683_REG_CR_BEEP);
992 	if (val)
993 		reg |= NCT6683_CR_BEEP_MASK;
994 	else
995 		reg &= ~NCT6683_CR_BEEP_MASK;
996 	superio_outb(data->sioreg, NCT6683_REG_CR_BEEP, reg);
997 	superio_exit(data->sioreg);
998 error:
999 	mutex_unlock(&data->update_lock);
1000 	return count;
1001 }
1002 
1003 /* Case open detection */
1004 
1005 static ssize_t
1006 show_caseopen(struct device *dev, struct device_attribute *attr, char *buf)
1007 {
1008 	struct nct6683_data *data = dev_get_drvdata(dev);
1009 	int ret;
1010 	u8 reg;
1011 
1012 	mutex_lock(&data->update_lock);
1013 
1014 	ret = superio_enter(data->sioreg);
1015 	if (ret)
1016 		goto error;
1017 	superio_select(data->sioreg, NCT6683_LD_ACPI);
1018 	reg = superio_inb(data->sioreg, NCT6683_REG_CR_CASEOPEN);
1019 	superio_exit(data->sioreg);
1020 
1021 	mutex_unlock(&data->update_lock);
1022 
1023 	return sprintf(buf, "%u\n", !(reg & NCT6683_CR_CASEOPEN_MASK));
1024 
1025 error:
1026 	mutex_unlock(&data->update_lock);
1027 	return ret;
1028 }
1029 
1030 static ssize_t
1031 clear_caseopen(struct device *dev, struct device_attribute *attr,
1032 	       const char *buf, size_t count)
1033 {
1034 	struct nct6683_data *data = dev_get_drvdata(dev);
1035 	unsigned long val;
1036 	u8 reg;
1037 	int ret;
1038 
1039 	if (kstrtoul(buf, 10, &val) || val != 0)
1040 		return -EINVAL;
1041 
1042 	mutex_lock(&data->update_lock);
1043 
1044 	/*
1045 	 * Use CR registers to clear caseopen status.
1046 	 * Caseopen is activ low, clear by writing 1 into the register.
1047 	 */
1048 
1049 	ret = superio_enter(data->sioreg);
1050 	if (ret) {
1051 		count = ret;
1052 		goto error;
1053 	}
1054 
1055 	superio_select(data->sioreg, NCT6683_LD_ACPI);
1056 	reg = superio_inb(data->sioreg, NCT6683_REG_CR_CASEOPEN);
1057 	reg |= NCT6683_CR_CASEOPEN_MASK;
1058 	superio_outb(data->sioreg, NCT6683_REG_CR_CASEOPEN, reg);
1059 	reg &= ~NCT6683_CR_CASEOPEN_MASK;
1060 	superio_outb(data->sioreg, NCT6683_REG_CR_CASEOPEN, reg);
1061 	superio_exit(data->sioreg);
1062 
1063 	data->valid = false;	/* Force cache refresh */
1064 error:
1065 	mutex_unlock(&data->update_lock);
1066 	return count;
1067 }
1068 
1069 static DEVICE_ATTR(intrusion0_alarm, S_IWUSR | S_IRUGO, show_caseopen,
1070 		   clear_caseopen);
1071 static DEVICE_ATTR(beep_enable, S_IWUSR | S_IRUGO, show_global_beep,
1072 		   store_global_beep);
1073 
1074 static struct attribute *nct6683_attributes_other[] = {
1075 	&dev_attr_intrusion0_alarm.attr,
1076 	&dev_attr_beep_enable.attr,
1077 	NULL
1078 };
1079 
1080 static const struct attribute_group nct6683_group_other = {
1081 	.attrs = nct6683_attributes_other,
1082 };
1083 
1084 /* Get the monitoring functions started */
1085 static inline void nct6683_init_device(struct nct6683_data *data)
1086 {
1087 	u8 tmp;
1088 
1089 	/* Start hardware monitoring if needed */
1090 	tmp = nct6683_read(data, NCT6683_HWM_CFG);
1091 	if (!(tmp & 0x80))
1092 		nct6683_write(data, NCT6683_HWM_CFG, tmp | 0x80);
1093 }
1094 
1095 /*
1096  * There are a total of 24 fan inputs. Each can be configured as input
1097  * or as output. A maximum of 16 inputs and 8 outputs is configurable.
1098  */
1099 static void
1100 nct6683_setup_fans(struct nct6683_data *data)
1101 {
1102 	int i;
1103 	u8 reg;
1104 
1105 	for (i = 0; i < NCT6683_NUM_REG_FAN; i++) {
1106 		reg = nct6683_read(data, NCT6683_REG_FANIN_CFG(i));
1107 		if (reg & 0x80)
1108 			data->have_fan |= 1 << i;
1109 		data->fanin_cfg[i] = reg;
1110 	}
1111 	for (i = 0; i < NCT6683_NUM_REG_PWM; i++) {
1112 		reg = nct6683_read(data, NCT6683_REG_FANOUT_CFG(i));
1113 		if (reg & 0x80)
1114 			data->have_pwm |= 1 << i;
1115 		data->fanout_cfg[i] = reg;
1116 	}
1117 }
1118 
1119 /*
1120  * Translation from monitoring register to temperature and voltage attributes
1121  * ==========================================================================
1122  *
1123  * There are a total of 32 monitoring registers. Each can be assigned to either
1124  * a temperature or voltage monitoring source.
1125  * NCT6683_REG_MON_CFG(x) defines assignment for each monitoring source.
1126  *
1127  * Temperature and voltage attribute mapping is determined by walking through
1128  * the NCT6683_REG_MON_CFG registers. If the assigned source is
1129  * a temperature, temp_index[n] is set to the monitor register index, and
1130  * temp_src[n] is set to the temperature source. If the assigned source is
1131  * a voltage, the respective values are stored in in_index[] and in_src[],
1132  * respectively.
1133  */
1134 
1135 static void nct6683_setup_sensors(struct nct6683_data *data)
1136 {
1137 	u8 reg;
1138 	int i;
1139 
1140 	data->temp_num = 0;
1141 	data->in_num = 0;
1142 	for (i = 0; i < NCT6683_NUM_REG_MON; i++) {
1143 		reg = nct6683_read(data, NCT6683_REG_MON_CFG(i)) & 0x7f;
1144 		/* Ignore invalid assignments */
1145 		if (reg >= NUM_MON_LABELS)
1146 			continue;
1147 		/* Skip if disabled or reserved */
1148 		if (nct6683_mon_label[reg] == NULL)
1149 			continue;
1150 		if (reg < MON_VOLTAGE_START) {
1151 			data->temp_index[data->temp_num] = i;
1152 			data->temp_src[data->temp_num] = reg;
1153 			data->temp_num++;
1154 		} else {
1155 			data->in_index[data->in_num] = i;
1156 			data->in_src[data->in_num] = reg;
1157 			data->in_num++;
1158 		}
1159 	}
1160 }
1161 
1162 static int nct6683_probe(struct platform_device *pdev)
1163 {
1164 	struct device *dev = &pdev->dev;
1165 	struct nct6683_sio_data *sio_data = dev->platform_data;
1166 	struct attribute_group *group;
1167 	struct nct6683_data *data;
1168 	struct device *hwmon_dev;
1169 	struct resource *res;
1170 	int groups = 0;
1171 
1172 	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
1173 	if (!devm_request_region(dev, res->start, IOREGION_LENGTH, DRVNAME))
1174 		return -EBUSY;
1175 
1176 	data = devm_kzalloc(dev, sizeof(struct nct6683_data), GFP_KERNEL);
1177 	if (!data)
1178 		return -ENOMEM;
1179 
1180 	data->kind = sio_data->kind;
1181 	data->sioreg = sio_data->sioreg;
1182 	data->addr = res->start;
1183 	mutex_init(&data->update_lock);
1184 	platform_set_drvdata(pdev, data);
1185 
1186 	data->customer_id = nct6683_read16(data, NCT6683_REG_CUSTOMER_ID);
1187 
1188 	nct6683_init_device(data);
1189 	nct6683_setup_fans(data);
1190 	nct6683_setup_sensors(data);
1191 
1192 	/* Register sysfs hooks */
1193 
1194 	if (data->have_pwm) {
1195 		group = nct6683_create_attr_group(dev,
1196 						  &nct6683_pwm_template_group,
1197 						  fls(data->have_pwm));
1198 		if (IS_ERR(group))
1199 			return PTR_ERR(group);
1200 		data->groups[groups++] = group;
1201 	}
1202 
1203 	if (data->in_num) {
1204 		group = nct6683_create_attr_group(dev,
1205 						  &nct6683_in_template_group,
1206 						  data->in_num);
1207 		if (IS_ERR(group))
1208 			return PTR_ERR(group);
1209 		data->groups[groups++] = group;
1210 	}
1211 
1212 	if (data->have_fan) {
1213 		group = nct6683_create_attr_group(dev,
1214 						  &nct6683_fan_template_group,
1215 						  fls(data->have_fan));
1216 		if (IS_ERR(group))
1217 			return PTR_ERR(group);
1218 		data->groups[groups++] = group;
1219 	}
1220 
1221 	if (data->temp_num) {
1222 		group = nct6683_create_attr_group(dev,
1223 						  &nct6683_temp_template_group,
1224 						  data->temp_num);
1225 		if (IS_ERR(group))
1226 			return PTR_ERR(group);
1227 		data->groups[groups++] = group;
1228 	}
1229 	data->groups[groups++] = &nct6683_group_other;
1230 
1231 	dev_info(dev, "%s EC firmware version %d.%d build %02x/%02x/%02x\n",
1232 		 nct6683_chip_names[data->kind],
1233 		 nct6683_read(data, NCT6683_REG_VERSION_HI),
1234 		 nct6683_read(data, NCT6683_REG_VERSION_LO),
1235 		 nct6683_read(data, NCT6683_REG_BUILD_MONTH),
1236 		 nct6683_read(data, NCT6683_REG_BUILD_DAY),
1237 		 nct6683_read(data, NCT6683_REG_BUILD_YEAR));
1238 
1239 	hwmon_dev = devm_hwmon_device_register_with_groups(dev,
1240 			nct6683_device_names[data->kind], data, data->groups);
1241 	return PTR_ERR_OR_ZERO(hwmon_dev);
1242 }
1243 
1244 #ifdef CONFIG_PM
1245 static int nct6683_suspend(struct device *dev)
1246 {
1247 	struct nct6683_data *data = nct6683_update_device(dev);
1248 
1249 	mutex_lock(&data->update_lock);
1250 	data->hwm_cfg = nct6683_read(data, NCT6683_HWM_CFG);
1251 	mutex_unlock(&data->update_lock);
1252 
1253 	return 0;
1254 }
1255 
1256 static int nct6683_resume(struct device *dev)
1257 {
1258 	struct nct6683_data *data = dev_get_drvdata(dev);
1259 
1260 	mutex_lock(&data->update_lock);
1261 
1262 	nct6683_write(data, NCT6683_HWM_CFG, data->hwm_cfg);
1263 
1264 	/* Force re-reading all values */
1265 	data->valid = false;
1266 	mutex_unlock(&data->update_lock);
1267 
1268 	return 0;
1269 }
1270 
1271 static const struct dev_pm_ops nct6683_dev_pm_ops = {
1272 	.suspend = nct6683_suspend,
1273 	.resume = nct6683_resume,
1274 	.freeze = nct6683_suspend,
1275 	.restore = nct6683_resume,
1276 };
1277 
1278 #define NCT6683_DEV_PM_OPS	(&nct6683_dev_pm_ops)
1279 #else
1280 #define NCT6683_DEV_PM_OPS	NULL
1281 #endif /* CONFIG_PM */
1282 
1283 static struct platform_driver nct6683_driver = {
1284 	.driver = {
1285 		.owner	= THIS_MODULE,
1286 		.name	= DRVNAME,
1287 		.pm	= NCT6683_DEV_PM_OPS,
1288 	},
1289 	.probe		= nct6683_probe,
1290 };
1291 
1292 static int __init nct6683_find(int sioaddr, struct nct6683_sio_data *sio_data)
1293 {
1294 	const char *board_vendor;
1295 	int addr;
1296 	u16 val;
1297 	int err;
1298 
1299 	/*
1300 	 * Only run on Intel boards unless the 'force' module parameter is set
1301 	 */
1302 	if (!force) {
1303 		board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
1304 		if (!board_vendor || strcmp(board_vendor, "Intel Corporation"))
1305 			return -ENODEV;
1306 	}
1307 
1308 	err = superio_enter(sioaddr);
1309 	if (err)
1310 		return err;
1311 
1312 	val = (superio_inb(sioaddr, SIO_REG_DEVID) << 8)
1313 	       | superio_inb(sioaddr, SIO_REG_DEVID + 1);
1314 
1315 	switch (val & SIO_ID_MASK) {
1316 	case SIO_NCT6683_ID:
1317 		sio_data->kind = nct6683;
1318 		break;
1319 	default:
1320 		if (val != 0xffff)
1321 			pr_debug("unsupported chip ID: 0x%04x\n", val);
1322 		goto fail;
1323 	}
1324 
1325 	/* We have a known chip, find the HWM I/O address */
1326 	superio_select(sioaddr, NCT6683_LD_HWM);
1327 	val = (superio_inb(sioaddr, SIO_REG_ADDR) << 8)
1328 	    | superio_inb(sioaddr, SIO_REG_ADDR + 1);
1329 	addr = val & IOREGION_ALIGNMENT;
1330 	if (addr == 0) {
1331 		pr_err("EC base I/O port unconfigured\n");
1332 		goto fail;
1333 	}
1334 
1335 	/* Activate logical device if needed */
1336 	val = superio_inb(sioaddr, SIO_REG_ENABLE);
1337 	if (!(val & 0x01)) {
1338 		pr_err("EC is disabled\n");
1339 		goto fail;
1340 	}
1341 
1342 	superio_exit(sioaddr);
1343 	pr_info("Found %s or compatible chip at %#x:%#x\n",
1344 		nct6683_chip_names[sio_data->kind], sioaddr, addr);
1345 	sio_data->sioreg = sioaddr;
1346 
1347 	return addr;
1348 
1349 fail:
1350 	superio_exit(sioaddr);
1351 	return -ENODEV;
1352 }
1353 
1354 /*
1355  * when Super-I/O functions move to a separate file, the Super-I/O
1356  * bus will manage the lifetime of the device and this module will only keep
1357  * track of the nct6683 driver. But since we use platform_device_alloc(), we
1358  * must keep track of the device
1359  */
1360 static struct platform_device *pdev[2];
1361 
1362 static int __init sensors_nct6683_init(void)
1363 {
1364 	struct nct6683_sio_data sio_data;
1365 	int sioaddr[2] = { 0x2e, 0x4e };
1366 	struct resource res;
1367 	bool found = false;
1368 	int address;
1369 	int i, err;
1370 
1371 	err = platform_driver_register(&nct6683_driver);
1372 	if (err)
1373 		return err;
1374 
1375 	/*
1376 	 * initialize sio_data->kind and sio_data->sioreg.
1377 	 *
1378 	 * when Super-I/O functions move to a separate file, the Super-I/O
1379 	 * driver will probe 0x2e and 0x4e and auto-detect the presence of a
1380 	 * nct6683 hardware monitor, and call probe()
1381 	 */
1382 	for (i = 0; i < ARRAY_SIZE(pdev); i++) {
1383 		address = nct6683_find(sioaddr[i], &sio_data);
1384 		if (address <= 0)
1385 			continue;
1386 
1387 		found = true;
1388 
1389 		pdev[i] = platform_device_alloc(DRVNAME, address);
1390 		if (!pdev[i]) {
1391 			err = -ENOMEM;
1392 			goto exit_device_unregister;
1393 		}
1394 
1395 		err = platform_device_add_data(pdev[i], &sio_data,
1396 					       sizeof(struct nct6683_sio_data));
1397 		if (err)
1398 			goto exit_device_put;
1399 
1400 		memset(&res, 0, sizeof(res));
1401 		res.name = DRVNAME;
1402 		res.start = address + IOREGION_OFFSET;
1403 		res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1;
1404 		res.flags = IORESOURCE_IO;
1405 
1406 		err = acpi_check_resource_conflict(&res);
1407 		if (err) {
1408 			platform_device_put(pdev[i]);
1409 			pdev[i] = NULL;
1410 			continue;
1411 		}
1412 
1413 		err = platform_device_add_resources(pdev[i], &res, 1);
1414 		if (err)
1415 			goto exit_device_put;
1416 
1417 		/* platform_device_add calls probe() */
1418 		err = platform_device_add(pdev[i]);
1419 		if (err)
1420 			goto exit_device_put;
1421 	}
1422 	if (!found) {
1423 		err = -ENODEV;
1424 		goto exit_unregister;
1425 	}
1426 
1427 	return 0;
1428 
1429 exit_device_put:
1430 	platform_device_put(pdev[i]);
1431 exit_device_unregister:
1432 	while (--i >= 0) {
1433 		if (pdev[i])
1434 			platform_device_unregister(pdev[i]);
1435 	}
1436 exit_unregister:
1437 	platform_driver_unregister(&nct6683_driver);
1438 	return err;
1439 }
1440 
1441 static void __exit sensors_nct6683_exit(void)
1442 {
1443 	int i;
1444 
1445 	for (i = 0; i < ARRAY_SIZE(pdev); i++) {
1446 		if (pdev[i])
1447 			platform_device_unregister(pdev[i]);
1448 	}
1449 	platform_driver_unregister(&nct6683_driver);
1450 }
1451 
1452 MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
1453 MODULE_DESCRIPTION("NCT6683D driver");
1454 MODULE_LICENSE("GPL");
1455 
1456 module_init(sensors_nct6683_init);
1457 module_exit(sensors_nct6683_exit);
1458