Merge tag 'for-netdev' of https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
[linux-block.git] / drivers / hwmon / aquacomputer_d5next.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * hwmon driver for Aquacomputer devices (D5 Next, Farbwerk, Farbwerk 360, Octo,
4  * Quadro, High Flow Next, Aquaero, Aquastream Ultimate)
5  *
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).
9  *
10  * Copyright 2021 Aleksa Savic <savicaleksa83@gmail.com>
11  * Copyright 2022 Jack Doan <me@jackdoan.com>
12  */
13
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>
23
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
35
36 enum kinds {
37         d5next, farbwerk, farbwerk360, octo, quadro,
38         highflownext, aquaero, poweradjust3, aquastreamult,
39         aquastreamxt
40 };
41
42 static const char *const aqc_device_names[] = {
43         [d5next] = "d5next",
44         [farbwerk] = "farbwerk",
45         [farbwerk360] = "farbwerk360",
46         [octo] = "octo",
47         [quadro] = "quadro",
48         [highflownext] = "highflownext",
49         [aquastreamxt] = "aquastreamxt",
50         [aquaero] = "aquaero",
51         [aquastreamult] = "aquastreamultimate",
52         [poweradjust3] = "poweradjust3"
53 };
54
55 #define DRIVER_NAME                     "aquacomputer_d5next"
56
57 #define STATUS_REPORT_ID                0x01
58 #define STATUS_UPDATE_INTERVAL          (2 * HZ)        /* In seconds */
59 #define SERIAL_PART_OFFSET              2
60
61 #define CTRL_REPORT_ID                  0x03
62 #define AQUAERO_CTRL_REPORT_ID          0x0b
63
64 /* The HID report that the official software always sends
65  * after writing values, currently same for all devices
66  */
67 #define SECONDARY_CTRL_REPORT_ID        0x02
68 #define SECONDARY_CTRL_REPORT_SIZE      0x0B
69
70 static u8 secondary_ctrl_report[] = {
71         0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x34, 0xC6
72 };
73
74 /* Secondary HID report values for Aquaero */
75 #define AQUAERO_SECONDARY_CTRL_REPORT_ID        0x06
76 #define AQUAERO_SECONDARY_CTRL_REPORT_SIZE      0x07
77
78 static u8 aquaero_secondary_ctrl_report[] = {
79         0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00
80 };
81
82 /* Report IDs for legacy devices */
83 #define AQUASTREAMXT_STATUS_REPORT_ID   0x04
84
85 #define POWERADJUST3_STATUS_REPORT_ID   0x03
86
87 /* Data types for reading and writing control reports */
88 #define AQC_8           0
89 #define AQC_BE16        1
90
91 /* Info, sensor sizes and offsets for most Aquacomputer devices */
92 #define AQC_SERIAL_START                0x3
93 #define AQC_FIRMWARE_VERSION            0xD
94
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
102
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
115
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 };
126
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 };
133
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
139
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 };
149
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%) */
153
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
158
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 };
173
174 /* Spec and sensor report offset for the Farbwerk RGB controller */
175 #define FARBWERK_NUM_SENSORS            4
176 #define FARBWERK_SENSOR_START           0x2f
177
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
182
183 /* Sensor report offsets for the Farbwerk 360 */
184 #define FARBWERK360_SENSOR_START                0x32
185 #define FARBWERK360_VIRTUAL_SENSORS_START       0x3a
186
187 /* Control report offsets for the Farbwerk 360 */
188 #define FARBWERK360_TEMP_CTRL_OFFSET            0x8
189
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
195
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 };
201
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 };
206
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
213
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 };
220
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%) */
225
226 /* Specs of High Flow Next flow sensor */
227 #define HIGHFLOWNEXT_NUM_SENSORS        2
228 #define HIGHFLOWNEXT_NUM_FLOW_SENSORS   1
229
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
238
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
248
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 };
256
257 /* Specs of the Poweradjust 3 */
258 #define POWERADJUST3_NUM_SENSORS        1
259 #define POWERADJUST3_SENSOR_REPORT_SIZE 0x32
260
261 /* Sensor report offsets for the Poweradjust 3 */
262 #define POWERADJUST3_SENSOR_START       0x03
263
264 /* Labels for D5 Next */
265 static const char *const label_d5next_temp[] = {
266         "Coolant temp"
267 };
268
269 static const char *const label_d5next_speeds[] = {
270         "Pump speed",
271         "Fan speed"
272 };
273
274 static const char *const label_d5next_power[] = {
275         "Pump power",
276         "Fan power"
277 };
278
279 static const char *const label_d5next_voltages[] = {
280         "Pump voltage",
281         "Fan voltage",
282         "+5V voltage",
283         "+12V voltage"
284 };
285
286 static const char *const label_d5next_current[] = {
287         "Pump current",
288         "Fan current"
289 };
290
291 /* Labels for Aquaero, Farbwerk, Farbwerk 360 and Octo and Quadro temperature sensors */
292 static const char *const label_temp_sensors[] = {
293         "Sensor 1",
294         "Sensor 2",
295         "Sensor 3",
296         "Sensor 4",
297         "Sensor 5",
298         "Sensor 6",
299         "Sensor 7",
300         "Sensor 8"
301 };
302
303 static const char *const label_virtual_temp_sensors[] = {
304         "Virtual sensor 1",
305         "Virtual sensor 2",
306         "Virtual sensor 3",
307         "Virtual sensor 4",
308         "Virtual sensor 5",
309         "Virtual sensor 6",
310         "Virtual sensor 7",
311         "Virtual sensor 8",
312         "Virtual sensor 9",
313         "Virtual sensor 10",
314         "Virtual sensor 11",
315         "Virtual sensor 12",
316         "Virtual sensor 13",
317         "Virtual sensor 14",
318         "Virtual sensor 15",
319         "Virtual sensor 16",
320 };
321
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"
327 };
328
329 /* Labels for Octo and Quadro (except speed) */
330 static const char *const label_fan_speed[] = {
331         "Fan 1 speed",
332         "Fan 2 speed",
333         "Fan 3 speed",
334         "Fan 4 speed",
335         "Fan 5 speed",
336         "Fan 6 speed",
337         "Fan 7 speed",
338         "Fan 8 speed"
339 };
340
341 static const char *const label_fan_power[] = {
342         "Fan 1 power",
343         "Fan 2 power",
344         "Fan 3 power",
345         "Fan 4 power",
346         "Fan 5 power",
347         "Fan 6 power",
348         "Fan 7 power",
349         "Fan 8 power"
350 };
351
352 static const char *const label_fan_voltage[] = {
353         "Fan 1 voltage",
354         "Fan 2 voltage",
355         "Fan 3 voltage",
356         "Fan 4 voltage",
357         "Fan 5 voltage",
358         "Fan 6 voltage",
359         "Fan 7 voltage",
360         "Fan 8 voltage"
361 };
362
363 static const char *const label_fan_current[] = {
364         "Fan 1 current",
365         "Fan 2 current",
366         "Fan 3 current",
367         "Fan 4 current",
368         "Fan 5 current",
369         "Fan 6 current",
370         "Fan 7 current",
371         "Fan 8 current"
372 };
373
374 /* Labels for Quadro fan speeds */
375 static const char *const label_quadro_speeds[] = {
376         "Fan 1 speed",
377         "Fan 2 speed",
378         "Fan 3 speed",
379         "Fan 4 speed",
380         "Flow speed [dL/h]"
381 };
382
383 /* Labels for Aquaero fan speeds */
384 static const char *const label_aquaero_speeds[] = {
385         "Fan 1 speed",
386         "Fan 2 speed",
387         "Fan 3 speed",
388         "Fan 4 speed",
389         "Flow sensor 1 [dL/h]",
390         "Flow sensor 2 [dL/h]"
391 };
392
393 /* Labels for High Flow Next */
394 static const char *const label_highflownext_temp_sensors[] = {
395         "Coolant temp",
396         "External sensor"
397 };
398
399 static const char *const label_highflownext_fan_speed[] = {
400         "Flow [dL/h]",
401         "Water quality [%]",
402         "Conductivity [nS/cm]",
403 };
404
405 static const char *const label_highflownext_power[] = {
406         "Dissipated power",
407 };
408
409 static const char *const label_highflownext_voltage[] = {
410         "+5V voltage",
411         "+5V USB voltage"
412 };
413
414 /* Labels for Aquastream XT */
415 static const char *const label_aquastreamxt_temp_sensors[] = {
416         "Fan IC temp",
417         "External sensor",
418         "Coolant temp"
419 };
420
421 /* Labels for Aquastream Ultimate */
422 static const char *const label_aquastreamult_temp[] = {
423         "Coolant temp",
424         "External temp"
425 };
426
427 static const char *const label_aquastreamult_speeds[] = {
428         "Fan speed",
429         "Pump speed",
430         "Pressure [mbar]",
431         "Flow speed [dL/h]"
432 };
433
434 static const char *const label_aquastreamult_power[] = {
435         "Fan power",
436         "Pump power"
437 };
438
439 static const char *const label_aquastreamult_voltages[] = {
440         "Fan voltage",
441         "Pump voltage"
442 };
443
444 static const char *const label_aquastreamult_current[] = {
445         "Fan current",
446         "Pump current"
447 };
448
449 /* Labels for Poweradjust 3 */
450 static const char *const label_poweradjust3_temp_sensors[] = {
451         "External sensor"
452 };
453
454 struct aqc_fan_structure_offsets {
455         u8 voltage;
456         u8 curr;
457         u8 power;
458         u8 speed;
459 };
460
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
467 };
468
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
475 };
476
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
483 };
484
485 struct aqc_data {
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 */
490         enum kinds kind;
491         const char *name;
492
493         int status_report_id;   /* Used for legacy devices, report is stored in buffer */
494         int ctrl_report_id;
495         int secondary_ctrl_report_id;
496         int secondary_ctrl_report_size;
497         u8 *secondary_ctrl_report;
498
499         int buffer_size;
500         u8 *buffer;
501         int checksum_start;
502         int checksum_length;
503         int checksum_offset;
504
505         int num_fans;
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;
520
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;
526
527         /* How many times the device was powered on, if available */
528         u32 power_cycles;
529
530         /* Sensor values */
531         s32 temp_input[20];     /* Max 4 physical and 16 virtual or 8 physical and 12 virtual */
532         u16 speed_input[8];
533         u32 power_input[8];
534         u16 voltage_input[8];
535         u16 current_input[8];
536
537         /* Label values */
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;
545
546         unsigned long updated;
547 };
548
549 /* Converts from centi-percent */
550 static int aqc_percent_to_pwm(u16 val)
551 {
552         return DIV_ROUND_CLOSEST(val * 255, 100 * 100);
553 }
554
555 /* Converts to centi-percent */
556 static int aqc_pwm_to_percent(long val)
557 {
558         if (val < 0 || val > 255)
559                 return -EINVAL;
560
561         return DIV_ROUND_CLOSEST(val * 100 * 100, 255);
562 }
563
564 /* Converts raw value for Aquastream XT pump speed to RPM */
565 static int aqc_aquastreamxt_convert_pump_rpm(u16 val)
566 {
567         if (val > 0)
568                 return DIV_ROUND_CLOSEST(AQUASTREAMXT_PUMP_CONVERSION_CONST, val);
569         return 0;
570 }
571
572 /* Converts raw value for Aquastream XT fan speed to RPM */
573 static int aqc_aquastreamxt_convert_fan_rpm(u16 val)
574 {
575         if (val > 0)
576                 return DIV_ROUND_CLOSEST(AQUASTREAMXT_FAN_CONVERSION_CONST, val);
577         return 0;
578 }
579
580 /* Expects the mutex to be locked */
581 static int aqc_get_ctrl_data(struct aqc_data *priv)
582 {
583         int ret;
584
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);
588         if (ret < 0)
589                 ret = -ENODATA;
590
591         return ret;
592 }
593
594 /* Expects the mutex to be locked */
595 static int aqc_send_ctrl_data(struct aqc_data *priv)
596 {
597         int ret;
598         u16 checksum;
599
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);
605                 checksum ^= 0xffff;
606
607                 /* Place the new checksum at the end of the report */
608                 put_unaligned_be16(checksum, priv->buffer + priv->checksum_offset);
609         }
610
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);
614         if (ret < 0)
615                 return ret;
616
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);
621         return ret;
622 }
623
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)
626 {
627         int ret;
628
629         mutex_lock(&priv->mutex);
630
631         ret = aqc_get_ctrl_data(priv);
632         if (ret < 0)
633                 goto unlock_and_return;
634
635         switch (type) {
636         case AQC_BE16:
637                 *val = (s16)get_unaligned_be16(priv->buffer + offset);
638                 break;
639         case AQC_8:
640                 *val = priv->buffer[offset];
641                 break;
642         default:
643                 ret = -EINVAL;
644         }
645
646 unlock_and_return:
647         mutex_unlock(&priv->mutex);
648         return ret;
649 }
650
651 static int aqc_set_ctrl_vals(struct aqc_data *priv, int *offsets, long *vals, int *types, int len)
652 {
653         int ret, i;
654
655         mutex_lock(&priv->mutex);
656
657         ret = aqc_get_ctrl_data(priv);
658         if (ret < 0)
659                 goto unlock_and_return;
660
661         for (i = 0; i < len; i++) {
662                 switch (types[i]) {
663                 case AQC_BE16:
664                         put_unaligned_be16((s16)vals[i], priv->buffer + offsets[i]);
665                         break;
666                 case AQC_8:
667                         priv->buffer[offsets[i]] = (u8)vals[i];
668                         break;
669                 default:
670                         ret = -EINVAL;
671                 }
672         }
673
674         if (ret < 0)
675                 goto unlock_and_return;
676
677         ret = aqc_send_ctrl_data(priv);
678
679 unlock_and_return:
680         mutex_unlock(&priv->mutex);
681         return ret;
682 }
683
684 static int aqc_set_ctrl_val(struct aqc_data *priv, int offset, long val, int type)
685 {
686         return aqc_set_ctrl_vals(priv, &offset, &val, &type, 1);
687 }
688
689 static umode_t aqc_is_visible(const void *data, enum hwmon_sensor_types type, u32 attr, int channel)
690 {
691         const struct aqc_data *priv = data;
692
693         switch (type) {
694         case hwmon_temp:
695                 if (channel < priv->num_temp_sensors) {
696                         switch (attr) {
697                         case hwmon_temp_label:
698                         case hwmon_temp_input:
699                                 return 0444;
700                         case hwmon_temp_offset:
701                                 if (priv->temp_ctrl_offset != 0)
702                                         return 0644;
703                                 break;
704                         default:
705                                 break;
706                         }
707                 }
708
709                 if (channel <
710                     priv->num_temp_sensors + priv->num_virtual_temp_sensors +
711                     priv->num_calc_virt_temp_sensors)
712                         switch (attr) {
713                         case hwmon_temp_label:
714                         case hwmon_temp_input:
715                                 return 0444;
716                         default:
717                                 break;
718                         }
719                 break;
720         case hwmon_pwm:
721                 if (priv->fan_ctrl_offsets && channel < priv->num_fans) {
722                         switch (attr) {
723                         case hwmon_pwm_input:
724                                 return 0644;
725                         default:
726                                 break;
727                         }
728                 }
729                 break;
730         case hwmon_fan:
731                 switch (attr) {
732                 case hwmon_fan_input:
733                 case hwmon_fan_label:
734                         switch (priv->kind) {
735                         case aquastreamult:
736                                 /*
737                                  * Special case to support pump RPM, fan RPM,
738                                  * pressure and flow sensor
739                                  */
740                                 if (channel < 4)
741                                         return 0444;
742                                 break;
743                         case highflownext:
744                                 /* Special case to support flow sensor, water quality
745                                  * and conductivity
746                                  */
747                                 if (channel < 3)
748                                         return 0444;
749                                 break;
750                         case aquaero:
751                         case quadro:
752                                 /* Special case to support flow sensors */
753                                 if (channel < priv->num_fans + priv->num_flow_sensors)
754                                         return 0444;
755                                 break;
756                         default:
757                                 if (channel < priv->num_fans)
758                                         return 0444;
759                                 break;
760                         }
761                         break;
762                 case hwmon_fan_pulses:
763                         /* Special case for Quadro flow sensor */
764                         if (priv->kind == quadro && channel == priv->num_fans)
765                                 return 0644;
766                         break;
767                 default:
768                         break;
769                 }
770                 break;
771         case hwmon_power:
772                 switch (priv->kind) {
773                 case aquastreamult:
774                         /* Special case to support pump and fan power */
775                         if (channel < 2)
776                                 return 0444;
777                         break;
778                 case highflownext:
779                         /* Special case to support one power sensor */
780                         if (channel == 0)
781                                 return 0444;
782                         break;
783                 case aquastreamxt:
784                         break;
785                 default:
786                         if (channel < priv->num_fans)
787                                 return 0444;
788                         break;
789                 }
790                 break;
791         case hwmon_curr:
792                 switch (priv->kind) {
793                 case aquastreamult:
794                         /* Special case to support pump and fan current */
795                         if (channel < 2)
796                                 return 0444;
797                         break;
798                 case aquastreamxt:
799                         /* Special case to support pump current */
800                         if (channel == 0)
801                                 return 0444;
802                         break;
803                 default:
804                         if (channel < priv->num_fans)
805                                 return 0444;
806                         break;
807                 }
808                 break;
809         case hwmon_in:
810                 switch (priv->kind) {
811                 case d5next:
812                         /* Special case to support +5V and +12V voltage sensors */
813                         if (channel < priv->num_fans + 2)
814                                 return 0444;
815                         break;
816                 case aquastreamult:
817                 case highflownext:
818                         /* Special case to support two voltage sensors */
819                         if (channel < 2)
820                                 return 0444;
821                         break;
822                 default:
823                         if (channel < priv->num_fans)
824                                 return 0444;
825                         break;
826                 }
827                 break;
828         default:
829                 break;
830         }
831
832         return 0;
833 }
834
835 /* Read device sensors by manually requesting the sensor report (legacy way) */
836 static int aqc_legacy_read(struct aqc_data *priv)
837 {
838         int ret, i, sensor_value;
839
840         mutex_lock(&priv->mutex);
841
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);
845         if (ret < 0)
846                 goto unlock_and_return;
847
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;
853         }
854
855         /* Special-case sensor readings */
856         switch (priv->kind) {
857         case aquastreamxt:
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);
863
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);
867
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;
872                 } else {
873                         sensor_value =
874                                 get_unaligned_le16(priv->buffer + priv->fan_sensor_offsets[1]);
875                         priv->speed_input[1] = aqc_aquastreamxt_convert_fan_rpm(sensor_value);
876                 }
877
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;
881
882                 sensor_value = get_unaligned_le16(priv->buffer + AQUASTREAMXT_PUMP_VOLTAGE_OFFSET);
883                 priv->voltage_input[0] = DIV_ROUND_CLOSEST(sensor_value * 1000, 61);
884
885                 sensor_value = get_unaligned_le16(priv->buffer + AQUASTREAMXT_FAN_VOLTAGE_OFFSET);
886                 priv->voltage_input[1] = DIV_ROUND_CLOSEST(sensor_value * 1000, 63);
887                 break;
888         default:
889                 break;
890         }
891
892         priv->updated = jiffies;
893
894 unlock_and_return:
895         mutex_unlock(&priv->mutex);
896         return ret;
897 }
898
899 static int aqc_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
900                     int channel, long *val)
901 {
902         int ret;
903         struct aqc_data *priv = dev_get_drvdata(dev);
904
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);
909                         if (ret < 0)
910                                 return -ENODATA;
911                 } else {
912                         return -ENODATA;
913                 }
914         }
915
916         switch (type) {
917         case hwmon_temp:
918                 switch (attr) {
919                 case hwmon_temp_input:
920                         if (priv->temp_input[channel] == -ENODATA)
921                                 return -ENODATA;
922
923                         *val = priv->temp_input[channel];
924                         break;
925                 case hwmon_temp_offset:
926                         ret =
927                             aqc_get_ctrl_val(priv, priv->temp_ctrl_offset +
928                                              channel * AQC_SENSOR_SIZE, val, AQC_BE16);
929                         if (ret < 0)
930                                 return ret;
931
932                         *val *= 10;
933                         break;
934                 default:
935                         break;
936                 }
937                 break;
938         case hwmon_fan:
939                 switch (attr) {
940                 case hwmon_fan_input:
941                         *val = priv->speed_input[channel];
942                         break;
943                 case hwmon_fan_pulses:
944                         ret = aqc_get_ctrl_val(priv, priv->flow_pulses_ctrl_offset,
945                                                val, AQC_BE16);
946                         if (ret < 0)
947                                 return ret;
948                         break;
949                 default:
950                         break;
951                 }
952                 break;
953         case hwmon_power:
954                 *val = priv->power_input[channel];
955                 break;
956         case hwmon_pwm:
957                 switch (priv->kind) {
958                 case aquaero:
959                         ret = aqc_get_ctrl_val(priv,
960                                 AQUAERO_CTRL_PRESET_START + channel * AQUAERO_CTRL_PRESET_SIZE,
961                                 val, AQC_BE16);
962                         if (ret < 0)
963                                 return ret;
964                         *val = aqc_percent_to_pwm(*val);
965                         break;
966                 default:
967                         ret = aqc_get_ctrl_val(priv, priv->fan_ctrl_offsets[channel],
968                                                val, AQC_BE16);
969                         if (ret < 0)
970                                 return ret;
971
972                         *val = aqc_percent_to_pwm(ret);
973                         break;
974                 }
975                 break;
976         case hwmon_in:
977                 *val = priv->voltage_input[channel];
978                 break;
979         case hwmon_curr:
980                 *val = priv->current_input[channel];
981                 break;
982         default:
983                 return -EOPNOTSUPP;
984         }
985
986         return 0;
987 }
988
989 static int aqc_read_string(struct device *dev, enum hwmon_sensor_types type, u32 attr,
990                            int channel, const char **str)
991 {
992         struct aqc_data *priv = dev_get_drvdata(dev);
993
994         /* Number of sensors that are not calculated */
995         int num_non_calc_sensors = priv->num_temp_sensors + priv->num_virtual_temp_sensors;
996
997         switch (type) {
998         case hwmon_temp:
999                 if (channel < priv->num_temp_sensors) {
1000                         *str = priv->temp_label[channel];
1001                 } else {
1002                         if (priv->kind == aquaero && channel >= num_non_calc_sensors)
1003                                 *str =
1004                                     priv->calc_virt_temp_label[channel - num_non_calc_sensors];
1005                         else
1006                                 *str = priv->virtual_temp_label[channel - priv->num_temp_sensors];
1007                 }
1008                 break;
1009         case hwmon_fan:
1010                 *str = priv->speed_label[channel];
1011                 break;
1012         case hwmon_power:
1013                 *str = priv->power_label[channel];
1014                 break;
1015         case hwmon_in:
1016                 *str = priv->voltage_label[channel];
1017                 break;
1018         case hwmon_curr:
1019                 *str = priv->current_label[channel];
1020                 break;
1021         default:
1022                 return -EOPNOTSUPP;
1023         }
1024
1025         return 0;
1026 }
1027
1028 static int aqc_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel,
1029                      long val)
1030 {
1031         int ret, pwm_value;
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);
1037
1038         switch (type) {
1039         case hwmon_temp:
1040                 switch (attr) {
1041                 case hwmon_temp_offset:
1042                         /* Limit temp offset to +/- 15K as in the official software */
1043                         val = clamp_val(val, -15000, 15000) / 10;
1044                         ret =
1045                             aqc_set_ctrl_val(priv, priv->temp_ctrl_offset +
1046                                              channel * AQC_SENSOR_SIZE, val, AQC_BE16);
1047                         if (ret < 0)
1048                                 return ret;
1049                         break;
1050                 default:
1051                         return -EOPNOTSUPP;
1052                 }
1053                 break;
1054         case hwmon_fan:
1055                 switch (attr) {
1056                 case hwmon_fan_pulses:
1057                         val = clamp_val(val, 10, 1000);
1058                         ret = aqc_set_ctrl_val(priv, priv->flow_pulses_ctrl_offset,
1059                                                val, AQC_BE16);
1060                         if (ret < 0)
1061                                 return ret;
1062                         break;
1063                 default:
1064                         break;
1065                 }
1066                 break;
1067         case hwmon_pwm:
1068                 switch (attr) {
1069                 case hwmon_pwm_input:
1070                         pwm_value = aqc_pwm_to_percent(val);
1071                         if (pwm_value < 0)
1072                                 return pwm_value;
1073
1074                         switch (priv->kind) {
1075                         case aquaero:
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;
1081
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;
1087
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;
1091                                 ctrl_values[2] = 0;
1092                                 ctrl_values_types[2] = AQC_BE16;
1093
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;
1099
1100                                 ret = aqc_set_ctrl_vals(priv, ctrl_values_offsets, ctrl_values,
1101                                                         ctrl_values_types, 4);
1102                                 if (ret < 0)
1103                                         return ret;
1104                                 break;
1105                         default:
1106                                 ret = aqc_set_ctrl_val(priv, priv->fan_ctrl_offsets[channel],
1107                                                        pwm_value, AQC_BE16);
1108                                 if (ret < 0)
1109                                         return ret;
1110                                 break;
1111                         }
1112                         break;
1113                 default:
1114                         break;
1115                 }
1116                 break;
1117         default:
1118                 return -EOPNOTSUPP;
1119         }
1120
1121         return 0;
1122 }
1123
1124 static const struct hwmon_ops aqc_hwmon_ops = {
1125         .is_visible = aqc_is_visible,
1126         .read = aqc_read,
1127         .read_string = aqc_read_string,
1128         .write = aqc_write
1129 };
1130
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,
1172                            HWMON_PWM_INPUT,
1173                            HWMON_PWM_INPUT,
1174                            HWMON_PWM_INPUT,
1175                            HWMON_PWM_INPUT,
1176                            HWMON_PWM_INPUT,
1177                            HWMON_PWM_INPUT,
1178                            HWMON_PWM_INPUT,
1179                            HWMON_PWM_INPUT),
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),
1198         NULL
1199 };
1200
1201 static const struct hwmon_chip_info aqc_chip_info = {
1202         .ops = &aqc_hwmon_ops,
1203         .info = aqc_info,
1204 };
1205
1206 static int aqc_raw_event(struct hid_device *hdev, struct hid_report *report, u8 *data, int size)
1207 {
1208         int i, j, sensor_value;
1209         struct aqc_data *priv;
1210
1211         if (report->id != STATUS_REPORT_ID)
1212                 return 0;
1213
1214         priv = hid_get_drvdata(hdev);
1215
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);
1221
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;
1229                 else
1230                         priv->temp_input[i] = sensor_value * 10;
1231         }
1232
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;
1240                 else
1241                         priv->temp_input[i] = sensor_value * 10;
1242                 i++;
1243         }
1244
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);
1259         }
1260
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);
1265                 i++;
1266         }
1267
1268         if (priv->power_cycle_count_offset != 0)
1269                 priv->power_cycles = get_unaligned_be32(data + priv->power_cycle_count_offset);
1270
1271         /* Special-case sensor readings */
1272         switch (priv->kind) {
1273         case aquaero:
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;
1282                         else
1283                                 priv->temp_input[i] = sensor_value * 10;
1284                         i++;
1285                 }
1286                 break;
1287         case aquastreamult:
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);
1291
1292                 priv->power_input[1] = get_unaligned_be16(data + AQUASTREAMULT_PUMP_POWER) * 10000;
1293
1294                 priv->voltage_input[1] = get_unaligned_be16(data + AQUASTREAMULT_PUMP_VOLTAGE) * 10;
1295
1296                 priv->current_input[1] = get_unaligned_be16(data + AQUASTREAMULT_PUMP_CURRENT);
1297                 break;
1298         case d5next:
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;
1301                 break;
1302         case highflownext:
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;
1306                 else
1307                         priv->power_input[0] =
1308                             get_unaligned_be16(data + HIGHFLOWNEXT_POWER) * 1000000;
1309
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;
1313
1314                 priv->speed_input[1] = get_unaligned_be16(data + HIGHFLOWNEXT_WATER_QUALITY);
1315                 priv->speed_input[2] = get_unaligned_be16(data + HIGHFLOWNEXT_CONDUCTIVITY);
1316                 break;
1317         default:
1318                 break;
1319         }
1320
1321         priv->updated = jiffies;
1322
1323         return 0;
1324 }
1325
1326 #ifdef CONFIG_DEBUG_FS
1327
1328 static int serial_number_show(struct seq_file *seqf, void *unused)
1329 {
1330         struct aqc_data *priv = seqf->private;
1331
1332         seq_printf(seqf, "%05u-%05u\n", priv->serial_number[0], priv->serial_number[1]);
1333
1334         return 0;
1335 }
1336 DEFINE_SHOW_ATTRIBUTE(serial_number);
1337
1338 static int firmware_version_show(struct seq_file *seqf, void *unused)
1339 {
1340         struct aqc_data *priv = seqf->private;
1341
1342         seq_printf(seqf, "%u\n", priv->firmware_version);
1343
1344         return 0;
1345 }
1346 DEFINE_SHOW_ATTRIBUTE(firmware_version);
1347
1348 static int power_cycles_show(struct seq_file *seqf, void *unused)
1349 {
1350         struct aqc_data *priv = seqf->private;
1351
1352         seq_printf(seqf, "%u\n", priv->power_cycles);
1353
1354         return 0;
1355 }
1356 DEFINE_SHOW_ATTRIBUTE(power_cycles);
1357
1358 static void aqc_debugfs_init(struct aqc_data *priv)
1359 {
1360         char name[64];
1361
1362         scnprintf(name, sizeof(name), "%s_%s-%s", "aquacomputer", priv->name,
1363                   dev_name(&priv->hdev->dev));
1364
1365         priv->debugfs = debugfs_create_dir(name, NULL);
1366
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);
1375 }
1376
1377 #else
1378
1379 static void aqc_debugfs_init(struct aqc_data *priv)
1380 {
1381 }
1382
1383 #endif
1384
1385 static int aqc_probe(struct hid_device *hdev, const struct hid_device_id *id)
1386 {
1387         struct aqc_data *priv;
1388         int ret;
1389
1390         priv = devm_kzalloc(&hdev->dev, sizeof(*priv), GFP_KERNEL);
1391         if (!priv)
1392                 return -ENOMEM;
1393
1394         priv->hdev = hdev;
1395         hid_set_drvdata(hdev, priv);
1396
1397         priv->updated = jiffies - STATUS_UPDATE_INTERVAL;
1398
1399         ret = hid_parse(hdev);
1400         if (ret)
1401                 return ret;
1402
1403         ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW);
1404         if (ret)
1405                 return ret;
1406
1407         ret = hid_hw_open(hdev);
1408         if (ret)
1409                 goto fail_and_stop;
1410
1411         switch (hdev->product) {
1412         case USB_PRODUCT_ID_AQUAERO:
1413                 /*
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.
1419                  *
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.
1423                  */
1424                 if (hdev->collection[1].type != 0) {
1425                         ret = -ENODEV;
1426                         goto fail_and_close;
1427                 }
1428
1429                 priv->kind = aquaero;
1430
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;
1434
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;
1443
1444                 priv->buffer_size = AQUAERO_CTRL_REPORT_SIZE;
1445                 priv->temp_ctrl_offset = AQUAERO_TEMP_CTRL_OFFSET;
1446
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;
1454                 break;
1455         case USB_PRODUCT_ID_D5NEXT:
1456                 priv->kind = d5next;
1457
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;
1461
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;
1467
1468                 priv->buffer_size = D5NEXT_CTRL_REPORT_SIZE;
1469
1470                 priv->power_cycle_count_offset = D5NEXT_POWER_CYCLES;
1471
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;
1478                 break;
1479         case USB_PRODUCT_ID_FARBWERK:
1480                 priv->kind = farbwerk;
1481
1482                 priv->num_fans = 0;
1483
1484                 priv->num_temp_sensors = FARBWERK_NUM_SENSORS;
1485                 priv->temp_sensor_start_offset = FARBWERK_SENSOR_START;
1486
1487                 priv->temp_label = label_temp_sensors;
1488                 break;
1489         case USB_PRODUCT_ID_FARBWERK360:
1490                 priv->kind = farbwerk360;
1491
1492                 priv->num_fans = 0;
1493
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;
1499
1500                 priv->buffer_size = FARBWERK360_CTRL_REPORT_SIZE;
1501
1502                 priv->temp_label = label_temp_sensors;
1503                 priv->virtual_temp_label = label_virtual_temp_sensors;
1504                 break;
1505         case USB_PRODUCT_ID_OCTO:
1506                 priv->kind = octo;
1507
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;
1511
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;
1517
1518                 priv->buffer_size = OCTO_CTRL_REPORT_SIZE;
1519
1520                 priv->power_cycle_count_offset = OCTO_POWER_CYCLES;
1521
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;
1528                 break;
1529         case USB_PRODUCT_ID_QUADRO:
1530                 priv->kind = quadro;
1531
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;
1535
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;
1542
1543                 priv->temp_ctrl_offset = QUADRO_TEMP_CTRL_OFFSET;
1544
1545                 priv->buffer_size = QUADRO_CTRL_REPORT_SIZE;
1546
1547                 priv->flow_pulses_ctrl_offset = QUADRO_FLOW_PULSES_CTRL_OFFSET;
1548                 priv->power_cycle_count_offset = QUADRO_POWER_CYCLES;
1549
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;
1556                 break;
1557         case USB_PRODUCT_ID_HIGHFLOWNEXT:
1558                 priv->kind = highflownext;
1559
1560                 priv->num_fans = 0;
1561
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;
1566
1567                 priv->power_cycle_count_offset = QUADRO_POWER_CYCLES;
1568
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;
1573                 break;
1574         case USB_PRODUCT_ID_AQUASTREAMXT:
1575                 priv->kind = aquastreamxt;
1576
1577                 priv->num_fans = AQUASTREAMXT_NUM_FANS;
1578                 priv->fan_sensor_offsets = aquastreamxt_sensor_fan_offsets;
1579
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;
1583
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;
1588                 break;
1589         case USB_PRODUCT_ID_AQUASTREAMULT:
1590                 priv->kind = aquastreamult;
1591
1592                 priv->num_fans = AQUASTREAMULT_NUM_FANS;
1593                 priv->fan_sensor_offsets = aquastreamult_sensor_fan_offsets;
1594
1595                 priv->num_temp_sensors = AQUASTREAMULT_NUM_SENSORS;
1596                 priv->temp_sensor_start_offset = AQUASTREAMULT_SENSOR_START;
1597
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;
1603                 break;
1604         case USB_PRODUCT_ID_POWERADJUST3:
1605                 priv->kind = poweradjust3;
1606
1607                 priv->num_fans = 0;
1608
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;
1612
1613                 priv->temp_label = label_poweradjust3_temp_sensors;
1614                 break;
1615         default:
1616                 break;
1617         }
1618
1619         switch (priv->kind) {
1620         case aquaero:
1621                 priv->serial_number_start_offset = AQUAERO_SERIAL_START;
1622                 priv->firmware_version_offset = AQUAERO_FIRMWARE_VERSION;
1623
1624                 priv->fan_structure = &aqc_aquaero_fan_structure;
1625
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;
1630                 break;
1631         case poweradjust3:
1632                 priv->status_report_id = POWERADJUST3_STATUS_REPORT_ID;
1633                 break;
1634         case aquastreamxt:
1635                 priv->serial_number_start_offset = AQUASTREAMXT_SERIAL_START;
1636                 priv->firmware_version_offset = AQUASTREAMXT_FIRMWARE_VERSION;
1637
1638                 priv->status_report_id = AQUASTREAMXT_STATUS_REPORT_ID;
1639                 break;
1640         default:
1641                 priv->serial_number_start_offset = AQC_SERIAL_START;
1642                 priv->firmware_version_offset = AQC_FIRMWARE_VERSION;
1643
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;
1648
1649                 if (priv->kind == aquastreamult)
1650                         priv->fan_structure = &aqc_aquastreamult_fan_structure;
1651                 else
1652                         priv->fan_structure = &aqc_general_fan_structure;
1653                 break;
1654         }
1655
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;
1660         }
1661
1662         priv->name = aqc_device_names[priv->kind];
1663
1664         priv->buffer = devm_kzalloc(&hdev->dev, priv->buffer_size, GFP_KERNEL);
1665         if (!priv->buffer) {
1666                 ret = -ENOMEM;
1667                 goto fail_and_close;
1668         }
1669
1670         mutex_init(&priv->mutex);
1671
1672         priv->hwmon_dev = hwmon_device_register_with_info(&hdev->dev, priv->name, priv,
1673                                                           &aqc_chip_info, NULL);
1674
1675         if (IS_ERR(priv->hwmon_dev)) {
1676                 ret = PTR_ERR(priv->hwmon_dev);
1677                 goto fail_and_close;
1678         }
1679
1680         aqc_debugfs_init(priv);
1681
1682         return 0;
1683
1684 fail_and_close:
1685         hid_hw_close(hdev);
1686 fail_and_stop:
1687         hid_hw_stop(hdev);
1688         return ret;
1689 }
1690
1691 static void aqc_remove(struct hid_device *hdev)
1692 {
1693         struct aqc_data *priv = hid_get_drvdata(hdev);
1694
1695         debugfs_remove_recursive(priv->debugfs);
1696         hwmon_device_unregister(priv->hwmon_dev);
1697
1698         hid_hw_close(hdev);
1699         hid_hw_stop(hdev);
1700 }
1701
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) },
1713         { }
1714 };
1715
1716 MODULE_DEVICE_TABLE(hid, aqc_table);
1717
1718 static struct hid_driver aqc_driver = {
1719         .name = DRIVER_NAME,
1720         .id_table = aqc_table,
1721         .probe = aqc_probe,
1722         .remove = aqc_remove,
1723         .raw_event = aqc_raw_event,
1724 };
1725
1726 static int __init aqc_init(void)
1727 {
1728         return hid_register_driver(&aqc_driver);
1729 }
1730
1731 static void __exit aqc_exit(void)
1732 {
1733         hid_unregister_driver(&aqc_driver);
1734 }
1735
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);
1739
1740 MODULE_LICENSE("GPL");
1741 MODULE_AUTHOR("Aleksa Savic <savicaleksa83@gmail.com>");
1742 MODULE_AUTHOR("Jack Doan <me@jackdoan.com>");
1743 MODULE_DESCRIPTION("Hwmon driver for Aquacomputer devices");