ASoC: Intel: handle haswell pcm suspend including runtime modules freeing

It needs free pcm runtime modules before unloading firmware, here
add hsw_pcm_suspend() to handle this procedure:
suspends firmware ==> frees runtime modules ==> unloads firmware.

This fixes the broadwell module unload failed issue.

Signed-off-by: Jie Yang <yang.jie@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Jie Yang 2015-05-30 22:33:59 +08:00 коммит произвёл Mark Brown
Родитель 2dbc80caf7
Коммит edd8ed496b
1 изменённых файлов: 16 добавлений и 6 удалений

Просмотреть файл

@ -1209,6 +1209,20 @@ static int hsw_pcm_runtime_idle(struct device *dev)
return 0; return 0;
} }
static int hsw_pcm_suspend(struct device *dev)
{
struct hsw_priv_data *pdata = dev_get_drvdata(dev);
struct sst_hsw *hsw = pdata->hsw;
/* enter D3 state and stall */
sst_hsw_dsp_runtime_suspend(hsw);
/* free all runtime modules */
hsw_pcm_free_modules(pdata);
/* put the DSP to sleep, fw unloaded after runtime modules freed */
sst_hsw_dsp_runtime_sleep(hsw);
return 0;
}
static int hsw_pcm_runtime_suspend(struct device *dev) static int hsw_pcm_runtime_suspend(struct device *dev)
{ {
struct hsw_priv_data *pdata = dev_get_drvdata(dev); struct hsw_priv_data *pdata = dev_get_drvdata(dev);
@ -1225,8 +1239,7 @@ static int hsw_pcm_runtime_suspend(struct device *dev)
return ret; return ret;
sst_hsw_set_module_enabled_rtd3(hsw, SST_HSW_MODULE_WAVES); sst_hsw_set_module_enabled_rtd3(hsw, SST_HSW_MODULE_WAVES);
} }
sst_hsw_dsp_runtime_suspend(hsw); hsw_pcm_suspend(dev);
sst_hsw_dsp_runtime_sleep(hsw);
pdata->pm_state = HSW_PM_STATE_RTD3; pdata->pm_state = HSW_PM_STATE_RTD3;
return 0; return 0;
@ -1366,10 +1379,7 @@ static int hsw_pcm_prepare(struct device *dev)
if (err < 0) if (err < 0)
dev_err(dev, "failed to save context for PCM %d\n", i); dev_err(dev, "failed to save context for PCM %d\n", i);
} }
/* enter D3 state and stall */ hsw_pcm_suspend(dev);
sst_hsw_dsp_runtime_suspend(hsw);
/* put the DSP to sleep */
sst_hsw_dsp_runtime_sleep(hsw);
} }
snd_soc_suspend(pdata->soc_card->dev); snd_soc_suspend(pdata->soc_card->dev);