ASoC: da7219: Reset codec gracefully, if still active
Currently the reset code in i2c_probe only resets the AAD part of the device and not the entire codec. This patch updates the driver to resolve this and ensures that if the codec is still active from a previous boot then the audio paths are powered down prior to reset. Signed-off-by: Adam Thomson <Adam.Thomson.Opensource@diasemi.com> Signed-off-by: Mark Brown <broonie@kernel.org>
此提交包含在:
@@ -1925,7 +1925,8 @@ static int da7219_i2c_probe(struct i2c_client *i2c,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct da7219_priv *da7219;
|
||||
int ret;
|
||||
unsigned int system_active, system_status;
|
||||
int i, ret;
|
||||
|
||||
da7219 = devm_kzalloc(&i2c->dev, sizeof(struct da7219_priv),
|
||||
GFP_KERNEL);
|
||||
@@ -1941,14 +1942,37 @@ static int da7219_i2c_probe(struct i2c_client *i2c,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Software reset codec. */
|
||||
regcache_cache_bypass(da7219->regmap, true);
|
||||
|
||||
/* Disable audio paths if still active from previous start */
|
||||
regmap_read(da7219->regmap, DA7219_SYSTEM_ACTIVE, &system_active);
|
||||
if (system_active) {
|
||||
regmap_write(da7219->regmap, DA7219_GAIN_RAMP_CTRL,
|
||||
DA7219_GAIN_RAMP_RATE_NOMINAL);
|
||||
regmap_write(da7219->regmap, DA7219_SYSTEM_MODES_INPUT, 0x00);
|
||||
regmap_write(da7219->regmap, DA7219_SYSTEM_MODES_OUTPUT, 0x01);
|
||||
|
||||
for (i = 0; i < DA7219_SYS_STAT_CHECK_RETRIES; ++i) {
|
||||
regmap_read(da7219->regmap, DA7219_SYSTEM_STATUS,
|
||||
&system_status);
|
||||
if (!system_status)
|
||||
break;
|
||||
|
||||
msleep(DA7219_SYS_STAT_CHECK_DELAY);
|
||||
}
|
||||
}
|
||||
|
||||
/* Soft reset codec */
|
||||
regmap_write_bits(da7219->regmap, DA7219_ACCDET_CONFIG_1,
|
||||
DA7219_ACCDET_EN_MASK, 0);
|
||||
regmap_write_bits(da7219->regmap, DA7219_CIF_CTRL,
|
||||
DA7219_CIF_REG_SOFT_RESET_MASK, 0);
|
||||
DA7219_CIF_REG_SOFT_RESET_MASK,
|
||||
DA7219_CIF_REG_SOFT_RESET_MASK);
|
||||
regmap_write_bits(da7219->regmap, DA7219_SYSTEM_ACTIVE,
|
||||
DA7219_SYSTEM_ACTIVE_MASK, 0);
|
||||
|
||||
regcache_cache_bypass(da7219->regmap, false);
|
||||
|
||||
ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_da7219,
|
||||
&da7219_dai, 1);
|
||||
if (ret < 0) {
|
||||
|
新增問題並參考
封鎖使用者