lkml.org 
[lkml]   [2021]   [Apr]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 4/5] hwmon: (max31790) Allow setting fan*_div
    Date
    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 | 66 ++++++++++++++++++++++++++------
    2 files changed, 55 insertions(+), 12 deletions(-)

    diff --git a/Documentation/hwmon/max31790.rst b/Documentation/hwmon/max31790.rst
    index 8979c8a02cd1..2979addeac8f 100644
    --- a/Documentation/hwmon/max31790.rst
    +++ b/Documentation/hwmon/max31790.rst
    @@ -38,6 +38,7 @@ Sysfs entries
    fan[1-12]_enable RW enable fan speed monitoring
    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
    diff --git a/drivers/hwmon/max31790.c b/drivers/hwmon/max31790.c
    index 842749482ba4..9f8562d28a3b 100644
    --- a/drivers/hwmon/max31790.c
    +++ b/drivers/hwmon/max31790.c
    @@ -158,6 +158,26 @@ static int write_reg_word(struct regmap *regmap, u8 reg, u16 val)
    return regmap_bulk_write(regmap, reg, bulk_val, 2);
    }

    +static int bits_for_speed_range(long 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)
    {
    @@ -205,6 +225,9 @@ static int max31790_read_fan(struct device *dev, u32 attr, int channel,
    case hwmon_fan_enable:
    *val = !!(data->fan_config[channel] & MAX31790_FAN_CFG_TACH_INPUT_EN);
    return 0;
    + case hwmon_fan_div:
    + *val = get_tach_period(data->fan_config[channel]);
    + return 0;
    default:
    return -EOPNOTSUPP;
    }
    @@ -256,6 +279,24 @@ static int max31790_write_fan(struct device *dev, u32 attr, int channel,
    MAX31790_REG_FAN_CONFIG(channel),
    data->fan_config[channel]);
    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;
    @@ -284,6 +325,7 @@ static umode_t max31790_fan_is_visible(const void *_data, u32 attr, int channel)
    return 0644;
    return 0;
    case hwmon_fan_enable:
    + case hwmon_fan_div:
    if (channel < NR_CHANNEL ||
    (fan_config & MAX31790_FAN_CFG_TACH_INPUT))
    return 0644;
    @@ -442,18 +484,18 @@ static umode_t max31790_is_visible(const void *data,

    static const struct hwmon_channel_info *max31790_info[] = {
    HWMON_CHANNEL_INFO(fan,
    - HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
    - HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
    - HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
    - HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
    - HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
    - HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
    - HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_FAULT,
    - HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_FAULT,
    - HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_FAULT,
    - HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_FAULT,
    - HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_FAULT,
    - HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_FAULT),
    + HWMON_F_DIV | HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
    + HWMON_F_DIV | HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
    + HWMON_F_DIV | HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
    + HWMON_F_DIV | HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
    + HWMON_F_DIV | HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
    + HWMON_F_DIV | HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
    + HWMON_F_DIV | HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_FAULT,
    + HWMON_F_DIV | HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_FAULT,
    + HWMON_F_DIV | HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_FAULT,
    + HWMON_F_DIV | HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_FAULT,
    + HWMON_F_DIV | HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_FAULT,
    + HWMON_F_DIV | HWMON_F_ENABLE | HWMON_F_INPUT | HWMON_F_FAULT),
    HWMON_CHANNEL_INFO(pwm,
    HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
    HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
    --
    2.31.1
    \
     
     \ /
      Last update: 2021-04-26 14:39    [W:2.386 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site