From mboxrd@z Thu Jan 1 00:00:00 1970 From: Troy Kisky Subject: Re: [PATCH] ASoC: AM3517: Fix AIC23 suspend/resume hang Date: Wed, 25 Nov 2009 13:22:42 -0700 Message-ID: <4B0D9212.1060805@boundarydevices.com> References: <1259154631-15251-1-git-send-email-anuj.aggarwal@ti.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1259154631-15251-1-git-send-email-anuj.aggarwal@ti.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: alsa-devel-bounces@alsa-project.org Errors-To: alsa-devel-bounces@alsa-project.org To: Anuj Aggarwal Cc: alsa-devel@alsa-project.org, linux-omap@vger.kernel.org, Arun KS , Mark Brown List-Id: linux-omap@vger.kernel.org Anuj Aggarwal wrote: > System hang is observed While trying to do suspend. It was because > of an infinite loop in the AIC23 resume path which was trying to > restore AIC23 register values from the register cache. > > This patch fixes the problem by correcting the resume path and > properly activating/deactivating the digital interface while > doing the suspend / off transitions. > > Signed-off-by: Anuj Aggarwal > --- > sound/soc/codecs/tlv320aic23.c | 16 +++------------- > 1 files changed, 3 insertions(+), 13 deletions(-) > > diff --git a/sound/soc/codecs/tlv320aic23.c b/sound/soc/codecs/tlv320aic23.c > index 6b24d8b..cabe60c 100644 > --- a/sound/soc/codecs/tlv320aic23.c > +++ b/sound/soc/codecs/tlv320aic23.c > @@ -565,13 +565,12 @@ static int tlv320aic23_set_bias_level(struct snd_soc_codec *codec, > case SND_SOC_BIAS_PREPARE: > break; > case SND_SOC_BIAS_STANDBY: > - /* everything off except vref/vmid, */ > - tlv320aic23_write(codec, TLV320AIC23_PWR, reg | 0x0040); > + /* Activate the digital interface */ > + tlv320aic23_write(codec, TLV320AIC23_ACTIVE, 0x1); > break; > case SND_SOC_BIAS_OFF: > - /* everything off, dac mute, inactive */ > + /* Deactivate the digital interface */ > tlv320aic23_write(codec, TLV320AIC23_ACTIVE, 0x0); > - tlv320aic23_write(codec, TLV320AIC23_PWR, 0xffff); > break; > } > codec->bias_level = level; > @@ -615,7 +614,6 @@ static int tlv320aic23_suspend(struct platform_device *pdev, > struct snd_soc_device *socdev = platform_get_drvdata(pdev); > struct snd_soc_codec *codec = socdev->card->codec; > > - tlv320aic23_write(codec, TLV320AIC23_ACTIVE, 0x0); > tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_OFF); > > return 0; > @@ -625,14 +623,6 @@ static int tlv320aic23_resume(struct platform_device *pdev) > { > struct snd_soc_device *socdev = platform_get_drvdata(pdev); > struct snd_soc_codec *codec = socdev->card->codec; > - int i; > - u16 reg; > - > - /* Sync reg_cache with the hardware */ > - for (reg = 0; reg < ARRAY_SIZE(tlv320aic23_reg); i++) { > - u16 val = tlv320aic23_read_reg_cache(codec, reg); > - tlv320aic23_write(codec, reg, val); > - } Changing to for (reg = 0; reg < ARRAY_SIZE(tlv320aic23_reg); reg++) { should be enough to fix the infinite loop. Could you try this without the rest of the patch? > > tlv320aic23_set_bias_level(codec, SND_SOC_BIAS_STANDBY); > tlv320aic23_set_bias_level(codec, codec->suspend_bias_level); Adding Arun to cc list