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