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
44enum kinds { nct6683 };
45
46static bool force;
47module_param(force, bool, 0);
48MODULE_PARM_DESC(force, "Set to one to enable detection on non-Intel boards");
49
50static const char * const nct6683_device_names[] = {
51	"nct6683",
52};
53
54static 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
77static inline void
78superio_outb(int ioreg, int reg, int val)
79{
80	outb(reg, ioreg);
81	outb(val, ioreg + 1);
82}
83
84static inline int
85superio_inb(int ioreg, int reg)
86{
87	outb(reg, ioreg);
88	return inb(ioreg + 1);
89}
90
91static inline void
92superio_select(int ioreg, int ld)
93{
94	outb(SIO_REG_LDSEL, ioreg);
95	outb(ld, ioreg + 1);
96}
97
98static inline int
99superio_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
113static inline void
114superio_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
184static 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
290struct 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
336struct nct6683_sio_data {
337	int sioreg;
338	enum kinds kind;
339};
340
341struct 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
353struct 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)	\
380static 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)					\
386static struct sensor_device_template sensor_dev_template_##_name	\
387	= SENSOR_DEVICE_TEMPLATE_2(_template, _mode, _show, _store,	\
388				 _nr, _index)
389
390struct sensor_template_group {
391	struct sensor_device_template **templates;
392	umode_t (*is_visible)(struct kobject *, struct attribute *, int);
393	int base;
394};
395
396static struct attribute_group *
397nct6683_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
477static 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
487static 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
498static 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
509static u16 nct6683_read16(struct nct6683_data *data, u16 reg)
510{
511	return (nct6683_read(data, reg) << 8) | nct6683_read(data, reg + 1);
512}
513
514static 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
522static 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
545static 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
583static 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
595static 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 */
653static ssize_t
654show_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
663static ssize_t
664show_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
675static 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
693SENSOR_TEMPLATE(in_label, "in%d_label", S_IRUGO, show_in_label, NULL, 0);
694SENSOR_TEMPLATE_2(in_input, "in%d_input", S_IRUGO, show_in_reg, NULL, 0, 0);
695SENSOR_TEMPLATE_2(in_min, "in%d_min", S_IRUGO, show_in_reg, NULL, 0, 1);
696SENSOR_TEMPLATE_2(in_max, "in%d_max", S_IRUGO, show_in_reg, NULL, 0, 2);
697
698static 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
706static struct sensor_template_group nct6683_in_template_group = {
707	.templates = nct6683_attributes_in_template,
708	.is_visible = nct6683_in_is_visible,
709};
710
711static ssize_t
712show_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
720static ssize_t
721show_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
730static ssize_t
731show_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
740static 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
761SENSOR_TEMPLATE(fan_input, "fan%d_input", S_IRUGO, show_fan, NULL, 0);
762SENSOR_TEMPLATE(fan_pulses, "fan%d_pulses", S_IRUGO, show_fan_pulses, NULL, 0);
763SENSOR_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 */
770static 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
777static 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
783static ssize_t
784show_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
793static ssize_t
794show_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
804static ssize_t
805show_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
815static ssize_t
816show_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
835static 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
849static ssize_t
850show_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
858static 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
880SENSOR_TEMPLATE(temp_input, "temp%d_input", S_IRUGO, show_temp16, NULL, 0);
881SENSOR_TEMPLATE(temp_label, "temp%d_label", S_IRUGO, show_temp_label, NULL, 0);
882SENSOR_TEMPLATE_2(temp_min, "temp%d_min", S_IRUGO, show_temp8, NULL, 0, 0);
883SENSOR_TEMPLATE_2(temp_max, "temp%d_max", S_IRUGO, show_temp8, NULL, 0, 1);
884SENSOR_TEMPLATE(temp_max_hyst, "temp%d_max_hyst", S_IRUGO, show_temp_hyst, NULL,
885		0);
886SENSOR_TEMPLATE_2(temp_crit, "temp%d_crit", S_IRUGO, show_temp8, NULL, 0, 3);
887SENSOR_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 */
894static 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
905static 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
911static ssize_t
912show_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
921SENSOR_TEMPLATE(pwm, "pwm%d", S_IRUGO, show_pwm, NULL, 0);
922
923static 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
936static struct sensor_device_template *nct6683_attributes_pwm_template[] = {
937	&sensor_dev_template_pwm,
938	NULL
939};
940
941static 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
947static ssize_t
948show_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
967error:
968	mutex_unlock(&data->update_lock);
969	return ret;
970}
971
972static ssize_t
973store_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);
1000error:
1001	mutex_unlock(&data->update_lock);
1002	return count;
1003}
1004
1005/* Case open detection */
1006
1007static ssize_t
1008show_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
1027error:
1028	mutex_unlock(&data->update_lock);
1029	return ret;
1030}
1031
1032static ssize_t
1033clear_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 */
1066error:
1067	mutex_unlock(&data->update_lock);
1068	return count;
1069}
1070
1071static DEVICE_ATTR(intrusion0_alarm, S_IWUSR | S_IRUGO, show_caseopen,
1072		   clear_caseopen);
1073static DEVICE_ATTR(beep_enable, S_IWUSR | S_IRUGO, show_global_beep,
1074		   store_global_beep);
1075
1076static struct attribute *nct6683_attributes_other[] = {
1077	&dev_attr_intrusion0_alarm.attr,
1078	&dev_attr_beep_enable.attr,
1079	NULL
1080};
1081
1082static const struct attribute_group nct6683_group_other = {
1083	.attrs = nct6683_attributes_other,
1084};
1085
1086/* Get the monitoring functions started */
1087static 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 */
1101static void
1102nct6683_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
1137static 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
1164static 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
1247static 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
1258static 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
1273static 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
1285static struct platform_driver nct6683_driver = {
1286	.driver = {
1287		.name	= DRVNAME,
1288		.pm	= NCT6683_DEV_PM_OPS,
1289	},
1290	.probe		= nct6683_probe,
1291};
1292
1293static 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
1350fail:
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 */
1361static struct platform_device *pdev[2];
1362
1363static 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
1430exit_device_put:
1431	platform_device_put(pdev[i]);
1432exit_device_unregister:
1433	while (--i >= 0) {
1434		if (pdev[i])
1435			platform_device_unregister(pdev[i]);
1436	}
1437exit_unregister:
1438	platform_driver_unregister(&nct6683_driver);
1439	return err;
1440}
1441
1442static 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
1453MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
1454MODULE_DESCRIPTION("NCT6683D driver");
1455MODULE_LICENSE("GPL");
1456
1457module_init(sensors_nct6683_init);
1458module_exit(sensors_nct6683_exit);
1459