Messages in this thread | | | From | Geert Uytterhoeven <> | Date | Tue, 5 Oct 2021 15:31:35 +0200 | Subject | Re: [PATCH] i2c: rcar: add SMBus block read support |
| |
Hi Andrew,
On Wed, Sep 22, 2021 at 6:14 PM Andrew Gabbasov <andrew_gabbasov@mentor.com> wrote: > The smbus block read is not currently supported for rcar i2c devices. > This patchset adds the support to rcar i2c bus so that blocks of data > can be read using SMbus block reads.(using i2c_smbus_read_block_data() > function from the i2c-core-smbus.c). > > Inspired by commit 8e8782c71595 ("i2c: imx: add SMBus block read support") > > This patch (adapted) was tested with v4.14, but due to lack of real > hardware with SMBus block read operations support, using "simulation", > that is manual analysis of data, read from plain I2C devices with > SMBus block read request. > > Signed-off-by: Bhuvanesh Surachari <bhuvanesh_surachari@mentor.com> > Signed-off-by: Andrew Gabbasov <andrew_gabbasov@mentor.com>
Thanks for your patch!
> --- a/drivers/i2c/busses/i2c-rcar.c > +++ b/drivers/i2c/busses/i2c-rcar.c > @@ -429,9 +431,16 @@ static bool rcar_i2c_dma(struct rcar_i2c_priv *priv) > /* > * The last two bytes needs to be fetched using PIO in > * order for the STOP phase to work. > + * > + * For SMBus block read the first byte was received using PIO.
So it might be easier to read, and more maintainable, to keep the old assignments:
buf = priv->msg->buf; len = priv->msg->len - 2;
and adjust them for SMBus afterwards:
if (block_data) { /* For SMBus block read the first byte was received using PIO */ buf++; len--; }
?
> */ > - buf = priv->msg->buf; > - len = priv->msg->len - 2; > + if (block_data) { > + buf = priv->msg->buf + 1; > + len = priv->msg->len - 3; > + } else { > + buf = priv->msg->buf; > + len = priv->msg->len - 2; > + } > } else { > /* > * First byte in message was sent using PIO.
And below we have another case handling buf and len :-(
So perhaps:
buf = priv->msg->buf; len = priv->msg->len;
if (read) { /* * The last two bytes needs to be fetched using PIO in * order for the STOP phase to work. */ len -= 2; } if (!read || block_data) { /* First byte in message was sent using PIO * buf++; len--; }
Gr{oetje,eeting}s,
Geert
-- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
| |