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