.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(®map_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 ®map_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, ®map_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);
 
                                      struct lock_class_key *lock_key,
                                      const char *lock_name)
 {
-       return __devm_regmap_init(&spi->dev, ®map_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);