summaryrefslogtreecommitdiff
path: root/cs40l26/cs40l26-codec.c
diff options
context:
space:
mode:
authorTai Kuo <taikuo@google.com>2022-05-23 12:45:21 +0800
committerTreeHugger Robot <treehugger-gerrit@google.com>2022-05-31 16:21:29 +0000
commit21a7d25270828dc0bac2db87c407b3b75e067313 (patch)
treee50fc20189234fe97db428aac391f814991f2ab1 /cs40l26/cs40l26-codec.c
parent9346e6318577d70ae497225192be80dcf57e06ec (diff)
downloadamplifiers-21a7d25270828dc0bac2db87c407b3b75e067313.tar.gz
cs40l26: merge cs40l26 v5.2.1android-t-beta-3.2_r0.4
Branch: v5.10-cs40l26 Tag: cs40l26-v5.2.1_5.10 Files: drivers/input/misc/cs40l26-i2c.c (No changes) drivers/input/misc/cs40l26-spi.c (No changes) drivers/input/misc/cs40l26-sysfs.c drivers/input/misc/cs40l26-tables.c (No changes) drivers/input/misc/cs40l26.c include/linux/mfd/cs40l26.h sound/soc/codecs/cs40l26.c -> cs40l26-codec.c Features: - Add vpbr_thld sysfs control - Add svc_le_est sysfs control in calibration directory Bug fixes: - Fix issue where invert and SVC were not applied to streaming data on first playback - Fix vibe_state issue when stopping an SVC effect immediately after triggering - Work around PSEQ_WRITE_REG full sign extention bug - Fix bug in SVC and invert kcontrols where driver attempts to access control before ensuring device is awake Major API changes: - None Commits: 217a3c0 ASoC: cs40l26: Use pm_runtime for kcontrols b6e471f ASoC: cs40l26: Report return value upon PM Runtime Resume Failure 112d30b input: cs40l26: Report return value upon PM Runtime Resume Failure 0b5f633 ASoC: cs40l26: PM Resume error handle for CODEC 40792b3 input: cs40l26: Improvements to SVC Le Estimation fc06825 input: cs40l26: Support for maintenance firmware branch 3952b3b input: cs40l26: Address PSEQ WRITE_FULL issue aaaf562 input: cs40l26: Add sysfs control for vpbr_thld caa3f56 input: cs40l26: Move stop delay outside mutex (Skip) 63b3998 Documentation: cs40l26: Fix timeout maximum values 2075e2f ASoC: cs40l26: Move PMU-time register writes to mixer controls (Skip) e376a83 Documentation: cs40l26: Fix "cirrus,redc-default" calculation 0bb9162 ASoC: cs40l26: Use set_pll_loop() during RECLK config 4b341ed input: cs40l26: Avoid DSP lock during driver probe Bug: 231410838 Test: Copy texts and adjust alarm Test: NFC, dumpstate, keyboard vibration Test: idlcli commands Test: Switch firmware continuous Test: Switch firmware and check the first tick effect Signed-off-by: Tai Kuo <taikuo@google.com> Change-Id: Ide206f8ea173e79267fa4506dece31f6e26a9356
Diffstat (limited to 'cs40l26/cs40l26-codec.c')
-rw-r--r--cs40l26/cs40l26-codec.c170
1 files changed, 104 insertions, 66 deletions
diff --git a/cs40l26/cs40l26-codec.c b/cs40l26/cs40l26-codec.c
index 4cf74bd..d126149 100644
--- a/cs40l26/cs40l26-codec.c
+++ b/cs40l26/cs40l26-codec.c
@@ -60,13 +60,10 @@ static int cs40l26_swap_ext_clk(struct cs40l26_codec *codec, u8 clk_src)
return ret;
}
- ret = regmap_update_bits(regmap, CS40L26_REFCLK_INPUT,
- CS40L26_PLL_REFCLK_OPEN_LOOP_MASK, 1 <<
- CS40L26_PLL_REFCLK_OPEN_LOOP_SHIFT);
- if (ret) {
- dev_err(dev, "Failed to set Open-Loop PLL\n");
+ ret = cs40l26_set_pll_loop(codec->core,
+ CS40L26_PLL_REFCLK_SET_OPEN_LOOP);
+ if (ret)
return ret;
- }
ret = regmap_update_bits(regmap, CS40L26_REFCLK_INPUT,
CS40L26_PLL_REFCLK_FREQ_MASK |
@@ -77,11 +74,8 @@ static int cs40l26_swap_ext_clk(struct cs40l26_codec *codec, u8 clk_src)
return ret;
}
- ret = regmap_update_bits(regmap, CS40L26_REFCLK_INPUT,
- CS40L26_PLL_REFCLK_OPEN_LOOP_MASK, 0 <<
- CS40L26_PLL_REFCLK_OPEN_LOOP_SHIFT);
- if (ret)
- dev_err(dev, "Failed to close PLL loop\n");
+ ret = cs40l26_set_pll_loop(codec->core,
+ CS40L26_PLL_REFCLK_SET_CLOSED_LOOP);
return ret;
}
@@ -203,7 +197,7 @@ static int cs40l26_pcm_ev(struct snd_soc_dapm_widget *w,
struct device *dev = cs40l26->dev;
u32 asp_en_mask = CS40L26_ASP_TX1_EN_MASK | CS40L26_ASP_TX2_EN_MASK |
CS40L26_ASP_RX1_EN_MASK | CS40L26_ASP_RX2_EN_MASK;
- u32 asp_enables, reg;
+ u32 asp_enables;
u8 data_src;
int ret;
@@ -242,30 +236,6 @@ static int cs40l26_pcm_ev(struct snd_soc_dapm_widget *w,
goto err_mutex;
}
- ret = cl_dsp_get_reg(cs40l26->dsp, "FLAGS",
- CL_DSP_XM_UNPACKED_TYPE, CS40L26_EXT_ALGO_ID, &reg);
- if (ret)
- goto err_mutex;
-
- ret = regmap_update_bits(regmap, reg,
- CS40L26_SVC_FOR_STREAMING_MASK,
- codec->svc_for_streaming_data);
- if (ret) {
- dev_err(dev, "Failed to specify SVC for streaming\n");
- goto err_mutex;
- }
-
- ret = cl_dsp_get_reg(cs40l26->dsp, "SOURCE_INVERT",
- CL_DSP_XM_UNPACKED_TYPE, CS40L26_EXT_ALGO_ID, &reg);
- if (ret)
- goto err_mutex;
-
- ret = regmap_write(regmap, reg, codec->invert_streaming_data);
- if (ret) {
- dev_err(dev, "Failed to specify SVC for streaming\n");
- goto err_mutex;
- }
-
break;
case SND_SOC_DAPM_PRE_PMD:
ret = cs40l26_ack_write(cs40l26, CS40L26_DSP_VIRTUAL1_MBOX_1,
@@ -308,7 +278,7 @@ static int cs40l26_i2s_vmon_get(struct snd_kcontrol *kcontrol,
ret = pm_runtime_get_sync(cs40l26->dev);
if (ret < 0) {
- cs40l26_resume_error_handle(cs40l26->dev);
+ cs40l26_resume_error_handle(cs40l26->dev, ret);
return ret;
}
@@ -379,17 +349,37 @@ static int cs40l26_svc_for_streaming_data_get(struct snd_kcontrol *kcontrol,
struct cs40l26_codec *codec =
snd_soc_component_get_drvdata(snd_soc_kcontrol_component(kcontrol));
struct cs40l26_private *cs40l26 = codec->core;
+ struct regmap *regmap = cs40l26->regmap;
+ struct device *dev = cs40l26->dev;
+ unsigned int val = 0, reg;
+ int ret = 0;
- mutex_lock(&cs40l26->lock);
+ ret = cl_dsp_get_reg(cs40l26->dsp, "FLAGS",
+ CL_DSP_XM_UNPACKED_TYPE, CS40L26_EXT_ALGO_ID, &reg);
+ if (ret)
+ return ret;
- if (codec->svc_for_streaming_data)
+ ret = pm_runtime_get_sync(dev);
+ if (ret < 0) {
+ cs40l26_resume_error_handle(dev, ret);
+ return ret;
+ }
+
+ ret = regmap_read(regmap, reg, &val);
+ if (ret) {
+ dev_err(cs40l26->dev, "Failed to read FLAGS\n");
+ return ret;
+ }
+
+ pm_runtime_mark_last_busy(dev);
+ pm_runtime_put_autosuspend(dev);
+
+ if (val & CS40L26_SVC_FOR_STREAMING_MASK)
ucontrol->value.enumerated.item[0] = 1;
else
ucontrol->value.enumerated.item[0] = 0;
- mutex_unlock(&cs40l26->lock);
-
- return 0;
+ return ret;
}
static int cs40l26_svc_for_streaming_data_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
@@ -397,17 +387,32 @@ static int cs40l26_svc_for_streaming_data_put(struct snd_kcontrol *kcontrol,
struct cs40l26_codec *codec =
snd_soc_component_get_drvdata(snd_soc_kcontrol_component(kcontrol));
struct cs40l26_private *cs40l26 = codec->core;
+ struct regmap *regmap = cs40l26->regmap;
+ struct device *dev = cs40l26->dev;
+ int ret = 0;
+ unsigned int reg;
- mutex_lock(&cs40l26->lock);
+ ret = cl_dsp_get_reg(cs40l26->dsp, "FLAGS",
+ CL_DSP_XM_UNPACKED_TYPE, CS40L26_EXT_ALGO_ID, &reg);
+ if (ret)
+ return ret;
- if (ucontrol->value.enumerated.item[0])
- codec->svc_for_streaming_data = true;
- else
- codec->svc_for_streaming_data = false;
+ ret = pm_runtime_get_sync(dev);
+ if (ret < 0) {
+ cs40l26_resume_error_handle(dev, ret);
+ return ret;
+ }
- mutex_unlock(&cs40l26->lock);
+ ret = regmap_update_bits(regmap, reg,
+ CS40L26_SVC_FOR_STREAMING_MASK,
+ ucontrol->value.enumerated.item[0]);
+ if (ret)
+ dev_err(cs40l26->dev, "Failed to specify SVC for streaming\n");
- return 0;
+ pm_runtime_mark_last_busy(dev);
+ pm_runtime_put_autosuspend(dev);
+
+ return ret;
}
static int cs40l26_invert_streaming_data_get(struct snd_kcontrol *kcontrol,
@@ -416,17 +421,37 @@ static int cs40l26_invert_streaming_data_get(struct snd_kcontrol *kcontrol,
struct cs40l26_codec *codec =
snd_soc_component_get_drvdata(snd_soc_kcontrol_component(kcontrol));
struct cs40l26_private *cs40l26 = codec->core;
+ struct regmap *regmap = cs40l26->regmap;
+ struct device *dev = cs40l26->dev;
+ unsigned int val = 0, reg;
+ int ret = 0;
- mutex_lock(&cs40l26->lock);
+ ret = cl_dsp_get_reg(cs40l26->dsp, "SOURCE_INVERT",
+ CL_DSP_XM_UNPACKED_TYPE, CS40L26_EXT_ALGO_ID, &reg);
+ if (ret)
+ return ret;
+
+ ret = pm_runtime_get_sync(dev);
+ if (ret < 0) {
+ cs40l26_resume_error_handle(dev, ret);
+ return ret;
+ }
+
+ ret = regmap_read(regmap, reg, &val);
+ if (ret) {
+ dev_err(cs40l26->dev, "Failed to read SOURCE_INVERT\n");
+ return ret;
+ }
- if (codec->invert_streaming_data)
+ pm_runtime_mark_last_busy(dev);
+ pm_runtime_put_autosuspend(dev);
+
+ if (val)
ucontrol->value.enumerated.item[0] = 1;
else
ucontrol->value.enumerated.item[0] = 0;
- mutex_unlock(&cs40l26->lock);
-
- return 0;
+ return ret;
}
static int cs40l26_invert_streaming_data_put(struct snd_kcontrol *kcontrol,
@@ -435,17 +460,30 @@ static int cs40l26_invert_streaming_data_put(struct snd_kcontrol *kcontrol,
struct cs40l26_codec *codec =
snd_soc_component_get_drvdata(snd_soc_kcontrol_component(kcontrol));
struct cs40l26_private *cs40l26 = codec->core;
+ struct regmap *regmap = cs40l26->regmap;
+ struct device *dev = cs40l26->dev;
+ int ret = 0;
+ unsigned int reg;
- mutex_lock(&cs40l26->lock);
+ ret = cl_dsp_get_reg(cs40l26->dsp, "SOURCE_INVERT",
+ CL_DSP_XM_UNPACKED_TYPE, CS40L26_EXT_ALGO_ID, &reg);
+ if (ret)
+ return ret;
- if (ucontrol->value.enumerated.item[0])
- codec->invert_streaming_data = true;
- else
- codec->invert_streaming_data = false;
+ ret = pm_runtime_get_sync(dev);
+ if (ret < 0) {
+ cs40l26_resume_error_handle(dev, ret);
+ return ret;
+ }
- mutex_unlock(&cs40l26->lock);
+ ret = regmap_write(regmap, reg, ucontrol->value.enumerated.item[0]);
+ if (ret)
+ dev_err(cs40l26->dev, "Failed to specify invert streaming data\n");
- return 0;
+ pm_runtime_mark_last_busy(dev);
+ pm_runtime_put_autosuspend(dev);
+
+ return ret;
}
static int cs40l26_tuning_get(struct snd_kcontrol *kcontrol,
@@ -504,7 +542,7 @@ static int cs40l26_a2h_volume_get(struct snd_kcontrol *kcontrol,
ret = pm_runtime_get_sync(dev);
if (ret < 0) {
- cs40l26_resume_error_handle(dev);
+ cs40l26_resume_error_handle(dev, ret);
return ret;
}
@@ -545,7 +583,7 @@ static int cs40l26_a2h_volume_put(struct snd_kcontrol *kcontrol,
ret = pm_runtime_get_sync(dev);
if (ret < 0) {
- cs40l26_resume_error_handle(dev);
+ cs40l26_resume_error_handle(dev, ret);
return ret;
}
@@ -602,7 +640,7 @@ static int cs40l26_a2h_delay_get(struct snd_kcontrol *kcontrol,
ret = pm_runtime_get_sync(dev);
if (ret < 0) {
- cs40l26_resume_error_handle(dev);
+ cs40l26_resume_error_handle(dev, ret);
return ret;
}
@@ -646,7 +684,7 @@ static int cs40l26_a2h_delay_put(struct snd_kcontrol *kcontrol,
ret = pm_runtime_get_sync(dev);
if (ret < 0) {
- cs40l26_resume_error_handle(dev);
+ cs40l26_resume_error_handle(dev, ret);
return ret;
}
@@ -800,7 +838,7 @@ static int cs40l26_pcm_hw_params(struct snd_pcm_substream *substream,
ret = pm_runtime_get_sync(codec->dev);
if (ret < 0) {
- cs40l26_resume_error_handle(codec->dev);
+ cs40l26_resume_error_handle(codec->dev, ret);
return ret;
}