[PATCH 1/2] eeprom: at24: added quirk for 24c08 devices
Xo Wang
xow at google.com
Tue Aug 30 09:24:30 AEST 2016
On Sat, Aug 20, 2016 at 6:34 PM, Brendan Higgins
<brendanhiggins at google.com> wrote:
> Some 24c08 devices exhibits a quirk where they will not NACK durring an
BTW, the I2C EEPROM on our AST2500 EVBs are actually generic clones of
the 24C04, with 4K of storage. This isn't mentioned on the schematic,
which is why the DTS for dev-4.7 shows a 24C08-compatible device.
> acknowledge poll. Added a STOP after the dummy write to address problem.
> ---
> drivers/misc/eeprom/at24.c | 12 +++++++++++-
> include/linux/platform_data/at24.h | 1 +
> 2 files changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
> index 9ceb63b..c647efb 100644
> --- a/drivers/misc/eeprom/at24.c
> +++ b/drivers/misc/eeprom/at24.c
> @@ -120,7 +120,11 @@ static const struct i2c_device_id at24_ids[] = {
> AT24_FLAG_READONLY | AT24_FLAG_IRUGO) },
> { "24c04", AT24_DEVICE_MAGIC(4096 / 8, 0) },
> /* 24rf08 quirk is handled at i2c-core */
> - { "24c08", AT24_DEVICE_MAGIC(8192 / 8, 0) },
> + /* 24c08 exhibits a quirk where it will not NACK durring an
> + * acknowledge poll so we have to send a stop after the dummy write in
> + * a read.
> + */
> + { "24c08", AT24_DEVICE_MAGIC(8192 / 8, AT24_FLAG_STOPPOLL) },
> { "24c16", AT24_DEVICE_MAGIC(16384 / 8, 0) },
> { "24c32", AT24_DEVICE_MAGIC(32768 / 8, AT24_FLAG_ADDR16) },
> { "24c64", AT24_DEVICE_MAGIC(65536 / 8, AT24_FLAG_ADDR16) },
> @@ -212,6 +216,12 @@ static ssize_t at24_eeprom_read(struct at24_data *at24, char *buf,
> msgbuf[i++] = offset;
>
> msg[0].addr = client->addr;
> + /*
> + * Some EEPROMs do not perform the acknowledge poll correctly
> + * and have to send a STOP after the dummy write.
> + */
> + if (at24->chip.flags & AT24_FLAG_STOPPOLL)
> + msg[0].flags = I2C_M_STOP;
> msg[0].buf = msgbuf;
> msg[0].len = i;
>
> diff --git a/include/linux/platform_data/at24.h b/include/linux/platform_data/at24.h
> index be830b1..1773822 100644
> --- a/include/linux/platform_data/at24.h
> +++ b/include/linux/platform_data/at24.h
> @@ -47,6 +47,7 @@ struct at24_platform_data {
> #define AT24_FLAG_READONLY 0x40 /* sysfs-entry will be read-only */
> #define AT24_FLAG_IRUGO 0x20 /* sysfs-entry will be world-readable */
> #define AT24_FLAG_TAKE8ADDR 0x10 /* take always 8 addresses (24c00) */
> +#define AT24_FLAG_STOPPOLL 0x08 /* Send stop before ACK poll */
>
> void (*setup)(struct nvmem_device *nvmem, void *context);
> void *context;
> --
> 2.8.0.rc3.226.g39d4020
>
> _______________________________________________
> openbmc mailing list
> openbmc at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/openbmc
cheers
xo
More information about the openbmc
mailing list