Skip to content

Commit d2cdb12

Browse files
committed
Merge tag 'regmap-v5.16' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap
Pull regmap update from Mark Brown: "A single change to use the maximum transfer and message sizes advertised by SPI controllers to configure limits within the regmap core, ensuring better interoperation" * tag 'regmap-v5.16' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap: regmap: spi: Set regmap max raw r/w from max_transfer_size
2 parents 247ee3e + f231ff3 commit d2cdb12

File tree

1 file changed

+32
-4
lines changed

1 file changed

+32
-4
lines changed

drivers/base/regmap/regmap-spi.c

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,37 @@ static const struct regmap_bus regmap_spi = {
109109
.val_format_endian_default = REGMAP_ENDIAN_BIG,
110110
};
111111

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+
112132
struct regmap *__regmap_init_spi(struct spi_device *spi,
113133
const struct regmap_config *config,
114134
struct lock_class_key *lock_key,
115135
const char *lock_name)
116136
{
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);
119143
}
120144
EXPORT_SYMBOL_GPL(__regmap_init_spi);
121145

@@ -124,8 +148,12 @@ struct regmap *__devm_regmap_init_spi(struct spi_device *spi,
124148
struct lock_class_key *lock_key,
125149
const char *lock_name)
126150
{
127-
return __devm_regmap_init(&spi->dev, &regmap_spi, &spi->dev, config,
128-
lock_key, lock_name);
151+
const struct regmap_bus *bus = regmap_get_spi_bus(spi, config);
152+
153+
if (IS_ERR(bus))
154+
return ERR_CAST(bus);
155+
156+
return __devm_regmap_init(&spi->dev, bus, &spi->dev, config, lock_key, lock_name);
129157
}
130158
EXPORT_SYMBOL_GPL(__devm_regmap_init_spi);
131159

0 commit comments

Comments
 (0)