summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorVlad Karpovich <Vlad.Karpovich@cirrus.com>2020-08-26 16:55:34 -0500
committerAlexander Deucher <alexander.deucher@amd.com>2021-09-01 00:12:31 -0400
commit038f82777d7ae57d770ec4862612332ee87bf27d (patch)
treecafe7920e0f590b016a75d485eea2f8ee9a0bc85 /sound
parent1ca99fe79acb4ccf9adfe21d4c905964c4a4e60f (diff)
ASoC: cs35l41: Move DSP resume to later stage
Playback FW revs 5.41+ and 6.31+ need more time for PLL lock and update of the MBOX status bit. This may cause MBOX timeout error. Move DSP resume to DSP1 enable widget which is called later in the audio power on sequence. Signed-off-by: Vlad Karpovich <Vlad.Karpovich@cirrus.com>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/codecs/cs35l41.c59
1 files changed, 32 insertions, 27 deletions
diff --git a/sound/soc/codecs/cs35l41.c b/sound/soc/codecs/cs35l41.c
index 33fbaa11a5d3..714ef8cc62f3 100644
--- a/sound/soc/codecs/cs35l41.c
+++ b/sound/soc/codecs/cs35l41.c
@@ -248,6 +248,9 @@ static int cs35l41_dsp_power_ev(struct snd_soc_dapm_widget *w,
return 0;
}
+static int cs35l41_set_csplmboxcmd(struct cs35l41_private *cs35l41,
+ enum cs35l41_cspl_mboxcmd cmd);
+
static int cs35l41_dsp_load_ev(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
@@ -255,6 +258,9 @@ static int cs35l41_dsp_load_ev(struct snd_soc_dapm_widget *w,
snd_soc_dapm_to_component(w->dapm);
struct cs35l41_private *cs35l41 =
snd_soc_component_get_drvdata(component);
+ enum cs35l41_cspl_mboxcmd mboxcmd = CSPL_MBOX_CMD_NONE;
+ enum cs35l41_cspl_mboxstate fw_status = CSPL_MBOX_STS_RUNNING;
+ int ret = 0;
switch (event) {
case SND_SOC_DAPM_POST_PMU:
@@ -262,6 +268,32 @@ static int cs35l41_dsp_load_ev(struct snd_soc_dapm_widget *w,
wm_adsp_event(w, kcontrol, event);
cs35l41->halo_booted = true;
}
+
+ if (cs35l41->dsp.running) {
+ regmap_read(cs35l41->regmap, CS35L41_DSP_MBOX_2,
+ (unsigned int *)&fw_status);
+ switch (fw_status) {
+ case CSPL_MBOX_STS_RDY_FOR_REINIT:
+ mboxcmd = CSPL_MBOX_CMD_REINIT;
+ break;
+ case CSPL_MBOX_STS_PAUSED:
+ mboxcmd = CSPL_MBOX_CMD_RESUME;
+ break;
+ case CSPL_MBOX_STS_RUNNING:
+ /*
+ * First time playing audio
+ * means fw_status is running
+ */
+ mboxcmd = CSPL_MBOX_CMD_RESUME;
+ break;
+ default:
+ dev_err(cs35l41->dev,
+ "Firmware status is invalid(%u)\n",
+ fw_status);
+ break;
+ }
+ ret = cs35l41_set_csplmboxcmd(cs35l41, mboxcmd);
+ }
break;
default:
break;
@@ -1790,7 +1822,6 @@ static int cs35l41_main_amp_event(struct snd_soc_dapm_widget *w,
snd_soc_component_get_drvdata(component);
enum cs35l41_cspl_mboxcmd mboxcmd = CSPL_MBOX_CMD_NONE;
int ret = 0;
- enum cs35l41_cspl_mboxstate fw_status = CSPL_MBOX_STS_RUNNING;
int i;
bool pdn;
unsigned int val;
@@ -1807,32 +1838,6 @@ static int cs35l41_main_amp_event(struct snd_soc_dapm_widget *w,
usleep_range(1000, 1100);
- if (cs35l41->dsp.running) {
- regmap_read(cs35l41->regmap, CS35L41_DSP_MBOX_2,
- (unsigned int *)&fw_status);
- switch (fw_status) {
- case CSPL_MBOX_STS_RDY_FOR_REINIT:
- mboxcmd = CSPL_MBOX_CMD_REINIT;
- break;
- case CSPL_MBOX_STS_PAUSED:
- mboxcmd = CSPL_MBOX_CMD_RESUME;
- break;
- case CSPL_MBOX_STS_RUNNING:
- /*
- * First time playing audio
- * means fw_status is running
- */
- mboxcmd = CSPL_MBOX_CMD_RESUME;
- break;
- default:
- dev_err(cs35l41->dev,
- "Firmware status is invalid(%u)\n",
- fw_status);
- break;
- }
- ret = cs35l41_set_csplmboxcmd(cs35l41, mboxcmd);
- }
-
atomic_set(&cs35l41->vol_ctl.playback, 1);
if (atomic_read(&cs35l41->vol_ctl.manual_ramp) ||
cs35l41_need_auto_vol_ramp(cs35l41))