Am 25.01.2018 um 17:07 schrieb Bartosz Golaszewski: > 2018-01-25 14:40 GMT+01:00 Johannes Poehlmann <johannes.poehlmann@xxxxxxxxxxx>: >> Hi Bartosz, >> >> The patch was build against recent linus master >> commit 5b7d27967dabfb17c21b0d98b29153b9e3ee71e5 >> Merge: f165495 624ca9c >> Author: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> >> Date: Wed Jan 24 17:24:30 2018 -0800 >> >> checkpatch.pl run to 0 Errors >> tested on powerpc 32bit >> >> Any recommendations/comments ? >> >> >> ------------------------------------------------------------------- >> >> Signed-off-by: Johannes Poehlmann <johannes.poehlmann@xxxxxxxxxxx> >> >> needed with some eeprom chips >> modelled after at25 >> --- >> .../devicetree/bindings/eeprom/eeprom.txt | 3 +++ >> drivers/misc/eeprom/at24.c | 24 ++++++++++++++++++++-- >> 2 files changed, 25 insertions(+), 2 deletions(-) >> >> diff --git a/Documentation/devicetree/bindings/eeprom/eeprom.txt b/Documentation/devicetree/bindings/eeprom/eeprom.txt >> index 27f2bc1..8f3293c 100644 >> --- a/Documentation/devicetree/bindings/eeprom/eeprom.txt >> +++ b/Documentation/devicetree/bindings/eeprom/eeprom.txt >> @@ -38,10 +38,13 @@ Optional properties: >> >> - size: total eeprom size in bytes >> >> + - address-width : number of address bits (8 or 16) >> + >> Example: >> >> eeprom@52 { >> compatible = "atmel,24c32"; >> reg = <0x52>; >> pagesize = <32>; >> + address-width = <16>; >> }; >> diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c >> index 4d63ac8..2a6d476 100644 >> --- a/drivers/misc/eeprom/at24.c >> +++ b/drivers/misc/eeprom/at24.c >> @@ -651,11 +651,27 @@ static int at24_write(void *priv, unsigned int off, void *val, size_t count) >> return 0; >> } >> >> -static void at24_get_pdata(struct device *dev, struct at24_platform_data *chip) >> +static int at24_get_pdata(struct device *dev, struct at24_platform_data *chip) >> { >> int err; >> u32 val; >> >> + if (device_property_read_u32(dev, "address-width", &val) == 0) { >> + switch (val) { >> + case 8: >> + chip->flags &= ~AT24_FLAG_ADDR16; >> + break; >> + case 16: >> + chip->flags |= AT24_FLAG_ADDR16; >> + break; >> + default: >> + dev_err(dev, >> + "Error: bad \"address-width\" property: %u\n", >> + val); >> + return -ENODEV; >> + } >> + } >> + >> if (device_property_present(dev, "read-only")) >> chip->flags |= AT24_FLAG_READONLY; >> >> @@ -674,6 +690,7 @@ static void at24_get_pdata(struct device *dev, struct at24_platform_data *chip) >> */ >> chip->page_size = 1; >> } >> + return 0; >> } >> >> static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) >> @@ -716,7 +733,10 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) >> magic >>= AT24_SIZE_BYTELEN; >> chip.flags = magic & AT24_BITMASK(AT24_SIZE_FLAGS); >> >> - at24_get_pdata(&client->dev, &chip); >> + err = at24_get_pdata(&client->dev, &chip); >> + if (err) >> + return err; >> + >> >> chip.setup = NULL; >> chip.context = NULL; >> -- >> 2.1.4 >> > > What EEPROM model do you need that for? Is it not covered by all the > standard types we already support in the driver? > > Thanks, > Bartosz > Hi Bartosz, I need this for a M24M01-D* eeprom. (http://www.st.com/content/ccc/resource/technical/document/datasheet/group0/cb/91/ba/7d/0b/c1/4d/f6/CD00147128/files/CD00147128.pdf/jcr:content/translations/en.CD00147128.pdf) It is 1 Mbit sized and has 2 byte addresses. Under another I2C address it offers a additional write lockable page of 256 Byte, but with _2 byte addresses_. I could not correctly read this "second eeprom" with one of the standard eeprom at24* models. With the patch and using a device tree entry of compatible = "at,24c02"; address-width = <16>; reg = <0x5C>; pagesize = <256>; gave me a 256 Byte "eeprom" file in sysfs with no errors. Regards Johannes