Commit 8b3905cf authored by Luuk Paulussen's avatar Luuk Paulussen Committed by Kleber Sacilotto de Souza

hwmon: (adt7475) Make volt2reg return same reg as reg2volt input

BugLink: https://bugs.launchpad.net/bugs/1864773

commit cf3ca187 upstream.

reg2volt returns the voltage that matches a given register value.
Converting this back the other way with volt2reg didn't return the same
register value because it used truncation instead of rounding.

This meant that values read from sysfs could not be written back to sysfs
to set back the same register value.

With this change, volt2reg will return the same value for every voltage
previously returned by reg2volt (for the set of possible input values)
Signed-off-by: default avatarLuuk Paulussen <luuk.paulussen@alliedtelesis.co.nz>
Link: https://lore.kernel.org/r/20191205231659.1301-1-luuk.paulussen@alliedtelesis.co.nz
cc: stable@vger.kernel.org
Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarKhalid Elmously <khalid.elmously@canonical.com>
Signed-off-by: default avatarKleber Sacilotto de Souza <kleber.souza@canonical.com>
parent 80ca4745
...@@ -268,9 +268,10 @@ static inline u16 volt2reg(int channel, long volt, u8 bypass_attn) ...@@ -268,9 +268,10 @@ static inline u16 volt2reg(int channel, long volt, u8 bypass_attn)
long reg; long reg;
if (bypass_attn & (1 << channel)) if (bypass_attn & (1 << channel))
reg = (volt * 1024) / 2250; reg = DIV_ROUND_CLOSEST(volt * 1024, 2250);
else else
reg = (volt * r[1] * 1024) / ((r[0] + r[1]) * 2250); reg = DIV_ROUND_CLOSEST(volt * r[1] * 1024,
(r[0] + r[1]) * 2250);
return clamp_val(reg, 0, 1023) & (0xff << 2); return clamp_val(reg, 0, 1023) & (0xff << 2);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment