![Alexandru Gagniuc](/assets/img/avatar_default.png)
These patches support the tps23861 PoE controller found on a number of managed switches. The TPS23861 is an I2C-based quad IEEE 802.3at (PoE+) Power-over-Ethernet PSE controller. It's also found on some Realtek based switches, where we expect the bulk of the users to reside. Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com> [Disable driver in generic/config-5.10] Signed-off-by: Sander Vanheule <sander@svanheule.net>
67 lines
2.2 KiB
Diff
67 lines
2.2 KiB
Diff
From 0eabb1396656f215a5333a9444158b17b0fd3247 Mon Sep 17 00:00:00 2001
|
|
From: Alexandru Gagniuc <mr.nuke.me@gmail.com>
|
|
Date: Wed, 20 Jul 2022 22:22:55 -0500
|
|
Subject: hwmon: (tps23861) fix byte order in current and voltage registers
|
|
|
|
Trying to use this driver on a big-endian machine results in garbage
|
|
values for voltage and current. The tps23861 registers are little-
|
|
endian, and regmap_read_bulk() does not do byte order conversion. Thus
|
|
on BE machines, the most significant bytes got modified, and were
|
|
trimmed by the VOLTAGE_CURRENT_MASK.
|
|
|
|
To resolve this use uint16_t values, and convert them to host byte
|
|
order using le16_to_cpu(). This results in correct readings on MIPS.
|
|
|
|
Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
|
|
Link: https://lore.kernel.org/r/20220721032255.2850647-1-mr.nuke.me@gmail.com
|
|
[groeck: Use __le16 instead of uint16_t]
|
|
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
|
|
---
|
|
drivers/hwmon/tps23861.c | 14 +++++++++-----
|
|
1 file changed, 9 insertions(+), 5 deletions(-)
|
|
|
|
--- a/drivers/hwmon/tps23861.c
|
|
+++ b/drivers/hwmon/tps23861.c
|
|
@@ -140,7 +140,8 @@ static int tps23861_read_temp(struct tps
|
|
static int tps23861_read_voltage(struct tps23861_data *data, int channel,
|
|
long *val)
|
|
{
|
|
- unsigned int regval;
|
|
+ __le16 regval;
|
|
+ long raw_val;
|
|
int err;
|
|
|
|
if (channel < TPS23861_NUM_PORTS) {
|
|
@@ -155,7 +156,8 @@ static int tps23861_read_voltage(struct
|
|
if (err < 0)
|
|
return err;
|
|
|
|
- *val = (FIELD_GET(VOLTAGE_CURRENT_MASK, regval) * VOLTAGE_LSB) / 1000;
|
|
+ raw_val = le16_to_cpu(regval);
|
|
+ *val = (FIELD_GET(VOLTAGE_CURRENT_MASK, raw_val) * VOLTAGE_LSB) / 1000;
|
|
|
|
return 0;
|
|
}
|
|
@@ -163,8 +165,9 @@ static int tps23861_read_voltage(struct
|
|
static int tps23861_read_current(struct tps23861_data *data, int channel,
|
|
long *val)
|
|
{
|
|
- unsigned int current_lsb;
|
|
- unsigned int regval;
|
|
+ long raw_val, current_lsb;
|
|
+ __le16 regval;
|
|
+
|
|
int err;
|
|
|
|
if (data->shunt_resistor == SHUNT_RESISTOR_DEFAULT)
|
|
@@ -178,7 +181,8 @@ static int tps23861_read_current(struct
|
|
if (err < 0)
|
|
return err;
|
|
|
|
- *val = (FIELD_GET(VOLTAGE_CURRENT_MASK, regval) * current_lsb) / 1000000;
|
|
+ raw_val = le16_to_cpu(regval);
|
|
+ *val = (FIELD_GET(VOLTAGE_CURRENT_MASK, raw_val) * current_lsb) / 1000000;
|
|
|
|
return 0;
|
|
}
|