Skip to content

Commit 6ff838f

Browse files
aleksamagickagroeck
authored andcommitted
hwmon: (aquacomputer_d5next) Add support for Quadro flow sensor pulses
Add support for reading and writing flow sensor pulses value on the Aquacomputer Quadro. Implemented by Leonard Anderweit [1]. [1] aleksamagicka/aquacomputer_d5next-hwmon#45 Originally-from: Leonard Anderweit <[email protected]> Signed-off-by: Aleksa Savic <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Guenter Roeck <[email protected]>
1 parent c05f477 commit 6ff838f

File tree

2 files changed

+55
-14
lines changed

2 files changed

+55
-14
lines changed

Documentation/hwmon/aquacomputer_d5next.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ current.
3939

4040
The Quadro exposes four physical and sixteen virtual temperature sensors, a flow
4141
sensor and four PWM controllable fans, along with their speed (in RPM), power,
42-
voltage and current.
42+
voltage and current. Flow sensor pulses are also available.
4343

4444
The Farbwerk and Farbwerk 360 expose four temperature sensors. Additionally,
4545
sixteen virtual temperature sensors of the Farbwerk 360 are exposed.
@@ -64,6 +64,7 @@ Sysfs entries
6464
temp[1-20]_input Physical/virtual temperature sensors (in millidegrees Celsius)
6565
temp[1-4]_offset Temperature sensor correction offset (in millidegrees Celsius)
6666
fan[1-8]_input Pump/fan speed (in RPM) / Flow speed (in dL/h)
67+
fan5_pulses Quadro flow sensor pulses
6768
power[1-8]_input Pump/fan power (in micro Watts)
6869
in[0-7]_input Pump/fan voltage (in milli Volts)
6970
curr[1-8]_input Pump/fan current (in milli Amperes)

drivers/hwmon/aquacomputer_d5next.c

Lines changed: 53 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ static u8 quadro_sensor_fan_offsets[] = { 0x70, 0x7D, 0x8A, 0x97 };
136136

137137
/* Control report offsets for the Quadro */
138138
#define QUADRO_TEMP_CTRL_OFFSET 0xA
139+
#define QUADRO_FLOW_PULSES_CTRL_OFFSET 0x6
139140
static u16 quadro_ctrl_fan_offsets[] = { 0x37, 0x8c, 0xe1, 0x136 }; /* Fan speed offsets (0-100%) */
140141

141142
/* Specs of High Flow Next flow sensor */
@@ -303,6 +304,7 @@ struct aqc_data {
303304
u16 temp_ctrl_offset;
304305
u16 power_cycle_count_offset;
305306
u8 flow_sensor_offset;
307+
u8 flow_pulses_ctrl_offset;
306308

307309
/* General info, same across all devices */
308310
u32 serial_number[2];
@@ -461,20 +463,34 @@ static umode_t aqc_is_visible(const void *data, enum hwmon_sensor_types type, u3
461463
}
462464
break;
463465
case hwmon_fan:
464-
switch (priv->kind) {
465-
case highflownext:
466-
/* Special case to support flow sensor, water quality and conductivity */
467-
if (channel < 3)
468-
return 0444;
466+
switch (attr) {
467+
case hwmon_fan_input:
468+
case hwmon_fan_label:
469+
switch (priv->kind) {
470+
case highflownext:
471+
/* Special case to support flow sensor, water quality
472+
* and conductivity
473+
*/
474+
if (channel < 3)
475+
return 0444;
476+
break;
477+
case quadro:
478+
/* Special case to support flow sensor */
479+
if (channel < priv->num_fans + 1)
480+
return 0444;
481+
break;
482+
default:
483+
if (channel < priv->num_fans)
484+
return 0444;
485+
break;
486+
}
469487
break;
470-
case quadro:
471-
/* Special case to support flow sensor */
472-
if (channel < priv->num_fans + 1)
473-
return 0444;
488+
case hwmon_fan_pulses:
489+
/* Special case for Quadro flow sensor */
490+
if (priv->kind == quadro && channel == priv->num_fans)
491+
return 0644;
474492
break;
475493
default:
476-
if (channel < priv->num_fans)
477-
return 0444;
478494
break;
479495
}
480496
break;
@@ -552,7 +568,18 @@ static int aqc_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
552568
}
553569
break;
554570
case hwmon_fan:
555-
*val = priv->speed_input[channel];
571+
switch (attr) {
572+
case hwmon_fan_input:
573+
*val = priv->speed_input[channel];
574+
break;
575+
case hwmon_fan_pulses:
576+
ret = aqc_get_ctrl_val(priv, priv->flow_pulses_ctrl_offset, val);
577+
if (ret < 0)
578+
return ret;
579+
break;
580+
default:
581+
break;
582+
}
556583
break;
557584
case hwmon_power:
558585
*val = priv->power_input[channel];
@@ -632,6 +659,18 @@ static int aqc_write(struct device *dev, enum hwmon_sensor_types type, u32 attr,
632659
return -EOPNOTSUPP;
633660
}
634661
break;
662+
case hwmon_fan:
663+
switch (attr) {
664+
case hwmon_fan_pulses:
665+
val = clamp_val(val, 10, 1000);
666+
ret = aqc_set_ctrl_val(priv, priv->flow_pulses_ctrl_offset, val);
667+
if (ret < 0)
668+
return ret;
669+
break;
670+
default:
671+
break;
672+
}
673+
break;
635674
case hwmon_pwm:
636675
switch (attr) {
637676
case hwmon_pwm_input:
@@ -691,7 +730,7 @@ static const struct hwmon_channel_info *aqc_info[] = {
691730
HWMON_F_INPUT | HWMON_F_LABEL,
692731
HWMON_F_INPUT | HWMON_F_LABEL,
693732
HWMON_F_INPUT | HWMON_F_LABEL,
694-
HWMON_F_INPUT | HWMON_F_LABEL,
733+
HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_PULSES,
695734
HWMON_F_INPUT | HWMON_F_LABEL,
696735
HWMON_F_INPUT | HWMON_F_LABEL,
697736
HWMON_F_INPUT | HWMON_F_LABEL),
@@ -1000,6 +1039,7 @@ static int aqc_probe(struct hid_device *hdev, const struct hid_device_id *id)
10001039
priv->buffer_size = QUADRO_CTRL_REPORT_SIZE;
10011040

10021041
priv->flow_sensor_offset = QUADRO_FLOW_SENSOR_OFFSET;
1042+
priv->flow_pulses_ctrl_offset = QUADRO_FLOW_PULSES_CTRL_OFFSET;
10031043
priv->power_cycle_count_offset = QUADRO_POWER_CYCLES;
10041044

10051045
priv->temp_label = label_temp_sensors;

0 commit comments

Comments
 (0)