Re: [PATCH v2 4/4] hwmon: (ina2xx) Decouple in0 and curr1 alarms
Guenter Roeck <[email protected]>
| Newsgroups | org.kernel.vger.linux-hwmon,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On Thu, Aug 20, 2026 at 06:09:24AM -0700, Jared Kangas wrote:
> INA2XX current limits are converted into shunt voltage limits internally
> using the shunt resistor value. Once a current limit's corresponding
> voltage limit is written to the hardware, shunt voltage and current
> alarms are indistinguishable from each other.
>
> This causes two issues:
>
> 1. in0/curr1 alarms may be unintentionally cleared by reading from the
> opposite input's alarm.
>
> 2. When a limit for either in0 (shunt voltage) or curr1 (current) is
> set, both of their alarms are triggered, and both of their limits
> read nonzero.
>
> An example of this behavior on an INA231:
>
> # cd /sys/class/hwmon/hwmon0
> # head {curr1,in0}_input
> ==> curr1_input <==
> 1713
>
> ==> in0_input <==
> 2
> # echo 1800 >curr1_lcrit
> # head {curr1,in0}_lcrit_alarm
> ==> curr1_lcrit_alarm <==
> 1
>
> ==> in0_lcrit_alarm <==
> 0
> # head {in0,curr1}_lcrit_alarm
> ==> in0_lcrit_alarm <==
> 1
>
> ==> curr1_lcrit_alarm <==
> 0
> # head {in0,curr1}_lcrit_alarm
> ==> in0_lcrit_alarm <==
> 1
>
> ==> curr1_lcrit_alarm <==
> 1
>
> This is because curr1 uses the same underlying masks
> (INA226_SHUNT_*_VOLTAGE_MASK) as in0 on the hardware. As a result,
> ina2xx_{curr,in}_read() both read the shunt voltage alarms/limits
> without considering whether the voltage or current is currently set.
>
> To fix this, track the active alarm type in ina2xx_data and guard
> alarm/limit reads with a check that returns zero if the active alarm is
> for a different type. The new field is initialized based on the
> MASK_ENABLE register's set function, assuming voltage instead of current
> when the shunt voltage mask is set.
>
> After this fix, the alarms only read back 1 if their corresponding limit
> is set:
>
> # echo 0 >curr1_lcrit
> # head {curr1,in0}_lcrit_alarm
> ==> curr1_lcrit_alarm <==
> 0
>
> ==> in0_lcrit_alarm <==
> 0
> # echo 9999 >curr1_lcrit
> # head {curr1,in0}_lcrit_alarm
> ==> curr1_lcrit_alarm <==
> 1
>
> ==> in0_lcrit_alarm <==
> 0
> # echo 9999 >in0_lcrit
> # head {curr1,in0}_lcrit_alarm
> ==> curr1_lcrit_alarm <==
> 0
>
> ==> in0_lcrit_alarm <==
> 1
>
> Fixes: 4d5c2d986757 ("hwmon: (ina2xx) Add support for current limits")
> Signed-off-by: Jared Kangas <[email protected]>
Applied.
Thanks,
Guenter