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