Liam,
In soc_resume() we should do this snd_power_change_state(codec->card, SNDRV_CTL_POWER_D0); instead of snd_power_change_state(codec->card, SNDRV_CTL_POWER_D3hot);
Because snd_pcm_resume in pcm_native.c expects the card to be in SNDRV_CTL_POWER_D0 state. Other ioctl will wait forever.
static int snd_pcm_resume(struct snd_pcm_substream *substream) { struct snd_card *card = substream->pcm->card; int res;
snd_power_lock(card); if ((res = snd_power_wait(card, SNDRV_CTL_POWER_D0)) >= 0) res = snd_pcm_action_lock_irq(&snd_pcm_action_resume, substream, 0); snd_power_unlock(card); return res; }
One more thing why we are using snd_power_change_state(codec->card, SNDRV_CTL_POWER_D3cold); every other driver is doing snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
SNDRV_CTL_POWER_D3cold is true for deep sleep where power to the controller is switched off .
In sleep, only clock to the controller is switched off.
Nobin Mathew
On 6/4/07, Nobin Mathew nobin.mathew@gmail.com wrote:
Liam
I will get back, i need to set up the board
On 6/1/07, Liam Girdwood lg@opensource.wolfsonmicro.com wrote:
Nobin,
Can you try the following patch :-
http://opensource.wolfsonmicro.com/cgi-bin/gitweb/gitweb.cgi?p=linux-2.6-aso...
This will notify pcm's of their suspend state.
Liam
On Wed, 2007-05-30 at 12:58 +0200, Takashi Iwai wrote:
At Wed, 30 May 2007 16:06:54 +0530, Nobin Mathew wrote:
I am writing an ASoC driver, where i can place these calls
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); snd_pcm_suspend_all(chip->pcm[i]);
and snd_power_change_state(card, SNDRV_CTL_POWER_D0);
In soc-core.c ?
I suppose so. In soc_suspend() and soc_resume(), you can get the card instance from codec->card, at least.
But currently SoC doesn't keep the PCM instances, so it cannot be implemented as it is... Liam, any plan or known issue regarding this?
Takashi