size_t val_bytes = map->format.val_bytes;
        size_t total_size = val_bytes * val_count;
 
-       if (map->bus && !map->format.parse_inplace)
-               return -EINVAL;
        if (!IS_ALIGNED(reg, map->reg_stride))
                return -EINVAL;
 
         *
         * The first if block is used for memory mapped io. It does not allow
         * val_bytes of 3 for example.
-        * The second one is used for busses which do not have this limitation
+        * The second one is for busses that do not provide raw I/O.
+        * The third one is used for busses which do not have these limitations
         * and can write arbitrary value lengths.
         */
        if (!map->bus) {
                }
 out:
                map->unlock(map->lock_arg);
+       } else if (map->bus && !map->format.parse_inplace) {
+               const u8 *u8 = val;
+               const u16 *u16 = val;
+               const u32 *u32 = val;
+               unsigned int ival;
+
+               for (i = 0; i < val_count; i++) {
+                       switch (map->format.val_bytes) {
+                       case 4:
+                               ival = u32[i];
+                               break;
+                       case 2:
+                               ival = u16[i];
+                               break;
+                       case 1:
+                               ival = u8[i];
+                               break;
+                       default:
+                               return -EINVAL;
+                       }
+
+                       ret = regmap_write(map, reg + (i * map->reg_stride),
+                                          ival);
+                       if (ret)
+                               return ret;
+               }
        } else if (map->use_single_write ||
                   (map->max_raw_write && map->max_raw_write < total_size)) {
                int chunk_stride = map->reg_stride;