Commit a676f083068b08e676c557279effbd7f4d590812
1 parent
9943fa300a
Exists in
master
and in
6 other branches
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
drivers/base/regmap/Makefile
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, ®map_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, |