nzxt-smart2.c (20116B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Reverse-engineered NZXT RGB & Fan Controller/Smart Device v2 driver. 4 * 5 * Copyright (c) 2021 Aleksandr Mezin 6 */ 7 8#include <linux/hid.h> 9#include <linux/hwmon.h> 10#include <linux/math.h> 11#include <linux/module.h> 12#include <linux/mutex.h> 13#include <linux/spinlock.h> 14#include <linux/wait.h> 15 16#include <asm/byteorder.h> 17#include <asm/unaligned.h> 18 19/* 20 * The device has only 3 fan channels/connectors. But all HID reports have 21 * space reserved for up to 8 channels. 22 */ 23#define FAN_CHANNELS 3 24#define FAN_CHANNELS_MAX 8 25 26#define UPDATE_INTERVAL_DEFAULT_MS 1000 27 28/* These strings match labels on the device exactly */ 29static const char *const fan_label[] = { 30 "FAN 1", 31 "FAN 2", 32 "FAN 3", 33}; 34 35static const char *const curr_label[] = { 36 "FAN 1 Current", 37 "FAN 2 Current", 38 "FAN 3 Current", 39}; 40 41static const char *const in_label[] = { 42 "FAN 1 Voltage", 43 "FAN 2 Voltage", 44 "FAN 3 Voltage", 45}; 46 47enum { 48 INPUT_REPORT_ID_FAN_CONFIG = 0x61, 49 INPUT_REPORT_ID_FAN_STATUS = 0x67, 50}; 51 52enum { 53 FAN_STATUS_REPORT_SPEED = 0x02, 54 FAN_STATUS_REPORT_VOLTAGE = 0x04, 55}; 56 57enum { 58 FAN_TYPE_NONE = 0, 59 FAN_TYPE_DC = 1, 60 FAN_TYPE_PWM = 2, 61}; 62 63struct unknown_static_data { 64 /* 65 * Some configuration data? Stays the same after fan speed changes, 66 * changes in fan configuration, reboots and driver reloads. 67 * 68 * The same data in multiple report types. 69 * 70 * Byte 12 seems to be the number of fan channels, but I am not sure. 71 */ 72 u8 unknown1[14]; 73} __packed; 74 75/* 76 * The device sends this input report in response to "detect fans" command: 77 * a 2-byte output report { 0x60, 0x03 }. 78 */ 79struct fan_config_report { 80 /* report_id should be INPUT_REPORT_ID_FAN_CONFIG = 0x61 */ 81 u8 report_id; 82 /* Always 0x03 */ 83 u8 magic; 84 struct unknown_static_data unknown_data; 85 /* Fan type as detected by the device. See FAN_TYPE_* enum. */ 86 u8 fan_type[FAN_CHANNELS_MAX]; 87} __packed; 88 89/* 90 * The device sends these reports at a fixed interval (update interval) - 91 * one report with type = FAN_STATUS_REPORT_SPEED, and one report with type = 92 * FAN_STATUS_REPORT_VOLTAGE per update interval. 93 */ 94struct fan_status_report { 95 /* report_id should be INPUT_REPORT_ID_STATUS = 0x67 */ 96 u8 report_id; 97 /* FAN_STATUS_REPORT_SPEED = 0x02 or FAN_STATUS_REPORT_VOLTAGE = 0x04 */ 98 u8 type; 99 struct unknown_static_data unknown_data; 100 /* Fan type as detected by the device. See FAN_TYPE_* enum. */ 101 u8 fan_type[FAN_CHANNELS_MAX]; 102 103 union { 104 /* When type == FAN_STATUS_REPORT_SPEED */ 105 struct { 106 /* 107 * Fan speed, in RPM. Zero for channels without fans 108 * connected. 109 */ 110 __le16 fan_rpm[FAN_CHANNELS_MAX]; 111 /* 112 * Fan duty cycle, in percent. Non-zero even for 113 * channels without fans connected. 114 */ 115 u8 duty_percent[FAN_CHANNELS_MAX]; 116 /* 117 * Exactly the same values as duty_percent[], non-zero 118 * for disconnected fans too. 119 */ 120 u8 duty_percent_dup[FAN_CHANNELS_MAX]; 121 /* "Case Noise" in db */ 122 u8 noise_db; 123 } __packed fan_speed; 124 /* When type == FAN_STATUS_REPORT_VOLTAGE */ 125 struct { 126 /* 127 * Voltage, in millivolts. Non-zero even when fan is 128 * not connected. 129 */ 130 __le16 fan_in[FAN_CHANNELS_MAX]; 131 /* 132 * Current, in milliamperes. Near-zero when 133 * disconnected. 134 */ 135 __le16 fan_current[FAN_CHANNELS_MAX]; 136 } __packed fan_voltage; 137 } __packed; 138} __packed; 139 140#define OUTPUT_REPORT_SIZE 64 141 142enum { 143 OUTPUT_REPORT_ID_INIT_COMMAND = 0x60, 144 OUTPUT_REPORT_ID_SET_FAN_SPEED = 0x62, 145}; 146 147enum { 148 INIT_COMMAND_SET_UPDATE_INTERVAL = 0x02, 149 INIT_COMMAND_DETECT_FANS = 0x03, 150}; 151 152/* 153 * This output report sets pwm duty cycle/target fan speed for one or more 154 * channels. 155 */ 156struct set_fan_speed_report { 157 /* report_id should be OUTPUT_REPORT_ID_SET_FAN_SPEED = 0x62 */ 158 u8 report_id; 159 /* Should be 0x01 */ 160 u8 magic; 161 /* To change fan speed on i-th channel, set i-th bit here */ 162 u8 channel_bit_mask; 163 /* 164 * Fan duty cycle/target speed in percent. For voltage-controlled fans, 165 * the minimal voltage (duty_percent = 1) is about 9V. 166 * Setting duty_percent to 0 (if the channel is selected in 167 * channel_bit_mask) turns off the fan completely (regardless of the 168 * control mode). 169 */ 170 u8 duty_percent[FAN_CHANNELS_MAX]; 171} __packed; 172 173struct drvdata { 174 struct hid_device *hid; 175 struct device *hwmon; 176 177 u8 fan_duty_percent[FAN_CHANNELS]; 178 u16 fan_rpm[FAN_CHANNELS]; 179 bool pwm_status_received; 180 181 u16 fan_in[FAN_CHANNELS]; 182 u16 fan_curr[FAN_CHANNELS]; 183 bool voltage_status_received; 184 185 u8 fan_type[FAN_CHANNELS]; 186 bool fan_config_received; 187 188 /* 189 * wq is used to wait for *_received flags to become true. 190 * All accesses to *_received flags and fan_* arrays are performed with 191 * wq.lock held. 192 */ 193 wait_queue_head_t wq; 194 /* 195 * mutex is used to: 196 * 1) Prevent concurrent conflicting changes to update interval and pwm 197 * values (after sending an output hid report, the corresponding field 198 * in drvdata must be updated, and only then new output reports can be 199 * sent). 200 * 2) Synchronize access to output_buffer (well, the buffer is here, 201 * because synchronization is necessary anyway - so why not get rid of 202 * a kmalloc?). 203 */ 204 struct mutex mutex; 205 long update_interval; 206 u8 output_buffer[OUTPUT_REPORT_SIZE]; 207}; 208 209static long scale_pwm_value(long val, long orig_max, long new_max) 210{ 211 if (val <= 0) 212 return 0; 213 214 /* 215 * Positive values should not become zero: 0 completely turns off the 216 * fan. 217 */ 218 return max(1L, DIV_ROUND_CLOSEST(min(val, orig_max) * new_max, orig_max)); 219} 220 221static void handle_fan_config_report(struct drvdata *drvdata, void *data, int size) 222{ 223 struct fan_config_report *report = data; 224 int i; 225 226 if (size < sizeof(struct fan_config_report)) 227 return; 228 229 if (report->magic != 0x03) 230 return; 231 232 spin_lock(&drvdata->wq.lock); 233 234 for (i = 0; i < FAN_CHANNELS; i++) 235 drvdata->fan_type[i] = report->fan_type[i]; 236 237 drvdata->fan_config_received = true; 238 wake_up_all_locked(&drvdata->wq); 239 spin_unlock(&drvdata->wq.lock); 240} 241 242static void handle_fan_status_report(struct drvdata *drvdata, void *data, int size) 243{ 244 struct fan_status_report *report = data; 245 int i; 246 247 if (size < sizeof(struct fan_status_report)) 248 return; 249 250 spin_lock(&drvdata->wq.lock); 251 252 /* 253 * The device sends INPUT_REPORT_ID_FAN_CONFIG = 0x61 report in response 254 * to "detect fans" command. Only accept other data after getting 0x61, 255 * to make sure that fan detection is complete. In particular, fan 256 * detection resets pwm values. 257 */ 258 if (!drvdata->fan_config_received) { 259 spin_unlock(&drvdata->wq.lock); 260 return; 261 } 262 263 for (i = 0; i < FAN_CHANNELS; i++) { 264 if (drvdata->fan_type[i] == report->fan_type[i]) 265 continue; 266 267 /* 268 * This should not happen (if my expectations about the device 269 * are correct). 270 * 271 * Even if the userspace sends fan detect command through 272 * hidraw, fan config report should arrive first. 273 */ 274 hid_warn_once(drvdata->hid, 275 "Fan %d type changed unexpectedly from %d to %d", 276 i, drvdata->fan_type[i], report->fan_type[i]); 277 drvdata->fan_type[i] = report->fan_type[i]; 278 } 279 280 switch (report->type) { 281 case FAN_STATUS_REPORT_SPEED: 282 for (i = 0; i < FAN_CHANNELS; i++) { 283 drvdata->fan_rpm[i] = 284 get_unaligned_le16(&report->fan_speed.fan_rpm[i]); 285 drvdata->fan_duty_percent[i] = 286 report->fan_speed.duty_percent[i]; 287 } 288 289 drvdata->pwm_status_received = true; 290 wake_up_all_locked(&drvdata->wq); 291 break; 292 293 case FAN_STATUS_REPORT_VOLTAGE: 294 for (i = 0; i < FAN_CHANNELS; i++) { 295 drvdata->fan_in[i] = 296 get_unaligned_le16(&report->fan_voltage.fan_in[i]); 297 drvdata->fan_curr[i] = 298 get_unaligned_le16(&report->fan_voltage.fan_current[i]); 299 } 300 301 drvdata->voltage_status_received = true; 302 wake_up_all_locked(&drvdata->wq); 303 break; 304 } 305 306 spin_unlock(&drvdata->wq.lock); 307} 308 309static umode_t nzxt_smart2_hwmon_is_visible(const void *data, 310 enum hwmon_sensor_types type, 311 u32 attr, int channel) 312{ 313 switch (type) { 314 case hwmon_pwm: 315 switch (attr) { 316 case hwmon_pwm_input: 317 case hwmon_pwm_enable: 318 return 0644; 319 320 default: 321 return 0444; 322 } 323 324 case hwmon_chip: 325 switch (attr) { 326 case hwmon_chip_update_interval: 327 return 0644; 328 329 default: 330 return 0444; 331 } 332 333 default: 334 return 0444; 335 } 336} 337 338static int nzxt_smart2_hwmon_read(struct device *dev, enum hwmon_sensor_types type, 339 u32 attr, int channel, long *val) 340{ 341 struct drvdata *drvdata = dev_get_drvdata(dev); 342 int res = -EINVAL; 343 344 if (type == hwmon_chip) { 345 switch (attr) { 346 case hwmon_chip_update_interval: 347 *val = drvdata->update_interval; 348 return 0; 349 350 default: 351 return -EINVAL; 352 } 353 } 354 355 spin_lock_irq(&drvdata->wq.lock); 356 357 switch (type) { 358 case hwmon_pwm: 359 /* 360 * fancontrol: 361 * 1) remembers pwm* values when it starts 362 * 2) needs pwm*_enable to be 1 on controlled fans 363 * So make sure we have correct data before allowing pwm* reads. 364 * Returning errors for pwm of fan speed read can even cause 365 * fancontrol to shut down. So the wait is unavoidable. 366 */ 367 switch (attr) { 368 case hwmon_pwm_enable: 369 res = wait_event_interruptible_locked_irq(drvdata->wq, 370 drvdata->fan_config_received); 371 if (res) 372 goto unlock; 373 374 *val = drvdata->fan_type[channel] != FAN_TYPE_NONE; 375 break; 376 377 case hwmon_pwm_mode: 378 res = wait_event_interruptible_locked_irq(drvdata->wq, 379 drvdata->fan_config_received); 380 if (res) 381 goto unlock; 382 383 *val = drvdata->fan_type[channel] == FAN_TYPE_PWM; 384 break; 385 386 case hwmon_pwm_input: 387 res = wait_event_interruptible_locked_irq(drvdata->wq, 388 drvdata->pwm_status_received); 389 if (res) 390 goto unlock; 391 392 *val = scale_pwm_value(drvdata->fan_duty_percent[channel], 393 100, 255); 394 break; 395 } 396 break; 397 398 case hwmon_fan: 399 /* 400 * It's not strictly necessary to wait for *_received in the 401 * remaining cases (fancontrol doesn't care about them). But I'm 402 * doing it to have consistent behavior. 403 */ 404 if (attr == hwmon_fan_input) { 405 res = wait_event_interruptible_locked_irq(drvdata->wq, 406 drvdata->pwm_status_received); 407 if (res) 408 goto unlock; 409 410 *val = drvdata->fan_rpm[channel]; 411 } 412 break; 413 414 case hwmon_in: 415 if (attr == hwmon_in_input) { 416 res = wait_event_interruptible_locked_irq(drvdata->wq, 417 drvdata->voltage_status_received); 418 if (res) 419 goto unlock; 420 421 *val = drvdata->fan_in[channel]; 422 } 423 break; 424 425 case hwmon_curr: 426 if (attr == hwmon_curr_input) { 427 res = wait_event_interruptible_locked_irq(drvdata->wq, 428 drvdata->voltage_status_received); 429 if (res) 430 goto unlock; 431 432 *val = drvdata->fan_curr[channel]; 433 } 434 break; 435 436 default: 437 break; 438 } 439 440unlock: 441 spin_unlock_irq(&drvdata->wq.lock); 442 return res; 443} 444 445static int send_output_report(struct drvdata *drvdata, const void *data, 446 size_t data_size) 447{ 448 int ret; 449 450 if (data_size > sizeof(drvdata->output_buffer)) 451 return -EINVAL; 452 453 memcpy(drvdata->output_buffer, data, data_size); 454 455 if (data_size < sizeof(drvdata->output_buffer)) 456 memset(drvdata->output_buffer + data_size, 0, 457 sizeof(drvdata->output_buffer) - data_size); 458 459 ret = hid_hw_output_report(drvdata->hid, drvdata->output_buffer, 460 sizeof(drvdata->output_buffer)); 461 return ret < 0 ? ret : 0; 462} 463 464static int set_pwm(struct drvdata *drvdata, int channel, long val) 465{ 466 int ret; 467 u8 duty_percent = scale_pwm_value(val, 255, 100); 468 469 struct set_fan_speed_report report = { 470 .report_id = OUTPUT_REPORT_ID_SET_FAN_SPEED, 471 .magic = 1, 472 .channel_bit_mask = 1 << channel 473 }; 474 475 ret = mutex_lock_interruptible(&drvdata->mutex); 476 if (ret) 477 return ret; 478 479 report.duty_percent[channel] = duty_percent; 480 ret = send_output_report(drvdata, &report, sizeof(report)); 481 if (ret) 482 goto unlock; 483 484 /* 485 * pwmconfig and fancontrol scripts expect pwm writes to take effect 486 * immediately (i. e. read from pwm* sysfs should return the value 487 * written into it). The device seems to always accept pwm values - even 488 * when there is no fan connected - so update pwm status without waiting 489 * for a report, to make pwmconfig and fancontrol happy. Worst case - 490 * if the device didn't accept new pwm value for some reason (never seen 491 * this in practice) - it will be reported incorrectly only until next 492 * update. This avoids "fan stuck" messages from pwmconfig, and 493 * fancontrol setting fan speed to 100% during shutdown. 494 */ 495 spin_lock_bh(&drvdata->wq.lock); 496 drvdata->fan_duty_percent[channel] = duty_percent; 497 spin_unlock_bh(&drvdata->wq.lock); 498 499unlock: 500 mutex_unlock(&drvdata->mutex); 501 return ret; 502} 503 504/* 505 * Workaround for fancontrol/pwmconfig trying to write to pwm*_enable even if it 506 * already is 1 and read-only. Otherwise, fancontrol won't restore pwm on 507 * shutdown properly. 508 */ 509static int set_pwm_enable(struct drvdata *drvdata, int channel, long val) 510{ 511 long expected_val; 512 int res; 513 514 spin_lock_irq(&drvdata->wq.lock); 515 516 res = wait_event_interruptible_locked_irq(drvdata->wq, 517 drvdata->fan_config_received); 518 if (res) { 519 spin_unlock_irq(&drvdata->wq.lock); 520 return res; 521 } 522 523 expected_val = drvdata->fan_type[channel] != FAN_TYPE_NONE; 524 525 spin_unlock_irq(&drvdata->wq.lock); 526 527 return (val == expected_val) ? 0 : -EOPNOTSUPP; 528} 529 530/* 531 * Control byte | Actual update interval in seconds 532 * 0xff | 65.5 533 * 0xf7 | 63.46 534 * 0x7f | 32.74 535 * 0x3f | 16.36 536 * 0x1f | 8.17 537 * 0x0f | 4.07 538 * 0x07 | 2.02 539 * 0x03 | 1.00 540 * 0x02 | 0.744 541 * 0x01 | 0.488 542 * 0x00 | 0.25 543 */ 544static u8 update_interval_to_control_byte(long interval) 545{ 546 if (interval <= 250) 547 return 0; 548 549 return clamp_val(1 + DIV_ROUND_CLOSEST(interval - 488, 256), 0, 255); 550} 551 552static long control_byte_to_update_interval(u8 control_byte) 553{ 554 if (control_byte == 0) 555 return 250; 556 557 return 488 + (control_byte - 1) * 256; 558} 559 560static int set_update_interval(struct drvdata *drvdata, long val) 561{ 562 u8 control = update_interval_to_control_byte(val); 563 u8 report[] = { 564 OUTPUT_REPORT_ID_INIT_COMMAND, 565 INIT_COMMAND_SET_UPDATE_INTERVAL, 566 0x01, 567 0xe8, 568 control, 569 0x01, 570 0xe8, 571 control, 572 }; 573 int ret; 574 575 ret = send_output_report(drvdata, report, sizeof(report)); 576 if (ret) 577 return ret; 578 579 drvdata->update_interval = control_byte_to_update_interval(control); 580 return 0; 581} 582 583static int init_device(struct drvdata *drvdata, long update_interval) 584{ 585 int ret; 586 static const u8 detect_fans_report[] = { 587 OUTPUT_REPORT_ID_INIT_COMMAND, 588 INIT_COMMAND_DETECT_FANS, 589 }; 590 591 ret = send_output_report(drvdata, detect_fans_report, 592 sizeof(detect_fans_report)); 593 if (ret) 594 return ret; 595 596 return set_update_interval(drvdata, update_interval); 597} 598 599static int nzxt_smart2_hwmon_write(struct device *dev, 600 enum hwmon_sensor_types type, u32 attr, 601 int channel, long val) 602{ 603 struct drvdata *drvdata = dev_get_drvdata(dev); 604 int ret; 605 606 switch (type) { 607 case hwmon_pwm: 608 switch (attr) { 609 case hwmon_pwm_enable: 610 return set_pwm_enable(drvdata, channel, val); 611 612 case hwmon_pwm_input: 613 return set_pwm(drvdata, channel, val); 614 615 default: 616 return -EINVAL; 617 } 618 619 case hwmon_chip: 620 switch (attr) { 621 case hwmon_chip_update_interval: 622 ret = mutex_lock_interruptible(&drvdata->mutex); 623 if (ret) 624 return ret; 625 626 ret = set_update_interval(drvdata, val); 627 628 mutex_unlock(&drvdata->mutex); 629 return ret; 630 631 default: 632 return -EINVAL; 633 } 634 635 default: 636 return -EINVAL; 637 } 638} 639 640static int nzxt_smart2_hwmon_read_string(struct device *dev, 641 enum hwmon_sensor_types type, u32 attr, 642 int channel, const char **str) 643{ 644 switch (type) { 645 case hwmon_fan: 646 *str = fan_label[channel]; 647 return 0; 648 case hwmon_curr: 649 *str = curr_label[channel]; 650 return 0; 651 case hwmon_in: 652 *str = in_label[channel]; 653 return 0; 654 default: 655 return -EINVAL; 656 } 657} 658 659static const struct hwmon_ops nzxt_smart2_hwmon_ops = { 660 .is_visible = nzxt_smart2_hwmon_is_visible, 661 .read = nzxt_smart2_hwmon_read, 662 .read_string = nzxt_smart2_hwmon_read_string, 663 .write = nzxt_smart2_hwmon_write, 664}; 665 666static const struct hwmon_channel_info *nzxt_smart2_channel_info[] = { 667 HWMON_CHANNEL_INFO(fan, HWMON_F_INPUT | HWMON_F_LABEL, 668 HWMON_F_INPUT | HWMON_F_LABEL, 669 HWMON_F_INPUT | HWMON_F_LABEL), 670 HWMON_CHANNEL_INFO(pwm, HWMON_PWM_INPUT | HWMON_PWM_MODE | HWMON_PWM_ENABLE, 671 HWMON_PWM_INPUT | HWMON_PWM_MODE | HWMON_PWM_ENABLE, 672 HWMON_PWM_INPUT | HWMON_PWM_MODE | HWMON_PWM_ENABLE), 673 HWMON_CHANNEL_INFO(in, HWMON_I_INPUT | HWMON_I_LABEL, 674 HWMON_I_INPUT | HWMON_I_LABEL, 675 HWMON_I_INPUT | HWMON_I_LABEL), 676 HWMON_CHANNEL_INFO(curr, HWMON_C_INPUT | HWMON_C_LABEL, 677 HWMON_C_INPUT | HWMON_C_LABEL, 678 HWMON_C_INPUT | HWMON_C_LABEL), 679 HWMON_CHANNEL_INFO(chip, HWMON_C_UPDATE_INTERVAL), 680 NULL 681}; 682 683static const struct hwmon_chip_info nzxt_smart2_chip_info = { 684 .ops = &nzxt_smart2_hwmon_ops, 685 .info = nzxt_smart2_channel_info, 686}; 687 688static int nzxt_smart2_hid_raw_event(struct hid_device *hdev, 689 struct hid_report *report, u8 *data, int size) 690{ 691 struct drvdata *drvdata = hid_get_drvdata(hdev); 692 u8 report_id = *data; 693 694 switch (report_id) { 695 case INPUT_REPORT_ID_FAN_CONFIG: 696 handle_fan_config_report(drvdata, data, size); 697 break; 698 699 case INPUT_REPORT_ID_FAN_STATUS: 700 handle_fan_status_report(drvdata, data, size); 701 break; 702 } 703 704 return 0; 705} 706 707static int __maybe_unused nzxt_smart2_hid_reset_resume(struct hid_device *hdev) 708{ 709 struct drvdata *drvdata = hid_get_drvdata(hdev); 710 711 /* 712 * Userspace is still frozen (so no concurrent sysfs attribute access 713 * is possible), but raw_event can already be called concurrently. 714 */ 715 spin_lock_bh(&drvdata->wq.lock); 716 drvdata->fan_config_received = false; 717 drvdata->pwm_status_received = false; 718 drvdata->voltage_status_received = false; 719 spin_unlock_bh(&drvdata->wq.lock); 720 721 return init_device(drvdata, drvdata->update_interval); 722} 723 724static int nzxt_smart2_hid_probe(struct hid_device *hdev, 725 const struct hid_device_id *id) 726{ 727 struct drvdata *drvdata; 728 int ret; 729 730 drvdata = devm_kzalloc(&hdev->dev, sizeof(struct drvdata), GFP_KERNEL); 731 if (!drvdata) 732 return -ENOMEM; 733 734 drvdata->hid = hdev; 735 hid_set_drvdata(hdev, drvdata); 736 737 init_waitqueue_head(&drvdata->wq); 738 739 mutex_init(&drvdata->mutex); 740 devm_add_action(&hdev->dev, (void (*)(void *))mutex_destroy, 741 &drvdata->mutex); 742 743 ret = hid_parse(hdev); 744 if (ret) 745 return ret; 746 747 ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW); 748 if (ret) 749 return ret; 750 751 ret = hid_hw_open(hdev); 752 if (ret) 753 goto out_hw_stop; 754 755 hid_device_io_start(hdev); 756 757 init_device(drvdata, UPDATE_INTERVAL_DEFAULT_MS); 758 759 drvdata->hwmon = 760 hwmon_device_register_with_info(&hdev->dev, "nzxtsmart2", drvdata, 761 &nzxt_smart2_chip_info, NULL); 762 if (IS_ERR(drvdata->hwmon)) { 763 ret = PTR_ERR(drvdata->hwmon); 764 goto out_hw_close; 765 } 766 767 return 0; 768 769out_hw_close: 770 hid_hw_close(hdev); 771 772out_hw_stop: 773 hid_hw_stop(hdev); 774 return ret; 775} 776 777static void nzxt_smart2_hid_remove(struct hid_device *hdev) 778{ 779 struct drvdata *drvdata = hid_get_drvdata(hdev); 780 781 hwmon_device_unregister(drvdata->hwmon); 782 783 hid_hw_close(hdev); 784 hid_hw_stop(hdev); 785} 786 787static const struct hid_device_id nzxt_smart2_hid_id_table[] = { 788 { HID_USB_DEVICE(0x1e71, 0x2006) }, /* NZXT Smart Device V2 */ 789 { HID_USB_DEVICE(0x1e71, 0x200d) }, /* NZXT Smart Device V2 */ 790 { HID_USB_DEVICE(0x1e71, 0x2009) }, /* NZXT RGB & Fan Controller */ 791 { HID_USB_DEVICE(0x1e71, 0x200e) }, /* NZXT RGB & Fan Controller */ 792 { HID_USB_DEVICE(0x1e71, 0x2010) }, /* NZXT RGB & Fan Controller */ 793 {}, 794}; 795 796static struct hid_driver nzxt_smart2_hid_driver = { 797 .name = "nzxt-smart2", 798 .id_table = nzxt_smart2_hid_id_table, 799 .probe = nzxt_smart2_hid_probe, 800 .remove = nzxt_smart2_hid_remove, 801 .raw_event = nzxt_smart2_hid_raw_event, 802#ifdef CONFIG_PM 803 .reset_resume = nzxt_smart2_hid_reset_resume, 804#endif 805}; 806 807static int __init nzxt_smart2_init(void) 808{ 809 return hid_register_driver(&nzxt_smart2_hid_driver); 810} 811 812static void __exit nzxt_smart2_exit(void) 813{ 814 hid_unregister_driver(&nzxt_smart2_hid_driver); 815} 816 817MODULE_DEVICE_TABLE(hid, nzxt_smart2_hid_id_table); 818MODULE_AUTHOR("Aleksandr Mezin <mezin.alexander@gmail.com>"); 819MODULE_DESCRIPTION("Driver for NZXT RGB & Fan Controller/Smart Device V2"); 820MODULE_LICENSE("GPL"); 821 822/* 823 * With module_init()/module_hid_driver() and the driver built into the kernel: 824 * 825 * Driver 'nzxt_smart2' was unable to register with bus_type 'hid' because the 826 * bus was not initialized. 827 */ 828late_initcall(nzxt_smart2_init); 829module_exit(nzxt_smart2_exit);