|
@@ -163,6 +163,7 @@ static unsigned int regmap_parse_32(void *buf)
|
|
|
*
|
|
|
* @dev: Device that will be interacted with
|
|
|
* @bus: Bus-specific callbacks to use with device
|
|
|
+ * @bus_context: Data passed to bus-specific callbacks
|
|
|
* @config: Configuration for register map
|
|
|
*
|
|
|
* The return value will be an ERR_PTR() on error or a valid pointer to
|
|
@@ -171,6 +172,7 @@ static unsigned int regmap_parse_32(void *buf)
|
|
|
*/
|
|
|
struct regmap *regmap_init(struct device *dev,
|
|
|
const struct regmap_bus *bus,
|
|
|
+ void *bus_context,
|
|
|
const struct regmap_config *config)
|
|
|
{
|
|
|
struct regmap *map;
|
|
@@ -193,6 +195,7 @@ struct regmap *regmap_init(struct device *dev,
|
|
|
map->format.buf_size += map->format.pad_bytes;
|
|
|
map->dev = dev;
|
|
|
map->bus = bus;
|
|
|
+ map->bus_context = bus_context;
|
|
|
map->max_register = config->max_register;
|
|
|
map->writeable_reg = config->writeable_reg;
|
|
|
map->readable_reg = config->readable_reg;
|
|
@@ -316,6 +319,7 @@ static void devm_regmap_release(struct device *dev, void *res)
|
|
|
*
|
|
|
* @dev: Device that will be interacted with
|
|
|
* @bus: Bus-specific callbacks to use with device
|
|
|
+ * @bus_context: Data passed to bus-specific callbacks
|
|
|
* @config: Configuration for register map
|
|
|
*
|
|
|
* The return value will be an ERR_PTR() on error or a valid pointer
|
|
@@ -325,6 +329,7 @@ static void devm_regmap_release(struct device *dev, void *res)
|
|
|
*/
|
|
|
struct regmap *devm_regmap_init(struct device *dev,
|
|
|
const struct regmap_bus *bus,
|
|
|
+ void *bus_context,
|
|
|
const struct regmap_config *config)
|
|
|
{
|
|
|
struct regmap **ptr, *regmap;
|
|
@@ -333,7 +338,7 @@ struct regmap *devm_regmap_init(struct device *dev,
|
|
|
if (!ptr)
|
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
- regmap = regmap_init(dev, bus, config);
|
|
|
+ regmap = regmap_init(dev, bus, bus_context, config);
|
|
|
if (!IS_ERR(regmap)) {
|
|
|
*ptr = regmap;
|
|
|
devres_add(dev, ptr);
|
|
@@ -391,6 +396,8 @@ void regmap_exit(struct regmap *map)
|
|
|
{
|
|
|
regcache_exit(map);
|
|
|
regmap_debugfs_exit(map);
|
|
|
+ if (map->bus->free_context)
|
|
|
+ map->bus->free_context(map->bus_context);
|
|
|
kfree(map->work_buf);
|
|
|
kfree(map);
|
|
|
}
|
|
@@ -444,12 +451,12 @@ static int _regmap_raw_write(struct regmap *map, unsigned int reg,
|
|
|
*/
|
|
|
if (val == (map->work_buf + map->format.pad_bytes +
|
|
|
map->format.reg_bytes))
|
|
|
- ret = map->bus->write(map->dev, map->work_buf,
|
|
|
+ ret = map->bus->write(map->bus_context, map->work_buf,
|
|
|
map->format.reg_bytes +
|
|
|
map->format.pad_bytes +
|
|
|
val_len);
|
|
|
else if (map->bus->gather_write)
|
|
|
- ret = map->bus->gather_write(map->dev, map->work_buf,
|
|
|
+ ret = map->bus->gather_write(map->bus_context, map->work_buf,
|
|
|
map->format.reg_bytes +
|
|
|
map->format.pad_bytes,
|
|
|
val, val_len);
|
|
@@ -464,7 +471,7 @@ static int _regmap_raw_write(struct regmap *map, unsigned int reg,
|
|
|
memcpy(buf, map->work_buf, map->format.reg_bytes);
|
|
|
memcpy(buf + map->format.reg_bytes + map->format.pad_bytes,
|
|
|
val, val_len);
|
|
|
- ret = map->bus->write(map->dev, buf, len);
|
|
|
+ ret = map->bus->write(map->bus_context, buf, len);
|
|
|
|
|
|
kfree(buf);
|
|
|
}
|
|
@@ -498,7 +505,7 @@ int _regmap_write(struct regmap *map, unsigned int reg,
|
|
|
|
|
|
trace_regmap_hw_write_start(map->dev, reg, 1);
|
|
|
|
|
|
- ret = map->bus->write(map->dev, map->work_buf,
|
|
|
+ ret = map->bus->write(map->bus_context, map->work_buf,
|
|
|
map->format.buf_size);
|
|
|
|
|
|
trace_regmap_hw_write_done(map->dev, reg, 1);
|
|
@@ -639,7 +646,7 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
|
|
|
trace_regmap_hw_read_start(map->dev, reg,
|
|
|
val_len / map->format.val_bytes);
|
|
|
|
|
|
- ret = map->bus->read(map->dev, map->work_buf,
|
|
|
+ ret = map->bus->read(map->bus_context, map->work_buf,
|
|
|
map->format.reg_bytes + map->format.pad_bytes,
|
|
|
val, val_len);
|
|
|
|