Commit a676f083068b08e676c557279effbd7f4d590812

Authored by Mark Brown
1 parent 9943fa300a

regmap: Add SPI bus support

Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: Liam Girdwood <lrg@ti.com>
Acked-by: Wolfram Sang <w.sang@pengutronix.de>
Acked-by: Grant Likely <grant.likely@secretlab.ca>

Showing 4 changed files with 81 additions and 1 deletions Side-by-side Diff

drivers/base/regmap/Kconfig
... ... @@ -3,9 +3,12 @@
3 3 # subsystems should select the appropriate symbols.
4 4  
5 5 config REGMAP
6   - default y if REGMAP_I2C
  6 + default y if (REGMAP_I2C || REGMAP_SPI)
7 7 bool
8 8  
9 9 config REGMAP_I2C
  10 + tristate
  11 +
  12 +config REGMAP_SPI
10 13 tristate
drivers/base/regmap/Makefile
1 1 obj-$(CONFIG_REGMAP) += regmap.o
2 2 obj-$(CONFIG_REGMAP_I2C) += regmap-i2c.o
  3 +obj-$(CONFIG_REGMAP_SPI) += regmap-spi.o
drivers/base/regmap/regmap-spi.c
  1 +/*
  2 + * Register map access API - SPI support
  3 + *
  4 + * Copyright 2011 Wolfson Microelectronics plc
  5 + *
  6 + * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
  7 + *
  8 + * This program is free software; you can redistribute it and/or modify
  9 + * it under the terms of the GNU General Public License version 2 as
  10 + * published by the Free Software Foundation.
  11 + */
  12 +
  13 +#include <linux/regmap.h>
  14 +#include <linux/spi/spi.h>
  15 +#include <linux/init.h>
  16 +
  17 +static int regmap_spi_write(struct device *dev, const void *data, size_t count)
  18 +{
  19 + struct spi_device *spi = to_spi_device(dev);
  20 +
  21 + return spi_write(spi, data, count);
  22 +}
  23 +
  24 +static int regmap_spi_gather_write(struct device *dev,
  25 + const void *reg, size_t reg_len,
  26 + const void *val, size_t val_len)
  27 +{
  28 + struct spi_device *spi = to_spi_device(dev);
  29 + struct spi_message m;
  30 + struct spi_transfer t[2] = { { .tx_buf = reg, .len = reg_len, },
  31 + { .tx_buf = val, .len = val_len, }, };
  32 +
  33 + spi_message_init(&m);
  34 + spi_message_add_tail(&t[0], &m);
  35 + spi_message_add_tail(&t[1], &m);
  36 +
  37 + return spi_sync(spi, &m);
  38 +}
  39 +
  40 +static int regmap_spi_read(struct device *dev,
  41 + const void *reg, size_t reg_size,
  42 + void *val, size_t val_size)
  43 +{
  44 + struct spi_device *spi = to_spi_device(dev);
  45 +
  46 + return spi_write_then_read(spi, reg, reg_size, val, val_size);
  47 +}
  48 +
  49 +static struct regmap_bus regmap_spi = {
  50 + .type = &spi_bus_type,
  51 + .write = regmap_spi_write,
  52 + .gather_write = regmap_spi_gather_write,
  53 + .read = regmap_spi_read,
  54 + .owner = THIS_MODULE,
  55 + .read_flag_mask = 0x80,
  56 +};
  57 +
  58 +/**
  59 + * regmap_init_spi(): Initialise register map
  60 + *
  61 + * @spi: Device that will be interacted with
  62 + * @config: Configuration for register map
  63 + *
  64 + * The return value will be an ERR_PTR() on error or a valid pointer to
  65 + * a struct regmap.
  66 + */
  67 +struct regmap *regmap_init_spi(struct spi_device *spi,
  68 + const struct regmap_config *config)
  69 +{
  70 + return regmap_init(&spi->dev, &regmap_spi, config);
  71 +}
  72 +EXPORT_SYMBOL_GPL(regmap_init_spi);
include/linux/regmap.h
... ... @@ -18,6 +18,7 @@
18 18 #include <linux/module.h>
19 19  
20 20 struct i2c_client;
  21 +struct spi_device;
21 22  
22 23 struct regmap_config {
23 24 int reg_bits;
... ... @@ -63,6 +64,9 @@
63 64 const struct regmap_config *config);
64 65 struct regmap *regmap_init_i2c(struct i2c_client *i2c,
65 66 const struct regmap_config *config);
  67 +struct regmap *regmap_init_spi(struct spi_device *dev,
  68 + const struct regmap_config *config);
  69 +
66 70 void regmap_exit(struct regmap *map);
67 71 int regmap_write(struct regmap *map, unsigned int reg, unsigned int val);
68 72 int regmap_raw_write(struct regmap *map, unsigned int reg,