Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
regmap-spi.c
Go to the documentation of this file.
1 /*
2  * Register map access API - SPI support
3  *
4  * Copyright 2011 Wolfson Microelectronics plc
5  *
6  * Author: Mark Brown <[email protected]>
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 #include <linux/module.h>
17 
18 static int regmap_spi_write(void *context, const void *data, size_t count)
19 {
20  struct device *dev = context;
21  struct spi_device *spi = to_spi_device(dev);
22 
23  return spi_write(spi, data, count);
24 }
25 
26 static int regmap_spi_gather_write(void *context,
27  const void *reg, size_t reg_len,
28  const void *val, size_t val_len)
29 {
30  struct device *dev = context;
31  struct spi_device *spi = to_spi_device(dev);
32  struct spi_message m;
33  struct spi_transfer t[2] = { { .tx_buf = reg, .len = reg_len, },
34  { .tx_buf = val, .len = val_len, }, };
35 
36  spi_message_init(&m);
37  spi_message_add_tail(&t[0], &m);
38  spi_message_add_tail(&t[1], &m);
39 
40  return spi_sync(spi, &m);
41 }
42 
43 static int regmap_spi_read(void *context,
44  const void *reg, size_t reg_size,
45  void *val, size_t val_size)
46 {
47  struct device *dev = context;
48  struct spi_device *spi = to_spi_device(dev);
49 
50  return spi_write_then_read(spi, reg, reg_size, val, val_size);
51 }
52 
53 static struct regmap_bus regmap_spi = {
54  .write = regmap_spi_write,
55  .gather_write = regmap_spi_gather_write,
56  .read = regmap_spi_read,
57  .read_flag_mask = 0x80,
58 };
59 
70  const struct regmap_config *config)
71 {
72  return regmap_init(&spi->dev, &regmap_spi, &spi->dev, config);
73 }
75 
87  const struct regmap_config *config)
88 {
89  return devm_regmap_init(&spi->dev, &regmap_spi, &spi->dev, config);
90 }
92 
93 MODULE_LICENSE("GPL");