* [PATCH v5 0/2] at24: support eeproms that do not auto-rollover reads. @ 2017-12-07 14:36 Sven Van Asbroeck 2017-12-07 14:36 ` [PATCH v5 1/2] " Sven Van Asbroeck 2017-12-07 14:36 ` [PATCH v5 2/2] dt-bindings: add eeprom "no-read-rollover" property Sven Van Asbroeck 0 siblings, 2 replies; 8+ messages in thread From: Sven Van Asbroeck @ 2017-12-07 14:36 UTC (permalink / raw) To: svendev, robh+dt, mark.rutland, wsa, brgl, nsekhar, sakari.ailus, david, javier, divagar.mohandass Cc: devicetree, linux-kernel, linux-i2c v5: at Rob Herring's request, renamed devicetree property: at24,no-read-rollover -> no-read-rollover v4: renamed devicetree property: no-read-rollover -> at24,no-read-rollover dt-bindings update now a separate patch v3: rebased against at24 maintainer's devel staging branch: git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux.git at24/devel clarified some of the comments and wording v2: kbuild test robot feedback: correct "warning: comparison of distinct pointer types lacks a cast" build warning on some compilers / architectures. v1: original patch Sven Van Asbroeck (2): at24: support eeproms that do not auto-rollover reads. dt-bindings: add eeprom "at24,no-read-rollover" property .../devicetree/bindings/eeprom/eeprom.txt | 5 +++ drivers/misc/eeprom/at24.c | 37 +++++++++++++++------- include/linux/platform_data/at24.h | 2 ++ 3 files changed, 32 insertions(+), 12 deletions(-) -- 1.9.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v5 1/2] at24: support eeproms that do not auto-rollover reads. 2017-12-07 14:36 [PATCH v5 0/2] at24: support eeproms that do not auto-rollover reads Sven Van Asbroeck @ 2017-12-07 14:36 ` Sven Van Asbroeck [not found] ` <1512657378-5221-2-git-send-email-svendev-fuHqz3Nb1YI@public.gmane.org> 2017-12-07 14:36 ` [PATCH v5 2/2] dt-bindings: add eeprom "no-read-rollover" property Sven Van Asbroeck 1 sibling, 1 reply; 8+ messages in thread From: Sven Van Asbroeck @ 2017-12-07 14:36 UTC (permalink / raw) To: svendev, robh+dt, mark.rutland, wsa, brgl, nsekhar, sakari.ailus, david, javier, divagar.mohandass Cc: devicetree, linux-kernel, linux-i2c Some multi-address eeproms in the at24 family may not automatically roll-over reads to the next slave address. On those eeproms, reads that straddle slave boundaries will not work correctly. Solution: Mark such eeproms with a flag that prevents reads straddling slave boundaries. Add the AT24_FLAG_NO_RDROL flag to the eeprom entry in the device_id table, or add 'no-read-rollover' to the eeprom devicetree entry. Note that I have not personally enountered an at24 chip that does not support read rollovers. They may or may not exist. However, my hardware requires this functionality because of a quirk. It's up to the Linux community to decide if this patch is useful/ general enough to warrant merging. Signed-off-by: Sven Van Asbroeck <svendev@arcx.com> --- drivers/misc/eeprom/at24.c | 37 +++++++++++++++++++++++++------------ include/linux/platform_data/at24.h | 2 ++ 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c index 625b001..8c93ed0 100644 --- a/drivers/misc/eeprom/at24.c +++ b/drivers/misc/eeprom/at24.c @@ -251,15 +251,6 @@ struct at24_data { * Slave address and byte offset derive from the offset. Always * set the byte address; on a multi-master board, another master * may have changed the chip's "current" address pointer. - * - * REVISIT some multi-address chips don't rollover page reads to - * the next slave address, so we may need to truncate the count. - * Those chips might need another quirk flag. - * - * If the real hardware used four adjacent 24c02 chips and that - * were misconfigured as one 24c08, that would be a similar effect: - * one "eeprom" file not four, but larger reads would fail when - * they crossed certain pages. */ static struct at24_client *at24_translate_offset(struct at24_data *at24, unsigned int *offset) @@ -277,6 +268,28 @@ static struct at24_client *at24_translate_offset(struct at24_data *at24, return &at24->client[i]; } +static size_t at24_adjust_read_count(struct at24_data *at24, + unsigned int offset, size_t count) +{ + unsigned int bits; + size_t remainder; + /* + * In case of multi-address chips that don't rollover reads to + * the next slave address: truncate the count to the slave boundary, + * so that the read never straddles slaves. + */ + if (at24->chip.flags & AT24_FLAG_NO_RDROL) { + bits = (at24->chip.flags & AT24_FLAG_ADDR16) ? 16 : 8; + remainder = BIT(bits) - offset; + if (count > remainder) + count = remainder; + } + if (count > io_limit) + count = io_limit; + + return count; +} + static ssize_t at24_regmap_read(struct at24_data *at24, char *buf, unsigned int offset, size_t count) { @@ -289,9 +302,7 @@ static ssize_t at24_regmap_read(struct at24_data *at24, char *buf, at24_client = at24_translate_offset(at24, &offset); regmap = at24_client->regmap; client = at24_client->client; - - if (count > io_limit) - count = io_limit; + count = at24_adjust_read_count(at24, offset, count); /* adjust offset for mac and serial read ops */ offset += at24->offset_adj; @@ -457,6 +468,8 @@ static void at24_get_pdata(struct device *dev, struct at24_platform_data *chip) if (device_property_present(dev, "read-only")) chip->flags |= AT24_FLAG_READONLY; + if (device_property_present(dev, "no-read-rollover")) + chip->flags |= AT24_FLAG_NO_RDROL; err = device_property_read_u32(dev, "size", &val); if (!err) diff --git a/include/linux/platform_data/at24.h b/include/linux/platform_data/at24.h index 271a4e2..841bb28 100644 --- a/include/linux/platform_data/at24.h +++ b/include/linux/platform_data/at24.h @@ -50,6 +50,8 @@ struct at24_platform_data { #define AT24_FLAG_TAKE8ADDR BIT(4) /* take always 8 addresses (24c00) */ #define AT24_FLAG_SERIAL BIT(3) /* factory-programmed serial number */ #define AT24_FLAG_MAC BIT(2) /* factory-programmed mac address */ +#define AT24_FLAG_NO_RDROL BIT(1) /* does not auto-rollover reads to */ + /* the next slave address */ void (*setup)(struct nvmem_device *nvmem, void *context); void *context; -- 1.9.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
[parent not found: <1512657378-5221-2-git-send-email-svendev-fuHqz3Nb1YI@public.gmane.org>]
* Re: [PATCH v5 1/2] at24: support eeproms that do not auto-rollover reads. [not found] ` <1512657378-5221-2-git-send-email-svendev-fuHqz3Nb1YI@public.gmane.org> @ 2017-12-07 16:26 ` Bartosz Golaszewski [not found] ` <CAMRc=MdhJRD+G18Xh5vfmaHHdJ+g9EnDTxUHVxhzDzVt-D0KMg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 1 reply; 8+ messages in thread From: Bartosz Golaszewski @ 2017-12-07 16:26 UTC (permalink / raw) To: Sven Van Asbroeck Cc: Rob Herring, Mark Rutland, Wolfram Sang, nsekhar-l0cyMroinI0, Sakari Ailus, David Lechner, Javier Martinez Canillas, Divagar Mohandass, devicetree-u79uwXL29TY76Z2rM5mHXA, Linux Kernel Mailing List, linux-i2c 2017-12-07 15:36 GMT+01:00 Sven Van Asbroeck <svendev-fuHqz3Nb1YI@public.gmane.org>: > Some multi-address eeproms in the at24 family may not automatically > roll-over reads to the next slave address. On those eeproms, reads > that straddle slave boundaries will not work correctly. > > Solution: > Mark such eeproms with a flag that prevents reads straddling > slave boundaries. Add the AT24_FLAG_NO_RDROL flag to the eeprom > entry in the device_id table, or add 'no-read-rollover' to the > eeprom devicetree entry. > > Note that I have not personally enountered an at24 chip that > does not support read rollovers. They may or may not exist. > However, my hardware requires this functionality because of > a quirk. > > It's up to the Linux community to decide if this patch is useful/ > general enough to warrant merging. > > Signed-off-by: Sven Van Asbroeck <svendev-fuHqz3Nb1YI@public.gmane.org> > --- > drivers/misc/eeprom/at24.c | 37 +++++++++++++++++++++++++------------ > include/linux/platform_data/at24.h | 2 ++ > 2 files changed, 27 insertions(+), 12 deletions(-) > Hi Sven, looks good in general, just a couple nits to fix below and it can be applied. > diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c > index 625b001..8c93ed0 100644 > --- a/drivers/misc/eeprom/at24.c > +++ b/drivers/misc/eeprom/at24.c > @@ -251,15 +251,6 @@ struct at24_data { > * Slave address and byte offset derive from the offset. Always > * set the byte address; on a multi-master board, another master > * may have changed the chip's "current" address pointer. > - * > - * REVISIT some multi-address chips don't rollover page reads to > - * the next slave address, so we may need to truncate the count. > - * Those chips might need another quirk flag. > - * > - * If the real hardware used four adjacent 24c02 chips and that > - * were misconfigured as one 24c08, that would be a similar effect: > - * one "eeprom" file not four, but larger reads would fail when > - * they crossed certain pages. > */ > static struct at24_client *at24_translate_offset(struct at24_data *at24, > unsigned int *offset) > @@ -277,6 +268,28 @@ static struct at24_client *at24_translate_offset(struct at24_data *at24, > return &at24->client[i]; > } > > +static size_t at24_adjust_read_count(struct at24_data *at24, > + unsigned int offset, size_t count) > +{ > + unsigned int bits; > + size_t remainder; Add a newline here. > + /* > + * In case of multi-address chips that don't rollover reads to > + * the next slave address: truncate the count to the slave boundary, > + * so that the read never straddles slaves. > + */ > + if (at24->chip.flags & AT24_FLAG_NO_RDROL) { > + bits = (at24->chip.flags & AT24_FLAG_ADDR16) ? 16 : 8; There's no need for braces around the ternary operator's condition. > + remainder = BIT(bits) - offset; > + if (count > remainder) > + count = remainder; > + } Another newline here. > + if (count > io_limit) > + count = io_limit; > + > + return count; > +} > + > static ssize_t at24_regmap_read(struct at24_data *at24, char *buf, > unsigned int offset, size_t count) > { > @@ -289,9 +302,7 @@ static ssize_t at24_regmap_read(struct at24_data *at24, char *buf, > at24_client = at24_translate_offset(at24, &offset); > regmap = at24_client->regmap; > client = at24_client->client; > - > - if (count > io_limit) > - count = io_limit; > + count = at24_adjust_read_count(at24, offset, count); > > /* adjust offset for mac and serial read ops */ > offset += at24->offset_adj; > @@ -457,6 +468,8 @@ static void at24_get_pdata(struct device *dev, struct at24_platform_data *chip) > > if (device_property_present(dev, "read-only")) > chip->flags |= AT24_FLAG_READONLY; > + if (device_property_present(dev, "no-read-rollover")) > + chip->flags |= AT24_FLAG_NO_RDROL; > > err = device_property_read_u32(dev, "size", &val); > if (!err) > diff --git a/include/linux/platform_data/at24.h b/include/linux/platform_data/at24.h > index 271a4e2..841bb28 100644 > --- a/include/linux/platform_data/at24.h > +++ b/include/linux/platform_data/at24.h > @@ -50,6 +50,8 @@ struct at24_platform_data { > #define AT24_FLAG_TAKE8ADDR BIT(4) /* take always 8 addresses (24c00) */ > #define AT24_FLAG_SERIAL BIT(3) /* factory-programmed serial number */ > #define AT24_FLAG_MAC BIT(2) /* factory-programmed mac address */ > +#define AT24_FLAG_NO_RDROL BIT(1) /* does not auto-rollover reads to */ > + /* the next slave address */ > > void (*setup)(struct nvmem_device *nvmem, void *context); > void *context; > -- > 1.9.1 > Thanks, Bartosz -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <CAMRc=MdhJRD+G18Xh5vfmaHHdJ+g9EnDTxUHVxhzDzVt-D0KMg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH v5 1/2] at24: support eeproms that do not auto-rollover reads. [not found] ` <CAMRc=MdhJRD+G18Xh5vfmaHHdJ+g9EnDTxUHVxhzDzVt-D0KMg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2017-12-07 19:02 ` Uwe Kleine-König 2017-12-07 21:33 ` Bartosz Golaszewski 0 siblings, 1 reply; 8+ messages in thread From: Uwe Kleine-König @ 2017-12-07 19:02 UTC (permalink / raw) To: Bartosz Golaszewski Cc: Sven Van Asbroeck, Rob Herring, Mark Rutland, Wolfram Sang, nsekhar-l0cyMroinI0, Sakari Ailus, David Lechner, Javier Martinez Canillas, Divagar Mohandass, devicetree-u79uwXL29TY76Z2rM5mHXA, Linux Kernel Mailing List, linux-i2c Hello, On Thu, Dec 07, 2017 at 05:26:50PM +0100, Bartosz Golaszewski wrote: > > + if (at24->chip.flags & AT24_FLAG_NO_RDROL) { > > + bits = (at24->chip.flags & AT24_FLAG_ADDR16) ? 16 : 8; > > There's no need for braces around the ternary operator's condition. Even if not required, I'd keep them for clearity. Best regards Uwe -- Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | http://www.pengutronix.de/ | -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v5 1/2] at24: support eeproms that do not auto-rollover reads. 2017-12-07 19:02 ` Uwe Kleine-König @ 2017-12-07 21:33 ` Bartosz Golaszewski [not found] ` <CAMRc=MeEnDYjDTpE=XKuP3LricsnEnh0RHKMzxEPUcOS6E0tPQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> 0 siblings, 1 reply; 8+ messages in thread From: Bartosz Golaszewski @ 2017-12-07 21:33 UTC (permalink / raw) To: Uwe Kleine-König Cc: Sven Van Asbroeck, Rob Herring, Mark Rutland, Wolfram Sang, nsekhar, Sakari Ailus, David Lechner, Javier Martinez Canillas, Divagar Mohandass, devicetree, Linux Kernel Mailing List, linux-i2c 2017-12-07 20:02 GMT+01:00 Uwe Kleine-König <u.kleine-koenig@pengutronix.de>: > Hello, > > On Thu, Dec 07, 2017 at 05:26:50PM +0100, Bartosz Golaszewski wrote: >> > + if (at24->chip.flags & AT24_FLAG_NO_RDROL) { >> > + bits = (at24->chip.flags & AT24_FLAG_ADDR16) ? 16 : 8; >> >> There's no need for braces around the ternary operator's condition. > > Even if not required, I'd keep them for clearity. > I don't want to start bikeshedding, so I'll take it as it is, but I prefer to avoid braces wherever it's not necessary. Thanks, Bartosz ^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <CAMRc=MeEnDYjDTpE=XKuP3LricsnEnh0RHKMzxEPUcOS6E0tPQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>]
* Re: [PATCH v5 1/2] at24: support eeproms that do not auto-rollover reads. [not found] ` <CAMRc=MeEnDYjDTpE=XKuP3LricsnEnh0RHKMzxEPUcOS6E0tPQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org> @ 2017-12-07 21:57 ` Uwe Kleine-König 0 siblings, 0 replies; 8+ messages in thread From: Uwe Kleine-König @ 2017-12-07 21:57 UTC (permalink / raw) To: Bartosz Golaszewski Cc: Sven Van Asbroeck, Rob Herring, Mark Rutland, Wolfram Sang, nsekhar-l0cyMroinI0, Sakari Ailus, David Lechner, Javier Martinez Canillas, Divagar Mohandass, devicetree-u79uwXL29TY76Z2rM5mHXA, Linux Kernel Mailing List, linux-i2c On Thu, Dec 07, 2017 at 10:33:51PM +0100, Bartosz Golaszewski wrote: > 2017-12-07 20:02 GMT+01:00 Uwe Kleine-König <u.kleine-koenig-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>: > > Hello, > > > > On Thu, Dec 07, 2017 at 05:26:50PM +0100, Bartosz Golaszewski wrote: > >> > + if (at24->chip.flags & AT24_FLAG_NO_RDROL) { > >> > + bits = (at24->chip.flags & AT24_FLAG_ADDR16) ? 16 : 8; > >> > >> There's no need for braces around the ternary operator's condition. > > > > Even if not required, I'd keep them for clearity. > > > > I don't want to start bikeshedding, so I'll take it as it is, but I > prefer to avoid braces wherever it's not necessary. For me the reasoning is: Most people (me included) don't know off-hand if the semantic of a & b ? c : d is (a & b) ? c : d or a & (b ? c : d) In some situations (e.g. a & b == c) gcc even warns when you don't add syntactically needless parentheses. The case under discussion isn't such an example though. Best regards Uwe -- Pengutronix e.K. | Uwe Kleine-König | Industrial Linux Solutions | http://www.pengutronix.de/ | -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v5 2/2] dt-bindings: add eeprom "no-read-rollover" property 2017-12-07 14:36 [PATCH v5 0/2] at24: support eeproms that do not auto-rollover reads Sven Van Asbroeck 2017-12-07 14:36 ` [PATCH v5 1/2] " Sven Van Asbroeck @ 2017-12-07 14:36 ` Sven Van Asbroeck 2017-12-07 15:40 ` Rob Herring 1 sibling, 1 reply; 8+ messages in thread From: Sven Van Asbroeck @ 2017-12-07 14:36 UTC (permalink / raw) To: svendev, robh+dt, mark.rutland, wsa, brgl, nsekhar, sakari.ailus, david, javier, divagar.mohandass Cc: devicetree, linux-kernel, linux-i2c Adds an optional property for at24 eeproms. This parameterless property indicates that the multi-address eeprom does not automatically roll over reads to the next slave address. Signed-off-by: Sven Van Asbroeck <svendev@arcx.com> --- Documentation/devicetree/bindings/eeprom/eeprom.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Documentation/devicetree/bindings/eeprom/eeprom.txt b/Documentation/devicetree/bindings/eeprom/eeprom.txt index 27f2bc1..5bfc0ac 100644 --- a/Documentation/devicetree/bindings/eeprom/eeprom.txt +++ b/Documentation/devicetree/bindings/eeprom/eeprom.txt @@ -38,6 +38,11 @@ Optional properties: - size: total eeprom size in bytes + - no-read-rollover: + This parameterless property indicates that the multi-address + eeprom does not automatically roll over reads to the next + slave address. Please consult the manual of your device. + Example: eeprom@52 { -- 1.9.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v5 2/2] dt-bindings: add eeprom "no-read-rollover" property 2017-12-07 14:36 ` [PATCH v5 2/2] dt-bindings: add eeprom "no-read-rollover" property Sven Van Asbroeck @ 2017-12-07 15:40 ` Rob Herring 0 siblings, 0 replies; 8+ messages in thread From: Rob Herring @ 2017-12-07 15:40 UTC (permalink / raw) To: Sven Van Asbroeck Cc: Mark Rutland, wsa@the-dreams.de, Bartosz Golaszewski, Sekhar Nori, Sakari Ailus, David Lechner, Javier Martinez Canillas, Divagar Mohandass, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-i2c@vger.kernel.org On Thu, Dec 7, 2017 at 8:36 AM, Sven Van Asbroeck <svendev@arcx.com> wrote: > Adds an optional property for at24 eeproms. > This parameterless property indicates that the multi-address eeprom > does not automatically roll over reads to the next slave address. > > Signed-off-by: Sven Van Asbroeck <svendev@arcx.com> > --- > Documentation/devicetree/bindings/eeprom/eeprom.txt | 5 +++++ > 1 file changed, 5 insertions(+) Reviewed-by: Rob Herring <robh@kernel.org> ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2017-12-07 21:57 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-12-07 14:36 [PATCH v5 0/2] at24: support eeproms that do not auto-rollover reads Sven Van Asbroeck
2017-12-07 14:36 ` [PATCH v5 1/2] " Sven Van Asbroeck
[not found] ` <1512657378-5221-2-git-send-email-svendev-fuHqz3Nb1YI@public.gmane.org>
2017-12-07 16:26 ` Bartosz Golaszewski
[not found] ` <CAMRc=MdhJRD+G18Xh5vfmaHHdJ+g9EnDTxUHVxhzDzVt-D0KMg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2017-12-07 19:02 ` Uwe Kleine-König
2017-12-07 21:33 ` Bartosz Golaszewski
[not found] ` <CAMRc=MeEnDYjDTpE=XKuP3LricsnEnh0RHKMzxEPUcOS6E0tPQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2017-12-07 21:57 ` Uwe Kleine-König
2017-12-07 14:36 ` [PATCH v5 2/2] dt-bindings: add eeprom "no-read-rollover" property Sven Van Asbroeck
2017-12-07 15:40 ` Rob Herring
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).