Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1702292 > unrolled thread
| Started by | srinivas.kandagatla@linaro.org |
|---|---|
| First post | 2017-08-02 19:20 +0200 |
| Last post | 2017-08-02 19:20 +0200 |
| Articles | 5 — 1 participant |
Back to article view | Back to linux.kernel
[PATCH v2 0/6] ASoC: codecs: msm8916-wcd-analog: Add support to MBHC srinivas.kandagatla@linaro.org - 2017-08-02 19:20 +0200
[PATCH v2 1/6] ASoC: jack: fix snd_soc_codec_set_jack return error srinivas.kandagatla@linaro.org - 2017-08-02 19:20 +0200
[PATCH v2 6/6] arm64: dts: apq8016-sbc: add mbhc buttons support srinivas.kandagatla@linaro.org - 2017-08-02 19:20 +0200
[PATCH v2 3/6] ASoC: codecs: msm8916-wcd-analog: get micbias voltage from dt srinivas.kandagatla@linaro.org - 2017-08-02 19:20 +0200
[PATCH v2 2/6] ASoC: codecs: msm8916-wcd-analog: move codec reset to probe srinivas.kandagatla@linaro.org - 2017-08-02 19:20 +0200
| From | srinivas.kandagatla@linaro.org |
|---|---|
| Date | 2017-08-02 19:20 +0200 |
| Subject | [PATCH v2 0/6] ASoC: codecs: msm8916-wcd-analog: Add support to MBHC |
| Message-ID | <ua5to-4lS-7@gated-at.bofh.it> |
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> This patchset adds support to MBHC(Multibutton headset control) block in PM8916 analog block. MBHC support comes from2 blocks first mechanical headset detection and second headset type, 5 button detection. This patchset adds support to: 1> Support to NC and NO type of headset Jacks. 2> Mechanical insertion and detection of headset jack. 3> Detect a 3 pole Headphone and a 4 pole Headset. 4> Detect 5 buttons. Damien sent a similar patchset to add support to mechanical detection, but that patch has issues and will not work on most usecases (for example after a playback/capture session, multicodec case). So I only picked up the BIT mask patch from that series. Tested it on DB410c with Audio Mezz board with 4 pole and 3 pole and during playback and recording use cases. Changes since v1(https://www.spinics.net/lists/kernel/msg2565463.html): - Micbias left to hardware default value suggested by Mark. - Updated commit log to reflect low power state for mbhc - cleaned up code spotted by Mark. - Moved the button voltage threshold to dt, suggested by Mark - Fixed key release issue reported by Damien Srinivas Kandagatla (6): ASoC: jack: fix snd_soc_codec_set_jack return error ASoC: codecs: msm8916-wcd-analog: move codec reset to probe ASoC: codecs: msm8916-wcd-analog: get micbias voltage from dt ASoC: codecs: msm8916-wcd-analog: add MBHC support ASoC: qcom: apq8016-sbc: Add support to Headset JACK arm64: dts: apq8016-sbc: add mbhc buttons support .../bindings/sound/qcom,msm8916-wcd-analog.txt | 18 +- arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi | 2 + sound/soc/codecs/msm8916-wcd-analog.c | 412 +++++++++++++++++++-- sound/soc/qcom/apq8016_sbc.c | 34 ++ sound/soc/soc-jack.c | 2 +- 5 files changed, 444 insertions(+), 24 deletions(-) -- 2.9.3
[toc] | [next] | [standalone]
| From | srinivas.kandagatla@linaro.org |
|---|---|
| Date | 2017-08-02 19:20 +0200 |
| Subject | [PATCH v2 1/6] ASoC: jack: fix snd_soc_codec_set_jack return error |
| Message-ID | <ua5tp-4lS-39@gated-at.bofh.it> |
| In reply to | #1702292 |
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> This patch changes the error code returned by snd_soc_codec_set_jack() from -EINVAL to -ENOTSUPP. The reason to do this is to make the caller aware that the underlying codec does not support this callback. This can make the caller write the code to handle this case properly. Other reason is that -EINVAL is not the correct error to return in this case anyway. Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> --- sound/soc/soc-jack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sound/soc/soc-jack.c b/sound/soc/soc-jack.c index 7daf21f..42ca9f1 100644 --- a/sound/soc/soc-jack.c +++ b/sound/soc/soc-jack.c @@ -36,7 +36,7 @@ int snd_soc_codec_set_jack(struct snd_soc_codec *codec, if (codec->driver->set_jack) return codec->driver->set_jack(codec, jack, data); else - return -EINVAL; + return -ENOTSUPP; } EXPORT_SYMBOL_GPL(snd_soc_codec_set_jack); -- 2.9.3
[toc] | [prev] | [next] | [standalone]
| From | srinivas.kandagatla@linaro.org |
|---|---|
| Date | 2017-08-02 19:20 +0200 |
| Subject | [PATCH v2 6/6] arm64: dts: apq8016-sbc: add mbhc buttons support |
| Message-ID | <ua5tp-4lS-51@gated-at.bofh.it> |
| In reply to | #1702292 |
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi b/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi
index 0981efc..bce458c 100644
--- a/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi
+++ b/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi
@@ -387,6 +387,8 @@
status = "okay";
clocks = <&gcc GCC_CODEC_DIGCODEC_CLK>;
clock-names = "mclk";
+ qcom,mbhc-vthreshold-low = <75 150 237 450 500>;
+ qcom,mbhc-vthreshold-high = <75 150 237 450 500>;
};
&spmi_pon {
--
2.9.3
[toc] | [prev] | [next] | [standalone]
| From | srinivas.kandagatla@linaro.org |
|---|---|
| Date | 2017-08-02 19:20 +0200 |
| Subject | [PATCH v2 3/6] ASoC: codecs: msm8916-wcd-analog: get micbias voltage from dt |
| Message-ID | <ua5tq-4lS-63@gated-at.bofh.it> |
| In reply to | #1702292 |
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
This patch adds bindings in DT to provide required micbias voltage which
could be specific to board. With this new binding, now the mic bias
voltage is left at hardware default value if the device tree does not
specify any mic bias voltage value. Correct micbias value is required
for mbhc buttons to work.
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
.../bindings/sound/qcom,msm8916-wcd-analog.txt | 1 +
sound/soc/codecs/msm8916-wcd-analog.c | 20 ++++++++++++++------
2 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-analog.txt b/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-analog.txt
index ccb401c..05b67a1 100644
--- a/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-analog.txt
+++ b/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-analog.txt
@@ -33,6 +33,7 @@ Required properties
- vdd-micbias-supply: phandle of VDD_MICBIAS supply's regulator DT node.
Optional Properties:
+- qcom,micbias-lvl: Voltage (mV) for Mic Bias
- qcom,micbias1-ext-cap: boolean, present if micbias1 has external capacitor
connected.
- qcom,micbias2-ext-cap: boolean, present if micbias2 has external capacitor
diff --git a/sound/soc/codecs/msm8916-wcd-analog.c b/sound/soc/codecs/msm8916-wcd-analog.c
index 6606954..dec4978 100644
--- a/sound/soc/codecs/msm8916-wcd-analog.c
+++ b/sound/soc/codecs/msm8916-wcd-analog.c
@@ -93,8 +93,12 @@
#define MICB_1_EN_TX3_GND_SEL_TX_GND 0
#define CDC_A_MICB_1_VAL (0xf141)
+#define MICB_MIN_VAL 1600
+#define MICB_STEP_SIZE 50
+#define MICB_VOLTAGE_REGVAL(v) ((v - MICB_MIN_VAL)/MICB_STEP_SIZE)
#define MICB_1_VAL_MICB_OUT_VAL_MASK GENMASK(7, 3)
#define MICB_1_VAL_MICB_OUT_VAL_V2P70V ((0x16) << 3)
+#define MICB_1_VAL_MICB_OUT_VAL_V1P80V ((0x4) << 3)
#define CDC_A_MICB_1_CTL (0xf142)
#define MICB_1_CTL_CFILT_REF_SEL_MASK BIT(1)
@@ -225,6 +229,7 @@ struct pm8916_wcd_analog_priv {
struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
unsigned int micbias1_cap_mode;
unsigned int micbias2_cap_mode;
+ unsigned int micbias_mv;
};
static const char *const adc2_mux_text[] = { "ZERO", "INP2", "INP3" };
@@ -265,18 +270,18 @@ static const struct snd_kcontrol_new pm8916_wcd_analog_snd_controls[] = {
static void pm8916_wcd_analog_micbias_enable(struct snd_soc_codec *codec)
{
+ struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec);
+
snd_soc_update_bits(codec, CDC_A_MICB_1_CTL,
MICB_1_CTL_EXT_PRECHARG_EN_MASK |
MICB_1_CTL_INT_PRECHARG_BYP_MASK,
MICB_1_CTL_INT_PRECHARG_BYP_EXT_PRECHRG_SEL
| MICB_1_CTL_EXT_PRECHARG_EN_ENABLE);
- snd_soc_write(codec, CDC_A_MICB_1_VAL, MICB_1_VAL_MICB_OUT_VAL_V2P70V);
- /*
- * Special headset needs MICBIAS as 2.7V so wait for
- * 50 msec for the MICBIAS to reach 2.7 volts.
- */
- msleep(50);
+ if (wcd->micbias_mv)
+ snd_soc_write(codec, CDC_A_MICB_1_VAL,
+ MICB_VOLTAGE_REGVAL(wcd->micbias_mv));
+
snd_soc_update_bits(codec, CDC_A_MICB_1_CTL,
MICB_1_CTL_EXT_PRECHARG_EN_MASK |
MICB_1_CTL_INT_PRECHARG_BYP_MASK, 0);
@@ -795,6 +800,9 @@ static int pm8916_wcd_analog_parse_dt(struct device *dev,
else
priv->micbias2_cap_mode = MICB_1_EN_NO_EXT_BYP_CAP;
+ of_property_read_u32(dev->of_node, "qcom,micbias-lvl",
+ &priv->micbias_mv);
+
return 0;
}
--
2.9.3
[toc] | [prev] | [next] | [standalone]
| From | srinivas.kandagatla@linaro.org |
|---|---|
| Date | 2017-08-02 19:20 +0200 |
| Subject | [PATCH v2 2/6] ASoC: codecs: msm8916-wcd-analog: move codec reset to probe |
| Message-ID | <ua5tq-4lS-65@gated-at.bofh.it> |
| In reply to | #1702292 |
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
This patch move the codec reset code from dai ops to codec probe, so
that the codec is not held in reset when headset detection block is
still active.
Without this patch the codec block will be in reset as long as its not
actively used, which means headset events will not be functional if the
codec dai is not actively used. Point to note is that the headset
detection blocks will work in low power when there is no active audio
usecase and switch to micbias source when audio usecase is active.
Existing dapms should put the codec in low power state anyway when there
is no audio usecase.
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
sound/soc/codecs/msm8916-wcd-analog.c | 30 ++++++------------------------
1 file changed, 6 insertions(+), 24 deletions(-)
diff --git a/sound/soc/codecs/msm8916-wcd-analog.c b/sound/soc/codecs/msm8916-wcd-analog.c
index 5710fd4..6606954 100644
--- a/sound/soc/codecs/msm8916-wcd-analog.c
+++ b/sound/soc/codecs/msm8916-wcd-analog.c
@@ -536,6 +536,9 @@ static int pm8916_wcd_analog_probe(struct snd_soc_codec *codec)
snd_soc_write(codec, wcd_reg_defaults_2_0[reg].reg,
wcd_reg_defaults_2_0[reg].def);
+ snd_soc_update_bits(codec, CDC_D_CDC_RST_CTL,
+ RST_CTL_DIG_SW_RST_N_MASK,
+ RST_CTL_DIG_SW_RST_N_REMOVE_RESET);
return 0;
}
@@ -543,6 +546,9 @@ static int pm8916_wcd_analog_remove(struct snd_soc_codec *codec)
{
struct pm8916_wcd_analog_priv *priv = dev_get_drvdata(codec->dev);
+ snd_soc_update_bits(codec, CDC_D_CDC_RST_CTL,
+ RST_CTL_DIG_SW_RST_N_MASK, 0);
+
return regulator_bulk_disable(ARRAY_SIZE(priv->supplies),
priv->supplies);
}
@@ -736,28 +742,6 @@ static struct regmap *pm8916_get_regmap(struct device *dev)
return dev_get_regmap(dev->parent, NULL);
}
-static int pm8916_wcd_analog_startup(struct snd_pcm_substream *substream,
- struct snd_soc_dai *dai)
-{
- snd_soc_update_bits(dai->codec, CDC_D_CDC_RST_CTL,
- RST_CTL_DIG_SW_RST_N_MASK,
- RST_CTL_DIG_SW_RST_N_REMOVE_RESET);
-
- return 0;
-}
-
-static void pm8916_wcd_analog_shutdown(struct snd_pcm_substream *substream,
- struct snd_soc_dai *dai)
-{
- snd_soc_update_bits(dai->codec, CDC_D_CDC_RST_CTL,
- RST_CTL_DIG_SW_RST_N_MASK, 0);
-}
-
-static struct snd_soc_dai_ops pm8916_wcd_analog_dai_ops = {
- .startup = pm8916_wcd_analog_startup,
- .shutdown = pm8916_wcd_analog_shutdown,
-};
-
static struct snd_soc_dai_driver pm8916_wcd_analog_dai[] = {
[0] = {
.name = "pm8916_wcd_analog_pdm_rx",
@@ -769,7 +753,6 @@ static struct snd_soc_dai_driver pm8916_wcd_analog_dai[] = {
.channels_min = 1,
.channels_max = 3,
},
- .ops = &pm8916_wcd_analog_dai_ops,
},
[1] = {
.name = "pm8916_wcd_analog_pdm_tx",
@@ -781,7 +764,6 @@ static struct snd_soc_dai_driver pm8916_wcd_analog_dai[] = {
.channels_min = 1,
.channels_max = 4,
},
- .ops = &pm8916_wcd_analog_dai_ops,
},
};
--
2.9.3
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web