aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2013-10-10 17:38:29 -0400
committerMark Brown <broonie@linaro.org>2013-10-14 17:09:26 -0400
commit04c50ccf0dab02923ef888a4839bfbd00de03181 (patch)
treed9e0981c77d0436410b20f518eaa0afd8bee8472
parentcd1b9dd0220d3c126b3b61c1f96f0832fc21fc61 (diff)
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>
-rw-r--r--drivers/base/regmap/regmap.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index a975a601f718..d0ce2fef43a3 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -1157,18 +1157,23 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
1157 /* If the caller supplied the value we can use it safely. */ 1157 /* If the caller supplied the value we can use it safely. */
1158 memcpy(async->work_buf, map->work_buf, map->format.pad_bytes + 1158 memcpy(async->work_buf, map->work_buf, map->format.pad_bytes +
1159 map->format.reg_bytes + map->format.val_bytes); 1159 map->format.reg_bytes + map->format.val_bytes);
1160 if (val == work_val)
1161 val = async->work_buf + map->format.pad_bytes +
1162 map->format.reg_bytes;
1163 1160
1164 spin_lock_irqsave(&map->async_lock, flags); 1161 spin_lock_irqsave(&map->async_lock, flags);
1165 list_add_tail(&async->list, &map->async_list); 1162 list_add_tail(&async->list, &map->async_list);
1166 spin_unlock_irqrestore(&map->async_lock, flags); 1163 spin_unlock_irqrestore(&map->async_lock, flags);
1167 1164
1168 ret = map->bus->async_write(map->bus_context, async->work_buf, 1165 if (val != work_val)
1169 map->format.reg_bytes + 1166 ret = map->bus->async_write(map->bus_context,
1170 map->format.pad_bytes, 1167 async->work_buf,
1171 val, val_len, async); 1168 map->format.reg_bytes +
1169 map->format.pad_bytes,
1170 val, val_len, async);
1171 else
1172 ret = map->bus->async_write(map->bus_context,
1173 async->work_buf,
1174 map->format.reg_bytes +
1175 map->format.pad_bytes +
1176 val_len, NULL, 0, async);
1172 1177
1173 if (ret != 0) { 1178 if (ret != 0) {
1174 dev_err(map->dev, "Failed to schedule write: %d\n", 1179 dev_err(map->dev, "Failed to schedule write: %d\n",