We already have regmap_init_i2c, so add regmap_init_spi as well. Unlike regmap_init_i2c, this one makes full use of the formatted regmap API. Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- drivers/base/regmap/Kconfig | 5 ++++ drivers/base/regmap/Makefile | 1 + drivers/base/regmap/regmap-spi.c | 42 ++++++++++++++++++++++++++++++++ include/regmap.h | 13 ++++++++++ 4 files changed, 61 insertions(+) create mode 100644 drivers/base/regmap/regmap-spi.c diff --git a/drivers/base/regmap/Kconfig b/drivers/base/regmap/Kconfig index 4fb6b6bcecf8..afe59a538c87 100644 --- a/drivers/base/regmap/Kconfig +++ b/drivers/base/regmap/Kconfig @@ -2,3 +2,8 @@ config REGMAP_FORMATTED bool + +config REGMAP_SPI + bool "SPI regmaps" if COMPILE_TEST + depends on SPI + select REGMAP_FORMATTED diff --git a/drivers/base/regmap/Makefile b/drivers/base/regmap/Makefile index ef6814a50277..d99db4277149 100644 --- a/drivers/base/regmap/Makefile +++ b/drivers/base/regmap/Makefile @@ -3,3 +3,4 @@ obj-y += regmap.o obj-y += regmap-mmio.o obj-$(CONFIG_REGMAP_FORMATTED) += regmap-fmt.o obj-$(CONFIG_I2C) += regmap-i2c.o +obj-$(CONFIG_REGMAP_SPI) += regmap-spi.o diff --git a/drivers/base/regmap/regmap-spi.c b/drivers/base/regmap/regmap-spi.c new file mode 100644 index 000000000000..5a0e418065b8 --- /dev/null +++ b/drivers/base/regmap/regmap-spi.c @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Register map access API - SPI support +// +// Copyright 2011 Wolfson Microelectronics plc +// +// Author: Mark Brown <broonie@xxxxxxxxxxxxxxxxxxxxxxxxxxx> + +#include <regmap.h> +#include <spi/spi.h> + +static int regmap_spi_write(void *context, const void *data, size_t count) +{ + struct device_d *dev = context; + struct spi_device *spi = to_spi_device(dev); + + return spi_write(spi, data, count); +} + +static int regmap_spi_read(void *context, + const void *reg, size_t reg_size, + void *val, size_t val_size) +{ + struct device_d *dev = context; + struct spi_device *spi = to_spi_device(dev); + + return spi_write_then_read(spi, reg, reg_size, val, val_size); +} + +static const struct regmap_bus regmap_spi = { + .write = regmap_spi_write, + .read = regmap_spi_read, + .read_flag_mask = 0x80, + .reg_format_endian_default = REGMAP_ENDIAN_BIG, + .val_format_endian_default = REGMAP_ENDIAN_BIG, +}; + +struct regmap *regmap_init_spi(struct spi_device *spi, + const struct regmap_config *config) +{ + return regmap_init(&spi->dev, ®map_spi, &spi->dev, config); +} diff --git a/include/regmap.h b/include/regmap.h index 36a75eb34e03..8f191c87cfcb 100644 --- a/include/regmap.h +++ b/include/regmap.h @@ -138,6 +138,19 @@ struct regmap *regmap_init_i2c(struct i2c_client *i2c, struct regmap *regmap_init_i2c_smbus(struct i2c_client *client, const struct regmap_config *config); +/** + * regmap_init_spi() - Initialise spi register map + * + * @spi: Device that will be interacted with + * @config: Configuration for register map + * + * The return value will be an ERR_PTR() on error or a valid pointer + * to a struct regmap. + */ +struct spi_device; +struct regmap *regmap_init_spi(struct spi_device *dev, + const struct regmap_config *config); + /** * regmap_init_mmio() - Initialise register map * -- 2.30.2