| From cf3ca1877574a306c0207cbf7fdf25419d9229df Mon Sep 17 00:00:00 2001 |
| From: Luuk Paulussen <luuk.paulussen@alliedtelesis.co.nz> |
| Date: Fri, 6 Dec 2019 12:16:59 +1300 |
| Subject: hwmon: (adt7475) Make volt2reg return same reg as reg2volt input |
| |
| From: Luuk Paulussen <luuk.paulussen@alliedtelesis.co.nz> |
| |
| commit cf3ca1877574a306c0207cbf7fdf25419d9229df 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: Luuk 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: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/hwmon/adt7475.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/hwmon/adt7475.c |
| +++ b/drivers/hwmon/adt7475.c |
| @@ -268,9 +268,10 @@ static inline u16 volt2reg(int channel, |
| long reg; |
| |
| if (bypass_attn & (1 << channel)) |
| - reg = (volt * 1024) / 2250; |
| + reg = DIV_ROUND_CLOSEST(volt * 1024, 2250); |
| 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); |
| } |
| |