static int snd_soc_flat_cache_sync(struct snd_soc_codec *codec) { int i; int ret; const struct snd_soc_codec_driver *codec_drv; unsigned int val; codec_drv = codec->driver; for (i = 0; i < codec_drv->reg_cache_size; ++i) { ret = snd_soc_cache_read(codec, i, &val); if (ret) return ret; if (codec->reg_def_copy) if (snd_soc_get_cache_val(codec->reg_def_copy, i, codec_drv->reg_word_size) == val) continue; WARN_ON(!snd_soc_codec_writable_register(codec, i)); ret = snd_soc_write(codec, i, val); if (ret) return ret; dev_dbg(codec->dev, "Synced register %#x, value = %#x\n", i, val); } return 0; }
static unsigned int adau1701_read(struct snd_soc_codec *codec, unsigned int reg) { unsigned int value; unsigned int ret; ret = snd_soc_cache_read(codec, reg, &value); if (ret) return ret; return value; }
static unsigned int lm4857_read(struct snd_soc_codec *codec, unsigned int reg) { unsigned int val; int ret; ret = snd_soc_cache_read(codec, reg, &val); if (ret) return -1; return val; }
static unsigned int hw_read(struct snd_soc_codec *codec, unsigned int reg) { int ret; unsigned int val; if (reg >= codec->driver->reg_cache_size || snd_soc_codec_volatile_register(codec, reg) || codec->cache_bypass) { if (codec->cache_only) return -1; BUG_ON(!codec->hw_read); return codec->hw_read(codec, reg); } ret = snd_soc_cache_read(codec, reg, &val); if (ret < 0) return -1; return val; }
static unsigned int hw_read(struct snd_soc_codec *codec, unsigned int reg) { int ret; unsigned int val; if (reg >= codec->driver->reg_cache_size || snd_soc_codec_volatile_register(codec, reg) || codec->cache_bypass) { if (codec->cache_only) return -1; ret = regmap_read(codec->control_data, reg, &val); if (ret == 0) return val; else return -1; } ret = snd_soc_cache_read(codec, reg, &val); if (ret < 0) return -1; return val; }