Hi Marek, 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? > > /* Reset chip to its default state */ > ret = tusb320_reset(priv); > @@ -477,7 +484,7 @@ static int tusb320_probe(struct i2c_client *client, > * State and polarity might change after a reset, so update > * them again and make sure the interrupt status bit is cleared. > */ > - tusb320_irq_handler(client->irq, priv); > + tusb320_state_update_handler(priv, true); > > ret = devm_request_threaded_irq(priv->dev, client->irq, NULL, > tusb320_irq_handler, > -- > 2.35.1 >