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

Václav Kubernát
2021-06-01T08:02:45Z

fanX_enable works fine.

Tested-by: Václav Kubernát <kubernat@cesnet.cz>

st 26. 5. 2021 v 17:40 odesílatel Guenter Roeck <linux@roeck-us.net> 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@cesnet.cz>
> Cc: Václav Kubernát <kubernat@cesnet.cz>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> 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
>