diff options
Diffstat (limited to 'drivers/base/regmap/regmap.c')
-rw-r--r-- | drivers/base/regmap/regmap.c | 19 |
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 | */ |
172 | struct regmap *regmap_init(struct device *dev, | 173 | struct 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 | */ |
326 | struct regmap *devm_regmap_init(struct device *dev, | 330 | struct 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 | ||