aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Thomson <Adam.Thomson.Opensource@diasemi.com>2016-09-26 09:29:20 -0400
committerMark Brown <broonie@kernel.org>2016-09-26 12:39:40 -0400
commita7f16ea90ecffde4d4915eb7c81b11428e636920 (patch)
treed154b8b1069cb4e594349e24d65f30f0c18cea4c
parent8339f0b6b209b640afe8381aa9b5d7accfeaf848 (diff)
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>
-rw-r--r--sound/soc/codecs/da7219.c30
-rw-r--r--sound/soc/codecs/da7219.h5
2 files changed, 32 insertions, 3 deletions
diff --git a/sound/soc/codecs/da7219.c b/sound/soc/codecs/da7219.c
index 9d08c11b6f14..eecb6d6c29cf 100644
--- a/sound/soc/codecs/da7219.c
+++ b/sound/soc/codecs/da7219.c
@@ -1925,7 +1925,8 @@ static int da7219_i2c_probe(struct i2c_client *i2c,
1925 const struct i2c_device_id *id) 1925 const struct i2c_device_id *id)
1926{ 1926{
1927 struct da7219_priv *da7219; 1927 struct da7219_priv *da7219;
1928 int ret; 1928 unsigned int system_active, system_status;
1929 int i, ret;
1929 1930
1930 da7219 = devm_kzalloc(&i2c->dev, sizeof(struct da7219_priv), 1931 da7219 = devm_kzalloc(&i2c->dev, sizeof(struct da7219_priv),
1931 GFP_KERNEL); 1932 GFP_KERNEL);
@@ -1941,14 +1942,37 @@ static int da7219_i2c_probe(struct i2c_client *i2c,
1941 return ret; 1942 return ret;
1942 } 1943 }
1943 1944
1944 /* Software reset codec. */ 1945 regcache_cache_bypass(da7219->regmap, true);
1946
1947 /* Disable audio paths if still active from previous start */
1948 regmap_read(da7219->regmap, DA7219_SYSTEM_ACTIVE, &system_active);
1949 if (system_active) {
1950 regmap_write(da7219->regmap, DA7219_GAIN_RAMP_CTRL,
1951 DA7219_GAIN_RAMP_RATE_NOMINAL);
1952 regmap_write(da7219->regmap, DA7219_SYSTEM_MODES_INPUT, 0x00);
1953 regmap_write(da7219->regmap, DA7219_SYSTEM_MODES_OUTPUT, 0x01);
1954
1955 for (i = 0; i < DA7219_SYS_STAT_CHECK_RETRIES; ++i) {
1956 regmap_read(da7219->regmap, DA7219_SYSTEM_STATUS,
1957 &system_status);
1958 if (!system_status)
1959 break;
1960
1961 msleep(DA7219_SYS_STAT_CHECK_DELAY);
1962 }
1963 }
1964
1965 /* Soft reset codec */
1945 regmap_write_bits(da7219->regmap, DA7219_ACCDET_CONFIG_1, 1966 regmap_write_bits(da7219->regmap, DA7219_ACCDET_CONFIG_1,
1946 DA7219_ACCDET_EN_MASK, 0); 1967 DA7219_ACCDET_EN_MASK, 0);
1947 regmap_write_bits(da7219->regmap, DA7219_CIF_CTRL, 1968 regmap_write_bits(da7219->regmap, DA7219_CIF_CTRL,
1948 DA7219_CIF_REG_SOFT_RESET_MASK, 0); 1969 DA7219_CIF_REG_SOFT_RESET_MASK,
1970 DA7219_CIF_REG_SOFT_RESET_MASK);
1949 regmap_write_bits(da7219->regmap, DA7219_SYSTEM_ACTIVE, 1971 regmap_write_bits(da7219->regmap, DA7219_SYSTEM_ACTIVE,
1950 DA7219_SYSTEM_ACTIVE_MASK, 0); 1972 DA7219_SYSTEM_ACTIVE_MASK, 0);
1951 1973
1974 regcache_cache_bypass(da7219->regmap, false);
1975
1952 ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_da7219, 1976 ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_da7219,
1953 &da7219_dai, 1); 1977 &da7219_dai, 1);
1954 if (ret < 0) { 1978 if (ret < 0) {
diff --git a/sound/soc/codecs/da7219.h b/sound/soc/codecs/da7219.h
index 545576ddf50c..f1b3ad835270 100644
--- a/sound/soc/codecs/da7219.h
+++ b/sound/soc/codecs/da7219.h
@@ -578,6 +578,7 @@
578#define DA7219_GAIN_RAMP_RATE_SHIFT 0 578#define DA7219_GAIN_RAMP_RATE_SHIFT 0
579#define DA7219_GAIN_RAMP_RATE_MASK (0x3 << 0) 579#define DA7219_GAIN_RAMP_RATE_MASK (0x3 << 0)
580#define DA7219_GAIN_RAMP_RATE_X8 (0x0 << 0) 580#define DA7219_GAIN_RAMP_RATE_X8 (0x0 << 0)
581#define DA7219_GAIN_RAMP_RATE_NOMINAL (0x1 << 0)
581#define DA7219_GAIN_RAMP_RATE_MAX 4 582#define DA7219_GAIN_RAMP_RATE_MAX 4
582 583
583/* DA7219_PC_COUNT = 0x94 */ 584/* DA7219_PC_COUNT = 0x94 */
@@ -772,6 +773,10 @@
772/* SRM */ 773/* SRM */
773#define DA7219_SRM_CHECK_RETRIES 8 774#define DA7219_SRM_CHECK_RETRIES 8
774 775
776/* System Controller */
777#define DA7219_SYS_STAT_CHECK_RETRIES 6
778#define DA7219_SYS_STAT_CHECK_DELAY 50
779
775enum da7219_clk_src { 780enum da7219_clk_src {
776 DA7219_CLKSRC_MCLK = 0, 781 DA7219_CLKSRC_MCLK = 0,
777 DA7219_CLKSRC_MCLK_SQR, 782 DA7219_CLKSRC_MCLK_SQR,