Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

regmap: spi: Set regmap max raw r/w from max_transfer_size

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>

authored by

Lucas Tanure and committed by
Mark Brown
f231ff38 6880fa6c

+32 -4
+32 -4
drivers/base/regmap/regmap-spi.c
··· 109 109 .val_format_endian_default = REGMAP_ENDIAN_BIG, 110 110 }; 111 111 112 + static const struct regmap_bus *regmap_get_spi_bus(struct spi_device *spi, 113 + const struct regmap_config *config) 114 + { 115 + size_t max_size = spi_max_transfer_size(spi); 116 + struct regmap_bus *bus; 117 + 118 + if (max_size != SIZE_MAX) { 119 + bus = kmemdup(&regmap_spi, sizeof(*bus), GFP_KERNEL); 120 + if (!bus) 121 + return ERR_PTR(-ENOMEM); 122 + 123 + bus->free_on_exit = true; 124 + bus->max_raw_read = max_size; 125 + bus->max_raw_write = max_size; 126 + return bus; 127 + } 128 + 129 + return &regmap_spi; 130 + } 131 + 112 132 struct regmap *__regmap_init_spi(struct spi_device *spi, 113 133 const struct regmap_config *config, 114 134 struct lock_class_key *lock_key, 115 135 const char *lock_name) 116 136 { 117 - return __regmap_init(&spi->dev, &regmap_spi, &spi->dev, config, 118 - lock_key, lock_name); 137 + const struct regmap_bus *bus = regmap_get_spi_bus(spi, config); 138 + 139 + if (IS_ERR(bus)) 140 + return ERR_CAST(bus); 141 + 142 + return __regmap_init(&spi->dev, bus, &spi->dev, config, lock_key, lock_name); 119 143 } 120 144 EXPORT_SYMBOL_GPL(__regmap_init_spi); 121 145 ··· 148 124 struct lock_class_key *lock_key, 149 125 const char *lock_name) 150 126 { 151 - return __devm_regmap_init(&spi->dev, &regmap_spi, &spi->dev, config, 152 - lock_key, lock_name); 127 + const struct regmap_bus *bus = regmap_get_spi_bus(spi, config); 128 + 129 + if (IS_ERR(bus)) 130 + return ERR_CAST(bus); 131 + 132 + return __devm_regmap_init(&spi->dev, bus, &spi->dev, config, lock_key, lock_name); 153 133 } 154 134 EXPORT_SYMBOL_GPL(__devm_regmap_init_spi); 155 135