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