diff options
author | Tai Kuo <taikuo@google.com> | 2022-05-23 12:45:21 +0800 |
---|---|---|
committer | TreeHugger Robot <treehugger-gerrit@google.com> | 2022-05-31 16:21:29 +0000 |
commit | 21a7d25270828dc0bac2db87c407b3b75e067313 (patch) | |
tree | e50fc20189234fe97db428aac391f814991f2ab1 /cs40l26/cs40l26-codec.c | |
parent | 9346e6318577d70ae497225192be80dcf57e06ec (diff) | |
download | amplifiers-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.c | 170 |
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, ®); - 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, ®); - 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, ®); + 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, ®); + 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, ®); + 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, ®); + 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; } |