On 11/21/22 00:52, Alvin Šipraga wrote:
Hi Marek,
Hi,
On Sun, Nov 20, 2022 at 03:15:09PM +0100, Marek Vasut wrote:
Currently this driver triggers extcon and typec state update in its
probe function, to read out current state reported by the chip and
report the correct state to upper layers. This synchronization is
performed correctly, but only in case the chip indicates a pending
interrupt in reg09 register.
This fails to cover the situation where all interrupts reported by
the chip were already handled by Linux before reboot, then the system
rebooted, and then Linux starts again. In this case, the TUSB320 no
longer reports any interrupts in reg09, and the state update does not
perform any update as it depends on that interrupt indication.
Fix this by turning tusb320_irq_handler() into a thin wrapper around
tusb320_state_update_handler(), where the later now contains the bulk
of the code of tusb320_irq_handler(), but adds new function parameter
"force_update". The "force_update" parameter can be used by the probe
function to assure that the state synchronization is always performed,
independent of the interrupt indicated in reg09. The interrupt handler
tusb320_irq_handler() callback uses force_update=false to avoid state
updates on potential spurious interrupts and retain current behavior.
Fixes: 06bc4ca115cdd ("extcon: Add driver for TI TUSB320")
Signed-off-by: Marek Vasut <marex@xxxxxxx>
Reviewed-by: Alvin Šipraga <alsi@xxxxxxxxxxxxxxx>
snip
@@ -466,7 +473,7 @@ static int tusb320_probe(struct i2c_client *client,
return ret;
/* update initial state */
- tusb320_irq_handler(client->irq, priv);
+ tusb320_state_update_handler(priv, true);
I wonder, is this function call even necessary?
Yes, it is, even though this is not immediately obvious why.
The tusb320_reset() rcalled right after the aforementioned call triggers
priv->ops->set_mode(), which is implemented e.g. by tusb320_set_mode(),
which contains this conditional:
if (priv->state != TUSB320_ATTACHED_STATE_NONE)
and the priv->state is assigned in tusb320_state_update_handler(), or
rather in function it calls, the tusb320_extcon_irq_handler().