On Fri, Dec 8, 2017 at 2:33 PM, Heiner Kallweit <hkallweit1@xxxxxxxxx> wrote: > In at24_adjust_read_count() there is the line > remainder = BIT(bits) - offset; > > AFAICS we can have the case offset > BIT(bits). Imagine a 8 bit chip > with size 512 (2 addresses) and we try to read a few bytes from > offset 300. Then the line in question doesn't do what it's supposed > to do. I don't think offset can be > BIT(bits). In at24_regmap_read(), we have: at24_client = at24_translate_offset(at24, &offset); regmap = at24_client->regmap; client = at24_client->client; count = at24_adjust_read_count(at24, offset, count); at24_translate_offset() will translate the general offset to an offset within a subchip. E.g. offset 300 will be translated to offset 44 into the second subchip. > And a more general aspect: If the size is 512 but only 256 byte are > accessible then I doubt it's nice to create a nvmem provider with > size 512. Wouldn't it be better to adjust byte_len to reflect the > accessible size? Then we also wouldn't need the check in > at24_adjust_read_count. I'm not sure if I understand. Could you clarify a bit Heiner? If the size is 512 and it's a multi-address chip with 8-bit addresses, we simply have two 256-byte subchips. The size is 512. All 512 bytes are accessible.