Merge tag 'trace-tools-v6.5' of git://git.kernel.org/pub/scm/linux/kernel/git/trace...
[linux-2.6-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, Leakshield)
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_LEAKSHIELD       0xf014
33 #define USB_PRODUCT_ID_AQUASTREAMXT     0xf0b6
34 #define USB_PRODUCT_ID_AQUASTREAMULT    0xf00b
35 #define USB_PRODUCT_ID_POWERADJUST3     0xf0bd
36
37 enum kinds {
38         d5next, farbwerk, farbwerk360, octo, quadro,
39         highflownext, aquaero, poweradjust3, aquastreamult,
40         aquastreamxt, leakshield
41 };
42
43 static const char *const aqc_device_names[] = {
44         [d5next] = "d5next",
45         [farbwerk] = "farbwerk",
46         [farbwerk360] = "farbwerk360",
47         [octo] = "octo",
48         [quadro] = "quadro",
49         [highflownext] = "highflownext",
50         [leakshield] = "leakshield",
51         [aquastreamxt] = "aquastreamxt",
52         [aquaero] = "aquaero",
53         [aquastreamult] = "aquastreamultimate",
54         [poweradjust3] = "poweradjust3"
55 };
56
57 #define DRIVER_NAME                     "aquacomputer_d5next"
58
59 #define STATUS_REPORT_ID                0x01
60 #define STATUS_UPDATE_INTERVAL          (2 * HZ)        /* In seconds */
61 #define SERIAL_PART_OFFSET              2
62
63 #define CTRL_REPORT_ID                  0x03
64 #define AQUAERO_CTRL_REPORT_ID          0x0b
65
66 /* The HID report that the official software always sends
67  * after writing values, currently same for all devices
68  */
69 #define SECONDARY_CTRL_REPORT_ID        0x02
70 #define SECONDARY_CTRL_REPORT_SIZE      0x0B
71
72 static u8 secondary_ctrl_report[] = {
73         0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x34, 0xC6
74 };
75
76 /* Secondary HID report values for Aquaero */
77 #define AQUAERO_SECONDARY_CTRL_REPORT_ID        0x06
78 #define AQUAERO_SECONDARY_CTRL_REPORT_SIZE      0x07
79
80 static u8 aquaero_secondary_ctrl_report[] = {
81         0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00
82 };
83
84 /* Report IDs for legacy devices */
85 #define AQUASTREAMXT_STATUS_REPORT_ID   0x04
86
87 #define POWERADJUST3_STATUS_REPORT_ID   0x03
88
89 /* Data types for reading and writing control reports */
90 #define AQC_8           0
91 #define AQC_BE16        1
92
93 /* Info, sensor sizes and offsets for most Aquacomputer devices */
94 #define AQC_SERIAL_START                0x3
95 #define AQC_FIRMWARE_VERSION            0xD
96
97 #define AQC_SENSOR_SIZE                 0x02
98 #define AQC_SENSOR_NA                   0x7FFF
99 #define AQC_FAN_PERCENT_OFFSET          0x00
100 #define AQC_FAN_VOLTAGE_OFFSET          0x02
101 #define AQC_FAN_CURRENT_OFFSET          0x04
102 #define AQC_FAN_POWER_OFFSET            0x06
103 #define AQC_FAN_SPEED_OFFSET            0x08
104
105 /* Specs of the Aquaero fan controllers */
106 #define AQUAERO_SERIAL_START                    0x07
107 #define AQUAERO_FIRMWARE_VERSION                0x0B
108 #define AQUAERO_NUM_FANS                        4
109 #define AQUAERO_NUM_SENSORS                     8
110 #define AQUAERO_NUM_VIRTUAL_SENSORS             8
111 #define AQUAERO_NUM_CALC_VIRTUAL_SENSORS        4
112 #define AQUAERO_NUM_FLOW_SENSORS                2
113 #define AQUAERO_CTRL_REPORT_SIZE                0xa93
114 #define AQUAERO_CTRL_PRESET_ID                  0x5c
115 #define AQUAERO_CTRL_PRESET_SIZE                0x02
116 #define AQUAERO_CTRL_PRESET_START               0x55c
117
118 /* Sensor report offsets for Aquaero fan controllers */
119 #define AQUAERO_SENSOR_START                    0x65
120 #define AQUAERO_VIRTUAL_SENSOR_START            0x85
121 #define AQUAERO_CALC_VIRTUAL_SENSOR_START       0x95
122 #define AQUAERO_FLOW_SENSORS_START              0xF9
123 #define AQUAERO_FAN_VOLTAGE_OFFSET              0x04
124 #define AQUAERO_FAN_CURRENT_OFFSET              0x06
125 #define AQUAERO_FAN_POWER_OFFSET                0x08
126 #define AQUAERO_FAN_SPEED_OFFSET                0x00
127 static u16 aquaero_sensor_fan_offsets[] = { 0x167, 0x173, 0x17f, 0x18B };
128
129 /* Control report offsets for the Aquaero fan controllers */
130 #define AQUAERO_TEMP_CTRL_OFFSET        0xdb
131 #define AQUAERO_FAN_CTRL_MIN_PWR_OFFSET 0x04
132 #define AQUAERO_FAN_CTRL_MAX_PWR_OFFSET 0x06
133 #define AQUAERO_FAN_CTRL_SRC_OFFSET     0x10
134 static u16 aquaero_ctrl_fan_offsets[] = { 0x20c, 0x220, 0x234, 0x248 };
135
136 /* Specs of the D5 Next pump */
137 #define D5NEXT_NUM_FANS                 2
138 #define D5NEXT_NUM_SENSORS              1
139 #define D5NEXT_NUM_VIRTUAL_SENSORS      8
140 #define D5NEXT_CTRL_REPORT_SIZE         0x329
141
142 /* Sensor report offsets for the D5 Next pump */
143 #define D5NEXT_POWER_CYCLES             0x18
144 #define D5NEXT_COOLANT_TEMP             0x57
145 #define D5NEXT_PUMP_OFFSET              0x6c
146 #define D5NEXT_FAN_OFFSET               0x5f
147 #define D5NEXT_5V_VOLTAGE               0x39
148 #define D5NEXT_12V_VOLTAGE              0x37
149 #define D5NEXT_VIRTUAL_SENSORS_START    0x3f
150 static u16 d5next_sensor_fan_offsets[] = { D5NEXT_PUMP_OFFSET, D5NEXT_FAN_OFFSET };
151
152 /* Control report offsets for the D5 Next pump */
153 #define D5NEXT_TEMP_CTRL_OFFSET         0x2D    /* Temperature sensor offsets location */
154 static u16 d5next_ctrl_fan_offsets[] = { 0x97, 0x42 };  /* Pump and fan speed (from 0-100%) */
155
156 /* Specs of the Aquastream Ultimate pump */
157 /* Pump does not follow the standard structure, so only consider the fan */
158 #define AQUASTREAMULT_NUM_FANS          1
159 #define AQUASTREAMULT_NUM_SENSORS       2
160
161 /* Sensor report offsets for the Aquastream Ultimate pump */
162 #define AQUASTREAMULT_SENSOR_START              0x2D
163 #define AQUASTREAMULT_PUMP_OFFSET               0x51
164 #define AQUASTREAMULT_PUMP_VOLTAGE              0x3D
165 #define AQUASTREAMULT_PUMP_CURRENT              0x53
166 #define AQUASTREAMULT_PUMP_POWER                0x55
167 #define AQUASTREAMULT_FAN_OFFSET                0x41
168 #define AQUASTREAMULT_PRESSURE_OFFSET           0x57
169 #define AQUASTREAMULT_FLOW_SENSOR_OFFSET        0x37
170 #define AQUASTREAMULT_FAN_VOLTAGE_OFFSET        0x02
171 #define AQUASTREAMULT_FAN_CURRENT_OFFSET        0x00
172 #define AQUASTREAMULT_FAN_POWER_OFFSET          0x04
173 #define AQUASTREAMULT_FAN_SPEED_OFFSET          0x06
174 static u16 aquastreamult_sensor_fan_offsets[] = { AQUASTREAMULT_FAN_OFFSET };
175
176 /* Spec and sensor report offset for the Farbwerk RGB controller */
177 #define FARBWERK_NUM_SENSORS            4
178 #define FARBWERK_SENSOR_START           0x2f
179
180 /* Specs of the Farbwerk 360 RGB controller */
181 #define FARBWERK360_NUM_SENSORS                 4
182 #define FARBWERK360_NUM_VIRTUAL_SENSORS         16
183 #define FARBWERK360_CTRL_REPORT_SIZE            0x682
184
185 /* Sensor report offsets for the Farbwerk 360 */
186 #define FARBWERK360_SENSOR_START                0x32
187 #define FARBWERK360_VIRTUAL_SENSORS_START       0x3a
188
189 /* Control report offsets for the Farbwerk 360 */
190 #define FARBWERK360_TEMP_CTRL_OFFSET            0x8
191
192 /* Specs of the Octo fan controller */
193 #define OCTO_NUM_FANS                   8
194 #define OCTO_NUM_SENSORS                4
195 #define OCTO_NUM_VIRTUAL_SENSORS        16
196 #define OCTO_CTRL_REPORT_SIZE           0x65F
197
198 /* Sensor report offsets for the Octo */
199 #define OCTO_POWER_CYCLES               0x18
200 #define OCTO_SENSOR_START               0x3D
201 #define OCTO_VIRTUAL_SENSORS_START      0x45
202 static u16 octo_sensor_fan_offsets[] = { 0x7D, 0x8A, 0x97, 0xA4, 0xB1, 0xBE, 0xCB, 0xD8 };
203
204 /* Control report offsets for the Octo */
205 #define OCTO_TEMP_CTRL_OFFSET           0xA
206 /* Fan speed offsets (0-100%) */
207 static u16 octo_ctrl_fan_offsets[] = { 0x5B, 0xB0, 0x105, 0x15A, 0x1AF, 0x204, 0x259, 0x2AE };
208
209 /* Specs of Quadro fan controller */
210 #define QUADRO_NUM_FANS                 4
211 #define QUADRO_NUM_SENSORS              4
212 #define QUADRO_NUM_VIRTUAL_SENSORS      16
213 #define QUADRO_NUM_FLOW_SENSORS         1
214 #define QUADRO_CTRL_REPORT_SIZE         0x3c1
215
216 /* Sensor report offsets for the Quadro */
217 #define QUADRO_POWER_CYCLES             0x18
218 #define QUADRO_SENSOR_START             0x34
219 #define QUADRO_VIRTUAL_SENSORS_START    0x3c
220 #define QUADRO_FLOW_SENSOR_OFFSET       0x6e
221 static u16 quadro_sensor_fan_offsets[] = { 0x70, 0x7D, 0x8A, 0x97 };
222
223 /* Control report offsets for the Quadro */
224 #define QUADRO_TEMP_CTRL_OFFSET         0xA
225 #define QUADRO_FLOW_PULSES_CTRL_OFFSET  0x6
226 static u16 quadro_ctrl_fan_offsets[] = { 0x37, 0x8c, 0xe1, 0x136 }; /* Fan speed offsets (0-100%) */
227
228 /* Specs of High Flow Next flow sensor */
229 #define HIGHFLOWNEXT_NUM_SENSORS        2
230 #define HIGHFLOWNEXT_NUM_FLOW_SENSORS   1
231
232 /* Sensor report offsets for the High Flow Next */
233 #define HIGHFLOWNEXT_SENSOR_START       85
234 #define HIGHFLOWNEXT_FLOW               81
235 #define HIGHFLOWNEXT_WATER_QUALITY      89
236 #define HIGHFLOWNEXT_POWER              91
237 #define HIGHFLOWNEXT_CONDUCTIVITY       95
238 #define HIGHFLOWNEXT_5V_VOLTAGE         97
239 #define HIGHFLOWNEXT_5V_VOLTAGE_USB     99
240
241 /* Specs of the Leakshield */
242 #define LEAKSHIELD_NUM_SENSORS          2
243
244 /* Sensor report offsets for Leakshield */
245 #define LEAKSHIELD_PRESSURE_ADJUSTED    285
246 #define LEAKSHIELD_TEMPERATURE_1        265
247 #define LEAKSHIELD_TEMPERATURE_2        287
248 #define LEAKSHIELD_PRESSURE_MIN         291
249 #define LEAKSHIELD_PRESSURE_TARGET      293
250 #define LEAKSHIELD_PRESSURE_MAX         295
251 #define LEAKSHIELD_PUMP_RPM_IN          101
252 #define LEAKSHIELD_FLOW_IN              111
253 #define LEAKSHIELD_RESERVOIR_VOLUME     313
254 #define LEAKSHIELD_RESERVOIR_FILLED     311
255
256 /* Specs of the Aquastream XT pump */
257 #define AQUASTREAMXT_SERIAL_START               0x3a
258 #define AQUASTREAMXT_FIRMWARE_VERSION           0x32
259 #define AQUASTREAMXT_NUM_FANS                   2
260 #define AQUASTREAMXT_NUM_SENSORS                3
261 #define AQUASTREAMXT_FAN_STOPPED                0x4
262 #define AQUASTREAMXT_PUMP_CONVERSION_CONST      45000000
263 #define AQUASTREAMXT_FAN_CONVERSION_CONST       5646000
264 #define AQUASTREAMXT_SENSOR_REPORT_SIZE         0x42
265
266 /* Sensor report offsets and info for Aquastream XT */
267 #define AQUASTREAMXT_SENSOR_START               0xd
268 #define AQUASTREAMXT_FAN_VOLTAGE_OFFSET         0x7
269 #define AQUASTREAMXT_FAN_STATUS_OFFSET          0x1d
270 #define AQUASTREAMXT_PUMP_VOLTAGE_OFFSET        0x9
271 #define AQUASTREAMXT_PUMP_CURR_OFFSET           0xb
272 static u16 aquastreamxt_sensor_fan_offsets[] = { 0x13, 0x1b };
273
274 /* Specs of the Poweradjust 3 */
275 #define POWERADJUST3_NUM_SENSORS        1
276 #define POWERADJUST3_SENSOR_REPORT_SIZE 0x32
277
278 /* Sensor report offsets for the Poweradjust 3 */
279 #define POWERADJUST3_SENSOR_START       0x03
280
281 /* Labels for D5 Next */
282 static const char *const label_d5next_temp[] = {
283         "Coolant temp"
284 };
285
286 static const char *const label_d5next_speeds[] = {
287         "Pump speed",
288         "Fan speed"
289 };
290
291 static const char *const label_d5next_power[] = {
292         "Pump power",
293         "Fan power"
294 };
295
296 static const char *const label_d5next_voltages[] = {
297         "Pump voltage",
298         "Fan voltage",
299         "+5V voltage",
300         "+12V voltage"
301 };
302
303 static const char *const label_d5next_current[] = {
304         "Pump current",
305         "Fan current"
306 };
307
308 /* Labels for Aquaero, Farbwerk, Farbwerk 360 and Octo and Quadro temperature sensors */
309 static const char *const label_temp_sensors[] = {
310         "Sensor 1",
311         "Sensor 2",
312         "Sensor 3",
313         "Sensor 4",
314         "Sensor 5",
315         "Sensor 6",
316         "Sensor 7",
317         "Sensor 8"
318 };
319
320 static const char *const label_virtual_temp_sensors[] = {
321         "Virtual sensor 1",
322         "Virtual sensor 2",
323         "Virtual sensor 3",
324         "Virtual sensor 4",
325         "Virtual sensor 5",
326         "Virtual sensor 6",
327         "Virtual sensor 7",
328         "Virtual sensor 8",
329         "Virtual sensor 9",
330         "Virtual sensor 10",
331         "Virtual sensor 11",
332         "Virtual sensor 12",
333         "Virtual sensor 13",
334         "Virtual sensor 14",
335         "Virtual sensor 15",
336         "Virtual sensor 16",
337 };
338
339 static const char *const label_aquaero_calc_temp_sensors[] = {
340         "Calc. virtual sensor 1",
341         "Calc. virtual sensor 2",
342         "Calc. virtual sensor 3",
343         "Calc. virtual sensor 4"
344 };
345
346 /* Labels for Octo and Quadro (except speed) */
347 static const char *const label_fan_speed[] = {
348         "Fan 1 speed",
349         "Fan 2 speed",
350         "Fan 3 speed",
351         "Fan 4 speed",
352         "Fan 5 speed",
353         "Fan 6 speed",
354         "Fan 7 speed",
355         "Fan 8 speed"
356 };
357
358 static const char *const label_fan_power[] = {
359         "Fan 1 power",
360         "Fan 2 power",
361         "Fan 3 power",
362         "Fan 4 power",
363         "Fan 5 power",
364         "Fan 6 power",
365         "Fan 7 power",
366         "Fan 8 power"
367 };
368
369 static const char *const label_fan_voltage[] = {
370         "Fan 1 voltage",
371         "Fan 2 voltage",
372         "Fan 3 voltage",
373         "Fan 4 voltage",
374         "Fan 5 voltage",
375         "Fan 6 voltage",
376         "Fan 7 voltage",
377         "Fan 8 voltage"
378 };
379
380 static const char *const label_fan_current[] = {
381         "Fan 1 current",
382         "Fan 2 current",
383         "Fan 3 current",
384         "Fan 4 current",
385         "Fan 5 current",
386         "Fan 6 current",
387         "Fan 7 current",
388         "Fan 8 current"
389 };
390
391 /* Labels for Quadro fan speeds */
392 static const char *const label_quadro_speeds[] = {
393         "Fan 1 speed",
394         "Fan 2 speed",
395         "Fan 3 speed",
396         "Fan 4 speed",
397         "Flow speed [dL/h]"
398 };
399
400 /* Labels for Aquaero fan speeds */
401 static const char *const label_aquaero_speeds[] = {
402         "Fan 1 speed",
403         "Fan 2 speed",
404         "Fan 3 speed",
405         "Fan 4 speed",
406         "Flow sensor 1 [dL/h]",
407         "Flow sensor 2 [dL/h]"
408 };
409
410 /* Labels for High Flow Next */
411 static const char *const label_highflownext_temp_sensors[] = {
412         "Coolant temp",
413         "External sensor"
414 };
415
416 static const char *const label_highflownext_fan_speed[] = {
417         "Flow [dL/h]",
418         "Water quality [%]",
419         "Conductivity [nS/cm]",
420 };
421
422 static const char *const label_highflownext_power[] = {
423         "Dissipated power",
424 };
425
426 static const char *const label_highflownext_voltage[] = {
427         "+5V voltage",
428         "+5V USB voltage"
429 };
430
431 /* Labels for Leakshield */
432 static const char *const label_leakshield_temp_sensors[] = {
433         "Temperature 1",
434         "Temperature 2"
435 };
436
437 static const char *const label_leakshield_fan_speed[] = {
438         "Pressure [ubar]",
439         "User-Provided Pump Speed",
440         "User-Provided Flow [dL/h]",
441         "Reservoir Volume [ml]",
442         "Reservoir Filled [ml]",
443 };
444
445 /* Labels for Aquastream XT */
446 static const char *const label_aquastreamxt_temp_sensors[] = {
447         "Fan IC temp",
448         "External sensor",
449         "Coolant temp"
450 };
451
452 /* Labels for Aquastream Ultimate */
453 static const char *const label_aquastreamult_temp[] = {
454         "Coolant temp",
455         "External temp"
456 };
457
458 static const char *const label_aquastreamult_speeds[] = {
459         "Fan speed",
460         "Pump speed",
461         "Pressure [mbar]",
462         "Flow speed [dL/h]"
463 };
464
465 static const char *const label_aquastreamult_power[] = {
466         "Fan power",
467         "Pump power"
468 };
469
470 static const char *const label_aquastreamult_voltages[] = {
471         "Fan voltage",
472         "Pump voltage"
473 };
474
475 static const char *const label_aquastreamult_current[] = {
476         "Fan current",
477         "Pump current"
478 };
479
480 /* Labels for Poweradjust 3 */
481 static const char *const label_poweradjust3_temp_sensors[] = {
482         "External sensor"
483 };
484
485 struct aqc_fan_structure_offsets {
486         u8 voltage;
487         u8 curr;
488         u8 power;
489         u8 speed;
490 };
491
492 /* Fan structure offsets for Aquaero */
493 static struct aqc_fan_structure_offsets aqc_aquaero_fan_structure = {
494         .voltage = AQUAERO_FAN_VOLTAGE_OFFSET,
495         .curr = AQUAERO_FAN_CURRENT_OFFSET,
496         .power = AQUAERO_FAN_POWER_OFFSET,
497         .speed = AQUAERO_FAN_SPEED_OFFSET
498 };
499
500 /* Fan structure offsets for Aquastream Ultimate */
501 static struct aqc_fan_structure_offsets aqc_aquastreamult_fan_structure = {
502         .voltage = AQUASTREAMULT_FAN_VOLTAGE_OFFSET,
503         .curr = AQUASTREAMULT_FAN_CURRENT_OFFSET,
504         .power = AQUASTREAMULT_FAN_POWER_OFFSET,
505         .speed = AQUASTREAMULT_FAN_SPEED_OFFSET
506 };
507
508 /* Fan structure offsets for all devices except those above */
509 static struct aqc_fan_structure_offsets aqc_general_fan_structure = {
510         .voltage = AQC_FAN_VOLTAGE_OFFSET,
511         .curr = AQC_FAN_CURRENT_OFFSET,
512         .power = AQC_FAN_POWER_OFFSET,
513         .speed = AQC_FAN_SPEED_OFFSET
514 };
515
516 struct aqc_data {
517         struct hid_device *hdev;
518         struct device *hwmon_dev;
519         struct dentry *debugfs;
520         struct mutex mutex;     /* Used for locking access when reading and writing PWM values */
521         enum kinds kind;
522         const char *name;
523
524         int status_report_id;   /* Used for legacy devices, report is stored in buffer */
525         int ctrl_report_id;
526         int secondary_ctrl_report_id;
527         int secondary_ctrl_report_size;
528         u8 *secondary_ctrl_report;
529
530         int buffer_size;
531         u8 *buffer;
532         int checksum_start;
533         int checksum_length;
534         int checksum_offset;
535
536         int num_fans;
537         u16 *fan_sensor_offsets;
538         u16 *fan_ctrl_offsets;
539         int num_temp_sensors;
540         int temp_sensor_start_offset;
541         int num_virtual_temp_sensors;
542         int virtual_temp_sensor_start_offset;
543         int num_calc_virt_temp_sensors;
544         int calc_virt_temp_sensor_start_offset;
545         u16 temp_ctrl_offset;
546         u16 power_cycle_count_offset;
547         int num_flow_sensors;
548         u8 flow_sensors_start_offset;
549         u8 flow_pulses_ctrl_offset;
550         struct aqc_fan_structure_offsets *fan_structure;
551
552         /* General info, same across all devices */
553         u8 serial_number_start_offset;
554         u32 serial_number[2];
555         u8 firmware_version_offset;
556         u16 firmware_version;
557
558         /* How many times the device was powered on, if available */
559         u32 power_cycles;
560
561         /* Sensor values */
562         s32 temp_input[20];     /* Max 4 physical and 16 virtual or 8 physical and 12 virtual */
563         s32 speed_input[8];
564         u32 speed_input_min[1];
565         u32 speed_input_target[1];
566         u32 speed_input_max[1];
567         u32 power_input[8];
568         u16 voltage_input[8];
569         u16 current_input[8];
570
571         /* Label values */
572         const char *const *temp_label;
573         const char *const *virtual_temp_label;
574         const char *const *calc_virt_temp_label;        /* For Aquaero */
575         const char *const *speed_label;
576         const char *const *power_label;
577         const char *const *voltage_label;
578         const char *const *current_label;
579
580         unsigned long updated;
581 };
582
583 /* Converts from centi-percent */
584 static int aqc_percent_to_pwm(u16 val)
585 {
586         return DIV_ROUND_CLOSEST(val * 255, 100 * 100);
587 }
588
589 /* Converts to centi-percent */
590 static int aqc_pwm_to_percent(long val)
591 {
592         if (val < 0 || val > 255)
593                 return -EINVAL;
594
595         return DIV_ROUND_CLOSEST(val * 100 * 100, 255);
596 }
597
598 /* Converts raw value for Aquastream XT pump speed to RPM */
599 static int aqc_aquastreamxt_convert_pump_rpm(u16 val)
600 {
601         if (val > 0)
602                 return DIV_ROUND_CLOSEST(AQUASTREAMXT_PUMP_CONVERSION_CONST, val);
603         return 0;
604 }
605
606 /* Converts raw value for Aquastream XT fan speed to RPM */
607 static int aqc_aquastreamxt_convert_fan_rpm(u16 val)
608 {
609         if (val > 0)
610                 return DIV_ROUND_CLOSEST(AQUASTREAMXT_FAN_CONVERSION_CONST, val);
611         return 0;
612 }
613
614 /* Expects the mutex to be locked */
615 static int aqc_get_ctrl_data(struct aqc_data *priv)
616 {
617         int ret;
618
619         memset(priv->buffer, 0x00, priv->buffer_size);
620         ret = hid_hw_raw_request(priv->hdev, priv->ctrl_report_id, priv->buffer, priv->buffer_size,
621                                  HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
622         if (ret < 0)
623                 ret = -ENODATA;
624
625         return ret;
626 }
627
628 /* Expects the mutex to be locked */
629 static int aqc_send_ctrl_data(struct aqc_data *priv)
630 {
631         int ret;
632         u16 checksum;
633
634         /* Checksum is not needed for Aquaero */
635         if (priv->kind != aquaero) {
636                 /* Init and xorout value for CRC-16/USB is 0xffff */
637                 checksum = crc16(0xffff, priv->buffer + priv->checksum_start,
638                                  priv->checksum_length);
639                 checksum ^= 0xffff;
640
641                 /* Place the new checksum at the end of the report */
642                 put_unaligned_be16(checksum, priv->buffer + priv->checksum_offset);
643         }
644
645         /* Send the patched up report back to the device */
646         ret = hid_hw_raw_request(priv->hdev, priv->ctrl_report_id, priv->buffer, priv->buffer_size,
647                                  HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
648         if (ret < 0)
649                 return ret;
650
651         /* The official software sends this report after every change, so do it here as well */
652         ret = hid_hw_raw_request(priv->hdev, priv->secondary_ctrl_report_id,
653                                  priv->secondary_ctrl_report, priv->secondary_ctrl_report_size,
654                                  HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
655         return ret;
656 }
657
658 /* Refreshes the control buffer and stores value at offset in val */
659 static int aqc_get_ctrl_val(struct aqc_data *priv, int offset, long *val, int type)
660 {
661         int ret;
662
663         mutex_lock(&priv->mutex);
664
665         ret = aqc_get_ctrl_data(priv);
666         if (ret < 0)
667                 goto unlock_and_return;
668
669         switch (type) {
670         case AQC_BE16:
671                 *val = (s16)get_unaligned_be16(priv->buffer + offset);
672                 break;
673         case AQC_8:
674                 *val = priv->buffer[offset];
675                 break;
676         default:
677                 ret = -EINVAL;
678         }
679
680 unlock_and_return:
681         mutex_unlock(&priv->mutex);
682         return ret;
683 }
684
685 static int aqc_set_ctrl_vals(struct aqc_data *priv, int *offsets, long *vals, int *types, int len)
686 {
687         int ret, i;
688
689         mutex_lock(&priv->mutex);
690
691         ret = aqc_get_ctrl_data(priv);
692         if (ret < 0)
693                 goto unlock_and_return;
694
695         for (i = 0; i < len; i++) {
696                 switch (types[i]) {
697                 case AQC_BE16:
698                         put_unaligned_be16((s16)vals[i], priv->buffer + offsets[i]);
699                         break;
700                 case AQC_8:
701                         priv->buffer[offsets[i]] = (u8)vals[i];
702                         break;
703                 default:
704                         ret = -EINVAL;
705                 }
706         }
707
708         if (ret < 0)
709                 goto unlock_and_return;
710
711         ret = aqc_send_ctrl_data(priv);
712
713 unlock_and_return:
714         mutex_unlock(&priv->mutex);
715         return ret;
716 }
717
718 static int aqc_set_ctrl_val(struct aqc_data *priv, int offset, long val, int type)
719 {
720         return aqc_set_ctrl_vals(priv, &offset, &val, &type, 1);
721 }
722
723 static umode_t aqc_is_visible(const void *data, enum hwmon_sensor_types type, u32 attr, int channel)
724 {
725         const struct aqc_data *priv = data;
726
727         switch (type) {
728         case hwmon_temp:
729                 if (channel < priv->num_temp_sensors) {
730                         switch (attr) {
731                         case hwmon_temp_label:
732                         case hwmon_temp_input:
733                                 return 0444;
734                         case hwmon_temp_offset:
735                                 if (priv->temp_ctrl_offset != 0)
736                                         return 0644;
737                                 break;
738                         default:
739                                 break;
740                         }
741                 }
742
743                 if (channel <
744                     priv->num_temp_sensors + priv->num_virtual_temp_sensors +
745                     priv->num_calc_virt_temp_sensors)
746                         switch (attr) {
747                         case hwmon_temp_label:
748                         case hwmon_temp_input:
749                                 return 0444;
750                         default:
751                                 break;
752                         }
753                 break;
754         case hwmon_pwm:
755                 if (priv->fan_ctrl_offsets && channel < priv->num_fans) {
756                         switch (attr) {
757                         case hwmon_pwm_input:
758                                 return 0644;
759                         default:
760                                 break;
761                         }
762                 }
763                 break;
764         case hwmon_fan:
765                 switch (attr) {
766                 case hwmon_fan_input:
767                 case hwmon_fan_label:
768                         switch (priv->kind) {
769                         case aquastreamult:
770                                 /*
771                                  * Special case to support pump RPM, fan RPM,
772                                  * pressure and flow sensor
773                                  */
774                                 if (channel < 4)
775                                         return 0444;
776                                 break;
777                         case highflownext:
778                                 /* Special case to support flow sensor, water quality
779                                  * and conductivity
780                                  */
781                                 if (channel < 3)
782                                         return 0444;
783                                 break;
784                         case leakshield:
785                                 /* Special case for Leakshield sensors */
786                                 if (channel < 5)
787                                         return 0444;
788                                 break;
789                         case aquaero:
790                         case quadro:
791                                 /* Special case to support flow sensors */
792                                 if (channel < priv->num_fans + priv->num_flow_sensors)
793                                         return 0444;
794                                 break;
795                         default:
796                                 if (channel < priv->num_fans)
797                                         return 0444;
798                                 break;
799                         }
800                         break;
801                 case hwmon_fan_pulses:
802                         /* Special case for Quadro flow sensor */
803                         if (priv->kind == quadro && channel == priv->num_fans)
804                                 return 0644;
805                         break;
806                 case hwmon_fan_min:
807                 case hwmon_fan_max:
808                 case hwmon_fan_target:
809                         /* Special case for Leakshield pressure sensor */
810                         if (priv->kind == leakshield && channel == 0)
811                                 return 0444;
812                         break;
813                 default:
814                         break;
815                 }
816                 break;
817         case hwmon_power:
818                 switch (priv->kind) {
819                 case aquastreamult:
820                         /* Special case to support pump and fan power */
821                         if (channel < 2)
822                                 return 0444;
823                         break;
824                 case highflownext:
825                         /* Special case to support one power sensor */
826                         if (channel == 0)
827                                 return 0444;
828                         break;
829                 case aquastreamxt:
830                         break;
831                 default:
832                         if (channel < priv->num_fans)
833                                 return 0444;
834                         break;
835                 }
836                 break;
837         case hwmon_curr:
838                 switch (priv->kind) {
839                 case aquastreamult:
840                         /* Special case to support pump and fan current */
841                         if (channel < 2)
842                                 return 0444;
843                         break;
844                 case aquastreamxt:
845                         /* Special case to support pump current */
846                         if (channel == 0)
847                                 return 0444;
848                         break;
849                 default:
850                         if (channel < priv->num_fans)
851                                 return 0444;
852                         break;
853                 }
854                 break;
855         case hwmon_in:
856                 switch (priv->kind) {
857                 case d5next:
858                         /* Special case to support +5V and +12V voltage sensors */
859                         if (channel < priv->num_fans + 2)
860                                 return 0444;
861                         break;
862                 case aquastreamult:
863                 case highflownext:
864                         /* Special case to support two voltage sensors */
865                         if (channel < 2)
866                                 return 0444;
867                         break;
868                 default:
869                         if (channel < priv->num_fans)
870                                 return 0444;
871                         break;
872                 }
873                 break;
874         default:
875                 break;
876         }
877
878         return 0;
879 }
880
881 /* Read device sensors by manually requesting the sensor report (legacy way) */
882 static int aqc_legacy_read(struct aqc_data *priv)
883 {
884         int ret, i, sensor_value;
885
886         mutex_lock(&priv->mutex);
887
888         memset(priv->buffer, 0x00, priv->buffer_size);
889         ret = hid_hw_raw_request(priv->hdev, priv->status_report_id, priv->buffer,
890                                  priv->buffer_size, HID_FEATURE_REPORT, HID_REQ_GET_REPORT);
891         if (ret < 0)
892                 goto unlock_and_return;
893
894         /* Temperature sensor readings */
895         for (i = 0; i < priv->num_temp_sensors; i++) {
896                 sensor_value = get_unaligned_le16(priv->buffer + priv->temp_sensor_start_offset +
897                                                   i * AQC_SENSOR_SIZE);
898                 priv->temp_input[i] = sensor_value * 10;
899         }
900
901         /* Special-case sensor readings */
902         switch (priv->kind) {
903         case aquastreamxt:
904                 /* Info provided with every report */
905                 priv->serial_number[0] = get_unaligned_le16(priv->buffer +
906                                                             priv->serial_number_start_offset);
907                 priv->firmware_version =
908                         get_unaligned_le16(priv->buffer + priv->firmware_version_offset);
909
910                 /* Read pump speed in RPM */
911                 sensor_value = get_unaligned_le16(priv->buffer + priv->fan_sensor_offsets[0]);
912                 priv->speed_input[0] = aqc_aquastreamxt_convert_pump_rpm(sensor_value);
913
914                 /* Read fan speed in RPM, if available */
915                 sensor_value = get_unaligned_le16(priv->buffer + AQUASTREAMXT_FAN_STATUS_OFFSET);
916                 if (sensor_value == AQUASTREAMXT_FAN_STOPPED) {
917                         priv->speed_input[1] = 0;
918                 } else {
919                         sensor_value =
920                                 get_unaligned_le16(priv->buffer + priv->fan_sensor_offsets[1]);
921                         priv->speed_input[1] = aqc_aquastreamxt_convert_fan_rpm(sensor_value);
922                 }
923
924                 /* Calculation derived from linear regression */
925                 sensor_value = get_unaligned_le16(priv->buffer + AQUASTREAMXT_PUMP_CURR_OFFSET);
926                 priv->current_input[0] = DIV_ROUND_CLOSEST(sensor_value * 176, 100) - 52;
927
928                 sensor_value = get_unaligned_le16(priv->buffer + AQUASTREAMXT_PUMP_VOLTAGE_OFFSET);
929                 priv->voltage_input[0] = DIV_ROUND_CLOSEST(sensor_value * 1000, 61);
930
931                 sensor_value = get_unaligned_le16(priv->buffer + AQUASTREAMXT_FAN_VOLTAGE_OFFSET);
932                 priv->voltage_input[1] = DIV_ROUND_CLOSEST(sensor_value * 1000, 63);
933                 break;
934         default:
935                 break;
936         }
937
938         priv->updated = jiffies;
939
940 unlock_and_return:
941         mutex_unlock(&priv->mutex);
942         return ret;
943 }
944
945 static int aqc_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
946                     int channel, long *val)
947 {
948         int ret;
949         struct aqc_data *priv = dev_get_drvdata(dev);
950
951         if (time_after(jiffies, priv->updated + STATUS_UPDATE_INTERVAL)) {
952                 if (priv->status_report_id != 0) {
953                         /* Legacy devices require manual reads */
954                         ret = aqc_legacy_read(priv);
955                         if (ret < 0)
956                                 return -ENODATA;
957                 } else {
958                         return -ENODATA;
959                 }
960         }
961
962         switch (type) {
963         case hwmon_temp:
964                 switch (attr) {
965                 case hwmon_temp_input:
966                         if (priv->temp_input[channel] == -ENODATA)
967                                 return -ENODATA;
968
969                         *val = priv->temp_input[channel];
970                         break;
971                 case hwmon_temp_offset:
972                         ret =
973                             aqc_get_ctrl_val(priv, priv->temp_ctrl_offset +
974                                              channel * AQC_SENSOR_SIZE, val, AQC_BE16);
975                         if (ret < 0)
976                                 return ret;
977
978                         *val *= 10;
979                         break;
980                 default:
981                         break;
982                 }
983                 break;
984         case hwmon_fan:
985                 switch (attr) {
986                 case hwmon_fan_input:
987                         if (priv->speed_input[channel] == -ENODATA)
988                                 return -ENODATA;
989
990                         *val = priv->speed_input[channel];
991                         break;
992                 case hwmon_fan_min:
993                         *val = priv->speed_input_min[channel];
994                         break;
995                 case hwmon_fan_max:
996                         *val = priv->speed_input_max[channel];
997                         break;
998                 case hwmon_fan_target:
999                         *val = priv->speed_input_target[channel];
1000                         break;
1001                 case hwmon_fan_pulses:
1002                         ret = aqc_get_ctrl_val(priv, priv->flow_pulses_ctrl_offset,
1003                                                val, AQC_BE16);
1004                         if (ret < 0)
1005                                 return ret;
1006                         break;
1007                 default:
1008                         break;
1009                 }
1010                 break;
1011         case hwmon_power:
1012                 *val = priv->power_input[channel];
1013                 break;
1014         case hwmon_pwm:
1015                 switch (priv->kind) {
1016                 case aquaero:
1017                         ret = aqc_get_ctrl_val(priv,
1018                                 AQUAERO_CTRL_PRESET_START + channel * AQUAERO_CTRL_PRESET_SIZE,
1019                                 val, AQC_BE16);
1020                         if (ret < 0)
1021                                 return ret;
1022                         *val = aqc_percent_to_pwm(*val);
1023                         break;
1024                 default:
1025                         ret = aqc_get_ctrl_val(priv, priv->fan_ctrl_offsets[channel],
1026                                                val, AQC_BE16);
1027                         if (ret < 0)
1028                                 return ret;
1029
1030                         *val = aqc_percent_to_pwm(ret);
1031                         break;
1032                 }
1033                 break;
1034         case hwmon_in:
1035                 *val = priv->voltage_input[channel];
1036                 break;
1037         case hwmon_curr:
1038                 *val = priv->current_input[channel];
1039                 break;
1040         default:
1041                 return -EOPNOTSUPP;
1042         }
1043
1044         return 0;
1045 }
1046
1047 static int aqc_read_string(struct device *dev, enum hwmon_sensor_types type, u32 attr,
1048                            int channel, const char **str)
1049 {
1050         struct aqc_data *priv = dev_get_drvdata(dev);
1051
1052         /* Number of sensors that are not calculated */
1053         int num_non_calc_sensors = priv->num_temp_sensors + priv->num_virtual_temp_sensors;
1054
1055         switch (type) {
1056         case hwmon_temp:
1057                 if (channel < priv->num_temp_sensors) {
1058                         *str = priv->temp_label[channel];
1059                 } else {
1060                         if (priv->kind == aquaero && channel >= num_non_calc_sensors)
1061                                 *str =
1062                                     priv->calc_virt_temp_label[channel - num_non_calc_sensors];
1063                         else
1064                                 *str = priv->virtual_temp_label[channel - priv->num_temp_sensors];
1065                 }
1066                 break;
1067         case hwmon_fan:
1068                 *str = priv->speed_label[channel];
1069                 break;
1070         case hwmon_power:
1071                 *str = priv->power_label[channel];
1072                 break;
1073         case hwmon_in:
1074                 *str = priv->voltage_label[channel];
1075                 break;
1076         case hwmon_curr:
1077                 *str = priv->current_label[channel];
1078                 break;
1079         default:
1080                 return -EOPNOTSUPP;
1081         }
1082
1083         return 0;
1084 }
1085
1086 static int aqc_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel,
1087                      long val)
1088 {
1089         int ret, pwm_value;
1090         /* Arrays for setting multiple values at once in the control report */
1091         int ctrl_values_offsets[4];
1092         long ctrl_values[4];
1093         int ctrl_values_types[4];
1094         struct aqc_data *priv = dev_get_drvdata(dev);
1095
1096         switch (type) {
1097         case hwmon_temp:
1098                 switch (attr) {
1099                 case hwmon_temp_offset:
1100                         /* Limit temp offset to +/- 15K as in the official software */
1101                         val = clamp_val(val, -15000, 15000) / 10;
1102                         ret =
1103                             aqc_set_ctrl_val(priv, priv->temp_ctrl_offset +
1104                                              channel * AQC_SENSOR_SIZE, val, AQC_BE16);
1105                         if (ret < 0)
1106                                 return ret;
1107                         break;
1108                 default:
1109                         return -EOPNOTSUPP;
1110                 }
1111                 break;
1112         case hwmon_fan:
1113                 switch (attr) {
1114                 case hwmon_fan_pulses:
1115                         val = clamp_val(val, 10, 1000);
1116                         ret = aqc_set_ctrl_val(priv, priv->flow_pulses_ctrl_offset,
1117                                                val, AQC_BE16);
1118                         if (ret < 0)
1119                                 return ret;
1120                         break;
1121                 default:
1122                         break;
1123                 }
1124                 break;
1125         case hwmon_pwm:
1126                 switch (attr) {
1127                 case hwmon_pwm_input:
1128                         pwm_value = aqc_pwm_to_percent(val);
1129                         if (pwm_value < 0)
1130                                 return pwm_value;
1131
1132                         switch (priv->kind) {
1133                         case aquaero:
1134                                 /* Write pwm value to preset corresponding to the channel */
1135                                 ctrl_values_offsets[0] = AQUAERO_CTRL_PRESET_START +
1136                                     channel * AQUAERO_CTRL_PRESET_SIZE;
1137                                 ctrl_values[0] = pwm_value;
1138                                 ctrl_values_types[0] = AQC_BE16;
1139
1140                                 /* Write preset number in fan control source */
1141                                 ctrl_values_offsets[1] = priv->fan_ctrl_offsets[channel] +
1142                                     AQUAERO_FAN_CTRL_SRC_OFFSET;
1143                                 ctrl_values[1] = AQUAERO_CTRL_PRESET_ID + channel;
1144                                 ctrl_values_types[1] = AQC_BE16;
1145
1146                                 /* Set minimum power to 0 to allow the fan to turn off */
1147                                 ctrl_values_offsets[2] = priv->fan_ctrl_offsets[channel] +
1148                                     AQUAERO_FAN_CTRL_MIN_PWR_OFFSET;
1149                                 ctrl_values[2] = 0;
1150                                 ctrl_values_types[2] = AQC_BE16;
1151
1152                                 /* Set maximum power to 255 to allow the fan to reach max speed */
1153                                 ctrl_values_offsets[3] = priv->fan_ctrl_offsets[channel] +
1154                                     AQUAERO_FAN_CTRL_MAX_PWR_OFFSET;
1155                                 ctrl_values[3] = aqc_pwm_to_percent(255);
1156                                 ctrl_values_types[3] = AQC_BE16;
1157
1158                                 ret = aqc_set_ctrl_vals(priv, ctrl_values_offsets, ctrl_values,
1159                                                         ctrl_values_types, 4);
1160                                 if (ret < 0)
1161                                         return ret;
1162                                 break;
1163                         default:
1164                                 ret = aqc_set_ctrl_val(priv, priv->fan_ctrl_offsets[channel],
1165                                                        pwm_value, AQC_BE16);
1166                                 if (ret < 0)
1167                                         return ret;
1168                                 break;
1169                         }
1170                         break;
1171                 default:
1172                         break;
1173                 }
1174                 break;
1175         default:
1176                 return -EOPNOTSUPP;
1177         }
1178
1179         return 0;
1180 }
1181
1182 static const struct hwmon_ops aqc_hwmon_ops = {
1183         .is_visible = aqc_is_visible,
1184         .read = aqc_read,
1185         .read_string = aqc_read_string,
1186         .write = aqc_write
1187 };
1188
1189 static const struct hwmon_channel_info * const aqc_info[] = {
1190         HWMON_CHANNEL_INFO(temp,
1191                            HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1192                            HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1193                            HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1194                            HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1195                            HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1196                            HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1197                            HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1198                            HWMON_T_INPUT | HWMON_T_LABEL | HWMON_T_OFFSET,
1199                            HWMON_T_INPUT | HWMON_T_LABEL,
1200                            HWMON_T_INPUT | HWMON_T_LABEL,
1201                            HWMON_T_INPUT | HWMON_T_LABEL,
1202                            HWMON_T_INPUT | HWMON_T_LABEL,
1203                            HWMON_T_INPUT | HWMON_T_LABEL,
1204                            HWMON_T_INPUT | HWMON_T_LABEL,
1205                            HWMON_T_INPUT | HWMON_T_LABEL,
1206                            HWMON_T_INPUT | HWMON_T_LABEL,
1207                            HWMON_T_INPUT | HWMON_T_LABEL,
1208                            HWMON_T_INPUT | HWMON_T_LABEL,
1209                            HWMON_T_INPUT | HWMON_T_LABEL,
1210                            HWMON_T_INPUT | HWMON_T_LABEL),
1211         HWMON_CHANNEL_INFO(fan,
1212                            HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_MIN | HWMON_F_MAX |
1213                            HWMON_F_TARGET,
1214                            HWMON_F_INPUT | HWMON_F_LABEL,
1215                            HWMON_F_INPUT | HWMON_F_LABEL,
1216                            HWMON_F_INPUT | HWMON_F_LABEL,
1217                            HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_PULSES,
1218                            HWMON_F_INPUT | HWMON_F_LABEL,
1219                            HWMON_F_INPUT | HWMON_F_LABEL,
1220                            HWMON_F_INPUT | HWMON_F_LABEL),
1221         HWMON_CHANNEL_INFO(power,
1222                            HWMON_P_INPUT | HWMON_P_LABEL,
1223                            HWMON_P_INPUT | HWMON_P_LABEL,
1224                            HWMON_P_INPUT | HWMON_P_LABEL,
1225                            HWMON_P_INPUT | HWMON_P_LABEL,
1226                            HWMON_P_INPUT | HWMON_P_LABEL,
1227                            HWMON_P_INPUT | HWMON_P_LABEL,
1228                            HWMON_P_INPUT | HWMON_P_LABEL,
1229                            HWMON_P_INPUT | HWMON_P_LABEL),
1230         HWMON_CHANNEL_INFO(pwm,
1231                            HWMON_PWM_INPUT,
1232                            HWMON_PWM_INPUT,
1233                            HWMON_PWM_INPUT,
1234                            HWMON_PWM_INPUT,
1235                            HWMON_PWM_INPUT,
1236                            HWMON_PWM_INPUT,
1237                            HWMON_PWM_INPUT,
1238                            HWMON_PWM_INPUT),
1239         HWMON_CHANNEL_INFO(in,
1240                            HWMON_I_INPUT | HWMON_I_LABEL,
1241                            HWMON_I_INPUT | HWMON_I_LABEL,
1242                            HWMON_I_INPUT | HWMON_I_LABEL,
1243                            HWMON_I_INPUT | HWMON_I_LABEL,
1244                            HWMON_I_INPUT | HWMON_I_LABEL,
1245                            HWMON_I_INPUT | HWMON_I_LABEL,
1246                            HWMON_I_INPUT | HWMON_I_LABEL,
1247                            HWMON_I_INPUT | HWMON_I_LABEL),
1248         HWMON_CHANNEL_INFO(curr,
1249                            HWMON_C_INPUT | HWMON_C_LABEL,
1250                            HWMON_C_INPUT | HWMON_C_LABEL,
1251                            HWMON_C_INPUT | HWMON_C_LABEL,
1252                            HWMON_C_INPUT | HWMON_C_LABEL,
1253                            HWMON_C_INPUT | HWMON_C_LABEL,
1254                            HWMON_C_INPUT | HWMON_C_LABEL,
1255                            HWMON_C_INPUT | HWMON_C_LABEL,
1256                            HWMON_C_INPUT | HWMON_C_LABEL),
1257         NULL
1258 };
1259
1260 static const struct hwmon_chip_info aqc_chip_info = {
1261         .ops = &aqc_hwmon_ops,
1262         .info = aqc_info,
1263 };
1264
1265 static int aqc_raw_event(struct hid_device *hdev, struct hid_report *report, u8 *data, int size)
1266 {
1267         int i, j, sensor_value;
1268         struct aqc_data *priv;
1269
1270         if (report->id != STATUS_REPORT_ID)
1271                 return 0;
1272
1273         priv = hid_get_drvdata(hdev);
1274
1275         /* Info provided with every report */
1276         priv->serial_number[0] = get_unaligned_be16(data + priv->serial_number_start_offset);
1277         priv->serial_number[1] = get_unaligned_be16(data + priv->serial_number_start_offset +
1278                                                     SERIAL_PART_OFFSET);
1279         priv->firmware_version = get_unaligned_be16(data + priv->firmware_version_offset);
1280
1281         /* Physical temperature sensor readings */
1282         for (i = 0; i < priv->num_temp_sensors; i++) {
1283                 sensor_value = get_unaligned_be16(data +
1284                                                   priv->temp_sensor_start_offset +
1285                                                   i * AQC_SENSOR_SIZE);
1286                 if (sensor_value == AQC_SENSOR_NA)
1287                         priv->temp_input[i] = -ENODATA;
1288                 else
1289                         priv->temp_input[i] = sensor_value * 10;
1290         }
1291
1292         /* Virtual temperature sensor readings */
1293         for (j = 0; j < priv->num_virtual_temp_sensors; j++) {
1294                 sensor_value = get_unaligned_be16(data +
1295                                                   priv->virtual_temp_sensor_start_offset +
1296                                                   j * AQC_SENSOR_SIZE);
1297                 if (sensor_value == AQC_SENSOR_NA)
1298                         priv->temp_input[i] = -ENODATA;
1299                 else
1300                         priv->temp_input[i] = sensor_value * 10;
1301                 i++;
1302         }
1303
1304         /* Fan speed and related readings */
1305         for (i = 0; i < priv->num_fans; i++) {
1306                 priv->speed_input[i] =
1307                     get_unaligned_be16(data + priv->fan_sensor_offsets[i] +
1308                                        priv->fan_structure->speed);
1309                 priv->power_input[i] =
1310                     get_unaligned_be16(data + priv->fan_sensor_offsets[i] +
1311                                        priv->fan_structure->power) * 10000;
1312                 priv->voltage_input[i] =
1313                     get_unaligned_be16(data + priv->fan_sensor_offsets[i] +
1314                                        priv->fan_structure->voltage) * 10;
1315                 priv->current_input[i] =
1316                     get_unaligned_be16(data + priv->fan_sensor_offsets[i] +
1317                                        priv->fan_structure->curr);
1318         }
1319
1320         /* Flow sensor readings */
1321         for (j = 0; j < priv->num_flow_sensors; j++) {
1322                 priv->speed_input[i] = get_unaligned_be16(data + priv->flow_sensors_start_offset +
1323                                                           j * AQC_SENSOR_SIZE);
1324                 i++;
1325         }
1326
1327         if (priv->power_cycle_count_offset != 0)
1328                 priv->power_cycles = get_unaligned_be32(data + priv->power_cycle_count_offset);
1329
1330         /* Special-case sensor readings */
1331         switch (priv->kind) {
1332         case aquaero:
1333                 /* Read calculated virtual temp sensors */
1334                 i = priv->num_temp_sensors + priv->num_virtual_temp_sensors;
1335                 for (j = 0; j < priv->num_calc_virt_temp_sensors; j++) {
1336                         sensor_value = get_unaligned_be16(data +
1337                                         priv->calc_virt_temp_sensor_start_offset +
1338                                         j * AQC_SENSOR_SIZE);
1339                         if (sensor_value == AQC_SENSOR_NA)
1340                                 priv->temp_input[i] = -ENODATA;
1341                         else
1342                                 priv->temp_input[i] = sensor_value * 10;
1343                         i++;
1344                 }
1345                 break;
1346         case aquastreamult:
1347                 priv->speed_input[1] = get_unaligned_be16(data + AQUASTREAMULT_PUMP_OFFSET);
1348                 priv->speed_input[2] = get_unaligned_be16(data + AQUASTREAMULT_PRESSURE_OFFSET);
1349                 priv->speed_input[3] = get_unaligned_be16(data + AQUASTREAMULT_FLOW_SENSOR_OFFSET);
1350
1351                 priv->power_input[1] = get_unaligned_be16(data + AQUASTREAMULT_PUMP_POWER) * 10000;
1352
1353                 priv->voltage_input[1] = get_unaligned_be16(data + AQUASTREAMULT_PUMP_VOLTAGE) * 10;
1354
1355                 priv->current_input[1] = get_unaligned_be16(data + AQUASTREAMULT_PUMP_CURRENT);
1356                 break;
1357         case d5next:
1358                 priv->voltage_input[2] = get_unaligned_be16(data + D5NEXT_5V_VOLTAGE) * 10;
1359                 priv->voltage_input[3] = get_unaligned_be16(data + D5NEXT_12V_VOLTAGE) * 10;
1360                 break;
1361         case highflownext:
1362                 /* If external temp sensor is not connected, its power reading is also N/A */
1363                 if (priv->temp_input[1] == -ENODATA)
1364                         priv->power_input[0] = -ENODATA;
1365                 else
1366                         priv->power_input[0] =
1367                             get_unaligned_be16(data + HIGHFLOWNEXT_POWER) * 1000000;
1368
1369                 priv->voltage_input[0] = get_unaligned_be16(data + HIGHFLOWNEXT_5V_VOLTAGE) * 10;
1370                 priv->voltage_input[1] =
1371                     get_unaligned_be16(data + HIGHFLOWNEXT_5V_VOLTAGE_USB) * 10;
1372
1373                 priv->speed_input[1] = get_unaligned_be16(data + HIGHFLOWNEXT_WATER_QUALITY);
1374                 priv->speed_input[2] = get_unaligned_be16(data + HIGHFLOWNEXT_CONDUCTIVITY);
1375                 break;
1376         case leakshield:
1377                 priv->speed_input[0] =
1378                     ((s16)get_unaligned_be16(data + LEAKSHIELD_PRESSURE_ADJUSTED)) * 100;
1379                 priv->speed_input_min[0] = get_unaligned_be16(data + LEAKSHIELD_PRESSURE_MIN) * 100;
1380                 priv->speed_input_target[0] =
1381                     get_unaligned_be16(data + LEAKSHIELD_PRESSURE_TARGET) * 100;
1382                 priv->speed_input_max[0] = get_unaligned_be16(data + LEAKSHIELD_PRESSURE_MAX) * 100;
1383
1384                 priv->speed_input[1] = get_unaligned_be16(data + LEAKSHIELD_PUMP_RPM_IN);
1385                 if (priv->speed_input[1] == AQC_SENSOR_NA)
1386                         priv->speed_input[1] = -ENODATA;
1387
1388                 priv->speed_input[2] = get_unaligned_be16(data + LEAKSHIELD_FLOW_IN);
1389                 if (priv->speed_input[2] == AQC_SENSOR_NA)
1390                         priv->speed_input[2] = -ENODATA;
1391
1392                 priv->speed_input[3] = get_unaligned_be16(data + LEAKSHIELD_RESERVOIR_VOLUME);
1393                 priv->speed_input[4] = get_unaligned_be16(data + LEAKSHIELD_RESERVOIR_FILLED);
1394
1395                 /* Second temp sensor is not positioned after the first one, read it here */
1396                 priv->temp_input[1] = get_unaligned_be16(data + LEAKSHIELD_TEMPERATURE_2) * 10;
1397                 break;
1398         default:
1399                 break;
1400         }
1401
1402         priv->updated = jiffies;
1403
1404         return 0;
1405 }
1406
1407 #ifdef CONFIG_DEBUG_FS
1408
1409 static int serial_number_show(struct seq_file *seqf, void *unused)
1410 {
1411         struct aqc_data *priv = seqf->private;
1412
1413         seq_printf(seqf, "%05u-%05u\n", priv->serial_number[0], priv->serial_number[1]);
1414
1415         return 0;
1416 }
1417 DEFINE_SHOW_ATTRIBUTE(serial_number);
1418
1419 static int firmware_version_show(struct seq_file *seqf, void *unused)
1420 {
1421         struct aqc_data *priv = seqf->private;
1422
1423         seq_printf(seqf, "%u\n", priv->firmware_version);
1424
1425         return 0;
1426 }
1427 DEFINE_SHOW_ATTRIBUTE(firmware_version);
1428
1429 static int power_cycles_show(struct seq_file *seqf, void *unused)
1430 {
1431         struct aqc_data *priv = seqf->private;
1432
1433         seq_printf(seqf, "%u\n", priv->power_cycles);
1434
1435         return 0;
1436 }
1437 DEFINE_SHOW_ATTRIBUTE(power_cycles);
1438
1439 static void aqc_debugfs_init(struct aqc_data *priv)
1440 {
1441         char name[64];
1442
1443         scnprintf(name, sizeof(name), "%s_%s-%s", "aquacomputer", priv->name,
1444                   dev_name(&priv->hdev->dev));
1445
1446         priv->debugfs = debugfs_create_dir(name, NULL);
1447
1448         if (priv->serial_number_start_offset != 0)
1449                 debugfs_create_file("serial_number", 0444, priv->debugfs, priv,
1450                                     &serial_number_fops);
1451         if (priv->firmware_version_offset != 0)
1452                 debugfs_create_file("firmware_version", 0444, priv->debugfs, priv,
1453                                     &firmware_version_fops);
1454         if (priv->power_cycle_count_offset != 0)
1455                 debugfs_create_file("power_cycles", 0444, priv->debugfs, priv, &power_cycles_fops);
1456 }
1457
1458 #else
1459
1460 static void aqc_debugfs_init(struct aqc_data *priv)
1461 {
1462 }
1463
1464 #endif
1465
1466 static int aqc_probe(struct hid_device *hdev, const struct hid_device_id *id)
1467 {
1468         struct aqc_data *priv;
1469         int ret;
1470
1471         priv = devm_kzalloc(&hdev->dev, sizeof(*priv), GFP_KERNEL);
1472         if (!priv)
1473                 return -ENOMEM;
1474
1475         priv->hdev = hdev;
1476         hid_set_drvdata(hdev, priv);
1477
1478         priv->updated = jiffies - STATUS_UPDATE_INTERVAL;
1479
1480         ret = hid_parse(hdev);
1481         if (ret)
1482                 return ret;
1483
1484         ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW);
1485         if (ret)
1486                 return ret;
1487
1488         ret = hid_hw_open(hdev);
1489         if (ret)
1490                 goto fail_and_stop;
1491
1492         switch (hdev->product) {
1493         case USB_PRODUCT_ID_AQUAERO:
1494                 /*
1495                  * Aquaero presents itself as three HID devices under the same product ID:
1496                  * "aquaero keyboard/mouse", "aquaero System Control" and "aquaero Device",
1497                  * which is the one we want to communicate with. Unlike most other Aquacomputer
1498                  * devices, Aquaero does not return meaningful data when explicitly requested
1499                  * using GET_FEATURE_REPORT.
1500                  *
1501                  * The difference between "aquaero Device" and the other two is in the collections
1502                  * they present. The two other devices have the type of the second element in
1503                  * their respective collections set to 1, while the real device has it set to 0.
1504                  */
1505                 if (hdev->collection[1].type != 0) {
1506                         ret = -ENODEV;
1507                         goto fail_and_close;
1508                 }
1509
1510                 priv->kind = aquaero;
1511
1512                 priv->num_fans = AQUAERO_NUM_FANS;
1513                 priv->fan_sensor_offsets = aquaero_sensor_fan_offsets;
1514                 priv->fan_ctrl_offsets = aquaero_ctrl_fan_offsets;
1515
1516                 priv->num_temp_sensors = AQUAERO_NUM_SENSORS;
1517                 priv->temp_sensor_start_offset = AQUAERO_SENSOR_START;
1518                 priv->num_virtual_temp_sensors = AQUAERO_NUM_VIRTUAL_SENSORS;
1519                 priv->virtual_temp_sensor_start_offset = AQUAERO_VIRTUAL_SENSOR_START;
1520                 priv->num_calc_virt_temp_sensors = AQUAERO_NUM_CALC_VIRTUAL_SENSORS;
1521                 priv->calc_virt_temp_sensor_start_offset = AQUAERO_CALC_VIRTUAL_SENSOR_START;
1522                 priv->num_flow_sensors = AQUAERO_NUM_FLOW_SENSORS;
1523                 priv->flow_sensors_start_offset = AQUAERO_FLOW_SENSORS_START;
1524
1525                 priv->buffer_size = AQUAERO_CTRL_REPORT_SIZE;
1526                 priv->temp_ctrl_offset = AQUAERO_TEMP_CTRL_OFFSET;
1527
1528                 priv->temp_label = label_temp_sensors;
1529                 priv->virtual_temp_label = label_virtual_temp_sensors;
1530                 priv->calc_virt_temp_label = label_aquaero_calc_temp_sensors;
1531                 priv->speed_label = label_aquaero_speeds;
1532                 priv->power_label = label_fan_power;
1533                 priv->voltage_label = label_fan_voltage;
1534                 priv->current_label = label_fan_current;
1535                 break;
1536         case USB_PRODUCT_ID_D5NEXT:
1537                 priv->kind = d5next;
1538
1539                 priv->num_fans = D5NEXT_NUM_FANS;
1540                 priv->fan_sensor_offsets = d5next_sensor_fan_offsets;
1541                 priv->fan_ctrl_offsets = d5next_ctrl_fan_offsets;
1542
1543                 priv->num_temp_sensors = D5NEXT_NUM_SENSORS;
1544                 priv->temp_sensor_start_offset = D5NEXT_COOLANT_TEMP;
1545                 priv->num_virtual_temp_sensors = D5NEXT_NUM_VIRTUAL_SENSORS;
1546                 priv->virtual_temp_sensor_start_offset = D5NEXT_VIRTUAL_SENSORS_START;
1547                 priv->temp_ctrl_offset = D5NEXT_TEMP_CTRL_OFFSET;
1548
1549                 priv->buffer_size = D5NEXT_CTRL_REPORT_SIZE;
1550
1551                 priv->power_cycle_count_offset = D5NEXT_POWER_CYCLES;
1552
1553                 priv->temp_label = label_d5next_temp;
1554                 priv->virtual_temp_label = label_virtual_temp_sensors;
1555                 priv->speed_label = label_d5next_speeds;
1556                 priv->power_label = label_d5next_power;
1557                 priv->voltage_label = label_d5next_voltages;
1558                 priv->current_label = label_d5next_current;
1559                 break;
1560         case USB_PRODUCT_ID_FARBWERK:
1561                 priv->kind = farbwerk;
1562
1563                 priv->num_fans = 0;
1564
1565                 priv->num_temp_sensors = FARBWERK_NUM_SENSORS;
1566                 priv->temp_sensor_start_offset = FARBWERK_SENSOR_START;
1567
1568                 priv->temp_label = label_temp_sensors;
1569                 break;
1570         case USB_PRODUCT_ID_FARBWERK360:
1571                 priv->kind = farbwerk360;
1572
1573                 priv->num_fans = 0;
1574
1575                 priv->num_temp_sensors = FARBWERK360_NUM_SENSORS;
1576                 priv->temp_sensor_start_offset = FARBWERK360_SENSOR_START;
1577                 priv->num_virtual_temp_sensors = FARBWERK360_NUM_VIRTUAL_SENSORS;
1578                 priv->virtual_temp_sensor_start_offset = FARBWERK360_VIRTUAL_SENSORS_START;
1579                 priv->temp_ctrl_offset = FARBWERK360_TEMP_CTRL_OFFSET;
1580
1581                 priv->buffer_size = FARBWERK360_CTRL_REPORT_SIZE;
1582
1583                 priv->temp_label = label_temp_sensors;
1584                 priv->virtual_temp_label = label_virtual_temp_sensors;
1585                 break;
1586         case USB_PRODUCT_ID_OCTO:
1587                 priv->kind = octo;
1588
1589                 priv->num_fans = OCTO_NUM_FANS;
1590                 priv->fan_sensor_offsets = octo_sensor_fan_offsets;
1591                 priv->fan_ctrl_offsets = octo_ctrl_fan_offsets;
1592
1593                 priv->num_temp_sensors = OCTO_NUM_SENSORS;
1594                 priv->temp_sensor_start_offset = OCTO_SENSOR_START;
1595                 priv->num_virtual_temp_sensors = OCTO_NUM_VIRTUAL_SENSORS;
1596                 priv->virtual_temp_sensor_start_offset = OCTO_VIRTUAL_SENSORS_START;
1597                 priv->temp_ctrl_offset = OCTO_TEMP_CTRL_OFFSET;
1598
1599                 priv->buffer_size = OCTO_CTRL_REPORT_SIZE;
1600
1601                 priv->power_cycle_count_offset = OCTO_POWER_CYCLES;
1602
1603                 priv->temp_label = label_temp_sensors;
1604                 priv->virtual_temp_label = label_virtual_temp_sensors;
1605                 priv->speed_label = label_fan_speed;
1606                 priv->power_label = label_fan_power;
1607                 priv->voltage_label = label_fan_voltage;
1608                 priv->current_label = label_fan_current;
1609                 break;
1610         case USB_PRODUCT_ID_QUADRO:
1611                 priv->kind = quadro;
1612
1613                 priv->num_fans = QUADRO_NUM_FANS;
1614                 priv->fan_sensor_offsets = quadro_sensor_fan_offsets;
1615                 priv->fan_ctrl_offsets = quadro_ctrl_fan_offsets;
1616
1617                 priv->num_temp_sensors = QUADRO_NUM_SENSORS;
1618                 priv->temp_sensor_start_offset = QUADRO_SENSOR_START;
1619                 priv->num_virtual_temp_sensors = QUADRO_NUM_VIRTUAL_SENSORS;
1620                 priv->virtual_temp_sensor_start_offset = QUADRO_VIRTUAL_SENSORS_START;
1621                 priv->num_flow_sensors = QUADRO_NUM_FLOW_SENSORS;
1622                 priv->flow_sensors_start_offset = QUADRO_FLOW_SENSOR_OFFSET;
1623
1624                 priv->temp_ctrl_offset = QUADRO_TEMP_CTRL_OFFSET;
1625
1626                 priv->buffer_size = QUADRO_CTRL_REPORT_SIZE;
1627
1628                 priv->flow_pulses_ctrl_offset = QUADRO_FLOW_PULSES_CTRL_OFFSET;
1629                 priv->power_cycle_count_offset = QUADRO_POWER_CYCLES;
1630
1631                 priv->temp_label = label_temp_sensors;
1632                 priv->virtual_temp_label = label_virtual_temp_sensors;
1633                 priv->speed_label = label_quadro_speeds;
1634                 priv->power_label = label_fan_power;
1635                 priv->voltage_label = label_fan_voltage;
1636                 priv->current_label = label_fan_current;
1637                 break;
1638         case USB_PRODUCT_ID_HIGHFLOWNEXT:
1639                 priv->kind = highflownext;
1640
1641                 priv->num_fans = 0;
1642
1643                 priv->num_temp_sensors = HIGHFLOWNEXT_NUM_SENSORS;
1644                 priv->temp_sensor_start_offset = HIGHFLOWNEXT_SENSOR_START;
1645                 priv->num_flow_sensors = HIGHFLOWNEXT_NUM_FLOW_SENSORS;
1646                 priv->flow_sensors_start_offset = HIGHFLOWNEXT_FLOW;
1647
1648                 priv->power_cycle_count_offset = QUADRO_POWER_CYCLES;
1649
1650                 priv->temp_label = label_highflownext_temp_sensors;
1651                 priv->speed_label = label_highflownext_fan_speed;
1652                 priv->power_label = label_highflownext_power;
1653                 priv->voltage_label = label_highflownext_voltage;
1654                 break;
1655         case USB_PRODUCT_ID_LEAKSHIELD:
1656                 /*
1657                  * Choose the right Leakshield device, because
1658                  * the other one acts as a keyboard
1659                  */
1660                 if (hdev->type != 2) {
1661                         ret = -ENODEV;
1662                         goto fail_and_close;
1663                 }
1664
1665                 priv->kind = leakshield;
1666
1667                 priv->num_fans = 0;
1668                 priv->num_temp_sensors = LEAKSHIELD_NUM_SENSORS;
1669                 priv->temp_sensor_start_offset = LEAKSHIELD_TEMPERATURE_1;
1670
1671                 priv->temp_label = label_leakshield_temp_sensors;
1672                 priv->speed_label = label_leakshield_fan_speed;
1673                 break;
1674         case USB_PRODUCT_ID_AQUASTREAMXT:
1675                 priv->kind = aquastreamxt;
1676
1677                 priv->num_fans = AQUASTREAMXT_NUM_FANS;
1678                 priv->fan_sensor_offsets = aquastreamxt_sensor_fan_offsets;
1679
1680                 priv->num_temp_sensors = AQUASTREAMXT_NUM_SENSORS;
1681                 priv->temp_sensor_start_offset = AQUASTREAMXT_SENSOR_START;
1682                 priv->buffer_size = AQUASTREAMXT_SENSOR_REPORT_SIZE;
1683
1684                 priv->temp_label = label_aquastreamxt_temp_sensors;
1685                 priv->speed_label = label_d5next_speeds;
1686                 priv->voltage_label = label_d5next_voltages;
1687                 priv->current_label = label_d5next_current;
1688                 break;
1689         case USB_PRODUCT_ID_AQUASTREAMULT:
1690                 priv->kind = aquastreamult;
1691
1692                 priv->num_fans = AQUASTREAMULT_NUM_FANS;
1693                 priv->fan_sensor_offsets = aquastreamult_sensor_fan_offsets;
1694
1695                 priv->num_temp_sensors = AQUASTREAMULT_NUM_SENSORS;
1696                 priv->temp_sensor_start_offset = AQUASTREAMULT_SENSOR_START;
1697
1698                 priv->temp_label = label_aquastreamult_temp;
1699                 priv->speed_label = label_aquastreamult_speeds;
1700                 priv->power_label = label_aquastreamult_power;
1701                 priv->voltage_label = label_aquastreamult_voltages;
1702                 priv->current_label = label_aquastreamult_current;
1703                 break;
1704         case USB_PRODUCT_ID_POWERADJUST3:
1705                 priv->kind = poweradjust3;
1706
1707                 priv->num_fans = 0;
1708
1709                 priv->num_temp_sensors = POWERADJUST3_NUM_SENSORS;
1710                 priv->temp_sensor_start_offset = POWERADJUST3_SENSOR_START;
1711                 priv->buffer_size = POWERADJUST3_SENSOR_REPORT_SIZE;
1712
1713                 priv->temp_label = label_poweradjust3_temp_sensors;
1714                 break;
1715         default:
1716                 break;
1717         }
1718
1719         switch (priv->kind) {
1720         case aquaero:
1721                 priv->serial_number_start_offset = AQUAERO_SERIAL_START;
1722                 priv->firmware_version_offset = AQUAERO_FIRMWARE_VERSION;
1723
1724                 priv->fan_structure = &aqc_aquaero_fan_structure;
1725
1726                 priv->ctrl_report_id = AQUAERO_CTRL_REPORT_ID;
1727                 priv->secondary_ctrl_report_id = AQUAERO_SECONDARY_CTRL_REPORT_ID;
1728                 priv->secondary_ctrl_report_size = AQUAERO_SECONDARY_CTRL_REPORT_SIZE;
1729                 priv->secondary_ctrl_report = aquaero_secondary_ctrl_report;
1730                 break;
1731         case poweradjust3:
1732                 priv->status_report_id = POWERADJUST3_STATUS_REPORT_ID;
1733                 break;
1734         case aquastreamxt:
1735                 priv->serial_number_start_offset = AQUASTREAMXT_SERIAL_START;
1736                 priv->firmware_version_offset = AQUASTREAMXT_FIRMWARE_VERSION;
1737
1738                 priv->status_report_id = AQUASTREAMXT_STATUS_REPORT_ID;
1739                 break;
1740         default:
1741                 priv->serial_number_start_offset = AQC_SERIAL_START;
1742                 priv->firmware_version_offset = AQC_FIRMWARE_VERSION;
1743
1744                 priv->ctrl_report_id = CTRL_REPORT_ID;
1745                 priv->secondary_ctrl_report_id = SECONDARY_CTRL_REPORT_ID;
1746                 priv->secondary_ctrl_report_size = SECONDARY_CTRL_REPORT_SIZE;
1747                 priv->secondary_ctrl_report = secondary_ctrl_report;
1748
1749                 if (priv->kind == aquastreamult)
1750                         priv->fan_structure = &aqc_aquastreamult_fan_structure;
1751                 else
1752                         priv->fan_structure = &aqc_general_fan_structure;
1753                 break;
1754         }
1755
1756         if (priv->buffer_size != 0) {
1757                 priv->checksum_start = 0x01;
1758                 priv->checksum_length = priv->buffer_size - 3;
1759                 priv->checksum_offset = priv->buffer_size - 2;
1760         }
1761
1762         priv->name = aqc_device_names[priv->kind];
1763
1764         priv->buffer = devm_kzalloc(&hdev->dev, priv->buffer_size, GFP_KERNEL);
1765         if (!priv->buffer) {
1766                 ret = -ENOMEM;
1767                 goto fail_and_close;
1768         }
1769
1770         mutex_init(&priv->mutex);
1771
1772         priv->hwmon_dev = hwmon_device_register_with_info(&hdev->dev, priv->name, priv,
1773                                                           &aqc_chip_info, NULL);
1774
1775         if (IS_ERR(priv->hwmon_dev)) {
1776                 ret = PTR_ERR(priv->hwmon_dev);
1777                 goto fail_and_close;
1778         }
1779
1780         aqc_debugfs_init(priv);
1781
1782         return 0;
1783
1784 fail_and_close:
1785         hid_hw_close(hdev);
1786 fail_and_stop:
1787         hid_hw_stop(hdev);
1788         return ret;
1789 }
1790
1791 static void aqc_remove(struct hid_device *hdev)
1792 {
1793         struct aqc_data *priv = hid_get_drvdata(hdev);
1794
1795         debugfs_remove_recursive(priv->debugfs);
1796         hwmon_device_unregister(priv->hwmon_dev);
1797
1798         hid_hw_close(hdev);
1799         hid_hw_stop(hdev);
1800 }
1801
1802 static const struct hid_device_id aqc_table[] = {
1803         { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_AQUAERO) },
1804         { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_D5NEXT) },
1805         { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_FARBWERK) },
1806         { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_FARBWERK360) },
1807         { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_OCTO) },
1808         { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_QUADRO) },
1809         { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_HIGHFLOWNEXT) },
1810         { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_LEAKSHIELD) },
1811         { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_AQUASTREAMXT) },
1812         { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_AQUASTREAMULT) },
1813         { HID_USB_DEVICE(USB_VENDOR_ID_AQUACOMPUTER, USB_PRODUCT_ID_POWERADJUST3) },
1814         { }
1815 };
1816
1817 MODULE_DEVICE_TABLE(hid, aqc_table);
1818
1819 static struct hid_driver aqc_driver = {
1820         .name = DRIVER_NAME,
1821         .id_table = aqc_table,
1822         .probe = aqc_probe,
1823         .remove = aqc_remove,
1824         .raw_event = aqc_raw_event,
1825 };
1826
1827 static int __init aqc_init(void)
1828 {
1829         return hid_register_driver(&aqc_driver);
1830 }
1831
1832 static void __exit aqc_exit(void)
1833 {
1834         hid_unregister_driver(&aqc_driver);
1835 }
1836
1837 /* Request to initialize after the HID bus to ensure it's not being loaded before */
1838 late_initcall(aqc_init);
1839 module_exit(aqc_exit);
1840
1841 MODULE_LICENSE("GPL");
1842 MODULE_AUTHOR("Aleksa Savic <savicaleksa83@gmail.com>");
1843 MODULE_AUTHOR("Jack Doan <me@jackdoan.com>");
1844 MODULE_DESCRIPTION("Hwmon driver for Aquacomputer devices");