]> git.karo-electronics.de Git - linux-beck.git/commitdiff
regmap: Don't generate gather writes for single register raw writes
authorMark Brown <broonie@linaro.org>
Tue, 8 Oct 2013 17:37:36 +0000 (18:37 +0100)
committerMark Brown <broonie@linaro.org>
Wed, 9 Oct 2013 13:05:21 +0000 (14:05 +0100)
Since it is quite common for single register raw or async writes to be
generated by rbtree cache syncs or firmware downloads and essentially all
hardware will be faster with only a single transfer optimise this case by
copying single values into the internal scratch buffer before sending.

Signed-off-by: Mark Brown <broonie@linaro.org>
drivers/base/regmap/regmap.c

index 742f300ca48a173f4f9e4785e6e41a6eb4909ed2..d27758c337af702ddadf05ca9d87d2694973986b 100644 (file)
@@ -1116,6 +1116,16 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
 
        u8[0] |= map->write_flag_mask;
 
+       /*
+        * Essentially all I/O mechanisms will be faster with a single
+        * buffer to write.  Since register syncs often generate raw
+        * writes of single registers optimise that case.
+        */
+       if (val != work_val && val_len == map->format.val_bytes) {
+               memcpy(work_val, val, map->format.val_bytes);
+               val = work_val;
+       }
+
        if (async && map->bus->async_write) {
                struct regmap_async *async;