1 // SPDX-License-Identifier: GPL-2.0+
3 * hwmon driver for Aquacomputer devices (D5 Next, Farbwerk, Farbwerk 360, Octo,
4 * Quadro, High Flow Next, Aquaero, Aquastream Ultimate)
6 * Aquacomputer devices send HID reports (with ID 0x01) every second to report
7 * sensor values, except for devices that communicate through the
8 * legacy way (currently, Poweradjust 3).
14 #include <linux/crc16.h>
15 #include <linux/debugfs.h>
16 #include <linux/hid.h>
17 #include <linux/hwmon.h>
18 #include <linux/jiffies.h>
19 #include <linux/module.h>
20 #include <linux/mutex.h>
21 #include <linux/seq_file.h>
22 #include <asm/unaligned.h>
24 #define USB_VENDOR_ID_AQUACOMPUTER 0x0c70
25 #define USB_PRODUCT_ID_AQUAERO 0xf001
26 #define USB_PRODUCT_ID_FARBWERK 0xf00a
27 #define USB_PRODUCT_ID_QUADRO 0xf00d
28 #define USB_PRODUCT_ID_D5NEXT 0xf00e
29 #define USB_PRODUCT_ID_FARBWERK360 0xf010
30 #define USB_PRODUCT_ID_OCTO 0xf011
31 #define USB_PRODUCT_ID_HIGHFLOWNEXT 0xf012
32 #define USB_PRODUCT_ID_AQUASTREAMXT 0xf0b6
33 #define USB_PRODUCT_ID_AQUASTREAMULT 0xf00b
34 #define USB_PRODUCT_ID_POWERADJUST3 0xf0bd
37 d5next, farbwerk, farbwerk360, octo, quadro,
38 highflownext, aquaero, poweradjust3, aquastreamult,
42 static const char *const aqc_device_names[] = {
44 [farbwerk] = "farbwerk",
45 [farbwerk360] = "farbwerk360",
48 [highflownext] = "highflownext",
49 [aquastreamxt] = "aquastreamxt",
50 [aquaero] = "aquaero",
51 [aquastreamult] = "aquastreamultimate",
52 [poweradjust3] = "poweradjust3"
55 #define DRIVER_NAME "aquacomputer_d5next"
57 #define STATUS_REPORT_ID 0x01
58 #define STATUS_UPDATE_INTERVAL (2 * HZ) /* In seconds */
59 #define SERIAL_PART_OFFSET 2
61 #define CTRL_REPORT_ID 0x03
62 #define AQUAERO_CTRL_REPORT_ID 0x0b
64 /* The HID report that the official software always sends
65 * after writing values, currently same for all devices
67 #define SECONDARY_CTRL_REPORT_ID 0x02
68 #define SECONDARY_CTRL_REPORT_SIZE 0x0B
70 static u8 secondary_ctrl_report[] = {
71 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x34, 0xC6
74 /* Secondary HID report values for Aquaero */
75 #define AQUAERO_SECONDARY_CTRL_REPORT_ID 0x06
76 #define AQUAERO_SECONDARY_CTRL_REPORT_SIZE 0x07
78 static u8 aquaero_secondary_ctrl_report[] = {
79 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00
82 /* Report IDs for legacy devices */
83 #define AQUASTREAMXT_STATUS_REPORT_ID 0x04
85 #define POWERADJUST3_STATUS_REPORT_ID 0x03
87 /* Data types for reading and writing control reports */
91 /* Info, sensor sizes and offsets for most Aquacomputer devices */
92 #define AQC_SERIAL_START 0x3
93 #define AQC_FIRMWARE_VERSION 0xD
95 #define AQC_SENSOR_SIZE 0x02
96 #define AQC_TEMP_SENSOR_DISCONNECTED 0x7FFF
97 #define AQC_FAN_PERCENT_OFFSET 0x00
98 #define AQC_FAN_VOLTAGE_OFFSET 0x02
99 #define AQC_FAN_CURRENT_OFFSET 0x04
100 #define AQC_FAN_POWER_OFFSET 0x06
101 #define AQC_FAN_SPEED_OFFSET 0x08
103 /* Specs of the Aquaero fan controllers */
104 #define AQUAERO_SERIAL_START 0x07
105 #define AQUAERO_FIRMWARE_VERSION 0x0B
106 #define AQUAERO_NUM_FANS 4
107 #define AQUAERO_NUM_SENSORS 8
108 #define AQUAERO_NUM_VIRTUAL_SENSORS 8
109 #define AQUAERO_NUM_CALC_VIRTUAL_SENSORS 4
110 #define AQUAERO_NUM_FLOW_SENSORS 2
111 #define AQUAERO_CTRL_REPORT_SIZE 0xa93
112 #define AQUAERO_CTRL_PRESET_ID 0x5c
113 #define AQUAERO_CTRL_PRESET_SIZE 0x02
114 #define AQUAERO_CTRL_PRESET_START 0x55c
116 /* Sensor report offsets for Aquaero fan controllers */
117 #define AQUAERO_SENSOR_START 0x65
118 #define AQUAERO_VIRTUAL_SENSOR_START 0x85
119 #define AQUAERO_CALC_VIRTUAL_SENSOR_START 0x95
120 #define AQUAERO_FLOW_SENSORS_START 0xF9
121 #define AQUAERO_FAN_VOLTAGE_OFFSET 0x04
122 #define AQUAERO_FAN_CURRENT_OFFSET 0x06
123 #define AQUAERO_FAN_POWER_OFFSET 0x08
124 #define AQUAERO_FAN_SPEED_OFFSET 0x00
125 static u16 aquaero_sensor_fan_offsets[] = { 0x167, 0x173, 0x17f, 0x18B };
127 /* Control report offsets for the Aquaero fan controllers */
128 #define AQUAERO_TEMP_CTRL_OFFSET 0xdb
129 #define AQUAERO_FAN_CTRL_MIN_PWR_OFFSET 0x04
130 #define AQUAERO_FAN_CTRL_MAX_PWR_OFFSET 0x06
131 #define AQUAERO_FAN_CTRL_SRC_OFFSET 0x10
132 static u16 aquaero_ctrl_fan_offsets[] = { 0x20c, 0x220, 0x234, 0x248 };
134 /* Specs of the D5 Next pump */
135 #define D5NEXT_NUM_FANS 2
136 #define D5NEXT_NUM_SENSORS 1
137 #define D5NEXT_NUM_VIRTUAL_SENSORS 8
138 #define D5NEXT_CTRL_REPORT_SIZE 0x329
140 /* Sensor report offsets for the D5 Next pump */
141 #define D5NEXT_POWER_CYCLES 0x18
142 #define D5NEXT_COOLANT_TEMP 0x57
143 #define D5NEXT_PUMP_OFFSET 0x6c
144 #define D5NEXT_FAN_OFFSET 0x5f
145 #define D5NEXT_5V_VOLTAGE 0x39
146 #define D5NEXT_12V_VOLTAGE 0x37
147 #define D5NEXT_VIRTUAL_SENSORS_START 0x3f
148 static u16 d5next_sensor_fan_offsets[] = { D5NEXT_PUMP_OFFSET, D5NEXT_FAN_OFFSET };
150 /* Control report offsets for the D5 Next pump */
151 #define D5NEXT_TEMP_CTRL_OFFSET 0x2D /* Temperature sensor offsets location */
152 static u16 d5next_ctrl_fan_offsets[] = { 0x97, 0x42 }; /* Pump and fan speed (from 0-100%) */
154 /* Specs of the Aquastream Ultimate pump */
155 /* Pump does not follow the standard structure, so only consider the fan */
156 #define AQUASTREAMULT_NUM_FANS 1
157 #define AQUASTREAMULT_NUM_SENSORS 2
159 /* Sensor report offsets for the Aquastream Ultimate pump */
160 #define AQUASTREAMULT_SENSOR_START 0x2D
161 #define AQUASTREAMULT_PUMP_OFFSET 0x51
162 #define AQUASTREAMULT_PUMP_VOLTAGE 0x3D
163 #define AQUASTREAMULT_PUMP_CURRENT 0x53
164 #define AQUASTREAMULT_PUMP_POWER 0x55
165 #define AQUASTREAMULT_FAN_OFFSET 0x41
166 #define AQUASTREAMULT_PRESSURE_OFFSET 0x57
167 #define AQUASTREAMULT_FLOW_SENSOR_OFFSET 0x37
168 #define AQUASTREAMULT_FAN_VOLTAGE_OFFSET 0x02
169 #define AQUASTREAMULT_FAN_CURRENT_OFFSET 0x00
170 #define AQUASTREAMULT_FAN_POWER_OFFSET 0x04
171 #define AQUASTREAMULT_FAN_SPEED_OFFSET 0x06
172 static u16 aquastreamult_sensor_fan_offsets[] = { AQUASTREAMULT_FAN_OFFSET };
174 /* Spec and sensor report offset for the Farbwerk RGB controller */
175 #define FARBWERK_NUM_SENSORS 4
176 #define FARBWERK_SENSOR_START 0x2f
178 /* Specs of the Farbwerk 360 RGB controller */
179 #define FARBWERK360_NUM_SENSORS 4
180 #define FARBWERK360_NUM_VIRTUAL_SENSORS 16
181 #define FARBWERK360_CTRL_REPORT_SIZE 0x682
183 /* Sensor report offsets for the Farbwerk 360 */
184 #define FARBWERK360_SENSOR_START 0x32
185 #define FARBWERK360_VIRTUAL_SENSORS_START 0x3a
187 /* Control report offsets for the Farbwerk 360 */
188 #define FARBWERK360_TEMP_CTRL_OFFSET 0x8
190 /* Specs of the Octo fan controller */
191 #define OCTO_NUM_FANS 8
192 #define OCTO_NUM_SENSORS 4
193 #define OCTO_NUM_VIRTUAL_SENSORS 16
194 #define OCTO_CTRL_REPORT_SIZE 0x65F
196 /* Sensor report offsets for the Octo */
197 #define OCTO_POWER_CYCLES 0x18
198 #define OCTO_SENSOR_START 0x3D
199 #define OCTO_VIRTUAL_SENSORS_START 0x45
200 static u16 octo_sensor_fan_offsets[] = { 0x7D, 0x8A, 0x97, 0xA4, 0xB1, 0xBE, 0xCB, 0xD8 };
202 /* Control report offsets for the Octo */
203 #define OCTO_TEMP_CTRL_OFFSET 0xA
204 /* Fan speed offsets (0-100%) */
205 static u16 octo_ctrl_fan_offsets[] = { 0x5B, 0xB0, 0x105, 0x15A, 0x1AF, 0x204, 0x259, 0x2AE };
207 /* Specs of Quadro fan controller */
208 #define QUADRO_NUM_FANS 4
209 #define QUADRO_NUM_SENSORS 4
210 #define QUADRO_NUM_VIRTUAL_SENSORS 16
211 #define QUADRO_NUM_FLOW_SENSORS 1
212 #define QUADRO_CTRL_REPORT_SIZE 0x3c1
214 /* Sensor report offsets for the Quadro */
215 #define QUADRO_POWER_CYCLES 0x18
216 #define QUADRO_SENSOR_START 0x34
217 #define QUADRO_VIRTUAL_SENSORS_START 0x3c
218 #define QUADRO_FLOW_SENSOR_OFFSET 0x6e
219 static u16 quadro_sensor_fan_offsets[] = { 0x70, 0x7D, 0x8A, 0x97 };
221 /* Control report offsets for the Quadro */
222 #define QUADRO_TEMP_CTRL_OFFSET 0xA
223 #define QUADRO_FLOW_PULSES_CTRL_OFFSET 0x6
224 static u16 quadro_ctrl_fan_offsets[] = { 0x37, 0x8c, 0xe1, 0x136 }; /* Fan speed offsets (0-100%) */
226 /* Specs of High Flow Next flow sensor */
227 #define HIGHFLOWNEXT_NUM_SENSORS 2
228 #define HIGHFLOWNEXT_NUM_FLOW_SENSORS 1
230 /* Sensor report offsets for the High Flow Next */
231 #define HIGHFLOWNEXT_SENSOR_START 85
232 #define HIGHFLOWNEXT_FLOW 81
233 #define HIGHFLOWNEXT_WATER_QUALITY 89
234 #define HIGHFLOWNEXT_POWER 91
235 #define HIGHFLOWNEXT_CONDUCTIVITY 95
236 #define HIGHFLOWNEXT_5V_VOLTAGE 97
237 #define HIGHFLOWNEXT_5V_VOLTAGE_USB 99
239 /* Specs of the Aquastream XT pump */
240 #define AQUASTREAMXT_SERIAL_START 0x3a
241 #define AQUASTREAMXT_FIRMWARE_VERSION 0x32
242 #define AQUASTREAMXT_NUM_FANS 2
243 #define AQUASTREAMXT_NUM_SENSORS 3
244 #define AQUASTREAMXT_FAN_STOPPED 0x4
245 #define AQUASTREAMXT_PUMP_CONVERSION_CONST 45000000
246 #define AQUASTREAMXT_FAN_CONVERSION_CONST 5646000
247 #define AQUASTREAMXT_SENSOR_REPORT_SIZE 0x42
249 /* Sensor report offsets and info for Aquastream XT */
250 #define AQUASTREAMXT_SENSOR_START 0xd
251 #define AQUASTREAMXT_FAN_VOLTAGE_OFFSET 0x7
252 #define AQUASTREAMXT_FAN_STATUS_OFFSET 0x1d
253 #define AQUASTREAMXT_PUMP_VOLTAGE_OFFSET 0x9
254 #define AQUASTREAMXT_PUMP_CURR_OFFSET 0xb
255 static u16 aquastreamxt_sensor_fan_offsets[] = { 0x13, 0x1b };
257 /* Specs of the Poweradjust 3 */
258 #define POWERADJUST3_NUM_SENSORS 1
259 #define POWERADJUST3_SENSOR_REPORT_SIZE 0x32
261 /* Sensor report offsets for the Poweradjust 3 */
262 #define POWERADJUST3_SENSOR_START 0x03
264 /* Labels for D5 Next */
265 static const char *const label_d5next_temp[] = {
269 static const char *const label_d5next_speeds[] = {
274 static const char *const label_d5next_power[] = {
279 static const char *const label_d5next_voltages[] = {
286 static const char *const label_d5next_current[] = {
291 /* Labels for Aquaero, Farbwerk, Farbwerk 360 and Octo and Quadro temperature sensors */
292 static const char *const label_temp_sensors[] = {
303 static const char *const label_virtual_temp_sensors[] = {
322 static const char *const label_aquaero_calc_temp_sensors[] = {
323 "Calc. virtual sensor 1",
324 "Calc. virtual sensor 2",
325 "Calc. virtual sensor 3",
326 "Calc. virtual sensor 4"
329 /* Labels for Octo and Quadro (except speed) */
330 static const char *const label_fan_speed[] = {
341 static const char *const label_fan_power[] = {
352 static const char *const label_fan_voltage[] = {
363 static const char *const label_fan_current[] = {
374 /* Labels for Quadro fan speeds */
375 static const char *const label_quadro_speeds[] = {
383 /* Labels for Aquaero fan speeds */
384 static const char *const label_aquaero_speeds[] = {
389 "Flow sensor 1 [dL/h]",
390 "Flow sensor 2 [dL/h]"
393 /* Labels for High Flow Next */
394 static const char *const label_highflownext_temp_sensors[] = {
399 static const char *const label_highflownext_fan_speed[] = {
402 "Conductivity [nS/cm]",
405 static const char *const label_highflownext_power[] = {
409 static const char *const label_highflownext_voltage[] = {
414 /* Labels for Aquastream XT */
415 static const char *const label_aquastreamxt_temp_sensors[] = {
421 /* Labels for Aquastream Ultimate */
422 static const char *const label_aquastreamult_temp[] = {
427 static const char *const label_aquastreamult_speeds[] = {
434 static const char *const label_aquastreamult_power[] = {
439 static const char *const label_aquastreamult_voltages[] = {
444 static const char *const label_aquastreamult_current[] = {
449 /* Labels for Poweradjust 3 */
450 static const char *const label_poweradjust3_temp_sensors[] = {
454 struct aqc_fan_structure_offsets {
461 /* Fan structure offsets for Aquaero */
462 static struct aqc_fan_structure_offsets aqc_aquaero_fan_structure = {
463 .voltage = AQUAERO_FAN_VOLTAGE_OFFSET,
464 .curr = AQUAERO_FAN_CURRENT_OFFSET,
465 .power = AQUAERO_FAN_POWER_OFFSET,
466 .speed = AQUAERO_FAN_SPEED_OFFSET
469 /* Fan structure offsets for Aquastream Ultimate */
470 static struct aqc_fan_structure_offsets aqc_aquastreamult_fan_structure = {
471 .voltage = AQUASTREAMULT_FAN_VOLTAGE_OFFSET,
472 .curr = AQUASTREAMULT_FAN_CURRENT_OFFSET,
473 .power = AQUASTREAMULT_FAN_POWER_OFFSET,
474 .speed = AQUASTREAMULT_FAN_SPEED_OFFSET
477 /* Fan structure offsets for all devices except those above */
478 static struct aqc_fan_structure_offsets aqc_general_fan_structure = {
479 .voltage = AQC_FAN_VOLTAGE_OFFSET,
480 .curr = AQC_FAN_CURRENT_OFFSET,
481 .power = AQC_FAN_POWER_OFFSET,
482 .speed = AQC_FAN_SPEED_OFFSET
486 struct hid_device *hdev;
487 struct device *hwmon_dev;
488 struct dentry *debugfs;
489 struct mutex mutex; /* Used for locking access when reading and writing PWM values */
493 int status_report_id; /* Used for legacy devices, report is stored in buffer */
495 int secondary_ctrl_report_id;
496 int secondary_ctrl_report_size;
497 u8 *secondary_ctrl_report;
506 u16 *fan_sensor_offsets;
507 u16 *fan_ctrl_offsets;
508 int num_temp_sensors;
509 int temp_sensor_start_offset;
510 int num_virtual_temp_sensors;
511 int virtual_temp_sensor_start_offset;
512 int num_calc_virt_temp_sensors;
513 int calc_virt_temp_sensor_start_offset;
514 u16 temp_ctrl_offset;
515 u16 power_cycle_count_offset;
516 int num_flow_sensors;
517 u8 flow_sensors_start_offset;
518 u8 flow_pulses_ctrl_offset;
519 struct aqc_fan_structure_offsets *fan_structure;
521 /* General info, same across all devices */
522 u8 serial_number_start_offset;
523 u32 serial_number[2];
524 u8 firmware_version_offset;
525 u16 firmware_version;
527 /* How many times the device was powered on, if available */
531 s32 temp_input[20]; /* Max 4 physical and 16 virtual or 8 physical and 12 virtual */
534 u16 voltage_input[8];
535 u16 current_input[8];
538 const char *const *temp_label;
539 const char *const *virtual_temp_label;
540 const char *const *calc_virt_temp_label; /* For Aquaero */
541 const char *const *speed_label;
542 const char *const *power_label;
543 const char *const *voltage_label;
544 const char *const *current_label;
546 unsigned long updated;
549 /* Converts from centi-percent */
550 static int aqc_percent_to_pwm(u16 val)
552 return DIV_ROUND_CLOSEST(val * 255, 100 * 100);
555 /* Converts to centi-percent */
556 static int aqc_pwm_to_percent(long val)
558 if (val < 0 || val > 255)
561 return DIV_ROUND_CLOSEST(val * 100 * 100, 255);
564 /* Converts raw value for Aquastream XT pump speed to RPM */
565 static int aqc_aquastreamxt_convert_pump_rpm(u16 val)
568 return DIV_ROUND_CLOSEST(AQUASTREAMXT_PUMP_CONVERSION_CONST, val);
572 /* Converts raw value for Aquastream XT fan speed to RPM */
573 static int aqc_aquastreamxt_convert_fan_rpm(u16 val)
576 return DIV_ROUND_CLOSEST(AQUASTREAMXT_FAN_CONVERSION_CONST, val);
580 /* Expects the mutex to be locked */
581 static int aqc_get_ctrl_data(struct aqc_data *priv)
585 memset(priv->buffer, 0x00, priv->buffer_size);
586 ret = hid_hw_raw_request(priv->hdev, priv->ctrl_report_id, priv->buffer, priv->buffer_size,
587 HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
594 /* Expects the mutex to be locked */
595 static int aqc_send_ctrl_data(struct aqc_data *priv)
600 /* Checksum is not needed for Aquaero */
601 if (priv->kind != aquaero) {
602 /* Init and xorout value for CRC-16/USB is 0xffff */
603 checksum = crc16(0xffff, priv->buffer + priv->checksum_start,
604 priv->checksum_length);
607 /* Place the new checksum at the end of the report */
608 put_unaligned_be16(checksum, priv->buffer + priv->checksum_offset);
611 /* Send the patched up report back to the device */
612 ret = hid_hw_raw_request(priv->hdev, priv->ctrl_report_id, priv->buffer, priv->buffer_size,
613 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
617 /* The official software sends this report after every change, so do it here as well */
618 ret = hid_hw_raw_request(priv->hdev, priv->secondary_ctrl_report_id,
619 priv->secondary_ctrl_report, priv->secondary_ctrl_report_size,
620 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
624 /* Refreshes the control buffer and stores value at offset in val */
625 static int aqc_get_ctrl_val(struct aqc_data *priv, int offset, long *val, int type)
629 mutex_lock(&priv->mutex);
631 ret = aqc_get_ctrl_data(priv);
633 goto unlock_and_return;
637 *val = (s16)get_unaligned_be16(priv->buffer + offset);
640 *val = priv->buffer[offset];
647 mutex_unlock(&priv->mutex);
651 static int aqc_set_ctrl_vals(struct aqc_data *priv, int *offsets, long *vals, int *types, int len)
655 mutex_lock(&priv->mutex);
657 ret = aqc_get_ctrl_data(priv);
659 goto unlock_and_return;
661 for (i = 0; i < len; i++) {
664 put_unaligned_be16((s16)vals[i], priv->buffer + offsets[i]);
667 priv->buffer[offsets[i]] = (u8)vals[i];
675 goto unlock_and_return;
677 ret = aqc_send_ctrl_data(priv);
680 mutex_unlock(&priv->mutex);
684 static int aqc_set_ctrl_val(struct aqc_data *priv, int offset, long val, int type)
686 return aqc_set_ctrl_vals(priv, &offset, &val, &type, 1);
689 static umode_t aqc_is_visible(const void *data, enum hwmon_sensor_types type, u32 attr, int channel)
691 const struct aqc_data *priv = data;
695 if (channel < priv->num_temp_sensors) {
697 case hwmon_temp_label:
698 case hwmon_temp_input:
700 case hwmon_temp_offset:
701 if (priv->temp_ctrl_offset != 0)
710 priv->num_temp_sensors + priv->num_virtual_temp_sensors +
711 priv->num_calc_virt_temp_sensors)
713 case hwmon_temp_label:
714 case hwmon_temp_input:
721 if (priv->fan_ctrl_offsets && channel < priv->num_fans) {
723 case hwmon_pwm_input:
732 case hwmon_fan_input:
733 case hwmon_fan_label:
734 switch (priv->kind) {
737 * Special case to support pump RPM, fan RPM,
738 * pressure and flow sensor
744 /* Special case to support flow sensor, water quality
752 /* Special case to support flow sensors */
753 if (channel < priv->num_fans + priv->num_flow_sensors)
757 if (channel < priv->num_fans)
762 case hwmon_fan_pulses:
763 /* Special case for Quadro flow sensor */
764 if (priv->kind == quadro && channel == priv->num_fans)
772 switch (priv->kind) {
774 /* Special case to support pump and fan power */
779 /* Special case to support one power sensor */
786 if (channel < priv->num_fans)
792 switch (priv->kind) {
794 /* Special case to support pump and fan current */
799 /* Special case to support pump current */
804 if (channel < priv->num_fans)
810 switch (priv->kind) {
812 /* Special case to support +5V and +12V voltage sensors */
813 if (channel < priv->num_fans + 2)
818 /* Special case to support two voltage sensors */
823 if (channel < priv->num_fans)
835 /* Read device sensors by manually requesting the sensor report (legacy way) */
836 static int aqc_legacy_read(struct aqc_data *priv)
838 int ret, i, sensor_value;
840 mutex_lock(&priv->mutex);
842 memset(priv->buffer, 0x00, priv->buffer_size);
843 ret = hid_hw_raw_request(priv->hdev, priv->status_report_id, priv->buffer,
844 priv->buffer_size, HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
846 goto unlock_and_return;
848 /* Temperature sensor readings */
849 for (i = 0; i < priv->num_temp_sensors; i++) {
850 sensor_value = get_unaligned_le16(priv->buffer + priv->temp_sensor_start_offset +
851 i * AQC_SENSOR_SIZE);
852 priv->temp_input[i] = sensor_value * 10;
855 /* Special-case sensor readings */
856 switch (priv->kind) {
858 /* Info provided with every report */
859 priv->serial_number[0] = get_unaligned_le16(priv->buffer +
860 priv->serial_number_start_offset);
861 priv->firmware_version =
862 get_unaligned_le16(priv->buffer + priv->firmware_version_offset);
864 /* Read pump speed in RPM */
865 sensor_value = get_unaligned_le16(priv->buffer + priv->fan_sensor_offsets[0]);
866 priv->speed_input[0] = aqc_aquastreamxt_convert_pump_rpm(sensor_value);
868 /* Read fan speed in RPM, if available */
869 sensor_value = get_unaligned_le16(priv->buffer + AQUASTREAMXT_FAN_STATUS_OFFSET);
870 if (sensor_value == AQUASTREAMXT_FAN_STOPPED) {
871 priv->speed_input[1] = 0;
874 get_unaligned_le16(priv->buffer + priv->fan_sensor_offsets[1]);
875 priv->speed_input[1] = aqc_aquastreamxt_convert_fan_rpm(sensor_value);
878 /* Calculation derived from linear regression */
879 sensor_value = get_unaligned_le16(priv->buffer + AQUASTREAMXT_PUMP_CURR_OFFSET);
880 priv->current_input[0] = DIV_ROUND_CLOSEST(sensor_value * 176, 100) - 52;
882 sensor_value = get_unaligned_le16(priv->buffer + AQUASTREAMXT_PUMP_VOLTAGE_OFFSET);
883 priv->voltage_input[0] = DIV_ROUND_CLOSEST(sensor_value * 1000, 61);
885 sensor_value = get_unaligned_le16(priv->buffer + AQUASTREAMXT_FAN_VOLTAGE_OFFSET);
886 priv->voltage_input[1] = DIV_ROUND_CLOSEST(sensor_value * 1000, 63);
892 priv->updated = jiffies;
895 mutex_unlock(&priv->mutex);
899 static int aqc_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
900 int channel, long *val)
903 struct aqc_data *priv = dev_get_drvdata(dev);
905 if (time_after(jiffies, priv->updated + STATUS_UPDATE_INTERVAL)) {
906 if (priv->status_report_id != 0) {
907 /* Legacy devices require manual reads */
908 ret = aqc_legacy_read(priv);
919 case hwmon_temp_input:
920 if (priv->temp_input[channel] == -ENODATA)
923 *val = priv->temp_input[channel];
925 case hwmon_temp_offset:
927 aqc_get_ctrl_val(priv, priv->temp_ctrl_offset +
928 channel * AQC_SENSOR_SIZE, val, AQC_BE16);
940 case hwmon_fan_input:
941 *val = priv->speed_input[channel];
943 case hwmon_fan_pulses:
944 ret = aqc_get_ctrl_val(priv, priv->flow_pulses_ctrl_offset,
954 *val = priv->power_input[channel];
957 switch (priv->kind) {
959 ret = aqc_get_ctrl_val(priv,
960 AQUAERO_CTRL_PRESET_START + channel * AQUAERO_CTRL_PRESET_SIZE,
964 *val = aqc_percent_to_pwm(*val);
967 ret = aqc_get_ctrl_val(priv, priv->fan_ctrl_offsets[channel],
972 *val = aqc_percent_to_pwm(ret);
977 *val = priv->voltage_input[channel];
980 *val = priv->current_input[channel];
989 static int aqc_read_string(struct device *dev, enum hwmon_sensor_types type, u32 attr,
990 int channel, const char **str)
992 struct aqc_data *priv = dev_get_drvdata(dev);
994 /* Number of sensors that are not calculated */
995 int num_non_calc_sensors = priv->num_temp_sensors + priv->num_virtual_temp_sensors;
999 if (channel < priv->num_temp_sensors) {
1000 *str = priv->temp_label[channel];
1002 if (priv->kind == aquaero && channel >= num_non_calc_sensors)
1004 priv->calc_virt_temp_label[channel - num_non_calc_sensors];
1006 *str = priv->virtual_temp_label[channel - priv->num_temp_sensors];
1010 *str = priv->speed_label[channel];
1013 *str = priv->power_label[channel];
1016 *str = priv->voltage_label[channel];
1019 *str = priv->current_label[channel];
1028 static int aqc_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel,
1032 /* Arrays for setting multiple values at once in the control report */
1033 int ctrl_values_offsets[4];
1034 long ctrl_values[4];
1035 int ctrl_values_types[4];
1036 struct aqc_data *priv = dev_get_drvdata(dev);
1041 case hwmon_temp_offset:
1042 /* Limit temp offset to +/- 15K as in the official software */
1043 val = clamp_val(val, -15000, 15000) / 10;
1045 aqc_set_ctrl_val(priv, priv->temp_ctrl_offset +
1046 channel * AQC_SENSOR_SIZE, val, AQC_BE16);
1056 case hwmon_fan_pulses:
1057 val = clamp_val(val, 10, 1000);
1058 ret = aqc_set_ctrl_val(priv, priv->flow_pulses_ctrl_offset,
1069 case hwmon_pwm_input:
1070 pwm_value = aqc_pwm_to_percent(val);
1074 switch (priv->kind) {
1076 /* Write pwm value to preset corresponding to the channel */
1077 ctrl_values_offsets[0] = AQUAERO_CTRL_PRESET_START +
1078 channel * AQUAERO_CTRL_PRESET_SIZE;
1079 ctrl_values[0] = pwm_value;
1080 ctrl_values_types[0] = AQC_BE16;
1082 /* Write preset number in fan control source */
1083 ctrl_values_offsets[1] = priv->fan_ctrl_offsets[channel] +
1084 AQUAERO_FAN_CTRL_SRC_OFFSET;
1085 ctrl_values[1] = AQUAERO_CTRL_PRESET_ID + channel;
1086 ctrl_values_types[1] = AQC_BE16;
1088 /* Set minimum power to 0 to allow the fan to turn off */
1089 ctrl_values_offsets[2] = priv->fan_ctrl_offsets[channel] +
1090 AQUAERO_FAN_CTRL_MIN_PWR_OFFSET;
1092 ctrl_values_types[2] = AQC_BE16;
1094 /* Set maximum power to 255 to allow the fan to reach max speed */
1095 ctrl_values_offsets[3] = priv->fan_ctrl_offsets[channel] +
1096 AQUAERO_FAN_CTRL_MAX_PWR_OFFSET;
1097 ctrl_values[3] = aqc_pwm_to_percent(255);
1098 ctrl_values_types[3] = AQC_BE16;
1100 ret = aqc_set_ctrl_vals(priv, ctrl_values_offsets, ctrl_values,
1101 ctrl_values_types, 4);
1106 ret = aqc_set_ctrl_val(priv, priv->fan_ctrl_offsets[channel],
1107 pwm_value, AQC_BE16);
1124 static const struct hwmon_ops aqc_hwmon_ops = {
1125 .is_visible = aqc_is_visible,
1127 .read_string = aqc_read_string,
1131 static const struct hwmon_channel_info * const aqc_info[] = {
1132 HWMON_CHANNEL_INFO(temp,
1133 HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1134 HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1135 HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1136 HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1137 HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1138 HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1139 HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1140 HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1141 HWMON_T_INPUT | HWMON_T_LABEL,
1142 HWMON_T_INPUT | HWMON_T_LABEL,
1143 HWMON_T_INPUT | HWMON_T_LABEL,
1144 HWMON_T_INPUT | HWMON_T_LABEL,
1145 HWMON_T_INPUT | HWMON_T_LABEL,
1146 HWMON_T_INPUT | HWMON_T_LABEL,
1147 HWMON_T_INPUT | HWMON_T_LABEL,
1148 HWMON_T_INPUT | HWMON_T_LABEL,
1149 HWMON_T_INPUT | HWMON_T_LABEL,
1150 HWMON_T_INPUT | HWMON_T_LABEL,
1151 HWMON_T_INPUT | HWMON_T_LABEL,
1152 HWMON_T_INPUT | HWMON_T_LABEL),
1153 HWMON_CHANNEL_INFO(fan,
1154 HWMON_F_INPUT | HWMON_F_LABEL,
1155 HWMON_F_INPUT | HWMON_F_LABEL,
1156 HWMON_F_INPUT | HWMON_F_LABEL,
1157 HWMON_F_INPUT | HWMON_F_LABEL,
1158 HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_PULSES,
1159 HWMON_F_INPUT | HWMON_F_LABEL,
1160 HWMON_F_INPUT | HWMON_F_LABEL,
1161 HWMON_F_INPUT | HWMON_F_LABEL),
1162 HWMON_CHANNEL_INFO(power,
1163 HWMON_P_INPUT | HWMON_P_LABEL,
1164 HWMON_P_INPUT | HWMON_P_LABEL,
1165 HWMON_P_INPUT | HWMON_P_LABEL,
1166 HWMON_P_INPUT | HWMON_P_LABEL,
1167 HWMON_P_INPUT | HWMON_P_LABEL,
1168 HWMON_P_INPUT | HWMON_P_LABEL,
1169 HWMON_P_INPUT | HWMON_P_LABEL,
1170 HWMON_P_INPUT | HWMON_P_LABEL),
1171 HWMON_CHANNEL_INFO(pwm,
1180 HWMON_CHANNEL_INFO(in,
1181 HWMON_I_INPUT | HWMON_I_LABEL,
1182 HWMON_I_INPUT | HWMON_I_LABEL,
1183 HWMON_I_INPUT | HWMON_I_LABEL,
1184 HWMON_I_INPUT | HWMON_I_LABEL,
1185 HWMON_I_INPUT | HWMON_I_LABEL,
1186 HWMON_I_INPUT | HWMON_I_LABEL,
1187 HWMON_I_INPUT | HWMON_I_LABEL,
1188 HWMON_I_INPUT | HWMON_I_LABEL),
1189 HWMON_CHANNEL_INFO(curr,
1190 HWMON_C_INPUT | HWMON_C_LABEL,
1191 HWMON_C_INPUT | HWMON_C_LABEL,
1192 HWMON_C_INPUT | HWMON_C_LABEL,
1193 HWMON_C_INPUT | HWMON_C_LABEL,
1194 HWMON_C_INPUT | HWMON_C_LABEL,
1195 HWMON_C_INPUT | HWMON_C_LABEL,
1196 HWMON_C_INPUT | HWMON_C_LABEL,
1197 HWMON_C_INPUT | HWMON_C_LABEL),
1201 static const struct hwmon_chip_info aqc_chip_info = {
1202 .ops = &aqc_hwmon_ops,
1206 static int aqc_raw_event(struct hid_device *hdev, struct hid_report *report, u8 *data, int size)
1208 int i, j, sensor_value;
1209 struct aqc_data *priv;
1211 if (report->id != STATUS_REPORT_ID)
1214 priv = hid_get_drvdata(hdev);
1216 /* Info provided with every report */
1217 priv->serial_number[0] = get_unaligned_be16(data + priv->serial_number_start_offset);
1218 priv->serial_number[1] = get_unaligned_be16(data + priv->serial_number_start_offset +
1219 SERIAL_PART_OFFSET);
1220 priv->firmware_version = get_unaligned_be16(data + priv->firmware_version_offset);
1222 /* Physical temperature sensor readings */
1223 for (i = 0; i < priv->num_temp_sensors; i++) {
1224 sensor_value = get_unaligned_be16(data +
1225 priv->temp_sensor_start_offset +
1226 i * AQC_SENSOR_SIZE);
1227 if (sensor_value == AQC_TEMP_SENSOR_DISCONNECTED)
1228 priv->temp_input[i] = -ENODATA;
1230 priv->temp_input[i] = sensor_value * 10;
1233 /* Virtual temperature sensor readings */
1234 for (j = 0; j < priv->num_virtual_temp_sensors; j++) {
1235 sensor_value = get_unaligned_be16(data +
1236 priv->virtual_temp_sensor_start_offset +
1237 j * AQC_SENSOR_SIZE);
1238 if (sensor_value == AQC_TEMP_SENSOR_DISCONNECTED)
1239 priv->temp_input[i] = -ENODATA;
1241 priv->temp_input[i] = sensor_value * 10;
1245 /* Fan speed and related readings */
1246 for (i = 0; i < priv->num_fans; i++) {
1247 priv->speed_input[i] =
1248 get_unaligned_be16(data + priv->fan_sensor_offsets[i] +
1249 priv->fan_structure->speed);
1250 priv->power_input[i] =
1251 get_unaligned_be16(data + priv->fan_sensor_offsets[i] +
1252 priv->fan_structure->power) * 10000;
1253 priv->voltage_input[i] =
1254 get_unaligned_be16(data + priv->fan_sensor_offsets[i] +
1255 priv->fan_structure->voltage) * 10;
1256 priv->current_input[i] =
1257 get_unaligned_be16(data + priv->fan_sensor_offsets[i] +
1258 priv->fan_structure->curr);
1261 /* Flow sensor readings */
1262 for (j = 0; j < priv->num_flow_sensors; j++) {
1263 priv->speed_input[i] = get_unaligned_be16(data + priv->flow_sensors_start_offset +
1264 j * AQC_SENSOR_SIZE);
1268 if (priv->power_cycle_count_offset != 0)
1269 priv->power_cycles = get_unaligned_be32(data + priv->power_cycle_count_offset);
1271 /* Special-case sensor readings */
1272 switch (priv->kind) {
1274 /* Read calculated virtual temp sensors */
1275 i = priv->num_temp_sensors + priv->num_virtual_temp_sensors;
1276 for (j = 0; j < priv->num_calc_virt_temp_sensors; j++) {
1277 sensor_value = get_unaligned_be16(data +
1278 priv->calc_virt_temp_sensor_start_offset +
1279 j * AQC_SENSOR_SIZE);
1280 if (sensor_value == AQC_TEMP_SENSOR_DISCONNECTED)
1281 priv->temp_input[i] = -ENODATA;
1283 priv->temp_input[i] = sensor_value * 10;
1288 priv->speed_input[1] = get_unaligned_be16(data + AQUASTREAMULT_PUMP_OFFSET);
1289 priv->speed_input[2] = get_unaligned_be16(data + AQUASTREAMULT_PRESSURE_OFFSET);
1290 priv->speed_input[3] = get_unaligned_be16(data + AQUASTREAMULT_FLOW_SENSOR_OFFSET);
1292 priv->power_input[1] = get_unaligned_be16(data + AQUASTREAMULT_PUMP_POWER) * 10000;
1294 priv->voltage_input[1] = get_unaligned_be16(data + AQUASTREAMULT_PUMP_VOLTAGE) * 10;
1296 priv->current_input[1] = get_unaligned_be16(data + AQUASTREAMULT_PUMP_CURRENT);
1299 priv->voltage_input[2] = get_unaligned_be16(data + D5NEXT_5V_VOLTAGE) * 10;
1300 priv->voltage_input[3] = get_unaligned_be16(data + D5NEXT_12V_VOLTAGE) * 10;
1303 /* If external temp sensor is not connected, its power reading is also N/A */
1304 if (priv->temp_input[1] == -ENODATA)
1305 priv->power_input[0] = -ENODATA;
1307 priv->power_input[0] =
1308 get_unaligned_be16(data + HIGHFLOWNEXT_POWER) * 1000000;
1310 priv->voltage_input[0] = get_unaligned_be16(data + HIGHFLOWNEXT_5V_VOLTAGE) * 10;
1311 priv->voltage_input[1] =
1312 get_unaligned_be16(data + HIGHFLOWNEXT_5V_VOLTAGE_USB) * 10;
1314 priv->speed_input[1] = get_unaligned_be16(data + HIGHFLOWNEXT_WATER_QUALITY);
1315 priv->speed_input[2] = get_unaligned_be16(data + HIGHFLOWNEXT_CONDUCTIVITY);
1321 priv->updated = jiffies;
1326 #ifdef CONFIG_DEBUG_FS
1328 static int serial_number_show(struct seq_file *seqf, void *unused)
1330 struct aqc_data *priv = seqf->private;
1332 seq_printf(seqf, "%05u-%05u\n", priv->serial_number[0], priv->serial_number[1]);
1336 DEFINE_SHOW_ATTRIBUTE(serial_number);
1338 static int firmware_version_show(struct seq_file *seqf, void *unused)
1340 struct aqc_data *priv = seqf->private;
1342 seq_printf(seqf, "%u\n", priv->firmware_version);
1346 DEFINE_SHOW_ATTRIBUTE(firmware_version);
1348 static int power_cycles_show(struct seq_file *seqf, void *unused)
1350 struct aqc_data *priv = seqf->private;
1352 seq_printf(seqf, "%u\n", priv->power_cycles);
1356 DEFINE_SHOW_ATTRIBUTE(power_cycles);
1358 static void aqc_debugfs_init(struct aqc_data *priv)
1362 scnprintf(name, sizeof(name), "%s_%s-%s", "aquacomputer", priv->name,
1363 dev_name(&priv->hdev->dev));
1365 priv->debugfs = debugfs_create_dir(name, NULL);
1367 if (priv->serial_number_start_offset != 0)
1368 debugfs_create_file("serial_number", 0444, priv->debugfs, priv,
1369 &serial_number_fops);
1370 if (priv->firmware_version_offset != 0)
1371 debugfs_create_file("firmware_version", 0444, priv->debugfs, priv,
1372 &firmware_version_fops);
1373 if (priv->power_cycle_count_offset != 0)
1374 debugfs_create_file("power_cycles", 0444, priv->debugfs, priv, &power_cycles_fops);
1379 static void aqc_debugfs_init(struct aqc_data *priv)
1385 static int aqc_probe(struct hid_device *hdev, const struct hid_device_id *id)
1387 struct aqc_data *priv;
1390 priv = devm_kzalloc(&hdev->dev, sizeof(*priv), GFP_KERNEL);
1395 hid_set_drvdata(hdev, priv);
1397 priv->updated = jiffies - STATUS_UPDATE_INTERVAL;
1399 ret = hid_parse(hdev);
1403 ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW);
1407 ret = hid_hw_open(hdev);
1411 switch (hdev->product) {
1412 case USB_PRODUCT_ID_AQUAERO:
1414 * Aquaero presents itself as three HID devices under the same product ID:
1415 * "aquaero keyboard/mouse", "aquaero System Control" and "aquaero Device",
1416 * which is the one we want to communicate with. Unlike most other Aquacomputer
1417 * devices, Aquaero does not return meaningful data when explicitly requested
1418 * using GET_FEATURE_REPORT.
1420 * The difference between "aquaero Device" and the other two is in the collections
1421 * they present. The two other devices have the type of the second element in
1422 * their respective collections set to 1, while the real device has it set to 0.
1424 if (hdev->collection[1].type != 0) {
1426 goto fail_and_close;
1429 priv->kind = aquaero;
1431 priv->num_fans = AQUAERO_NUM_FANS;
1432 priv->fan_sensor_offsets = aquaero_sensor_fan_offsets;
1433 priv->fan_ctrl_offsets = aquaero_ctrl_fan_offsets;
1435 priv->num_temp_sensors = AQUAERO_NUM_SENSORS;
1436 priv->temp_sensor_start_offset = AQUAERO_SENSOR_START;
1437 priv->num_virtual_temp_sensors = AQUAERO_NUM_VIRTUAL_SENSORS;
1438 priv->virtual_temp_sensor_start_offset = AQUAERO_VIRTUAL_SENSOR_START;
1439 priv->num_calc_virt_temp_sensors = AQUAERO_NUM_CALC_VIRTUAL_SENSORS;
1440 priv->calc_virt_temp_sensor_start_offset = AQUAERO_CALC_VIRTUAL_SENSOR_START;
1441 priv->num_flow_sensors = AQUAERO_NUM_FLOW_SENSORS;
1442 priv->flow_sensors_start_offset = AQUAERO_FLOW_SENSORS_START;
1444 priv->buffer_size = AQUAERO_CTRL_REPORT_SIZE;
1445 priv->temp_ctrl_offset = AQUAERO_TEMP_CTRL_OFFSET;
1447 priv->temp_label = label_temp_sensors;
1448 priv->virtual_temp_label = label_virtual_temp_sensors;
1449 priv->calc_virt_temp_label = label_aquaero_calc_temp_sensors;
1450 priv->speed_label = label_aquaero_speeds;
1451 priv->power_label = label_fan_power;
1452 priv->voltage_label = label_fan_voltage;
1453 priv->current_label = label_fan_current;
1455 case USB_PRODUCT_ID_D5NEXT:
1456 priv->kind = d5next;
1458 priv->num_fans = D5NEXT_NUM_FANS;
1459 priv->fan_sensor_offsets = d5next_sensor_fan_offsets;
1460 priv->fan_ctrl_offsets = d5next_ctrl_fan_offsets;
1462 priv->num_temp_sensors = D5NEXT_NUM_SENSORS;
1463 priv->temp_sensor_start_offset = D5NEXT_COOLANT_TEMP;
1464 priv->num_virtual_temp_sensors = D5NEXT_NUM_VIRTUAL_SENSORS;
1465 priv->virtual_temp_sensor_start_offset = D5NEXT_VIRTUAL_SENSORS_START;
1466 priv->temp_ctrl_offset = D5NEXT_TEMP_CTRL_OFFSET;
1468 priv->buffer_size = D5NEXT_CTRL_REPORT_SIZE;
1470 priv->power_cycle_count_offset = D5NEXT_POWER_CYCLES;
1472 priv->temp_label = label_d5next_temp;
1473 priv->virtual_temp_label = label_virtual_temp_sensors;
1474 priv->speed_label = label_d5next_speeds;
1475 priv->power_label = label_d5next_power;
1476 priv->voltage_label = label_d5next_voltages;
1477 priv->current_label = label_d5next_current;
1479 case USB_PRODUCT_ID_FARBWERK:
1480 priv->kind = farbwerk;
1484 priv->num_temp_sensors = FARBWERK_NUM_SENSORS;
1485 priv->temp_sensor_start_offset = FARBWERK_SENSOR_START;
1487 priv->temp_label = label_temp_sensors;
1489 case USB_PRODUCT_ID_FARBWERK360:
1490 priv->kind = farbwerk360;
1494 priv->num_temp_sensors = FARBWERK360_NUM_SENSORS;
1495 priv->temp_sensor_start_offset = FARBWERK360_SENSOR_START;
1496 priv->num_virtual_temp_sensors = FARBWERK360_NUM_VIRTUAL_SENSORS;
1497 priv->virtual_temp_sensor_start_offset = FARBWERK360_VIRTUAL_SENSORS_START;
1498 priv->temp_ctrl_offset = FARBWERK360_TEMP_CTRL_OFFSET;
1500 priv->buffer_size = FARBWERK360_CTRL_REPORT_SIZE;
1502 priv->temp_label = label_temp_sensors;
1503 priv->virtual_temp_label = label_virtual_temp_sensors;
1505 case USB_PRODUCT_ID_OCTO:
1508 priv->num_fans = OCTO_NUM_FANS;
1509 priv->fan_sensor_offsets = octo_sensor_fan_offsets;
1510 priv->fan_ctrl_offsets = octo_ctrl_fan_offsets;
1512 priv->num_temp_sensors = OCTO_NUM_SENSORS;
1513 priv->temp_sensor_start_offset = OCTO_SENSOR_START;
1514 priv->num_virtual_temp_sensors = OCTO_NUM_VIRTUAL_SENSORS;
1515 priv->virtual_temp_sensor_start_offset = OCTO_VIRTUAL_SENSORS_START;
1516 priv->temp_ctrl_offset = OCTO_TEMP_CTRL_OFFSET;
1518 priv->buffer_size = OCTO_CTRL_REPORT_SIZE;
1520 priv->power_cycle_count_offset = OCTO_POWER_CYCLES;
1522 priv->temp_label = label_temp_sensors;
1523 priv->virtual_temp_label = label_virtual_temp_sensors;
1524 priv->speed_label = label_fan_speed;
1525 priv->power_label = label_fan_power;
1526 priv->voltage_label = label_fan_voltage;
1527 priv->current_label = label_fan_current;
1529 case USB_PRODUCT_ID_QUADRO:
1530 priv->kind = quadro;
1532 priv->num_fans = QUADRO_NUM_FANS;
1533 priv->fan_sensor_offsets = quadro_sensor_fan_offsets;
1534 priv->fan_ctrl_offsets = quadro_ctrl_fan_offsets;
1536 priv->num_temp_sensors = QUADRO_NUM_SENSORS;
1537 priv->temp_sensor_start_offset = QUADRO_SENSOR_START;
1538 priv->num_virtual_temp_sensors = QUADRO_NUM_VIRTUAL_SENSORS;
1539 priv->virtual_temp_sensor_start_offset = QUADRO_VIRTUAL_SENSORS_START;
1540 priv->num_flow_sensors = QUADRO_NUM_FLOW_SENSORS;
1541 priv->flow_sensors_start_offset = QUADRO_FLOW_SENSOR_OFFSET;
1543 priv->temp_ctrl_offset = QUADRO_TEMP_CTRL_OFFSET;
1545 priv->buffer_size = QUADRO_CTRL_REPORT_SIZE;
1547 priv->flow_pulses_ctrl_offset = QUADRO_FLOW_PULSES_CTRL_OFFSET;
1548 priv->power_cycle_count_offset = QUADRO_POWER_CYCLES;
1550 priv->temp_label = label_temp_sensors;
1551 priv->virtual_temp_label = label_virtual_temp_sensors;
1552 priv->speed_label = label_quadro_speeds;
1553 priv->power_label = label_fan_power;
1554 priv->voltage_label = label_fan_voltage;
1555 priv->current_label = label_fan_current;
1557 case USB_PRODUCT_ID_HIGHFLOWNEXT:
1558 priv->kind = highflownext;
1562 priv->num_temp_sensors = HIGHFLOWNEXT_NUM_SENSORS;
1563 priv->temp_sensor_start_offset = HIGHFLOWNEXT_SENSOR_START;
1564 priv->num_flow_sensors = HIGHFLOWNEXT_NUM_FLOW_SENSORS;
1565 priv->flow_sensors_start_offset = HIGHFLOWNEXT_FLOW;
1567 priv->power_cycle_count_offset = QUADRO_POWER_CYCLES;
1569 priv->temp_label = label_highflownext_temp_sensors;
1570 priv->speed_label = label_highflownext_fan_speed;
1571 priv->power_label = label_highflownext_power;
1572 priv->voltage_label = label_highflownext_voltage;
1574 case USB_PRODUCT_ID_AQUASTREAMXT:
1575 priv->kind = aquastreamxt;
1577 priv->num_fans = AQUASTREAMXT_NUM_FANS;
1578 priv->fan_sensor_offsets = aquastreamxt_sensor_fan_offsets;
1580 priv->num_temp_sensors = AQUASTREAMXT_NUM_SENSORS;
1581 priv->temp_sensor_start_offset = AQUASTREAMXT_SENSOR_START;
1582 priv->buffer_size = AQUASTREAMXT_SENSOR_REPORT_SIZE;
1584 priv->temp_label = label_aquastreamxt_temp_sensors;
1585 priv->speed_label = label_d5next_speeds;
1586 priv->voltage_label = label_d5next_voltages;
1587 priv->current_label = label_d5next_current;
1589 case USB_PRODUCT_ID_AQUASTREAMULT:
1590 priv->kind = aquastreamult;
1592 priv->num_fans = AQUASTREAMULT_NUM_FANS;
1593 priv->fan_sensor_offsets = aquastreamult_sensor_fan_offsets;
1595 priv->num_temp_sensors = AQUASTREAMULT_NUM_SENSORS;
1596 priv->temp_sensor_start_offset = AQUASTREAMULT_SENSOR_START;
1598 priv->temp_label = label_aquastreamult_temp;
1599 priv->speed_label = label_aquastreamult_speeds;
1600 priv->power_label = label_aquastreamult_power;
1601 priv->voltage_label = label_aquastreamult_voltages;
1602 priv->current_label = label_aquastreamult_current;
1604 case USB_PRODUCT_ID_POWERADJUST3:
1605 priv->kind = poweradjust3;
1609 priv->num_temp_sensors = POWERADJUST3_NUM_SENSORS;
1610 priv->temp_sensor_start_offset = POWERADJUST3_SENSOR_START;
1611 priv->buffer_size = POWERADJUST3_SENSOR_REPORT_SIZE;
1613 priv->temp_label = label_poweradjust3_temp_sensors;
1619 switch (priv->kind) {
1621 priv->serial_number_start_offset = AQUAERO_SERIAL_START;
1622 priv->firmware_version_offset = AQUAERO_FIRMWARE_VERSION;
1624 priv->fan_structure = &aqc_aquaero_fan_structure;
1626 priv->ctrl_report_id = AQUAERO_CTRL_REPORT_ID;
1627 priv->secondary_ctrl_report_id = AQUAERO_SECONDARY_CTRL_REPORT_ID;
1628 priv->secondary_ctrl_report_size = AQUAERO_SECONDARY_CTRL_REPORT_SIZE;
1629 priv->secondary_ctrl_report = aquaero_secondary_ctrl_report;
1632 priv->status_report_id = POWERADJUST3_STATUS_REPORT_ID;
1635 priv->serial_number_start_offset = AQUASTREAMXT_SERIAL_START;
1636 priv->firmware_version_offset = AQUASTREAMXT_FIRMWARE_VERSION;
1638 priv->status_report_id = AQUASTREAMXT_STATUS_REPORT_ID;
1641 priv->serial_number_start_offset = AQC_SERIAL_START;
1642 priv->firmware_version_offset = AQC_FIRMWARE_VERSION;
1644 priv->ctrl_report_id = CTRL_REPORT_ID;
1645 priv->secondary_ctrl_report_id = SECONDARY_CTRL_REPORT_ID;
1646 priv->secondary_ctrl_report_size = SECONDARY_CTRL_REPORT_SIZE;
1647 priv->secondary_ctrl_report = secondary_ctrl_report;
1649 if (priv->kind == aquastreamult)
1650 priv->fan_structure = &aqc_aquastreamult_fan_structure;
1652 priv->fan_structure = &aqc_general_fan_structure;
1656 if (priv->buffer_size != 0) {
1657 priv->checksum_start = 0x01;
1658 priv->checksum_length = priv->buffer_size - 3;
1659 priv->checksum_offset = priv->buffer_size - 2;
1662 priv->name = aqc_device_names[priv->kind];
1664 priv->buffer = devm_kzalloc(&hdev->dev, priv->buffer_size, GFP_KERNEL);
1665 if (!priv->buffer) {
1667 goto fail_and_close;
1670 mutex_init(&priv->mutex);
1672 priv->hwmon_dev = hwmon_device_register_with_info(&hdev->dev, priv->name, priv,
1673 &aqc_chip_info, NULL);
1675 if (IS_ERR(priv->hwmon_dev)) {
1676 ret = PTR_ERR(priv->hwmon_dev);
1677 goto fail_and_close;
1680 aqc_debugfs_init(priv);
1691 static void aqc_remove(struct hid_device *hdev)
1693 struct aqc_data *priv = hid_get_drvdata(hdev);
1695 debugfs_remove_recursive(priv->debugfs);
1696 hwmon_device_unregister(priv->hwmon_dev);
1702 static const struct hid_device_id aqc_table[] = {
1703 { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_AQUAERO) },
1704 { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_D5NEXT) },
1705 { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_FARBWERK) },
1706 { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_FARBWERK360) },
1707 { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_OCTO) },
1708 { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_QUADRO) },
1709 { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_HIGHFLOWNEXT) },
1710 { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_AQUASTREAMXT) },
1711 { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_AQUASTREAMULT) },
1712 { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_POWERADJUST3) },
1716 MODULE_DEVICE_TABLE(hid, aqc_table);
1718 static struct hid_driver aqc_driver = {
1719 .name = DRIVER_NAME,
1720 .id_table = aqc_table,
1722 .remove = aqc_remove,
1723 .raw_event = aqc_raw_event,
1726 static int __init aqc_init(void)
1728 return hid_register_driver(&aqc_driver);
1731 static void __exit aqc_exit(void)
1733 hid_unregister_driver(&aqc_driver);
1736 /* Request to initialize after the HID bus to ensure it's not being loaded before */
1737 late_initcall(aqc_init);
1738 module_exit(aqc_exit);
1740 MODULE_LICENSE("GPL");
1743 MODULE_DESCRIPTION("Hwmon driver for Aquacomputer devices");