@@ -39,6 +39,7 @@ fan[1-12]_enable RW enable fan speed monitoring
fan[1-12]_pulses RW pulses per fan revolution (default: 2)
fan[1-12]_input RO fan tachometer speed in RPM
fan[1-12]_fault RO fan experienced fault
+fan[1-12]_div RW set the measurable speed range, not available in RPM mode
fan[1-6]_target RW desired fan speed in RPM
pwm[1-6]_enable RW regulator mode, 0=full speed, 1=manual (pwm) mode, 2=rpm mode
setting rpm mode sets fan*_enable to 1
@@ -57,7 +57,8 @@
#define U16_LSB(num) ((num) & 0x00FF)
#define FAN_INFO_1_TO_6 \
- (HWMON_F_PULSES | \
+ (HWMON_F_DIV | \
+ HWMON_F_PULSES | \
HWMON_F_ENABLE | \
HWMON_F_INPUT | \
HWMON_F_TARGET | \
@@ -221,6 +222,26 @@ static u8 bits_for_tach_period(int rpm)
return bits;
}
+static int bits_for_speed_range(int speed_range)
+{
+ switch (speed_range) {
+ case 1:
+ return 0x0;
+ case 2:
+ return 0x1;
+ case 4:
+ return 0x2;
+ case 8:
+ return 0x3;
+ case 16:
+ return 0x4;
+ case 32:
+ return 0x5;
+ default:
+ return -1;
+ }
+}
+
static int max31790_read_fan(struct device *dev, u32 attr, int channel,
long *val)
{
@@ -264,6 +285,9 @@ static int max31790_read_fan(struct device *dev, u32 attr, int channel,
case hwmon_fan_pulses:
*val = data->pulses[channel];
return 0;
+ case hwmon_fan_div:
+ *val = get_tach_period(data->fan_config[channel]);
+ return 0;
default:
return -EOPNOTSUPP;
}
@@ -321,6 +345,25 @@ static int max31790_write_fan(struct device *dev, u32 attr, int channel,
case hwmon_fan_pulses:
data->pulses[channel] = val;
break;
+ case hwmon_fan_div:
+ if (data->fan_config[channel] & MAX31790_FAN_CFG_RPM_MODE) {
+ err = -EINVAL;
+ break;
+ }
+ sr = bits_for_speed_range(val);
+ if (sr < 0) {
+ err = -EINVAL;
+ break;
+ }
+
+ data->fan_dynamics[channel] =
+ ((data->fan_dynamics[channel] &
+ ~MAX31790_FAN_DYN_SR_MASK) |
+ (sr << MAX31790_FAN_DYN_SR_SHIFT));
+ err = regmap_write(regmap,
+ MAX31790_REG_FAN_DYNAMICS(channel),
+ data->fan_dynamics[channel]);
+ break;
default:
err = -EOPNOTSUPP;
break;
@@ -353,6 +396,7 @@ static umode_t max31790_fan_is_visible(const void *_data, u32 attr, int channel)
(fan_config & MAX31790_FAN_CFG_TACH_INPUT))
return 0644;
return 0;
+ case hwmon_fan_div:
case hwmon_fan_pulses:
if (channel < NR_CHANNEL)
return 0644;
Right now, the divisor (which determines the speed range) is only set when in RPM mode. However, the speed range also affects the input RPM, which means, to get more accurate readings, this speed range needs to be set. Signed-off-by: Václav Kubernát <kubernat@cesnet.cz> --- Documentation/hwmon/max31790.rst | 1 + drivers/hwmon/max31790.c | 46 +++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-)