Merge series "ASoC: SOF: Intel: shutdown and core handling corrections" from Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>:
This patchset fixes a logical flow in the core status, improves shutdown support on Intel SOF platforms with an HDaudio controller and cleans-up ElkhartLake support. Guennadi Liakhovetski (1): ASoC: SOF: Intel: HDA: fix core status verification Libin Yang (5): ASoC: SOF: Intel: TGL: fix EHL ops ASoC: SOF: Intel: TGL: set shutdown callback to hda_dsp_shutdown ASoC: SOF: Intel: ICL: set shutdown callback to hda_dsp_shutdown ASoC: SOF: Intel: CNL: set shutdown callback to hda_dsp_shutdown ASoC: SOF: Intel: APL: set shutdown callback to hda_dsp_shutdown Pierre-Louis Bossart (2): ASoC: SOF: core: harden shutdown helper ASoC: SOF: Intel: move ELH chip info sound/soc/sof/core.c | 8 +++++++- sound/soc/sof/intel/apl.c | 3 ++- sound/soc/sof/intel/cnl.c | 19 ++----------------- sound/soc/sof/intel/hda-dsp.c | 21 +++++++++++++++++---- sound/soc/sof/intel/hda.h | 1 + sound/soc/sof/intel/icl.c | 3 ++- sound/soc/sof/intel/pci-tgl.c | 2 +- sound/soc/sof/intel/tgl.c | 18 +++++++++++++++++- 8 files changed, 49 insertions(+), 26 deletions(-) -- 2.25.1
This commit is contained in:
commit
2c0d7f9186
@ -399,7 +399,13 @@ int snd_sof_device_shutdown(struct device *dev)
|
||||
{
|
||||
struct snd_sof_dev *sdev = dev_get_drvdata(dev);
|
||||
|
||||
return snd_sof_shutdown(sdev);
|
||||
if (IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE))
|
||||
cancel_work_sync(&sdev->probe_work);
|
||||
|
||||
if (sdev->fw_state == SOF_FW_BOOT_COMPLETE)
|
||||
return snd_sof_shutdown(sdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_sof_device_shutdown);
|
||||
|
||||
|
@ -27,9 +27,10 @@ static const struct snd_sof_debugfs_map apl_dsp_debugfs[] = {
|
||||
|
||||
/* apollolake ops */
|
||||
const struct snd_sof_dsp_ops sof_apl_ops = {
|
||||
/* probe and remove */
|
||||
/* probe/remove/shutdown */
|
||||
.probe = hda_dsp_probe,
|
||||
.remove = hda_dsp_remove,
|
||||
.shutdown = hda_dsp_shutdown,
|
||||
|
||||
/* Register IO */
|
||||
.write = sof_io_write,
|
||||
|
@ -232,9 +232,10 @@ void cnl_ipc_dump(struct snd_sof_dev *sdev)
|
||||
|
||||
/* cannonlake ops */
|
||||
const struct snd_sof_dsp_ops sof_cnl_ops = {
|
||||
/* probe and remove */
|
||||
/* probe/remove/shutdown */
|
||||
.probe = hda_dsp_probe,
|
||||
.remove = hda_dsp_remove,
|
||||
.shutdown = hda_dsp_shutdown,
|
||||
|
||||
/* Register IO */
|
||||
.write = sof_io_write,
|
||||
@ -349,22 +350,6 @@ const struct sof_intel_dsp_desc cnl_chip_info = {
|
||||
};
|
||||
EXPORT_SYMBOL_NS(cnl_chip_info, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
const struct sof_intel_dsp_desc ehl_chip_info = {
|
||||
/* Elkhartlake */
|
||||
.cores_num = 4,
|
||||
.init_core_mask = 1,
|
||||
.host_managed_cores_mask = BIT(0),
|
||||
.ipc_req = CNL_DSP_REG_HIPCIDR,
|
||||
.ipc_req_mask = CNL_DSP_REG_HIPCIDR_BUSY,
|
||||
.ipc_ack = CNL_DSP_REG_HIPCIDA,
|
||||
.ipc_ack_mask = CNL_DSP_REG_HIPCIDA_DONE,
|
||||
.ipc_ctl = CNL_DSP_REG_HIPCCTL,
|
||||
.rom_init_timeout = 300,
|
||||
.ssp_count = ICL_SSP_COUNT,
|
||||
.ssp_base_offset = CNL_SSP_BASE_OFFSET,
|
||||
};
|
||||
EXPORT_SYMBOL_NS(ehl_chip_info, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
const struct sof_intel_dsp_desc jsl_chip_info = {
|
||||
/* Jasperlake */
|
||||
.cores_num = 2,
|
||||
|
@ -226,10 +226,17 @@ bool hda_dsp_core_is_enabled(struct snd_sof_dev *sdev,
|
||||
|
||||
val = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPCS);
|
||||
|
||||
is_enable = (val & HDA_DSP_ADSPCS_CPA_MASK(core_mask)) &&
|
||||
(val & HDA_DSP_ADSPCS_SPA_MASK(core_mask)) &&
|
||||
!(val & HDA_DSP_ADSPCS_CRST_MASK(core_mask)) &&
|
||||
!(val & HDA_DSP_ADSPCS_CSTALL_MASK(core_mask));
|
||||
#define MASK_IS_EQUAL(v, m, field) ({ \
|
||||
u32 _m = field(m); \
|
||||
((v) & _m) == _m; \
|
||||
})
|
||||
|
||||
is_enable = MASK_IS_EQUAL(val, core_mask, HDA_DSP_ADSPCS_CPA_MASK) &&
|
||||
MASK_IS_EQUAL(val, core_mask, HDA_DSP_ADSPCS_SPA_MASK) &&
|
||||
!(val & HDA_DSP_ADSPCS_CRST_MASK(core_mask)) &&
|
||||
!(val & HDA_DSP_ADSPCS_CSTALL_MASK(core_mask));
|
||||
|
||||
#undef MASK_IS_EQUAL
|
||||
|
||||
dev_dbg(sdev->dev, "DSP core(s) enabled? %d : core_mask %x\n",
|
||||
is_enable, core_mask);
|
||||
@ -885,6 +892,12 @@ int hda_dsp_suspend(struct snd_sof_dev *sdev, u32 target_state)
|
||||
return snd_sof_dsp_set_power_state(sdev, &target_dsp_state);
|
||||
}
|
||||
|
||||
int hda_dsp_shutdown(struct snd_sof_dev *sdev)
|
||||
{
|
||||
sdev->system_suspend_target = SOF_SUSPEND_S3;
|
||||
return snd_sof_suspend(sdev->dev);
|
||||
}
|
||||
|
||||
int hda_dsp_set_hw_params_upon_resume(struct snd_sof_dev *sdev)
|
||||
{
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
|
||||
|
@ -517,6 +517,7 @@ int hda_dsp_resume(struct snd_sof_dev *sdev);
|
||||
int hda_dsp_runtime_suspend(struct snd_sof_dev *sdev);
|
||||
int hda_dsp_runtime_resume(struct snd_sof_dev *sdev);
|
||||
int hda_dsp_runtime_idle(struct snd_sof_dev *sdev);
|
||||
int hda_dsp_shutdown(struct snd_sof_dev *sdev);
|
||||
int hda_dsp_set_hw_params_upon_resume(struct snd_sof_dev *sdev);
|
||||
void hda_dsp_dump(struct snd_sof_dev *sdev, u32 flags);
|
||||
void hda_ipc_dump(struct snd_sof_dev *sdev);
|
||||
|
@ -26,9 +26,10 @@ static const struct snd_sof_debugfs_map icl_dsp_debugfs[] = {
|
||||
|
||||
/* Icelake ops */
|
||||
const struct snd_sof_dsp_ops sof_icl_ops = {
|
||||
/* probe and remove */
|
||||
/* probe/remove/shutdown */
|
||||
.probe = hda_dsp_probe,
|
||||
.remove = hda_dsp_remove,
|
||||
.shutdown = hda_dsp_shutdown,
|
||||
|
||||
/* Register IO */
|
||||
.write = sof_io_write,
|
||||
|
@ -65,7 +65,7 @@ static const struct sof_dev_desc ehl_desc = {
|
||||
.default_tplg_path = "intel/sof-tplg",
|
||||
.default_fw_filename = "sof-ehl.ri",
|
||||
.nocodec_tplg_filename = "sof-ehl-nocodec.tplg",
|
||||
.ops = &sof_cnl_ops,
|
||||
.ops = &sof_tgl_ops,
|
||||
};
|
||||
|
||||
static const struct sof_dev_desc adls_desc = {
|
||||
|
@ -25,7 +25,7 @@ const struct snd_sof_dsp_ops sof_tgl_ops = {
|
||||
/* probe/remove/shutdown */
|
||||
.probe = hda_dsp_probe,
|
||||
.remove = hda_dsp_remove,
|
||||
.shutdown = hda_dsp_remove,
|
||||
.shutdown = hda_dsp_shutdown,
|
||||
|
||||
/* Register IO */
|
||||
.write = sof_io_write,
|
||||
@ -156,6 +156,22 @@ const struct sof_intel_dsp_desc tglh_chip_info = {
|
||||
};
|
||||
EXPORT_SYMBOL_NS(tglh_chip_info, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
const struct sof_intel_dsp_desc ehl_chip_info = {
|
||||
/* Elkhartlake */
|
||||
.cores_num = 4,
|
||||
.init_core_mask = 1,
|
||||
.host_managed_cores_mask = BIT(0),
|
||||
.ipc_req = CNL_DSP_REG_HIPCIDR,
|
||||
.ipc_req_mask = CNL_DSP_REG_HIPCIDR_BUSY,
|
||||
.ipc_ack = CNL_DSP_REG_HIPCIDA,
|
||||
.ipc_ack_mask = CNL_DSP_REG_HIPCIDA_DONE,
|
||||
.ipc_ctl = CNL_DSP_REG_HIPCCTL,
|
||||
.rom_init_timeout = 300,
|
||||
.ssp_count = ICL_SSP_COUNT,
|
||||
.ssp_base_offset = CNL_SSP_BASE_OFFSET,
|
||||
};
|
||||
EXPORT_SYMBOL_NS(ehl_chip_info, SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
|
||||
const struct sof_intel_dsp_desc adls_chip_info = {
|
||||
/* Alderlake-S */
|
||||
.cores_num = 2,
|
||||
|
Loading…
Reference in New Issue
Block a user