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