2 * Register map access API - I2C support
4 * Copyright 2011 Wolfson Microelectronics plc
6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
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.
13 #include <linux/regmap.h>
14 #include <linux/i2c.h>
15 #include <linux/module.h>
16 #include <linux/init.h>
18 static int regmap_i2c_write(void *context
, const void *data
, size_t count
)
20 struct device
*dev
= context
;
21 struct i2c_client
*i2c
= to_i2c_client(dev
);
24 ret
= i2c_master_send(i2c
, data
, count
);
33 static int regmap_i2c_gather_write(void *context
,
34 const void *reg
, size_t reg_size
,
35 const void *val
, size_t val_size
)
37 struct device
*dev
= context
;
38 struct i2c_client
*i2c
= to_i2c_client(dev
);
39 struct i2c_msg xfer
[2];
42 /* If the I2C controller can't do a gather tell the core, it
43 * will substitute in a linear write for us.
45 if (!i2c_check_functionality(i2c
->adapter
, I2C_FUNC_NOSTART
))
48 xfer
[0].addr
= i2c
->addr
;
50 xfer
[0].len
= reg_size
;
51 xfer
[0].buf
= (void *)reg
;
53 xfer
[1].addr
= i2c
->addr
;
54 xfer
[1].flags
= I2C_M_NOSTART
;
55 xfer
[1].len
= val_size
;
56 xfer
[1].buf
= (void *)val
;
58 ret
= i2c_transfer(i2c
->adapter
, xfer
, 2);
67 static int regmap_i2c_read(void *context
,
68 const void *reg
, size_t reg_size
,
69 void *val
, size_t val_size
)
71 struct device
*dev
= context
;
72 struct i2c_client
*i2c
= to_i2c_client(dev
);
73 struct i2c_msg xfer
[2];
76 xfer
[0].addr
= i2c
->addr
;
78 xfer
[0].len
= reg_size
;
79 xfer
[0].buf
= (void *)reg
;
81 xfer
[1].addr
= i2c
->addr
;
82 xfer
[1].flags
= I2C_M_RD
;
83 xfer
[1].len
= val_size
;
86 ret
= i2c_transfer(i2c
->adapter
, xfer
, 2);
95 static struct regmap_bus regmap_i2c
= {
96 .write
= regmap_i2c_write
,
97 .gather_write
= regmap_i2c_gather_write
,
98 .read
= regmap_i2c_read
,
102 * regmap_init_i2c(): Initialise register map
104 * @i2c: Device that will be interacted with
105 * @config: Configuration for register map
107 * The return value will be an ERR_PTR() on error or a valid pointer to
110 struct regmap
*regmap_init_i2c(struct i2c_client
*i2c
,
111 const struct regmap_config
*config
)
113 return regmap_init(&i2c
->dev
, ®map_i2c
, &i2c
->dev
, config
);
115 EXPORT_SYMBOL_GPL(regmap_init_i2c
);
118 * devm_regmap_init_i2c(): Initialise managed register map
120 * @i2c: Device that will be interacted with
121 * @config: Configuration for register map
123 * The return value will be an ERR_PTR() on error or a valid pointer
124 * to a struct regmap. The regmap will be automatically freed by the
125 * device management code.
127 struct regmap
*devm_regmap_init_i2c(struct i2c_client
*i2c
,
128 const struct regmap_config
*config
)
130 return devm_regmap_init(&i2c
->dev
, ®map_i2c
, &i2c
->dev
, config
);
132 EXPORT_SYMBOL_GPL(devm_regmap_init_i2c
);
134 MODULE_LICENSE("GPL");