mirror of https://gitee.com/openkylin/linux.git
Merge series "ASoC: SOF: finalize Baytrail/CherryTrail support" from Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>:
This long-overdue patchset adds missing system suspend/resume support
and hardens the IPC to solve module load/unload issues on specific
devices such as Cyan Chromebook. With this series SOF is finally
iso-feature with the legacy driver. Thanks to Ranjani and Keyon for
the basic patches and Enric for testing.
The last part needed for Baytrail/Cherrytrail is simplification of the
driver/card names and turn-key UCM support (on-going work with
Jaroslav).
Keyon Jie (1):
ASoC: SOF: Intel: BYT: harden IPC initialization and handling
Pierre-Louis Bossart (3):
ASoC: Intel: bytcr_rt5640/51: remove .ignore_suspend
ASoC: Intel: byt/cht: add .pm_ops
ASoC: SOF: Intel: BYT: mask BUSY or DONE interrupts in handler
Ranjani Sridharan (4):
ASoC: SOF: Intel: byt: Add PM callbacks
ASoC: SOF: pm: handle resume on legacy Intel platforms
ASoC: SOF: ipc: ignore DSP replies received when they are not expected
ASoC: SOF: Intel: BYT: add .remove op
sound/soc/intel/boards/bytcht_cx2072x.c | 3 +
sound/soc/intel/boards/bytcht_da7213.c | 3 +
sound/soc/intel/boards/bytcht_es8316.c | 3 +
sound/soc/intel/boards/bytcr_rt5640.c | 7 +-
sound/soc/intel/boards/bytcr_rt5651.c | 6 +-
sound/soc/intel/boards/cht_bsw_max98090_ti.c | 3 +
sound/soc/intel/boards/cht_bsw_nau8824.c | 3 +
sound/soc/intel/boards/cht_bsw_rt5645.c | 3 +
sound/soc/intel/boards/cht_bsw_rt5672.c | 3 +
sound/soc/sof/intel/byt.c | 116 ++++++++++++++-----
sound/soc/sof/ipc.c | 9 +-
sound/soc/sof/pm.c | 8 +-
sound/soc/sof/sof-priv.h | 2 +-
13 files changed, 122 insertions(+), 47 deletions(-)
base-commit: 0d71a5cf69
--
2.20.1
This commit is contained in:
commit
93e0f69a40
|
@ -261,6 +261,9 @@ static int snd_byt_cht_cx2072x_probe(struct platform_device *pdev)
|
||||||
static struct platform_driver snd_byt_cht_cx2072x_driver = {
|
static struct platform_driver snd_byt_cht_cx2072x_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "bytcht_cx2072x",
|
.name = "bytcht_cx2072x",
|
||||||
|
#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
||||||
|
.pm = &snd_soc_pm_ops,
|
||||||
|
#endif
|
||||||
},
|
},
|
||||||
.probe = snd_byt_cht_cx2072x_probe,
|
.probe = snd_byt_cht_cx2072x_probe,
|
||||||
};
|
};
|
||||||
|
|
|
@ -272,6 +272,9 @@ static int bytcht_da7213_probe(struct platform_device *pdev)
|
||||||
static struct platform_driver bytcht_da7213_driver = {
|
static struct platform_driver bytcht_da7213_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "bytcht_da7213",
|
.name = "bytcht_da7213",
|
||||||
|
#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
||||||
|
.pm = &snd_soc_pm_ops,
|
||||||
|
#endif
|
||||||
},
|
},
|
||||||
.probe = bytcht_da7213_probe,
|
.probe = bytcht_da7213_probe,
|
||||||
};
|
};
|
||||||
|
|
|
@ -605,6 +605,9 @@ static int snd_byt_cht_es8316_mc_remove(struct platform_device *pdev)
|
||||||
static struct platform_driver snd_byt_cht_es8316_mc_driver = {
|
static struct platform_driver snd_byt_cht_es8316_mc_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "bytcht_es8316",
|
.name = "bytcht_es8316",
|
||||||
|
#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
||||||
|
.pm = &snd_soc_pm_ops,
|
||||||
|
#endif
|
||||||
},
|
},
|
||||||
.probe = snd_byt_cht_es8316_mc_probe,
|
.probe = snd_byt_cht_es8316_mc_probe,
|
||||||
.remove = snd_byt_cht_es8316_mc_remove,
|
.remove = snd_byt_cht_es8316_mc_remove,
|
||||||
|
|
|
@ -910,9 +910,6 @@ static int byt_rt5640_init(struct snd_soc_pcm_runtime *runtime)
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
snd_soc_dapm_ignore_suspend(&card->dapm, "Headphone");
|
|
||||||
snd_soc_dapm_ignore_suspend(&card->dapm, "Speaker");
|
|
||||||
|
|
||||||
if (byt_rt5640_quirk & BYT_RT5640_MCLK_EN) {
|
if (byt_rt5640_quirk & BYT_RT5640_MCLK_EN) {
|
||||||
/*
|
/*
|
||||||
* The firmware might enable the clock at
|
* The firmware might enable the clock at
|
||||||
|
@ -1065,7 +1062,6 @@ static struct snd_soc_dai_link byt_rt5640_dais[] = {
|
||||||
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
||||||
| SND_SOC_DAIFMT_CBS_CFS,
|
| SND_SOC_DAIFMT_CBS_CFS,
|
||||||
.be_hw_params_fixup = byt_rt5640_codec_fixup,
|
.be_hw_params_fixup = byt_rt5640_codec_fixup,
|
||||||
.ignore_suspend = 1,
|
|
||||||
.nonatomic = true,
|
.nonatomic = true,
|
||||||
.dpcm_playback = 1,
|
.dpcm_playback = 1,
|
||||||
.dpcm_capture = 1,
|
.dpcm_capture = 1,
|
||||||
|
@ -1323,6 +1319,9 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
|
||||||
static struct platform_driver snd_byt_rt5640_mc_driver = {
|
static struct platform_driver snd_byt_rt5640_mc_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "bytcr_rt5640",
|
.name = "bytcr_rt5640",
|
||||||
|
#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
||||||
|
.pm = &snd_soc_pm_ops,
|
||||||
|
#endif
|
||||||
},
|
},
|
||||||
.probe = snd_byt_rt5640_mc_probe,
|
.probe = snd_byt_rt5640_mc_probe,
|
||||||
};
|
};
|
||||||
|
|
|
@ -601,8 +601,6 @@ static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime)
|
||||||
dev_err(card->dev, "unable to add card controls\n");
|
dev_err(card->dev, "unable to add card controls\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
snd_soc_dapm_ignore_suspend(&card->dapm, "Headphone");
|
|
||||||
snd_soc_dapm_ignore_suspend(&card->dapm, "Speaker");
|
|
||||||
|
|
||||||
if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN) {
|
if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN) {
|
||||||
/*
|
/*
|
||||||
|
@ -775,7 +773,6 @@ static struct snd_soc_dai_link byt_rt5651_dais[] = {
|
||||||
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
||||||
| SND_SOC_DAIFMT_CBS_CFS,
|
| SND_SOC_DAIFMT_CBS_CFS,
|
||||||
.be_hw_params_fixup = byt_rt5651_codec_fixup,
|
.be_hw_params_fixup = byt_rt5651_codec_fixup,
|
||||||
.ignore_suspend = 1,
|
|
||||||
.nonatomic = true,
|
.nonatomic = true,
|
||||||
.dpcm_playback = 1,
|
.dpcm_playback = 1,
|
||||||
.dpcm_capture = 1,
|
.dpcm_capture = 1,
|
||||||
|
@ -1100,6 +1097,9 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
|
||||||
static struct platform_driver snd_byt_rt5651_mc_driver = {
|
static struct platform_driver snd_byt_rt5651_mc_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "bytcr_rt5651",
|
.name = "bytcr_rt5651",
|
||||||
|
#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
||||||
|
.pm = &snd_soc_pm_ops,
|
||||||
|
#endif
|
||||||
},
|
},
|
||||||
.probe = snd_byt_rt5651_mc_probe,
|
.probe = snd_byt_rt5651_mc_probe,
|
||||||
};
|
};
|
||||||
|
|
|
@ -616,6 +616,9 @@ static int snd_cht_mc_remove(struct platform_device *pdev)
|
||||||
static struct platform_driver snd_cht_mc_driver = {
|
static struct platform_driver snd_cht_mc_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "cht-bsw-max98090",
|
.name = "cht-bsw-max98090",
|
||||||
|
#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
||||||
|
.pm = &snd_soc_pm_ops,
|
||||||
|
#endif
|
||||||
},
|
},
|
||||||
.probe = snd_cht_mc_probe,
|
.probe = snd_cht_mc_probe,
|
||||||
.remove = snd_cht_mc_remove,
|
.remove = snd_cht_mc_remove,
|
||||||
|
|
|
@ -282,6 +282,9 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
|
||||||
static struct platform_driver snd_cht_mc_driver = {
|
static struct platform_driver snd_cht_mc_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "cht-bsw-nau8824",
|
.name = "cht-bsw-nau8824",
|
||||||
|
#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
||||||
|
.pm = &snd_soc_pm_ops,
|
||||||
|
#endif
|
||||||
},
|
},
|
||||||
.probe = snd_cht_mc_probe,
|
.probe = snd_cht_mc_probe,
|
||||||
};
|
};
|
||||||
|
|
|
@ -680,6 +680,9 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
|
||||||
static struct platform_driver snd_cht_mc_driver = {
|
static struct platform_driver snd_cht_mc_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "cht-bsw-rt5645",
|
.name = "cht-bsw-rt5645",
|
||||||
|
#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
||||||
|
.pm = &snd_soc_pm_ops,
|
||||||
|
#endif
|
||||||
},
|
},
|
||||||
.probe = snd_cht_mc_probe,
|
.probe = snd_cht_mc_probe,
|
||||||
};
|
};
|
||||||
|
|
|
@ -459,6 +459,9 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
|
||||||
static struct platform_driver snd_cht_mc_driver = {
|
static struct platform_driver snd_cht_mc_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "cht-bsw-rt5672",
|
.name = "cht-bsw-rt5672",
|
||||||
|
#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
||||||
|
.pm = &snd_soc_pm_ops,
|
||||||
|
#endif
|
||||||
},
|
},
|
||||||
.probe = snd_cht_mc_probe,
|
.probe = snd_cht_mc_probe,
|
||||||
};
|
};
|
||||||
|
|
|
@ -160,13 +160,31 @@ static void byt_dump(struct snd_sof_dev *sdev, u32 flags)
|
||||||
static irqreturn_t byt_irq_handler(int irq, void *context)
|
static irqreturn_t byt_irq_handler(int irq, void *context)
|
||||||
{
|
{
|
||||||
struct snd_sof_dev *sdev = context;
|
struct snd_sof_dev *sdev = context;
|
||||||
u64 isr;
|
u64 ipcx, ipcd;
|
||||||
int ret = IRQ_NONE;
|
int ret = IRQ_NONE;
|
||||||
|
|
||||||
/* Interrupt arrived, check src */
|
ipcx = snd_sof_dsp_read64(sdev, BYT_DSP_BAR, SHIM_IPCX);
|
||||||
isr = snd_sof_dsp_read64(sdev, BYT_DSP_BAR, SHIM_ISRX);
|
ipcd = snd_sof_dsp_read64(sdev, BYT_DSP_BAR, SHIM_IPCD);
|
||||||
if (isr & (SHIM_ISRX_DONE | SHIM_ISRX_BUSY))
|
|
||||||
|
if (ipcx & SHIM_BYT_IPCX_DONE) {
|
||||||
|
|
||||||
|
/* reply message from DSP, Mask Done interrupt first */
|
||||||
|
snd_sof_dsp_update_bits64_unlocked(sdev, BYT_DSP_BAR,
|
||||||
|
SHIM_IMRX,
|
||||||
|
SHIM_IMRX_DONE,
|
||||||
|
SHIM_IMRX_DONE);
|
||||||
ret = IRQ_WAKE_THREAD;
|
ret = IRQ_WAKE_THREAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ipcd & SHIM_BYT_IPCD_BUSY) {
|
||||||
|
|
||||||
|
/* new message from DSP, Mask Busy interrupt first */
|
||||||
|
snd_sof_dsp_update_bits64_unlocked(sdev, BYT_DSP_BAR,
|
||||||
|
SHIM_IMRX,
|
||||||
|
SHIM_IMRX_BUSY,
|
||||||
|
SHIM_IMRX_BUSY);
|
||||||
|
ret = IRQ_WAKE_THREAD;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -175,19 +193,12 @@ static irqreturn_t byt_irq_thread(int irq, void *context)
|
||||||
{
|
{
|
||||||
struct snd_sof_dev *sdev = context;
|
struct snd_sof_dev *sdev = context;
|
||||||
u64 ipcx, ipcd;
|
u64 ipcx, ipcd;
|
||||||
u64 imrx;
|
|
||||||
|
|
||||||
imrx = snd_sof_dsp_read64(sdev, BYT_DSP_BAR, SHIM_IMRX);
|
|
||||||
ipcx = snd_sof_dsp_read64(sdev, BYT_DSP_BAR, SHIM_IPCX);
|
ipcx = snd_sof_dsp_read64(sdev, BYT_DSP_BAR, SHIM_IPCX);
|
||||||
|
ipcd = snd_sof_dsp_read64(sdev, BYT_DSP_BAR, SHIM_IPCD);
|
||||||
|
|
||||||
/* reply message from DSP */
|
/* reply message from DSP */
|
||||||
if (ipcx & SHIM_BYT_IPCX_DONE &&
|
if (ipcx & SHIM_BYT_IPCX_DONE) {
|
||||||
!(imrx & SHIM_IMRX_DONE)) {
|
|
||||||
/* Mask Done interrupt before first */
|
|
||||||
snd_sof_dsp_update_bits64_unlocked(sdev, BYT_DSP_BAR,
|
|
||||||
SHIM_IMRX,
|
|
||||||
SHIM_IMRX_DONE,
|
|
||||||
SHIM_IMRX_DONE);
|
|
||||||
|
|
||||||
spin_lock_irq(&sdev->ipc_lock);
|
spin_lock_irq(&sdev->ipc_lock);
|
||||||
|
|
||||||
|
@ -207,14 +218,7 @@ static irqreturn_t byt_irq_thread(int irq, void *context)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* new message from DSP */
|
/* new message from DSP */
|
||||||
ipcd = snd_sof_dsp_read64(sdev, BYT_DSP_BAR, SHIM_IPCD);
|
if (ipcd & SHIM_BYT_IPCD_BUSY) {
|
||||||
if (ipcd & SHIM_BYT_IPCD_BUSY &&
|
|
||||||
!(imrx & SHIM_IMRX_BUSY)) {
|
|
||||||
/* Mask Busy interrupt before return */
|
|
||||||
snd_sof_dsp_update_bits64_unlocked(sdev, BYT_DSP_BAR,
|
|
||||||
SHIM_IMRX,
|
|
||||||
SHIM_IMRX_BUSY,
|
|
||||||
SHIM_IMRX_BUSY);
|
|
||||||
|
|
||||||
/* Handle messages from DSP Core */
|
/* Handle messages from DSP Core */
|
||||||
if ((ipcd & SOF_IPC_PANIC_MAGIC_MASK) == SOF_IPC_PANIC_MAGIC) {
|
if ((ipcd & SOF_IPC_PANIC_MAGIC_MASK) == SOF_IPC_PANIC_MAGIC) {
|
||||||
|
@ -232,6 +236,10 @@ static irqreturn_t byt_irq_thread(int irq, void *context)
|
||||||
|
|
||||||
static int byt_send_msg(struct snd_sof_dev *sdev, struct snd_sof_ipc_msg *msg)
|
static int byt_send_msg(struct snd_sof_dev *sdev, struct snd_sof_ipc_msg *msg)
|
||||||
{
|
{
|
||||||
|
/* unmask and prepare to receive Done interrupt */
|
||||||
|
snd_sof_dsp_update_bits64_unlocked(sdev, BYT_DSP_BAR, SHIM_IMRX,
|
||||||
|
SHIM_IMRX_DONE, 0);
|
||||||
|
|
||||||
/* send the message */
|
/* send the message */
|
||||||
sof_mailbox_write(sdev, sdev->host_box.offset, msg->msg_data,
|
sof_mailbox_write(sdev, sdev->host_box.offset, msg->msg_data,
|
||||||
msg->msg_size);
|
msg->msg_size);
|
||||||
|
@ -297,7 +305,7 @@ static void byt_host_done(struct snd_sof_dev *sdev)
|
||||||
SHIM_BYT_IPCD_DONE,
|
SHIM_BYT_IPCD_DONE,
|
||||||
SHIM_BYT_IPCD_DONE);
|
SHIM_BYT_IPCD_DONE);
|
||||||
|
|
||||||
/* unmask busy interrupt */
|
/* unmask and prepare to receive next new message */
|
||||||
snd_sof_dsp_update_bits64_unlocked(sdev, BYT_DSP_BAR, SHIM_IMRX,
|
snd_sof_dsp_update_bits64_unlocked(sdev, BYT_DSP_BAR, SHIM_IMRX,
|
||||||
SHIM_IMRX_BUSY, 0);
|
SHIM_IMRX_BUSY, 0);
|
||||||
}
|
}
|
||||||
|
@ -307,10 +315,6 @@ static void byt_dsp_done(struct snd_sof_dev *sdev)
|
||||||
/* clear DONE bit - tell DSP we have completed */
|
/* clear DONE bit - tell DSP we have completed */
|
||||||
snd_sof_dsp_update_bits64_unlocked(sdev, BYT_DSP_BAR, SHIM_IPCX,
|
snd_sof_dsp_update_bits64_unlocked(sdev, BYT_DSP_BAR, SHIM_IPCX,
|
||||||
SHIM_BYT_IPCX_DONE, 0);
|
SHIM_BYT_IPCX_DONE, 0);
|
||||||
|
|
||||||
/* unmask Done interrupt */
|
|
||||||
snd_sof_dsp_update_bits64_unlocked(sdev, BYT_DSP_BAR, SHIM_IMRX,
|
|
||||||
SHIM_IMRX_DONE, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -428,6 +432,42 @@ static void byt_set_mach_params(const struct snd_soc_acpi_mach *mach,
|
||||||
mach_params->platform = dev_name(dev);
|
mach_params->platform = dev_name(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void byt_reset_dsp_disable_int(struct snd_sof_dev *sdev)
|
||||||
|
{
|
||||||
|
/* Disable Interrupt from both sides */
|
||||||
|
snd_sof_dsp_update_bits64(sdev, BYT_DSP_BAR, SHIM_IMRX, 0x3, 0x3);
|
||||||
|
snd_sof_dsp_update_bits64(sdev, BYT_DSP_BAR, SHIM_IMRD, 0x3, 0x3);
|
||||||
|
|
||||||
|
/* Put DSP into reset, set reset vector */
|
||||||
|
snd_sof_dsp_update_bits64(sdev, BYT_DSP_BAR, SHIM_CSR,
|
||||||
|
SHIM_BYT_CSR_RST | SHIM_BYT_CSR_VECTOR_SEL,
|
||||||
|
SHIM_BYT_CSR_RST | SHIM_BYT_CSR_VECTOR_SEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int byt_suspend(struct snd_sof_dev *sdev, u32 target_state)
|
||||||
|
{
|
||||||
|
byt_reset_dsp_disable_int(sdev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int byt_resume(struct snd_sof_dev *sdev)
|
||||||
|
{
|
||||||
|
/* enable BUSY and disable DONE Interrupt by default */
|
||||||
|
snd_sof_dsp_update_bits64(sdev, BYT_DSP_BAR, SHIM_IMRX,
|
||||||
|
SHIM_IMRX_BUSY | SHIM_IMRX_DONE,
|
||||||
|
SHIM_IMRX_DONE);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int byt_remove(struct snd_sof_dev *sdev)
|
||||||
|
{
|
||||||
|
byt_reset_dsp_disable_int(sdev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Baytrail DAIs */
|
/* Baytrail DAIs */
|
||||||
static struct snd_soc_dai_driver byt_dai[] = {
|
static struct snd_soc_dai_driver byt_dai[] = {
|
||||||
{
|
{
|
||||||
|
@ -567,9 +607,10 @@ static int tangier_pci_probe(struct snd_sof_dev *sdev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* enable Interrupt from both sides */
|
/* enable BUSY and disable DONE Interrupt by default */
|
||||||
snd_sof_dsp_update_bits64(sdev, BYT_DSP_BAR, SHIM_IMRX, 0x3, 0x0);
|
snd_sof_dsp_update_bits64(sdev, BYT_DSP_BAR, SHIM_IMRX,
|
||||||
snd_sof_dsp_update_bits64(sdev, BYT_DSP_BAR, SHIM_IMRD, 0x3, 0x0);
|
SHIM_IMRX_BUSY | SHIM_IMRX_DONE,
|
||||||
|
SHIM_IMRX_DONE);
|
||||||
|
|
||||||
/* set default mailbox offset for FW ready message */
|
/* set default mailbox offset for FW ready message */
|
||||||
sdev->dsp_box.offset = MBOX_OFFSET;
|
sdev->dsp_box.offset = MBOX_OFFSET;
|
||||||
|
@ -769,9 +810,10 @@ static int byt_acpi_probe(struct snd_sof_dev *sdev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* enable Interrupt from both sides */
|
/* enable BUSY and disable DONE Interrupt by default */
|
||||||
snd_sof_dsp_update_bits64(sdev, BYT_DSP_BAR, SHIM_IMRX, 0x3, 0x0);
|
snd_sof_dsp_update_bits64(sdev, BYT_DSP_BAR, SHIM_IMRX,
|
||||||
snd_sof_dsp_update_bits64(sdev, BYT_DSP_BAR, SHIM_IMRD, 0x3, 0x0);
|
SHIM_IMRX_BUSY | SHIM_IMRX_DONE,
|
||||||
|
SHIM_IMRX_DONE);
|
||||||
|
|
||||||
/* set default mailbox offset for FW ready message */
|
/* set default mailbox offset for FW ready message */
|
||||||
sdev->dsp_box.offset = MBOX_OFFSET;
|
sdev->dsp_box.offset = MBOX_OFFSET;
|
||||||
|
@ -783,6 +825,7 @@ static int byt_acpi_probe(struct snd_sof_dev *sdev)
|
||||||
const struct snd_sof_dsp_ops sof_byt_ops = {
|
const struct snd_sof_dsp_ops sof_byt_ops = {
|
||||||
/* device init */
|
/* device init */
|
||||||
.probe = byt_acpi_probe,
|
.probe = byt_acpi_probe,
|
||||||
|
.remove = byt_remove,
|
||||||
|
|
||||||
/* DSP core boot / reset */
|
/* DSP core boot / reset */
|
||||||
.run = byt_run,
|
.run = byt_run,
|
||||||
|
@ -832,6 +875,10 @@ const struct snd_sof_dsp_ops sof_byt_ops = {
|
||||||
/*Firmware loading */
|
/*Firmware loading */
|
||||||
.load_firmware = snd_sof_load_firmware_memcpy,
|
.load_firmware = snd_sof_load_firmware_memcpy,
|
||||||
|
|
||||||
|
/* PM */
|
||||||
|
.suspend = byt_suspend,
|
||||||
|
.resume = byt_resume,
|
||||||
|
|
||||||
/* DAI drivers */
|
/* DAI drivers */
|
||||||
.drv = byt_dai,
|
.drv = byt_dai,
|
||||||
.num_drv = 3, /* we have only 3 SSPs on byt*/
|
.num_drv = 3, /* we have only 3 SSPs on byt*/
|
||||||
|
@ -857,6 +904,7 @@ EXPORT_SYMBOL_NS(byt_chip_info, SND_SOC_SOF_BAYTRAIL);
|
||||||
const struct snd_sof_dsp_ops sof_cht_ops = {
|
const struct snd_sof_dsp_ops sof_cht_ops = {
|
||||||
/* device init */
|
/* device init */
|
||||||
.probe = byt_acpi_probe,
|
.probe = byt_acpi_probe,
|
||||||
|
.remove = byt_remove,
|
||||||
|
|
||||||
/* DSP core boot / reset */
|
/* DSP core boot / reset */
|
||||||
.run = byt_run,
|
.run = byt_run,
|
||||||
|
@ -906,6 +954,10 @@ const struct snd_sof_dsp_ops sof_cht_ops = {
|
||||||
/*Firmware loading */
|
/*Firmware loading */
|
||||||
.load_firmware = snd_sof_load_firmware_memcpy,
|
.load_firmware = snd_sof_load_firmware_memcpy,
|
||||||
|
|
||||||
|
/* PM */
|
||||||
|
.suspend = byt_suspend,
|
||||||
|
.resume = byt_resume,
|
||||||
|
|
||||||
/* DAI drivers */
|
/* DAI drivers */
|
||||||
.drv = byt_dai,
|
.drv = byt_dai,
|
||||||
/* all 6 SSPs may be available for cherrytrail */
|
/* all 6 SSPs may be available for cherrytrail */
|
||||||
|
|
|
@ -335,21 +335,20 @@ int sof_ipc_tx_message_no_pm(struct snd_sof_ipc *ipc, u32 header,
|
||||||
EXPORT_SYMBOL(sof_ipc_tx_message_no_pm);
|
EXPORT_SYMBOL(sof_ipc_tx_message_no_pm);
|
||||||
|
|
||||||
/* handle reply message from DSP */
|
/* handle reply message from DSP */
|
||||||
int snd_sof_ipc_reply(struct snd_sof_dev *sdev, u32 msg_id)
|
void snd_sof_ipc_reply(struct snd_sof_dev *sdev, u32 msg_id)
|
||||||
{
|
{
|
||||||
struct snd_sof_ipc_msg *msg = &sdev->ipc->msg;
|
struct snd_sof_ipc_msg *msg = &sdev->ipc->msg;
|
||||||
|
|
||||||
if (msg->ipc_complete) {
|
if (msg->ipc_complete) {
|
||||||
dev_err(sdev->dev, "error: no reply expected, received 0x%x",
|
dev_dbg(sdev->dev,
|
||||||
|
"no reply expected, received 0x%x, will be ignored",
|
||||||
msg_id);
|
msg_id);
|
||||||
return -EINVAL;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* wake up and return the error if we have waiters on this message ? */
|
/* wake up and return the error if we have waiters on this message ? */
|
||||||
msg->ipc_complete = true;
|
msg->ipc_complete = true;
|
||||||
wake_up(&msg->waitq);
|
wake_up(&msg->waitq);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(snd_sof_ipc_reply);
|
EXPORT_SYMBOL(snd_sof_ipc_reply);
|
||||||
|
|
||||||
|
|
|
@ -114,8 +114,12 @@ static int sof_resume(struct device *dev, bool runtime_resume)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Nothing further to do if resuming from a low-power D0 substate */
|
/*
|
||||||
if (!runtime_resume && old_state == SOF_DSP_PM_D0)
|
* Nothing further to be done for platforms that support the low power
|
||||||
|
* D0 substate.
|
||||||
|
*/
|
||||||
|
if (!runtime_resume && sof_ops(sdev)->set_power_state &&
|
||||||
|
old_state == SOF_DSP_PM_D0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
sdev->fw_state = SOF_FW_BOOT_PREPARE;
|
sdev->fw_state = SOF_FW_BOOT_PREPARE;
|
||||||
|
|
|
@ -480,7 +480,7 @@ int snd_sof_fw_parse_ext_data(struct snd_sof_dev *sdev, u32 bar, u32 offset);
|
||||||
*/
|
*/
|
||||||
struct snd_sof_ipc *snd_sof_ipc_init(struct snd_sof_dev *sdev);
|
struct snd_sof_ipc *snd_sof_ipc_init(struct snd_sof_dev *sdev);
|
||||||
void snd_sof_ipc_free(struct snd_sof_dev *sdev);
|
void snd_sof_ipc_free(struct snd_sof_dev *sdev);
|
||||||
int snd_sof_ipc_reply(struct snd_sof_dev *sdev, u32 msg_id);
|
void snd_sof_ipc_reply(struct snd_sof_dev *sdev, u32 msg_id);
|
||||||
void snd_sof_ipc_msgs_rx(struct snd_sof_dev *sdev);
|
void snd_sof_ipc_msgs_rx(struct snd_sof_dev *sdev);
|
||||||
int snd_sof_ipc_stream_pcm_params(struct snd_sof_dev *sdev,
|
int snd_sof_ipc_stream_pcm_params(struct snd_sof_dev *sdev,
|
||||||
struct sof_ipc_pcm_params *params);
|
struct sof_ipc_pcm_params *params);
|
||||||
|
|
Loading…
Reference in New Issue