Re: [PATCH 4/7] hwmon: (max31790) Add support for fanX_enable attributes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



fanX_enable works fine.

Tested-by: Václav Kubernát <kubernat@xxxxxxxxx>

st 26. 5. 2021 v 17:40 odesílatel Guenter Roeck <linux@xxxxxxxxxxxx> napsal:
>
> Since pwmX_enable is now fixed and only handles pwm support instead
> of also enabling/disabling fan tachometers, we need an explicit means
> to do that.
>
> For fan channels 7..12, display the enable status if the channel
> is configured for fan speed reporting. The displayed status matches
> the value of the companion channel but is read-only.
>
> Cc: Jan Kundrát <jan.kundrat@xxxxxxxxx>
> Cc: Václav Kubernát <kubernat@xxxxxxxxx>
> Signed-off-by: Guenter Roeck <linux@xxxxxxxxxxxx>
> ---
>  Documentation/hwmon/max31790.rst |  3 ++
>  drivers/hwmon/max31790.c         | 55 ++++++++++++++++++++++++--------
>  2 files changed, 45 insertions(+), 13 deletions(-)
>
> diff --git a/Documentation/hwmon/max31790.rst b/Documentation/hwmon/max31790.rst
> index 7b097c3b9b90..b43aa32813fd 100644
> --- a/Documentation/hwmon/max31790.rst
> +++ b/Documentation/hwmon/max31790.rst
> @@ -35,6 +35,9 @@ Sysfs entries
>  -------------
>
>  ================== === =======================================================
> +fan[1-12]_enable   RW  0=disable fan speed monitoring, 1=enable fan speed monitoring
> +                       The value is RO for companion channels (7-12). For those
> +                       channels, the value matches the value of the primary channel.
>  fan[1-12]_input    RO  fan tachometer speed in RPM
>  fan[1-12]_fault    RO  fan experienced fault
>  fan[1-6]_target    RW  desired fan speed in RPM
> diff --git a/drivers/hwmon/max31790.c b/drivers/hwmon/max31790.c
> index 67677c437768..19651feb40fb 100644
> --- a/drivers/hwmon/max31790.c
> +++ b/drivers/hwmon/max31790.c
> @@ -170,6 +170,9 @@ static int max31790_read_fan(struct device *dev, u32 attr, int channel,
>                 return PTR_ERR(data);
>
>         switch (attr) {
> +       case hwmon_fan_enable:
> +               *val = !!(data->fan_config[channel % NR_CHANNEL] & MAX31790_FAN_CFG_TACH_INPUT_EN);
> +               return 0;
>         case hwmon_fan_input:
>                 sr = get_tach_period(data->fan_dynamics[channel % NR_CHANNEL]);
>                 rpm = RPM_FROM_REG(data->tach[channel], sr);
> @@ -195,12 +198,32 @@ static int max31790_write_fan(struct device *dev, u32 attr, int channel,
>         struct i2c_client *client = data->client;
>         int target_count;
>         int err = 0;
> -       u8 bits;
> +       u8 bits, config;
>         int sr;
>
>         mutex_lock(&data->update_lock);
>
>         switch (attr) {
> +       case hwmon_fan_enable:
> +               config = data->fan_config[channel];
> +               if (val == 0) {
> +                       /* Disabling TACH_INPUT_EN has no effect in RPM_MODE */
> +                       if (!(config & MAX31790_FAN_CFG_RPM_MODE))
> +                               config &= ~MAX31790_FAN_CFG_TACH_INPUT_EN;
> +               } else if (val == 1) {
> +                       config |= MAX31790_FAN_CFG_TACH_INPUT_EN;
> +               } else {
> +                       err = -EINVAL;
> +                       break;
> +               }
> +               if (config != data->fan_config[channel]) {
> +                       err = i2c_smbus_write_byte_data(client,
> +                                                       MAX31790_REG_FAN_CONFIG(channel),
> +                                                       config);
> +                       if (!err)
> +                               data->fan_config[channel] = config;
> +               }
> +               break;
>         case hwmon_fan_target:
>                 val = clamp_val(val, FAN_RPM_MIN, FAN_RPM_MAX);
>                 bits = bits_for_tach_period(val);
> @@ -240,6 +263,12 @@ static umode_t max31790_fan_is_visible(const void *_data, u32 attr, int channel)
>         u8 fan_config = data->fan_config[channel % NR_CHANNEL];
>
>         switch (attr) {
> +       case hwmon_fan_enable:
> +               if (channel < NR_CHANNEL)
> +                       return 0644;
> +               if (fan_config & MAX31790_FAN_CFG_TACH_INPUT)
> +                       return 0444;
> +               return 0;
>         case hwmon_fan_input:
>         case hwmon_fan_fault:
>                 if (channel < NR_CHANNEL ||
> @@ -404,18 +433,18 @@ static umode_t max31790_is_visible(const void *data,
>
>  static const struct hwmon_channel_info *max31790_info[] = {
>         HWMON_CHANNEL_INFO(fan,
> -                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
> -                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
> -                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
> -                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
> -                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
> -                          HWMON_F_INPUT | HWMON_F_TARGET | HWMON_F_FAULT,
> -                          HWMON_F_INPUT | HWMON_F_FAULT,
> -                          HWMON_F_INPUT | HWMON_F_FAULT,
> -                          HWMON_F_INPUT | HWMON_F_FAULT,
> -                          HWMON_F_INPUT | HWMON_F_FAULT,
> -                          HWMON_F_INPUT | HWMON_F_FAULT,
> -                          HWMON_F_INPUT | 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_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_CHANNEL_INFO(pwm,
>                            HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
>                            HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
> --
> 2.25.1
>




[Index of Archives]     [LM Sensors]     [Linux Sound]     [ALSA Users]     [ALSA Devel]     [Linux Audio Users]     [Linux Media]     [Kernel]     [Gimp]     [Yosemite News]     [Linux Media]

  Powered by Linux