static int regcache_sync_block_raw_flush(struct regmap *map, const void **data, unsigned int base, unsigned int cur) { size_t val_bytes = map->format.val_bytes; int ret, count; if (*data == NULL) return 0; count = (cur - base) / map->reg_stride; dev_dbg(map->dev, "Writing %zu bytes for %d registers from 0x%x-0x%x\n", count * val_bytes, count, base, cur - map->reg_stride); map->cache_bypass = true; ret = _regmap_raw_write(map, base, *data, count * val_bytes); if (ret) dev_err(map->dev, "Unable to sync registers %#x-%#x. %d\n", base, cur - map->reg_stride, ret); map->cache_bypass = false; *data = NULL; return ret; }
static int regcache_sync_block_raw_flush(struct regmap *map, const void **data, unsigned int base, unsigned int cur) { size_t val_bytes = map->format.val_bytes; int ret, count; if (*data == NULL) return 0; count = cur - base; dev_dbg(map->dev, "Writing %zu bytes for %d registers from 0x%x-0x%x\n", count * val_bytes, count, base, cur - 1); map->cache_bypass = 1; ret = _regmap_raw_write(map, base, *data, count * val_bytes, false); map->cache_bypass = 0; *data = NULL; return ret; }
int _regmap_write(struct regmap *map, unsigned int reg, unsigned int val) { int ret; BUG_ON(!map->format.format_write && !map->format.format_val); if (!map->cache_bypass) { ret = regcache_write(map, reg, val); if (ret != 0) return ret; if (map->cache_only) return 0; } trace_regmap_reg_write(map->dev, reg, val); if (map->format.format_write) { map->format.format_write(map, reg, val); trace_regmap_hw_write_start(map->dev, reg, 1); ret = map->bus->write(map->dev, map->work_buf, map->format.buf_size); trace_regmap_hw_write_done(map->dev, reg, 1); return ret; } else { map->format.format_val(map->work_buf + map->format.reg_bytes, val); return _regmap_raw_write(map, reg, map->work_buf + map->format.reg_bytes, map->format.val_bytes); } }
/** * regmap_raw_write(): Write raw values to one or more registers * * @map: Register map to write to * @reg: Initial register to write to * @val: Block of data to be written, laid out for direct transmission to the * device * @val_len: Length of data pointed to by val. * * This function is intended to be used for things like firmware * download where a large block of data needs to be transferred to the * device. No formatting will be done on the data provided. * * A value of zero will be returned on success, a negative errno will * be returned in error cases. */ int regmap_raw_write(struct regmap *map, unsigned int reg, const void *val, size_t val_len) { int ret; WARN_ON(map->cache_type != REGCACHE_NONE); mutex_lock(&map->lock); ret = _regmap_raw_write(map, reg, val, val_len); mutex_unlock(&map->lock); return ret; }