Message ID | 20210908113450.788452-3-tanureal@opensource.cirrus.com |
---|---|
State | New |
Headers | show |
Series | [01/10] regmap: spi: Set regmap max raw r/w from max_transfer_size | expand |
On Wed, Sep 08, 2021 at 01:09:29PM +0000, Charles Keepax wrote: > On Wed, Sep 08, 2021 at 12:34:43PM +0100, Lucas Tanure wrote: > > regmap-spi will split data and address between two transfers > > in the same message, so max_[read|write] must include space > > for the address and padding > > > > Signed-off-by: Lucas Tanure <tanureal@opensource.cirrus.com> > > --- > > drivers/base/regmap/regmap-spi.c | 4 ++++ > > drivers/base/regmap/regmap.c | 15 +++++++++++++++ > > include/linux/regmap.h | 3 +++ > > 3 files changed, 22 insertions(+) > > > > diff --git a/drivers/base/regmap/regmap-spi.c b/drivers/base/regmap/regmap-spi.c > > index 0e6552e57ecf..1434c502e340 100644 > > --- a/drivers/base/regmap/regmap-spi.c > > +++ b/drivers/base/regmap/regmap-spi.c > > @@ -123,6 +123,10 @@ static const struct regmap_bus *regmap_get_spi_bus(struct spi_device *spi, > > bus->free_on_exit = true; > > bus->max_raw_read = max_size; > > bus->max_raw_write = max_size; > > + > > + if (spi_max_message_size(spi) != SIZE_MAX) > > + bus->max_combined_rw = spi_max_message_size(spi); > > I am not sure max_combined_rw is the best name here, it makes > sense in a SPI context where reads are a write followed by a > read. But does it really make sense for all buses? Like an MMIO > this no longer seems a very meaningful name. > > Perhaps max_transaction? But I am often not the best at thinking > of names myself. > Although thinking about this more are we sure this wouldn't just be better as a flag to include the address in the max_raw_read/write? I am not sure what extra use-cases the extra max_combined_rw opens up and it feels like the field is doing two things, 1) saying that the address needs to be included in the max size and 2) specifying a new max size. Thanks, Charles
diff --git a/drivers/base/regmap/regmap-spi.c b/drivers/base/regmap/regmap-spi.c index 0e6552e57ecf..1434c502e340 100644 --- a/drivers/base/regmap/regmap-spi.c +++ b/drivers/base/regmap/regmap-spi.c @@ -123,6 +123,10 @@ static const struct regmap_bus *regmap_get_spi_bus(struct spi_device *spi, bus->free_on_exit = true; bus->max_raw_read = max_size; bus->max_raw_write = max_size; + + if (spi_max_message_size(spi) != SIZE_MAX) + bus->max_combined_rw = spi_max_message_size(spi); + return bus; } diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index fe3e38dd5324..1cd936e097b0 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -718,6 +718,7 @@ struct regmap *__regmap_init(struct device *dev, struct regmap *map; int ret = -EINVAL; enum regmap_endian reg_endian, val_endian; + size_t reg_pad_size; int i, j; if (!config) @@ -815,6 +816,20 @@ struct regmap *__regmap_init(struct device *dev, if (bus) { map->max_raw_read = bus->max_raw_read; map->max_raw_write = bus->max_raw_write; + if (bus->max_combined_rw) { + reg_pad_size = map->format.reg_bytes + map->format.pad_bytes; + + if (map->max_raw_read + reg_pad_size > bus->max_combined_rw) + map->max_raw_read -= reg_pad_size; + if (map->max_raw_write + reg_pad_size > bus->max_combined_rw) + map->max_raw_write -= reg_pad_size; + + if (map->max_raw_read < map->format.buf_size || + map->max_raw_write < map->format.buf_size) { + ret = -EINVAL; + goto err_hwlock; + } + } } map->dev = dev; map->bus = bus; diff --git a/include/linux/regmap.h b/include/linux/regmap.h index f5f08dd0a116..53620c70ae5e 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -504,6 +504,8 @@ typedef void (*regmap_hw_free_context)(void *context); * @max_raw_read: Max raw read size that can be used on the bus. * @max_raw_write: Max raw write size that can be used on the bus. * @free_on_exit: kfree this on exit of regmap + * @max_combined_rw: Max size for raw_read + raw_write, when they are issued + * together as part of the same message */ struct regmap_bus { bool fast_io; @@ -521,6 +523,7 @@ struct regmap_bus { enum regmap_endian val_format_endian_default; size_t max_raw_read; size_t max_raw_write; + size_t max_combined_rw; bool free_on_exit; };
regmap-spi will split data and address between two transfers in the same message, so max_[read|write] must include space for the address and padding Signed-off-by: Lucas Tanure <tanureal@opensource.cirrus.com> --- drivers/base/regmap/regmap-spi.c | 4 ++++ drivers/base/regmap/regmap.c | 15 +++++++++++++++ include/linux/regmap.h | 3 +++ 3 files changed, 22 insertions(+)