aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base/regmap/regmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/base/regmap/regmap.c')
-rw-r--r--drivers/base/regmap/regmap.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index 7a3f535e481..bde30c5d5ee 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -163,6 +163,7 @@ static unsigned int regmap_parse_32(void *buf)
163 * 163 *
164 * @dev: Device that will be interacted with 164 * @dev: Device that will be interacted with
165 * @bus: Bus-specific callbacks to use with device 165 * @bus: Bus-specific callbacks to use with device
166 * @bus_context: Data passed to bus-specific callbacks
166 * @config: Configuration for register map 167 * @config: Configuration for register map
167 * 168 *
168 * The return value will be an ERR_PTR() on error or a valid pointer to 169 * 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)
171 */ 172 */
172struct regmap *regmap_init(struct device *dev, 173struct regmap *regmap_init(struct device *dev,
173 const struct regmap_bus *bus, 174 const struct regmap_bus *bus,
175 void *bus_context,
174 const struct regmap_config *config) 176 const struct regmap_config *config)
175{ 177{
176 struct regmap *map; 178 struct regmap *map;
@@ -193,6 +195,7 @@ struct regmap *regmap_init(struct device *dev,
193 map->format.buf_size += map->format.pad_bytes; 195 map->format.buf_size += map->format.pad_bytes;
194 map->dev = dev; 196 map->dev = dev;
195 map->bus = bus; 197 map->bus = bus;
198 map->bus_context = bus_context;
196 map->max_register = config->max_register; 199 map->max_register = config->max_register;
197 map->writeable_reg = config->writeable_reg; 200 map->writeable_reg = config->writeable_reg;
198 map->readable_reg = config->readable_reg; 201 map->readable_reg = config->readable_reg;
@@ -316,6 +319,7 @@ static void devm_regmap_release(struct device *dev, void *res)
316 * 319 *
317 * @dev: Device that will be interacted with 320 * @dev: Device that will be interacted with
318 * @bus: Bus-specific callbacks to use with device 321 * @bus: Bus-specific callbacks to use with device
322 * @bus_context: Data passed to bus-specific callbacks
319 * @config: Configuration for register map 323 * @config: Configuration for register map
320 * 324 *
321 * The return value will be an ERR_PTR() on error or a valid pointer 325 * 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)
325 */ 329 */
326struct regmap *devm_regmap_init(struct device *dev, 330struct regmap *devm_regmap_init(struct device *dev,
327 const struct regmap_bus *bus, 331 const struct regmap_bus *bus,
332 void *bus_context,
328 const struct regmap_config *config) 333 const struct regmap_config *config)
329{ 334{
330 struct regmap **ptr, *regmap; 335 struct regmap **ptr, *regmap;
@@ -333,7 +338,7 @@ struct regmap *devm_regmap_init(struct device *dev,
333 if (!ptr) 338 if (!ptr)
334 return ERR_PTR(-ENOMEM); 339 return ERR_PTR(-ENOMEM);
335 340
336 regmap = regmap_init(dev, bus, config); 341 regmap = regmap_init(dev, bus, bus_context, config);
337 if (!IS_ERR(regmap)) { 342 if (!IS_ERR(regmap)) {
338 *ptr = regmap; 343 *ptr = regmap;
339 devres_add(dev, ptr); 344 devres_add(dev, ptr);
@@ -391,6 +396,8 @@ void regmap_exit(struct regmap *map)
391{ 396{
392 regcache_exit(map); 397 regcache_exit(map);
393 regmap_debugfs_exit(map); 398 regmap_debugfs_exit(map);
399 if (map->bus->free_context)
400 map->bus->free_context(map->bus_context);
394 kfree(map->work_buf); 401 kfree(map->work_buf);
395 kfree(map); 402 kfree(map);
396} 403}
@@ -444,12 +451,12 @@ static int _regmap_raw_write(struct regmap *map, unsigned int reg,
444 */ 451 */
445 if (val == (map->work_buf + map->format.pad_bytes + 452 if (val == (map->work_buf + map->format.pad_bytes +
446 map->format.reg_bytes)) 453 map->format.reg_bytes))
447 ret = map->bus->write(map->dev, map->work_buf, 454 ret = map->bus->write(map->bus_context, map->work_buf,
448 map->format.reg_bytes + 455 map->format.reg_bytes +
449 map->format.pad_bytes + 456 map->format.pad_bytes +
450 val_len); 457 val_len);
451 else if (map->bus->gather_write) 458 else if (map->bus->gather_write)
452 ret = map->bus->gather_write(map->dev, map->work_buf, 459 ret = map->bus->gather_write(map->bus_context, map->work_buf,
453 map->format.reg_bytes + 460 map->format.reg_bytes +
454 map->format.pad_bytes, 461 map->format.pad_bytes,
455 val, val_len); 462 val, val_len);
@@ -464,7 +471,7 @@ static int _regmap_raw_write(struct regmap *map, unsigned int reg,
464 memcpy(buf, map->work_buf, map->format.reg_bytes); 471 memcpy(buf, map->work_buf, map->format.reg_bytes);
465 memcpy(buf + map->format.reg_bytes + map->format.pad_bytes, 472 memcpy(buf + map->format.reg_bytes + map->format.pad_bytes,
466 val, val_len); 473 val, val_len);
467 ret = map->bus->write(map->dev, buf, len); 474 ret = map->bus->write(map->bus_context, buf, len);
468 475
469 kfree(buf); 476 kfree(buf);
470 } 477 }
@@ -498,7 +505,7 @@ int _regmap_write(struct regmap *map, unsigned int reg,
498 505
499 trace_regmap_hw_write_start(map->dev, reg, 1); 506 trace_regmap_hw_write_start(map->dev, reg, 1);
500 507
501 ret = map->bus->write(map->dev, map->work_buf, 508 ret = map->bus->write(map->bus_context, map->work_buf,
502 map->format.buf_size); 509 map->format.buf_size);
503 510
504 trace_regmap_hw_write_done(map->dev, reg, 1); 511 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,
639 trace_regmap_hw_read_start(map->dev, reg, 646 trace_regmap_hw_read_start(map->dev, reg,
640 val_len / map->format.val_bytes); 647 val_len / map->format.val_bytes);
641 648
642 ret = map->bus->read(map->dev, map->work_buf, 649 ret = map->bus->read(map->bus_context, map->work_buf,
643 map->format.reg_bytes + map->format.pad_bytes, 650 map->format.reg_bytes + map->format.pad_bytes,
644 val, val_len); 651 val, val_len);
645 652