mirror of
https://github.com/torvalds/linux.git
synced 2024-12-05 10:32:35 +00:00
regmap: Only send a single buffer for async I/O if writing one register
Extend the interface for async I/O by allowing the value buffer to be omitted and sending the value as part of the register buffer, minimising the number of separate hardware operations required. Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
parent
cd1b9dd022
commit
04c50ccf0d
@ -1157,18 +1157,23 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
|
||||
/* If the caller supplied the value we can use it safely. */
|
||||
memcpy(async->work_buf, map->work_buf, map->format.pad_bytes +
|
||||
map->format.reg_bytes + map->format.val_bytes);
|
||||
if (val == work_val)
|
||||
val = async->work_buf + map->format.pad_bytes +
|
||||
map->format.reg_bytes;
|
||||
|
||||
spin_lock_irqsave(&map->async_lock, flags);
|
||||
list_add_tail(&async->list, &map->async_list);
|
||||
spin_unlock_irqrestore(&map->async_lock, flags);
|
||||
|
||||
ret = map->bus->async_write(map->bus_context, async->work_buf,
|
||||
map->format.reg_bytes +
|
||||
map->format.pad_bytes,
|
||||
val, val_len, async);
|
||||
if (val != work_val)
|
||||
ret = map->bus->async_write(map->bus_context,
|
||||
async->work_buf,
|
||||
map->format.reg_bytes +
|
||||
map->format.pad_bytes,
|
||||
val, val_len, async);
|
||||
else
|
||||
ret = map->bus->async_write(map->bus_context,
|
||||
async->work_buf,
|
||||
map->format.reg_bytes +
|
||||
map->format.pad_bytes +
|
||||
val_len, NULL, 0, async);
|
||||
|
||||
if (ret != 0) {
|
||||
dev_err(map->dev, "Failed to schedule write: %d\n",
|
||||
|
Loading…
Reference in New Issue
Block a user