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