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