Commit 2c0d7f91 authored by Mark Brown's avatar Mark Brown

Merge series "ASoC: SOF: Intel: shutdown and core handling corrections" from...

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
parents 16b82e75 8bb84ca8
...@@ -399,7 +399,13 @@ int snd_sof_device_shutdown(struct device *dev) ...@@ -399,7 +399,13 @@ int snd_sof_device_shutdown(struct device *dev)
{ {
struct snd_sof_dev *sdev = dev_get_drvdata(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); EXPORT_SYMBOL(snd_sof_device_shutdown);
......
...@@ -27,9 +27,10 @@ static const struct snd_sof_debugfs_map apl_dsp_debugfs[] = { ...@@ -27,9 +27,10 @@ static const struct snd_sof_debugfs_map apl_dsp_debugfs[] = {
/* apollolake ops */ /* apollolake ops */
const struct snd_sof_dsp_ops sof_apl_ops = { const struct snd_sof_dsp_ops sof_apl_ops = {
/* probe and remove */ /* probe/remove/shutdown */
.probe = hda_dsp_probe, .probe = hda_dsp_probe,
.remove = hda_dsp_remove, .remove = hda_dsp_remove,
.shutdown = hda_dsp_shutdown,
/* Register IO */ /* Register IO */
.write = sof_io_write, .write = sof_io_write,
......
...@@ -232,9 +232,10 @@ void cnl_ipc_dump(struct snd_sof_dev *sdev) ...@@ -232,9 +232,10 @@ void cnl_ipc_dump(struct snd_sof_dev *sdev)
/* cannonlake ops */ /* cannonlake ops */
const struct snd_sof_dsp_ops sof_cnl_ops = { const struct snd_sof_dsp_ops sof_cnl_ops = {
/* probe and remove */ /* probe/remove/shutdown */
.probe = hda_dsp_probe, .probe = hda_dsp_probe,
.remove = hda_dsp_remove, .remove = hda_dsp_remove,
.shutdown = hda_dsp_shutdown,
/* Register IO */ /* Register IO */
.write = sof_io_write, .write = sof_io_write,
...@@ -349,22 +350,6 @@ const struct sof_intel_dsp_desc cnl_chip_info = { ...@@ -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); 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 = { const struct sof_intel_dsp_desc jsl_chip_info = {
/* Jasperlake */ /* Jasperlake */
.cores_num = 2, .cores_num = 2,
......
...@@ -226,10 +226,17 @@ bool hda_dsp_core_is_enabled(struct snd_sof_dev *sdev, ...@@ -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); val = snd_sof_dsp_read(sdev, HDA_DSP_BAR, HDA_DSP_REG_ADSPCS);
is_enable = (val & HDA_DSP_ADSPCS_CPA_MASK(core_mask)) && #define MASK_IS_EQUAL(v, m, field) ({ \
(val & HDA_DSP_ADSPCS_SPA_MASK(core_mask)) && u32 _m = field(m); \
!(val & HDA_DSP_ADSPCS_CRST_MASK(core_mask)) && ((v) & _m) == _m; \
!(val & HDA_DSP_ADSPCS_CSTALL_MASK(core_mask)); })
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", dev_dbg(sdev->dev, "DSP core(s) enabled? %d : core_mask %x\n",
is_enable, core_mask); is_enable, core_mask);
...@@ -885,6 +892,12 @@ int hda_dsp_suspend(struct snd_sof_dev *sdev, u32 target_state) ...@@ -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); 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) int hda_dsp_set_hw_params_upon_resume(struct snd_sof_dev *sdev)
{ {
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA) #if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
......
...@@ -517,6 +517,7 @@ int hda_dsp_resume(struct snd_sof_dev *sdev); ...@@ -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_suspend(struct snd_sof_dev *sdev);
int hda_dsp_runtime_resume(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_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); 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_dsp_dump(struct snd_sof_dev *sdev, u32 flags);
void hda_ipc_dump(struct snd_sof_dev *sdev); void hda_ipc_dump(struct snd_sof_dev *sdev);
......
...@@ -26,9 +26,10 @@ static const struct snd_sof_debugfs_map icl_dsp_debugfs[] = { ...@@ -26,9 +26,10 @@ static const struct snd_sof_debugfs_map icl_dsp_debugfs[] = {
/* Icelake ops */ /* Icelake ops */
const struct snd_sof_dsp_ops sof_icl_ops = { const struct snd_sof_dsp_ops sof_icl_ops = {
/* probe and remove */ /* probe/remove/shutdown */
.probe = hda_dsp_probe, .probe = hda_dsp_probe,
.remove = hda_dsp_remove, .remove = hda_dsp_remove,
.shutdown = hda_dsp_shutdown,
/* Register IO */ /* Register IO */
.write = sof_io_write, .write = sof_io_write,
......
...@@ -65,7 +65,7 @@ static const struct sof_dev_desc ehl_desc = { ...@@ -65,7 +65,7 @@ static const struct sof_dev_desc ehl_desc = {
.default_tplg_path = "intel/sof-tplg", .default_tplg_path = "intel/sof-tplg",
.default_fw_filename = "sof-ehl.ri", .default_fw_filename = "sof-ehl.ri",
.nocodec_tplg_filename = "sof-ehl-nocodec.tplg", .nocodec_tplg_filename = "sof-ehl-nocodec.tplg",
.ops = &sof_cnl_ops, .ops = &sof_tgl_ops,
}; };
static const struct sof_dev_desc adls_desc = { static const struct sof_dev_desc adls_desc = {
......
...@@ -25,7 +25,7 @@ const struct snd_sof_dsp_ops sof_tgl_ops = { ...@@ -25,7 +25,7 @@ const struct snd_sof_dsp_ops sof_tgl_ops = {
/* probe/remove/shutdown */ /* probe/remove/shutdown */
.probe = hda_dsp_probe, .probe = hda_dsp_probe,
.remove = hda_dsp_remove, .remove = hda_dsp_remove,
.shutdown = hda_dsp_remove, .shutdown = hda_dsp_shutdown,
/* Register IO */ /* Register IO */
.write = sof_io_write, .write = sof_io_write,
...@@ -156,6 +156,22 @@ const struct sof_intel_dsp_desc tglh_chip_info = { ...@@ -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); 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 = { const struct sof_intel_dsp_desc adls_chip_info = {
/* Alderlake-S */ /* Alderlake-S */
.cores_num = 2, .cores_num = 2,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment