summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvincenttew <vincenttew@google.com>2022-05-03 19:09:31 +0800
committervincenttew <vincenttew@google.com>2022-05-05 10:05:22 +0800
commit47f06688de339d990f326d65a9c6798d18318ed9 (patch)
treea14827c4734057dea361fe53cffd2d0f6b1ffaaa
parent33811b4ea38472975ac5cb9896dbd8637311e202 (diff)
downloadamplifiers-47f06688de339d990f326d65a9c6798d18318ed9.tar.gz
cs35l41: restore current limit to the last valueandroid-t-beta-3_r0.4
1. Rewrite the Cirrus default current limit default value if controled by userspace, hibernate awake will restore to the default value. 2. Added a switch to disable hibernate mode Bug: 228796239 Signed-off-by: vincenttew <vincenttew@google.com> Change-Id: I3b974d7741dc07ddbacaf672d8840bf622b4ea6f
-rw-r--r--cs35l41/cs35l41.c76
1 files changed, 75 insertions, 1 deletions
diff --git a/cs35l41/cs35l41.c b/cs35l41/cs35l41.c
index 72c6aed..dc9594f 100644
--- a/cs35l41/cs35l41.c
+++ b/cs35l41/cs35l41.c
@@ -315,6 +315,76 @@ static int cs35l41_dsp_load_ev(struct snd_soc_dapm_widget *w,
return 0;
}
+static int cs35l41_bp_current_limit_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component =
+ snd_soc_kcontrol_component(kcontrol);
+ struct cs35l41_private *cs35l41 =
+ snd_soc_component_get_drvdata(component);
+
+ ucontrol->value.integer.value[0] =
+ (long)(((cs35l41->pdata.bst_ipk - 1600) / 50) + 0x10);
+
+ return 0;
+}
+
+static int cs35l41_bp_current_limit_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component =
+ snd_soc_kcontrol_component(kcontrol);
+ struct cs35l41_private *cs35l41 =
+ snd_soc_component_get_drvdata(component);
+
+ cs35l41->pdata.bst_ipk =
+ ((int)ucontrol->value.integer.value[0] - 0x10) * 50 + 1600;
+ dev_info(cs35l41->dev, "%s: value %d\n",
+ __func__, cs35l41->pdata.bst_ipk);
+
+ return 0;
+}
+
+static int cs35l41_hibernate_switch_get(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component =
+ snd_soc_kcontrol_component(kcontrol);
+ struct cs35l41_private *cs35l41 =
+ snd_soc_component_get_drvdata(component);
+
+ if (cs35l41->amp_hibernate == CS35L41_HIBERNATE_INCOMPATIBLE) {
+ ucontrol->value.integer.value[0] = false;
+ } else {
+ ucontrol->value.integer.value[0] = true;
+ }
+
+ return 0;
+}
+
+static int cs35l41_hibernate_switch_put(struct snd_kcontrol *kcontrol,
+ struct snd_ctl_elem_value *ucontrol)
+{
+ struct snd_soc_component *component =
+ snd_soc_kcontrol_component(kcontrol);
+ struct cs35l41_private *cs35l41 =
+ snd_soc_component_get_drvdata(component);
+
+ if (ucontrol->value.integer.value[0]) {
+ cs35l41->amp_hibernate = CS35L41_HIBERNATE_NOT_LOADED;
+ } else {
+ cancel_delayed_work(&cs35l41->hb_work);
+ mutex_lock(&cs35l41->hb_lock);
+ cs35l41_exit_hibernate(cs35l41);
+ mutex_unlock(&cs35l41->hb_lock);
+ cs35l41->amp_hibernate = CS35L41_HIBERNATE_INCOMPATIBLE;
+ }
+ dev_info(cs35l41->dev, "%s: %ld\n",
+ __func__, ucontrol->value.integer.value[0]);
+
+ return 0;
+}
+
static int cs35l41_halo_booted_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
@@ -1619,7 +1689,8 @@ static const struct snd_kcontrol_new cs35l41_aud_controls[] = {
SOC_SINGLE_RANGE("ASPRX2 Slot Position", CS35L41_SP_FRAME_RX_SLOT, 8,
0, 7, 0),
SOC_ENUM("PCM Soft Ramp", pcm_sft_ramp),
- SOC_ENUM("Boost Peak Current Limit", current_limit),
+ SOC_ENUM_EXT("Boost Peak Current Limit", current_limit,
+ cs35l41_bp_current_limit_get, cs35l41_bp_current_limit_put),
SOC_SINGLE_EXT("DSP Booted", SND_SOC_NOPM, 0, 1, 0,
cs35l41_halo_booted_get, cs35l41_halo_booted_put),
SOC_SINGLE_EXT("AMP Reset", SND_SOC_NOPM, 0, 1, 0,
@@ -1628,6 +1699,9 @@ static const struct snd_kcontrol_new cs35l41_aud_controls[] = {
cs35l41_ccm_reset_get, cs35l41_ccm_reset_put),
SOC_SINGLE_EXT("Force Interrupt", SND_SOC_NOPM, 0, 1, 0,
cs35l41_force_int_get, cs35l41_force_int_put),
+ SOC_SINGLE_EXT("Hibernate Switch", SND_SOC_NOPM, 0, 1, 0,
+ cs35l41_hibernate_switch_get,
+ cs35l41_hibernate_switch_put),
SOC_SINGLE_EXT("Hibernate Force Wake", SND_SOC_NOPM, 0, 1, 0,
cs35l41_hibernate_force_wake_get,
cs35l41_hibernate_force_wake_put),