<div dir="ltr">Good call,<div><br></div><div>I guess this is probably something we do not want to apply to all <span style="color:rgb(33,33,33);font-family:"helvetica neue",helvetica,arial,sans-serif;line-height:1.5">24C04 since the real ones probably work properly.</span></div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Aug 29, 2016 at 4:24 PM Xo Wang <<a href="mailto:xow@google.com">xow@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Sat, Aug 20, 2016 at 6:34 PM, Brendan Higgins<br>
<<a href="mailto:brendanhiggins@google.com" target="_blank">brendanhiggins@google.com</a>> wrote:<br>
> Some 24c08 devices exhibits a quirk where they will not NACK durring an<br>
<br>
BTW, the I2C EEPROM on our AST2500 EVBs are actually generic clones of<br>
the 24C04, with 4K of storage. This isn't mentioned on the schematic,<br>
which is why the DTS for dev-4.7 shows a 24C08-compatible device.<br>
<br>
> acknowledge poll. Added a STOP after the dummy write to address problem.<br>
> ---<br>
>  drivers/misc/eeprom/at24.c         | 12 +++++++++++-<br>
>  include/linux/platform_data/at24.h |  1 +<br>
>  2 files changed, 12 insertions(+), 1 deletion(-)<br>
><br>
> diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c<br>
> index 9ceb63b..c647efb 100644<br>
> --- a/drivers/misc/eeprom/at24.c<br>
> +++ b/drivers/misc/eeprom/at24.c<br>
> @@ -120,7 +120,11 @@ static const struct i2c_device_id at24_ids[] = {<br>
>                 AT24_FLAG_READONLY | AT24_FLAG_IRUGO) },<br>
>         { "24c04", AT24_DEVICE_MAGIC(4096 / 8, 0) },<br>
>         /* 24rf08 quirk is handled at i2c-core */<br>
> -       { "24c08", AT24_DEVICE_MAGIC(8192 / 8, 0) },<br>
> +       /* 24c08 exhibits a quirk where it will not NACK durring an<br>
> +        * acknowledge poll so we have to send a stop after the dummy write in<br>
> +        * a read.<br>
> +        */<br>
> +       { "24c08", AT24_DEVICE_MAGIC(8192 / 8, AT24_FLAG_STOPPOLL) },<br>
>         { "24c16", AT24_DEVICE_MAGIC(16384 / 8, 0) },<br>
>         { "24c32", AT24_DEVICE_MAGIC(32768 / 8, AT24_FLAG_ADDR16) },<br>
>         { "24c64", AT24_DEVICE_MAGIC(65536 / 8, AT24_FLAG_ADDR16) },<br>
> @@ -212,6 +216,12 @@ static ssize_t at24_eeprom_read(struct at24_data *at24, char *buf,<br>
>                 msgbuf[i++] = offset;<br>
><br>
>                 msg[0].addr = client->addr;<br>
> +               /*<br>
> +                * Some EEPROMs do not perform the acknowledge poll correctly<br>
> +                * and have to send a STOP after the dummy write.<br>
> +                */<br>
> +               if (at24->chip.flags & AT24_FLAG_STOPPOLL)<br>
> +                       msg[0].flags = I2C_M_STOP;<br>
>                 msg[0].buf = msgbuf;<br>
>                 msg[0].len = i;<br>
><br>
> diff --git a/include/linux/platform_data/at24.h b/include/linux/platform_data/at24.h<br>
> index be830b1..1773822 100644<br>
> --- a/include/linux/platform_data/at24.h<br>
> +++ b/include/linux/platform_data/at24.h<br>
> @@ -47,6 +47,7 @@ struct at24_platform_data {<br>
>  #define AT24_FLAG_READONLY     0x40    /* sysfs-entry will be read-only */<br>
>  #define AT24_FLAG_IRUGO                0x20    /* sysfs-entry will be world-readable */<br>
>  #define AT24_FLAG_TAKE8ADDR    0x10    /* take always 8 addresses (24c00) */<br>
> +#define AT24_FLAG_STOPPOLL     0x08    /* Send stop before ACK poll */<br>
><br>
>         void            (*setup)(struct nvmem_device *nvmem, void *context);<br>
>         void            *context;<br>
> --<br>
> 2.8.0.rc3.226.g39d4020<br>
><br>
> _______________________________________________<br>
> openbmc mailing list<br>
> <a href="mailto:openbmc@lists.ozlabs.org" target="_blank">openbmc@lists.ozlabs.org</a><br>
> <a href="https://lists.ozlabs.org/listinfo/openbmc" rel="noreferrer" target="_blank">https://lists.ozlabs.org/listinfo/openbmc</a><br>
<br>
cheers<br>
xo<br>
</blockquote></div>