regmap: spi: Set regmap max raw r/w from max_transfer_size
authorLucas Tanure <tanureal@opensource.cirrus.com>
Thu, 21 Oct 2021 13:27:21 +0000 (10:27 -0300)
committerMark Brown <broonie@kernel.org>
Sat, 23 Oct 2021 18:55:03 +0000 (19:55 +0100)
Set regmap raw read/write from spi max_transfer_size
so regmap_raw_read/write can split the access into chunks

Signed-off-by: Lucas Tanure <tanureal@opensource.cirrus.com>
Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
[AndrĂ©: fix build warning]
Signed-off-by: André Almeida <andrealmeid@collabora.com>
Link: https://lore.kernel.org/r/20211021132721.13669-1-andrealmeid@collabora.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/base/regmap/regmap-spi.c

index c1894e9..719323b 100644 (file)
@@ -109,13 +109,37 @@ static const struct regmap_bus regmap_spi = {
        .val_format_endian_default = REGMAP_ENDIAN_BIG,
 };
 
+static const struct regmap_bus *regmap_get_spi_bus(struct spi_device *spi,
+                                                  const struct regmap_config *config)
+{
+       size_t max_size = spi_max_transfer_size(spi);
+       struct regmap_bus *bus;
+
+       if (max_size != SIZE_MAX) {
+               bus = kmemdup(&regmap_spi, sizeof(*bus), GFP_KERNEL);
+               if (!bus)
+                       return ERR_PTR(-ENOMEM);
+
+               bus->free_on_exit = true;
+               bus->max_raw_read = max_size;
+               bus->max_raw_write = max_size;
+               return bus;
+       }
+
+       return &regmap_spi;
+}
+
 struct regmap *__regmap_init_spi(struct spi_device *spi,
                                 const struct regmap_config *config,
                                 struct lock_class_key *lock_key,
                                 const char *lock_name)
 {
-       return __regmap_init(&spi->dev, &regmap_spi, &spi->dev, config,
-                            lock_key, lock_name);
+       const struct regmap_bus *bus = regmap_get_spi_bus(spi, config);
+
+       if (IS_ERR(bus))
+               return ERR_CAST(bus);
+
+       return __regmap_init(&spi->dev, bus, &spi->dev, config, lock_key, lock_name);
 }
 EXPORT_SYMBOL_GPL(__regmap_init_spi);
 
@@ -124,8 +148,12 @@ struct regmap *__devm_regmap_init_spi(struct spi_device *spi,
                                      struct lock_class_key *lock_key,
                                      const char *lock_name)
 {
-       return __devm_regmap_init(&spi->dev, &regmap_spi, &spi->dev, config,
-                                 lock_key, lock_name);
+       const struct regmap_bus *bus = regmap_get_spi_bus(spi, config);
+
+       if (IS_ERR(bus))
+               return ERR_CAST(bus);
+
+       return __devm_regmap_init(&spi->dev, bus, &spi->dev, config, lock_key, lock_name);
 }
 EXPORT_SYMBOL_GPL(__devm_regmap_init_spi);