diff options
author | Vlad Karpovich <Vlad.Karpovich@cirrus.com> | 2020-08-26 16:55:34 -0500 |
---|---|---|
committer | Alexander Deucher <alexander.deucher@amd.com> | 2021-09-01 00:12:31 -0400 |
commit | 038f82777d7ae57d770ec4862612332ee87bf27d (patch) | |
tree | cafe7920e0f590b016a75d485eea2f8ee9a0bc85 /sound | |
parent | 1ca99fe79acb4ccf9adfe21d4c905964c4a4e60f (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.c | 59 |
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)) |