Message ID | 20240830034640.7049-8-kfting@nuvoton.com |
---|---|
State | Superseded |
Headers | show |
Series | [v2,1/7] i2c: npcm: restore slave addresses array length | expand |
Reviewed-by: Tali Perry <tali.perry1@gmail.com> On Fri, Aug 30, 2024 at 6:49 AM Tyrone Ting <warp5tw@gmail.com> wrote: > > From: Charles Boyer <Charles.Boyer@fii-usa.com> > > Nuvoton slave enable was in user space API call master_xfer, so it is > subject to delays from the OS scheduler. If the BMC is not enabled for > slave mode in time for master to send response, then it will NAK the > address match. Then the PLDM request timeout occurs. > > If the slave enable is moved to the EOB interrupt service routine, then > the BMC can be ready in slave mode by the time it needs to receive a > response. > > Signed-off-by: Charles Boyer <Charles.Boyer@fii-usa.com> > Signed-off-by: Vivekanand Veeracholan <vveerach@google.com> > Signed-off-by: Tyrone Ting <kfting@nuvoton.com> > --- > drivers/i2c/busses/i2c-npcm7xx.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/i2c/busses/i2c-npcm7xx.c b/drivers/i2c/busses/i2c-npcm7xx.c > index cac4ea0b69b8..5bdc1b5895ac 100644 > --- a/drivers/i2c/busses/i2c-npcm7xx.c > +++ b/drivers/i2c/busses/i2c-npcm7xx.c > @@ -1781,6 +1781,12 @@ static int npcm_i2c_int_master_handler(struct npcm_i2c *bus) > (FIELD_GET(NPCM_I2CCST3_EO_BUSY, > ioread8(bus->reg + NPCM_I2CCST3)))) { > npcm_i2c_irq_handle_eob(bus); > +#if IS_ENABLED(CONFIG_I2C_SLAVE) > + /* reenable slave if it was enabled */ > + if (bus->slave) > + iowrite8((bus->slave->addr & 0x7F) | NPCM_I2CADDR_SAEN, > + bus->reg + NPCM_I2CADDR1); > +#endif > return 0; > } > > -- > 2.34.1 >
diff --git a/drivers/i2c/busses/i2c-npcm7xx.c b/drivers/i2c/busses/i2c-npcm7xx.c index cac4ea0b69b8..5bdc1b5895ac 100644 --- a/drivers/i2c/busses/i2c-npcm7xx.c +++ b/drivers/i2c/busses/i2c-npcm7xx.c @@ -1781,6 +1781,12 @@ static int npcm_i2c_int_master_handler(struct npcm_i2c *bus) (FIELD_GET(NPCM_I2CCST3_EO_BUSY, ioread8(bus->reg + NPCM_I2CCST3)))) { npcm_i2c_irq_handle_eob(bus); +#if IS_ENABLED(CONFIG_I2C_SLAVE) + /* reenable slave if it was enabled */ + if (bus->slave) + iowrite8((bus->slave->addr & 0x7F) | NPCM_I2CADDR_SAEN, + bus->reg + NPCM_I2CADDR1); +#endif return 0; }