aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/codecs/twl4030.c17
-rw-r--r--sound/soc/codecs/twl4030.h1
2 files changed, 18 insertions, 0 deletions
diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c
index 45de2aad283c..b292c2d8f2a3 100644
--- a/sound/soc/codecs/twl4030.c
+++ b/sound/soc/codecs/twl4030.c
@@ -262,6 +262,17 @@ static inline void twl4030_check_defaults(struct snd_soc_codec *codec)
262 difference, difference ? "Not OK" : "OK"); 262 difference, difference ? "Not OK" : "OK");
263} 263}
264 264
265static inline void twl4030_reset_registers(struct snd_soc_codec *codec)
266{
267 int i;
268
269 /* set all audio section registers to reasonable defaults */
270 for (i = TWL4030_REG_OPTION; i <= TWL4030_REG_MISC_SET_2; i++)
271 if (i != TWL4030_REG_APLL_CTL)
272 twl4030_write(codec, i, twl4030_reg[i]);
273
274}
275
265static void twl4030_init_chip(struct platform_device *pdev) 276static void twl4030_init_chip(struct platform_device *pdev)
266{ 277{
267 struct snd_soc_device *socdev = platform_get_drvdata(pdev); 278 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
@@ -275,6 +286,10 @@ static void twl4030_init_chip(struct platform_device *pdev)
275 if (setup && setup->check_defaults) 286 if (setup && setup->check_defaults)
276 twl4030_check_defaults(codec); 287 twl4030_check_defaults(codec);
277 288
289 /* Reset registers, if no setup data or if instructed to do so */
290 if (!setup || (setup && setup->reset_registers))
291 twl4030_reset_registers(codec);
292
278 /* Refresh APLL_CTL register from HW */ 293 /* Refresh APLL_CTL register from HW */
279 twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, &byte, 294 twl_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, &byte,
280 TWL4030_REG_APLL_CTL); 295 TWL4030_REG_APLL_CTL);
@@ -2271,6 +2286,8 @@ static int twl4030_soc_remove(struct platform_device *pdev)
2271 struct snd_soc_device *socdev = platform_get_drvdata(pdev); 2286 struct snd_soc_device *socdev = platform_get_drvdata(pdev);
2272 struct snd_soc_codec *codec = socdev->card->codec; 2287 struct snd_soc_codec *codec = socdev->card->codec;
2273 2288
2289 /* Reset registers to their chip default before leaving */
2290 twl4030_reset_registers(codec);
2274 twl4030_set_bias_level(codec, SND_SOC_BIAS_OFF); 2291 twl4030_set_bias_level(codec, SND_SOC_BIAS_OFF);
2275 snd_soc_free_pcms(socdev); 2292 snd_soc_free_pcms(socdev);
2276 snd_soc_dapm_free(socdev); 2293 snd_soc_dapm_free(socdev);
diff --git a/sound/soc/codecs/twl4030.h b/sound/soc/codecs/twl4030.h
index c22542c2690c..788e3d125099 100644
--- a/sound/soc/codecs/twl4030.h
+++ b/sound/soc/codecs/twl4030.h
@@ -44,6 +44,7 @@ struct twl4030_setup_data {
44 unsigned int sysclk; 44 unsigned int sysclk;
45 unsigned int offset_cncl_path; 45 unsigned int offset_cncl_path;
46 unsigned int check_defaults:1; 46 unsigned int check_defaults:1;
47 unsigned int reset_registers:1;
47 unsigned int hs_extmute:1; 48 unsigned int hs_extmute:1;
48 void (*set_hs_extmute)(int mute); 49 void (*set_hs_extmute)(int mute);
49}; 50};