| From 8d3be2538cda20113b4295df7ae6548bcc135cd6 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 26 May 2021 08:40:17 -0700 |
| Subject: hwmon: (max31790) Report correct current pwm duty cycles |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Guenter Roeck <linux@roeck-us.net> |
| |
| [ Upstream commit 897f6339893b741a5d68ae8e2475df65946041c2 ] |
| |
| The MAX31790 has two sets of registers for pwm duty cycles, one to request |
| a duty cycle and one to read the actual current duty cycle. Both do not |
| have to be the same. |
| |
| When reporting the pwm duty cycle to the user, the actual pwm duty cycle |
| from pwm duty cycle registers needs to be reported. When setting it, the |
| pwm target duty cycle needs to be written. Since we don't know the actual |
| pwm duty cycle after a target pwm duty cycle has been written, set the |
| valid flag to false to indicate that actual pwm duty cycle should be read |
| from the chip instead of using cached values. |
| |
| 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> |
| Tested-by: Václav Kubernát <kubernat@ceesnet.cz> |
| Reviewed-by: Jan Kundrát <jan.kundrat@cesnet.cz> |
| Link: https://lore.kernel.org/r/20210526154022.3223012-3-linux@roeck-us.net |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| Documentation/hwmon/max31790.rst | 3 ++- |
| drivers/hwmon/max31790.c | 6 +++--- |
| 2 files changed, 5 insertions(+), 4 deletions(-) |
| |
| diff --git a/Documentation/hwmon/max31790.rst b/Documentation/hwmon/max31790.rst |
| index f301385d8cef..54ff0f49e28f 100644 |
| --- a/Documentation/hwmon/max31790.rst |
| +++ b/Documentation/hwmon/max31790.rst |
| @@ -39,5 +39,6 @@ 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 |
| pwm[1-6]_enable RW regulator mode, 0=disabled, 1=manual mode, 2=rpm mode |
| -pwm[1-6] RW fan target duty cycle (0-255) |
| +pwm[1-6] RW read: current pwm duty cycle, |
| + write: target pwm duty cycle (0-255) |
| ================== === ======================================================= |
| diff --git a/drivers/hwmon/max31790.c b/drivers/hwmon/max31790.c |
| index 86e6c71db685..8ad7a45bfe68 100644 |
| --- a/drivers/hwmon/max31790.c |
| +++ b/drivers/hwmon/max31790.c |
| @@ -104,7 +104,7 @@ static struct max31790_data *max31790_update_device(struct device *dev) |
| data->tach[NR_CHANNEL + i] = rv; |
| } else { |
| rv = i2c_smbus_read_word_swapped(client, |
| - MAX31790_REG_PWMOUT(i)); |
| + MAX31790_REG_PWM_DUTY_CYCLE(i)); |
| if (rv < 0) |
| goto abort; |
| data->pwm[i] = rv; |
| @@ -299,10 +299,10 @@ static int max31790_write_pwm(struct device *dev, u32 attr, int channel, |
| err = -EINVAL; |
| break; |
| } |
| - data->pwm[channel] = val << 8; |
| + data->valid = false; |
| err = i2c_smbus_write_word_swapped(client, |
| MAX31790_REG_PWMOUT(channel), |
| - data->pwm[channel]); |
| + val << 8); |
| break; |
| case hwmon_pwm_enable: |
| fan_config = data->fan_config[channel]; |
| -- |
| 2.30.2 |
| |