From 9830e98ff49a2d433dd01618d53cad3b3310d84f Mon Sep 17 00:00:00 2001 From: huangys Date: Wed, 12 Sep 2018 20:00:14 +0800 Subject: [PATCH] cs35l41: workaround for fixing speaker low volume issue - once cirrus new 96k firmware is ready, revert this - not sending mailbox command to firmware, instead of mute/unmute command Mot-CRs-fixed: (CR) (CR) Change-Id: I22b6d368499edd99da5238f0e7393eb8d5c79fcc Signed-off-by: huangys Reviewed-on: https://gerrit.mot.com/1241093 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Master Yoda Reviewed-by: Guobin Zhang Submit-Approved: Jira Key --- include/sound/cs35l41.h | 1 + sound/soc/codecs/cs35l41.c | 19 ++++++++++++++++++- sound/soc/codecs/cs35l41.h | 7 +++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/include/sound/cs35l41.h b/include/sound/cs35l41.h index b138d4ce778e..ab3143e035c3 100644 --- a/include/sound/cs35l41.h +++ b/include/sound/cs35l41.h @@ -61,6 +61,7 @@ struct cs35l41_private { int extclk_freq; int extclk_cfg; int sclk; + unsigned int cspl_cmd_reg; unsigned int cspl_cmd; bool tdm_mode; bool i2s_mode; diff --git a/sound/soc/codecs/cs35l41.c b/sound/soc/codecs/cs35l41.c index 5dc28f1b49d5..6cfb536812ce 100644 --- a/sound/soc/codecs/cs35l41.c +++ b/sound/soc/codecs/cs35l41.c @@ -44,6 +44,8 @@ #include "cs35l41.h" #include +#define WORKAROUND_CSPL_VOLUME + static const char * const cs35l41_supplies[] = { "VA", "VP", @@ -174,6 +176,14 @@ static int cs35l41_dsp_load_ev(struct snd_soc_dapm_widget *w, wm_halo_event(w, kcontrol, event); cs35l41->halo_booted = true; } + regmap_write(cs35l41->regmap, cs35l41->cspl_cmd_reg, + CS35L41_CSPL_CMD_UNMUTE); + return 0; + + case SND_SOC_DAPM_PRE_PMD: + regmap_write(cs35l41->regmap, cs35l41->cspl_cmd_reg, + CS35L41_CSPL_CMD_MUTE); + default: return 0; } @@ -257,6 +267,10 @@ static int cs35l41_set_csplmboxcmd(struct cs35l41_private *cs35l41, int ret; unsigned int sts; +#ifdef WORKAROUND_CSPL_VOLUME + pr_info("%s: workaround cspl volume\n", __func__); + return 0; +#endif /* Reset DSP sticky bit */ regmap_write(cs35l41->regmap, CS35L41_IRQ2_STATUS2, 1 << CS35L41_CSPL_MBOX_CMD_DRV_SHIFT); @@ -831,7 +845,8 @@ static const struct snd_soc_dapm_widget cs35l41_dapm_widgets[] = { SND_SOC_NOPM, 0, 0, cs35l41_dsp_power_ev, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD), SND_SOC_DAPM_OUT_DRV_E("DSP1", SND_SOC_NOPM, 0, 0, NULL, 0, - cs35l41_dsp_load_ev, SND_SOC_DAPM_POST_PMU), + cs35l41_dsp_load_ev, + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), SND_SOC_DAPM_OUTPUT("SPK"), SND_SOC_DAPM_SWITCH("AMP Enable", SND_SOC_NOPM, 0, 1, &_enable_ctrl), @@ -1919,9 +1934,11 @@ int cs35l41_probe(struct cs35l41_private *cs35l41, "Failed to apply A0 errata patch %d\n", ret); goto err; } + cs35l41->cspl_cmd_reg = CS35L41_CSPL_COMMAND_REV_A0; break; case CS35L41_REVID_B0: regmap_write(cs35l41->regmap, CS35L41_BSTCVRT_DCM_CTRL, 0x51); + cs35l41->cspl_cmd_reg = CS35L41_CSPL_COMMAND_REV_B0; break; } diff --git a/sound/soc/codecs/cs35l41.h b/sound/soc/codecs/cs35l41.h index a30a178abca3..4d830cac1717 100644 --- a/sound/soc/codecs/cs35l41.h +++ b/sound/soc/codecs/cs35l41.h @@ -733,6 +733,13 @@ extern const struct cs35l41_otp_map_element_t #define CS35L41_REGSTRIDE 4 #define CS35L41_MBOXWAIT 100 +#define CS35L41_CSPL_CMD_NONE 0 +#define CS35L41_CSPL_CMD_MUTE 1 +#define CS35L41_CSPL_CMD_UNMUTE 2 +#define CS35L41_CSPL_CMD_REINIT 3 +#define CS35L41_CSPL_COMMAND_REV_A0 0x02800210 +#define CS35L41_CSPL_COMMAND_REV_B0 0x02800234 + #define CS35L41_DSP_VIRT1_MBOX_SHIFT 20 #define CS35L41_DSP_VIRT2_MBOX_SHIFT 21 #define CS35L41_CSPL_MBOX_STS CS35L41_DSP_MBOX_2