Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1707492 > unrolled thread

[PATCH v3 0/5] ASoC: codecs: msm8916-wcd-analog: Add support to MBHC

Started bysrinivas.kandagatla@linaro.org
First post2017-08-09 18:50 +0200
Last post2017-08-11 17:20 +0200
Articles 13 — 4 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH v3 0/5] ASoC: codecs: msm8916-wcd-analog: Add support to MBHC srinivas.kandagatla@linaro.org - 2017-08-09 18:50 +0200
    [PATCH v3 5/5] arm64: dts: apq8016-sbc: add mbhc buttons support srinivas.kandagatla@linaro.org - 2017-08-09 19:00 +0200
    [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support srinivas.kandagatla@linaro.org - 2017-08-09 19:00 +0200
      Re: [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support Damien Riegel <damien.riegel@savoirfairelinux.com> - 2017-08-09 23:20 +0200
        Re: [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support Srinivas Kandagatla <srinivas.kandagatla@linaro.org> - 2017-08-10 12:10 +0200
          Re: [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support Damien Riegel <damien.riegel@savoirfairelinux.com> - 2017-08-10 15:40 +0200
            Re: [alsa-devel] [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog:  add MBHC support Damien Riegel <damien.riegel@savoirfairelinux.com> - 2017-08-14 16:20 +0200
              Re: [alsa-devel] [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add  MBHC support Srinivas Kandagatla <srinivas.kandagatla@linaro.org> - 2017-08-14 18:40 +0200
                Re: [alsa-devel] [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog:  add MBHC support Damien Riegel <damien.riegel@savoirfairelinux.com> - 2017-08-16 20:00 +0200
                  Re: [alsa-devel] [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add  MBHC support Srinivas Kandagatla <srinivas.kandagatla@linaro.org> - 2017-08-17 12:20 +0200
    [PATCH v3 2/5] ASoC: codecs: msm8916-wcd-analog: get micbias voltage from dt srinivas.kandagatla@linaro.org - 2017-08-09 19:00 +0200
      Re: [PATCH v3 2/5] ASoC: codecs: msm8916-wcd-analog: get micbias  voltage from dt Mark Brown <broonie@kernel.org> - 2017-08-10 17:30 +0200
        Re: [PATCH v3 2/5] ASoC: codecs: msm8916-wcd-analog: get micbias  voltage from dt Srinivas Kandagatla <srinivas.kandagatla@linaro.org> - 2017-08-11 17:20 +0200

#1707492 — [PATCH v3 0/5] ASoC: codecs: msm8916-wcd-analog: Add support to MBHC

Fromsrinivas.kandagatla@linaro.org
Date2017-08-09 18:50 +0200
Subject[PATCH v3 0/5] ASoC: codecs: msm8916-wcd-analog: Add support to MBHC
Message-ID<ucClc-1qq-5@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 from 2 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 v2(https://lkml.org/lkml/2017/8/2/609):
	- cleaned up code spotted by Damien
	- dropped fix snd_soc_codec_set_jack return error as it alredy applied

Srinivas Kandagatla (5):
  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              | 407 +++++++++++++++++++--
 sound/soc/qcom/apq8016_sbc.c                       |  34 ++
 4 files changed, 437 insertions(+), 24 deletions(-)

-- 
2.9.3

[toc] | [next] | [standalone]


#1707506 — [PATCH v3 5/5] arm64: dts: apq8016-sbc: add mbhc buttons support

Fromsrinivas.kandagatla@linaro.org
Date2017-08-09 19:00 +0200
Subject[PATCH v3 5/5] arm64: dts: apq8016-sbc: add mbhc buttons support
Message-ID<ucCuS-1ua-17@gated-at.bofh.it>
In reply to#1707492
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]


#1707513 — [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support

Fromsrinivas.kandagatla@linaro.org
Date2017-08-09 19:00 +0200
Subject[PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support
Message-ID<ucCuT-1ua-33@gated-at.bofh.it>
In reply to#1707492
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>

MBHC (MultiButton Headset Control) support is available in pm8921 in two
blocks, one to detect mechanical headset insertion and removal and other
block to support headset type detection and 5 button detection and othe
features like impedance calculation.

This patch 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.

Tested it on DB410c with Audio Mezz board with 4 pole and 3 pole
headset/headphones.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 .../bindings/sound/qcom,msm8916-wcd-analog.txt     |  17 +-
 sound/soc/codecs/msm8916-wcd-analog.c              | 373 ++++++++++++++++++++-
 2 files changed, 388 insertions(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-analog.txt b/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-analog.txt
index 05b67a1..551ecab 100644
--- a/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-analog.txt
+++ b/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-analog.txt
@@ -31,9 +31,22 @@ Required properties
  - vdd-cdc-io-supply: phandle to VDD_CDC_IO regulator DT node.
  - vdd-cdc-tx-rx-cx-supply: phandle to VDD_CDC_TX/RX/CX regulator DT node.
  - vdd-micbias-supply: phandle of VDD_MICBIAS supply's regulator DT node.
-
 Optional Properties:
+ - qcom,mbhc-vthreshold-low: Array of 5 threshold voltages in mV for 5 buttons
+			     detection on headset when the mbhc is powered up
+			     by internal current source, this is a low power.
+ - qcom,mbhc-vthreshold-high: Array of 5 thresold voltages in mV for 5 buttons
+			      detection on headset when mbhc is powered up
+			       from micbias.
 - qcom,micbias-lvl:  Voltage (mV) for Mic Bias
+- qcom,hphl-jack-type-normally-open: boolean, present if hphl pin on jack is a
+				     NO (Normally Open). If not specified, then
+				     its assumed that hphl pin on jack is NC
+				     (Normally Closed).
+- qcom,gnd-jack-type-normally-open: boolean, present if gnd pin on jack is
+				    NO (Normally Open). If not specified, then
+				    its assumed that gnd pin on jack is NC
+				    (Normally Closed).
 - qcom,micbias1-ext-cap: boolean, present if micbias1 has external capacitor
 			 connected.
 - qcom,micbias2-ext-cap: boolean, present if micbias2 has external capacitor
@@ -49,6 +62,8 @@ spmi_bus {
 		reg-names = "pmic-codec-core";
 		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>;
 		interrupt-parent = <&spmi_bus>;
 		interrupts = <0x1 0xf0 0x0 IRQ_TYPE_NONE>,
 			     <0x1 0xf0 0x1 IRQ_TYPE_NONE>,
diff --git a/sound/soc/codecs/msm8916-wcd-analog.c b/sound/soc/codecs/msm8916-wcd-analog.c
index dec4978..b84aeb4 100644
--- a/sound/soc/codecs/msm8916-wcd-analog.c
+++ b/sound/soc/codecs/msm8916-wcd-analog.c
@@ -12,9 +12,16 @@
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
 #include <sound/tlv.h>
+#include <sound/jack.h>
 
 #define CDC_D_REVISION1			(0xf000)
 #define CDC_D_PERPH_SUBTYPE		(0xf005)
+#define CDC_D_INT_EN_SET		(0x015)
+#define CDC_D_INT_EN_CLR		(0x016)
+#define MBHC_SWITCH_INT			BIT(7)
+#define MBHC_MIC_ELECTRICAL_INS_REM_DET	BIT(6)
+#define MBHC_BUTTON_PRESS_DET		BIT(5)
+#define MBHC_BUTTON_RELEASE_DET		BIT(4)
 #define CDC_D_CDC_RST_CTL		(0xf046)
 #define RST_CTL_DIG_SW_RST_N_MASK	BIT(7)
 #define RST_CTL_DIG_SW_RST_N_RESET	0
@@ -37,6 +44,8 @@
 #define DIG_CLK_CTL_RXD1_CLK_EN		BIT(0)
 #define DIG_CLK_CTL_RXD2_CLK_EN		BIT(1)
 #define DIG_CLK_CTL_RXD3_CLK_EN		BIT(2)
+#define DIG_CLK_CTL_D_MBHC_CLK_EN_MASK	BIT(3)
+#define DIG_CLK_CTL_D_MBHC_CLK_EN	BIT(3)
 #define DIG_CLK_CTL_TXD_CLK_EN		BIT(4)
 #define DIG_CLK_CTL_NCP_CLK_EN_MASK	BIT(6)
 #define DIG_CLK_CTL_NCP_CLK_EN		BIT(6)
@@ -132,8 +141,51 @@
 #define MICB_1_INT_TX3_INT_PULLUP_EN_TX1N_TO_GND	0
 
 #define CDC_A_MICB_2_EN			(0xf144)
+#define CDC_A_MICB_2_EN_ENABLE		BIT(7)
+#define CDC_A_MICB_2_PULL_DOWN_EN_MASK	BIT(5)
+#define CDC_A_MICB_2_PULL_DOWN_EN	BIT(5)
 #define CDC_A_TX_1_2_ATEST_CTL_2	(0xf145)
 #define CDC_A_MASTER_BIAS_CTL		(0xf146)
+#define CDC_A_MBHC_DET_CTL_1		(0xf147)
+#define CDC_A_MBHC_DET_CTL_L_DET_EN			BIT(7)
+#define CDC_A_MBHC_DET_CTL_GND_DET_EN			BIT(6)
+#define CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_INSERTION	BIT(5)
+#define CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_REMOVAL	(0)
+#define CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_MASK		BIT(5)
+#define CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_SHIFT		(5)
+#define CDC_A_MBHC_DET_CTL_MIC_CLAMP_CTL_AUTO		BIT(4)
+#define CDC_A_MBHC_DET_CTL_MIC_CLAMP_CTL_MANUAL		BIT(3)
+#define CDC_A_MBHC_DET_CTL_MIC_CLAMP_CTL_MASK		GENMASK(4, 3)
+#define CDC_A_MBHC_DET_CTL_MBHC_BIAS_EN			BIT(2)
+#define CDC_A_MBHC_DET_CTL_2		(0xf150)
+#define CDC_A_MBHC_DET_CTL_HS_L_DET_PULL_UP_CTRL_I_3P0	(BIT(7) | BIT(6))
+#define CDC_A_MBHC_DET_CTL_HS_L_DET_COMPA_CTRL_V0P9_VDD	BIT(5)
+#define CDC_A_PLUG_TYPE_MASK				GENMASK(4, 3)
+#define CDC_A_HPHL_PLUG_TYPE_NO				BIT(4)
+#define CDC_A_GND_PLUG_TYPE_NO				BIT(3)
+#define CDC_A_MBHC_DET_CTL_HPHL_100K_TO_GND_EN_MASK	BIT(0)
+#define CDC_A_MBHC_DET_CTL_HPHL_100K_TO_GND_EN		BIT(0)
+#define CDC_A_MBHC_FSM_CTL		(0xf151)
+#define CDC_A_MBHC_FSM_CTL_MBHC_FSM_EN			BIT(7)
+#define CDC_A_MBHC_FSM_CTL_MBHC_FSM_EN_MASK		BIT(7)
+#define CDC_A_MBHC_FSM_CTL_BTN_ISRC_CTRL_I_100UA	(0x3 << 4)
+#define CDC_A_MBHC_FSM_CTL_BTN_ISRC_CTRL_MASK		GENMASK(6, 4)
+#define CDC_A_MBHC_DBNC_TIMER		(0xf152)
+#define CDC_A_MBHC_DBNC_TIMER_BTN_DBNC_T_16MS		BIT(3)
+#define CDC_A_MBHC_DBNC_TIMER_INSREM_DBNC_T_256_MS	(0x9 << 4)
+#define CDC_A_MBHC_BTN0_ZDET_CTL_0	(0xf153)
+#define CDC_A_MBHC_BTN1_ZDET_CTL_1	(0xf154)
+#define CDC_A_MBHC_BTN2_ZDET_CTL_2	(0xf155)
+#define CDC_A_MBHC_BTN3_CTL		(0xf156)
+#define CDC_A_MBHC_BTN4_CTL		(0xf157)
+#define CDC_A_MBHC_BTN_VREF_FINE_SHIFT	(2)
+#define CDC_A_MBHC_BTN_VREF_FINE_MASK	GENMASK(4, 2)
+#define CDC_A_MBHC_BTN_VREF_COARSE_MASK	GENMASK(7, 5)
+#define CDC_A_MBHC_BTN_VREF_COARSE_SHIFT (5)
+#define CDC_A_MBHC_BTN_VREF_MASK	(CDC_A_MBHC_BTN_VREF_COARSE_MASK | \
+					CDC_A_MBHC_BTN_VREF_FINE_MASK)
+#define CDC_A_MBHC_RESULT_1		(0xf158)
+#define CDC_A_MBHC_RESULT_1_BTN_RESULT_MASK	GENMASK(4, 0)
 #define CDC_A_TX_1_EN			(0xf160)
 #define CDC_A_TX_2_EN			(0xf161)
 #define CDC_A_TX_1_2_TEST_CTL_1		(0xf162)
@@ -217,16 +269,34 @@
 #define MSM8916_WCD_ANALOG_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
 				    SNDRV_PCM_FMTBIT_S24_LE)
 
+static int btn_mask = SND_JACK_BTN_0 | SND_JACK_BTN_1 |
+	       SND_JACK_BTN_2 | SND_JACK_BTN_3 | SND_JACK_BTN_4;
+static int hs_jack_mask = SND_JACK_HEADPHONE | SND_JACK_HEADSET;
+
 static const char * const supply_names[] = {
 	"vdd-cdc-io",
 	"vdd-cdc-tx-rx-cx",
 };
 
+#define MBHC_MAX_BUTTONS	(5)
+
 struct pm8916_wcd_analog_priv {
 	u16 pmic_rev;
 	u16 codec_version;
+	bool	mbhc_btn_enabled;
+	/* special event to detect accessory type */
+	bool	mbhc_btn0_pressed;
+	bool	detect_accessory_type;
 	struct clk *mclk;
+	struct snd_soc_codec *codec;
 	struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
+	struct snd_soc_jack *jack;
+	bool hphl_jack_type_normally_open;
+	bool gnd_jack_type_normally_open;
+	/* Voltage threshold when internal current source of 100uA is used */
+	u32 vref_btn_cs[MBHC_MAX_BUTTONS];
+	/* Voltage threshold when microphone bias is ON */
+	u32 vref_btn_micb[MBHC_MAX_BUTTONS];
 	unsigned int micbias1_cap_mode;
 	unsigned int micbias2_cap_mode;
 	unsigned int micbias_mv;
@@ -366,6 +436,97 @@ static int pm8916_wcd_analog_enable_micbias_int1(struct
 						     wcd->micbias1_cap_mode);
 }
 
+static void pm8916_wcd_setup_mbhc(struct pm8916_wcd_analog_priv *wcd)
+{
+	struct snd_soc_codec *codec = wcd->codec;
+	u32 plug_type = 0;
+	u32 int_en_mask;
+
+	snd_soc_write(codec, CDC_A_MBHC_DET_CTL_1,
+		      CDC_A_MBHC_DET_CTL_L_DET_EN |
+		      CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_INSERTION |
+		      CDC_A_MBHC_DET_CTL_MIC_CLAMP_CTL_AUTO |
+		      CDC_A_MBHC_DET_CTL_MBHC_BIAS_EN);
+
+	if (wcd->hphl_jack_type_normally_open)
+		plug_type |= CDC_A_HPHL_PLUG_TYPE_NO;
+
+	if (wcd->gnd_jack_type_normally_open)
+		plug_type |= CDC_A_GND_PLUG_TYPE_NO;
+
+	snd_soc_write(codec, CDC_A_MBHC_DET_CTL_2,
+		      CDC_A_MBHC_DET_CTL_HS_L_DET_PULL_UP_CTRL_I_3P0 |
+		      CDC_A_MBHC_DET_CTL_HS_L_DET_COMPA_CTRL_V0P9_VDD |
+		      plug_type |
+		      CDC_A_MBHC_DET_CTL_HPHL_100K_TO_GND_EN);
+
+
+	snd_soc_write(codec, CDC_A_MBHC_DBNC_TIMER,
+		      CDC_A_MBHC_DBNC_TIMER_INSREM_DBNC_T_256_MS |
+		      CDC_A_MBHC_DBNC_TIMER_BTN_DBNC_T_16MS);
+
+	/* enable MBHC clock */
+	snd_soc_update_bits(codec, CDC_D_CDC_DIG_CLK_CTL,
+			    DIG_CLK_CTL_D_MBHC_CLK_EN_MASK,
+			    DIG_CLK_CTL_D_MBHC_CLK_EN);
+
+	int_en_mask = MBHC_SWITCH_INT;
+	if (wcd->mbhc_btn_enabled)
+		int_en_mask |= MBHC_BUTTON_PRESS_DET | MBHC_BUTTON_RELEASE_DET;
+
+	snd_soc_update_bits(codec, CDC_D_INT_EN_CLR, int_en_mask, 0);
+	snd_soc_update_bits(codec, CDC_D_INT_EN_SET, int_en_mask, int_en_mask);
+	wcd->mbhc_btn0_pressed = false;
+	wcd->detect_accessory_type = true;
+}
+
+static int pm8916_mbhc_configure_bias(struct pm8916_wcd_analog_priv *priv,
+				      bool micbias2_enabled)
+{
+	struct snd_soc_codec *codec = priv->codec;
+	u32 coarse, fine, reg_val, reg_addr;
+	int *vrefs, i;
+
+	if (!micbias2_enabled) { /* use internal 100uA Current source */
+		/* Enable internal 2.2k Internal Rbias Resistor */
+		snd_soc_update_bits(codec, CDC_A_MICB_1_INT_RBIAS,
+				    MICB_1_INT_TX2_INT_RBIAS_EN_MASK,
+				    MICB_1_INT_TX2_INT_RBIAS_EN_ENABLE);
+		/* Remove pull down on MIC BIAS2 */
+		snd_soc_update_bits(codec, CDC_A_MICB_2_EN,
+				   CDC_A_MICB_2_PULL_DOWN_EN_MASK,
+				   0);
+		/* enable 100uA internal current source */
+		snd_soc_update_bits(codec, CDC_A_MBHC_FSM_CTL,
+				    CDC_A_MBHC_FSM_CTL_BTN_ISRC_CTRL_MASK,
+				    CDC_A_MBHC_FSM_CTL_BTN_ISRC_CTRL_I_100UA);
+	}
+	snd_soc_update_bits(codec, CDC_A_MBHC_FSM_CTL,
+			CDC_A_MBHC_FSM_CTL_MBHC_FSM_EN_MASK,
+			CDC_A_MBHC_FSM_CTL_MBHC_FSM_EN);
+
+	if (micbias2_enabled)
+		vrefs = &priv->vref_btn_micb[0];
+	else
+		vrefs = &priv->vref_btn_cs[0];
+
+	/* program vref ranges for all the buttons */
+	reg_addr = CDC_A_MBHC_BTN0_ZDET_CTL_0;
+	for (i = 0; i <  MBHC_MAX_BUTTONS; i++) {
+		/* split mv in to coarse parts of 100mv & fine parts of 12mv */
+		coarse = (vrefs[i] / 100);
+		fine = ((vrefs[i] % 100) / 12);
+		reg_val = (coarse << CDC_A_MBHC_BTN_VREF_COARSE_SHIFT) |
+			 (fine << CDC_A_MBHC_BTN_VREF_FINE_SHIFT);
+		snd_soc_update_bits(codec, reg_addr,
+			       CDC_A_MBHC_BTN_VREF_MASK,
+			       reg_val);
+		reg_addr++;
+	}
+
+	return 0;
+}
+
 static int pm8916_wcd_analog_enable_micbias_int2(struct
 						  snd_soc_dapm_widget
 						  *w, struct snd_kcontrol
@@ -374,6 +535,15 @@ static int pm8916_wcd_analog_enable_micbias_int2(struct
 	struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
 	struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec);
 
+	switch (event) {
+	case SND_SOC_DAPM_POST_PMU:
+		pm8916_mbhc_configure_bias(wcd, true);
+		break;
+	case SND_SOC_DAPM_POST_PMD:
+		pm8916_mbhc_configure_bias(wcd, false);
+		break;
+	}
+
 	return pm8916_wcd_analog_enable_micbias_int(codec, event, w->reg,
 						     wcd->micbias2_cap_mode);
 }
@@ -541,9 +711,14 @@ 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);
 
+	priv->codec = codec;
+
 	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);
+
+	pm8916_wcd_setup_mbhc(priv);
+
 	return 0;
 }
 
@@ -742,11 +917,130 @@ static const struct snd_soc_dapm_widget pm8916_wcd_analog_dapm_widgets[] = {
 	SND_SOC_DAPM_SUPPLY("A_MCLK2", CDC_D_CDC_TOP_CLK_CTL, 3, 0, NULL, 0),
 };
 
+static int pm8916_wcd_analog_set_jack(struct snd_soc_codec *codec,
+				      struct snd_soc_jack *jack,
+				      void *data)
+{
+	struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec);
+
+	wcd->jack = jack;
+
+	return 0;
+}
+
 static struct regmap *pm8916_get_regmap(struct device *dev)
 {
 	return dev_get_regmap(dev->parent, NULL);
 }
 
+static irqreturn_t mbhc_btn_release_irq_handler(int irq, void *arg)
+{
+	struct pm8916_wcd_analog_priv *priv = arg;
+
+	if (priv->detect_accessory_type) {
+		struct snd_soc_codec *codec = priv->codec;
+		u32 val = snd_soc_read(codec, CDC_A_MBHC_RESULT_1);
+
+		/* check if its BTN0 thats released */
+		if ((val >= 0) && !(val & CDC_A_MBHC_RESULT_1_BTN_RESULT_MASK))
+			priv->mbhc_btn0_pressed = false;
+
+	} else {
+		snd_soc_jack_report(priv->jack, 0, btn_mask);
+	}
+
+	return IRQ_HANDLED;
+}
+
+static irqreturn_t mbhc_btn_press_irq_handler(int irq, void *arg)
+{
+	struct pm8916_wcd_analog_priv *priv = arg;
+	struct snd_soc_codec *codec = priv->codec;
+	u32 btn_result;
+
+	btn_result = snd_soc_read(codec, CDC_A_MBHC_RESULT_1) &
+				  CDC_A_MBHC_RESULT_1_BTN_RESULT_MASK;
+
+	switch (btn_result) {
+	case 0xf:
+		snd_soc_jack_report(priv->jack, SND_JACK_BTN_4, btn_mask);
+		break;
+	case 0x7:
+		snd_soc_jack_report(priv->jack, SND_JACK_BTN_3, btn_mask);
+		break;
+	case 0x3:
+		snd_soc_jack_report(priv->jack, SND_JACK_BTN_2, btn_mask);
+		break;
+	case 0x1:
+		snd_soc_jack_report(priv->jack, SND_JACK_BTN_1, btn_mask);
+		break;
+	case 0x0:
+		/* handle BTN_0 specially for type detection */
+		if (priv->detect_accessory_type)
+			priv->mbhc_btn0_pressed = true;
+		else
+			snd_soc_jack_report(priv->jack,
+					    SND_JACK_BTN_0, btn_mask);
+		break;
+	default:
+		dev_err(codec->dev,
+			"Unexpected button press result (%x)", btn_result);
+		break;
+	}
+
+	return IRQ_HANDLED;
+}
+
+
+static irqreturn_t pm8916_mbhc_switch_irq_handler(int irq, void *arg)
+{
+	struct pm8916_wcd_analog_priv *priv = arg;
+	struct snd_soc_codec *codec = priv->codec;
+	bool ins = false;
+
+	if (snd_soc_read(codec, CDC_A_MBHC_DET_CTL_1) &
+				CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_MASK)
+		ins = true;
+
+	/* Set the detection type appropriately */
+	snd_soc_update_bits(codec, CDC_A_MBHC_DET_CTL_1,
+			    CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_MASK,
+			    (!ins << CDC_A_MBHC_DET_CTL_MECH_DET_TYPE_SHIFT));
+
+
+	if (ins) { /* hs insertion */
+		bool micbias_enabled = false;
+
+		if (snd_soc_read(codec, CDC_A_MICB_2_EN) &
+				CDC_A_MICB_2_EN_ENABLE)
+			micbias_enabled = true;
+
+		pm8916_mbhc_configure_bias(priv, micbias_enabled);
+
+		/*
+		 * if only a btn0 press event is receive just before
+		 * insert event then its a 3 pole headphone else if
+		 * both press and release event received then its
+		 * a headset.
+		 */
+		if (priv->mbhc_btn0_pressed)
+			snd_soc_jack_report(priv->jack,
+					    SND_JACK_HEADPHONE, hs_jack_mask);
+		else
+			snd_soc_jack_report(priv->jack,
+					    SND_JACK_HEADSET, hs_jack_mask);
+
+		priv->detect_accessory_type = false;
+
+	} else { /* removal */
+		snd_soc_jack_report(priv->jack, 0, hs_jack_mask);
+		priv->detect_accessory_type = true;
+		priv->mbhc_btn0_pressed = false;
+	}
+
+	return IRQ_HANDLED;
+}
+
 static struct snd_soc_dai_driver pm8916_wcd_analog_dai[] = {
 	[0] = {
 	       .name = "pm8916_wcd_analog_pdm_rx",
@@ -775,6 +1069,7 @@ static struct snd_soc_dai_driver pm8916_wcd_analog_dai[] = {
 static struct snd_soc_codec_driver pm8916_wcd_analog = {
 	.probe = pm8916_wcd_analog_probe,
 	.remove = pm8916_wcd_analog_remove,
+	.set_jack = pm8916_wcd_analog_set_jack,
 	.get_regmap = pm8916_get_regmap,
 	.component_driver = {
 		.controls = pm8916_wcd_analog_snd_controls,
@@ -789,6 +1084,7 @@ static struct snd_soc_codec_driver pm8916_wcd_analog = {
 static int pm8916_wcd_analog_parse_dt(struct device *dev,
 				       struct pm8916_wcd_analog_priv *priv)
 {
+	int rval;
 
 	if (of_property_read_bool(dev->of_node, "qcom,micbias1-ext-cap"))
 		priv->micbias1_cap_mode = MICB_1_EN_EXT_BYP_CAP;
@@ -803,6 +1099,39 @@ static int pm8916_wcd_analog_parse_dt(struct device *dev,
 	of_property_read_u32(dev->of_node, "qcom,micbias-lvl",
 			     &priv->micbias_mv);
 
+	if (of_property_read_bool(dev->of_node,
+				  "qcom,hphl-jack-type-normally-open"))
+		priv->hphl_jack_type_normally_open = true;
+	else
+		priv->hphl_jack_type_normally_open = false;
+
+	if (of_property_read_bool(dev->of_node,
+				  "qcom,gnd-jack-type-normally-open"))
+		priv->gnd_jack_type_normally_open = true;
+	else
+		priv->gnd_jack_type_normally_open = false;
+
+	priv->mbhc_btn_enabled = true;
+	rval = of_property_read_u32_array(dev->of_node,
+					  "qcom,mbhc-vthreshold-low",
+					  &priv->vref_btn_cs[0],
+					  MBHC_MAX_BUTTONS);
+	if (rval < 0) {
+		priv->mbhc_btn_enabled = false;
+	} else {
+		rval = of_property_read_u32_array(dev->of_node,
+						  "qcom,mbhc-vthreshold-high",
+						  &priv->vref_btn_micb[0],
+						  MBHC_MAX_BUTTONS);
+		if (rval < 0)
+			priv->mbhc_btn_enabled = false;
+	}
+
+	if (!priv->mbhc_btn_enabled)
+		dev_err(dev,
+			"DT property missing, MBHC btn detection disabled\n");
+
+
 	return 0;
 }
 
@@ -810,7 +1139,7 @@ static int pm8916_wcd_analog_spmi_probe(struct platform_device *pdev)
 {
 	struct pm8916_wcd_analog_priv *priv;
 	struct device *dev = &pdev->dev;
-	int ret, i;
+	int ret, i, irq;
 
 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
 	if (!priv)
@@ -842,6 +1171,48 @@ static int pm8916_wcd_analog_spmi_probe(struct platform_device *pdev)
 		return ret;
 	}
 
+	irq = platform_get_irq_byname(pdev, "mbhc_switch_int");
+	if (irq < 0) {
+		dev_err(dev, "failed to get mbhc switch irq\n");
+		return irq;
+	}
+
+	ret = devm_request_irq(dev, irq, pm8916_mbhc_switch_irq_handler,
+			       IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING |
+			       IRQF_ONESHOT,
+			       "mbhc switch irq", priv);
+	if (ret)
+		dev_err(dev, "cannot request mbhc switch irq\n");
+
+	if (priv->mbhc_btn_enabled) {
+		irq = platform_get_irq_byname(pdev, "mbhc_but_press_det");
+		if (irq < 0) {
+			dev_err(dev, "failed to get button press irq\n");
+			return irq;
+		}
+
+		ret = devm_request_irq(dev, irq, mbhc_btn_press_irq_handler,
+				       IRQF_TRIGGER_RISING |
+				       IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+				       "mbhc btn press irq", priv);
+		if (ret)
+			dev_err(dev, "cannot request mbhc button press irq\n");
+
+		irq = platform_get_irq_byname(pdev, "mbhc_but_rel_det");
+		if (irq < 0) {
+			dev_err(dev, "failed to get button release irq\n");
+			return irq;
+		}
+
+		ret = devm_request_irq(dev, irq, mbhc_btn_release_irq_handler,
+				       IRQF_TRIGGER_RISING |
+				       IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+				       "mbhc btn release irq", priv);
+		if (ret)
+			dev_err(dev, "cannot request mbhc button release irq\n");
+
+	}
+
 	dev_set_drvdata(dev, priv);
 
 	return snd_soc_register_codec(dev, &pm8916_wcd_analog,
-- 
2.9.3

[toc] | [prev] | [next] | [standalone]


#1707959 — Re: [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support

FromDamien Riegel <damien.riegel@savoirfairelinux.com>
Date2017-08-09 23:20 +0200
SubjectRe: [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support
Message-ID<ucGyt-4l3-3@gated-at.bofh.it>
In reply to#1707513
Hi Srinivas,

On Wed, Aug 09, 2017 at 06:49:25PM +0200, srinivas.kandagatla@linaro.org wrote:
> From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> 
> MBHC (MultiButton Headset Control) support is available in pm8921 in two
> blocks, one to detect mechanical headset insertion and removal and other
> block to support headset type detection and 5 button detection and othe
> features like impedance calculation.
> 
> This patch 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.
> 
> Tested it on DB410c with Audio Mezz board with 4 pole and 3 pole
> headset/headphones.

I have the same issue with this patchset, KEY_MEDIA is being reported
when unplugging a headset. I added a few traces and what I observe is
that the "button pressed" irq is fired when unplugging, but no "button
released" irq follows. To get a "button released" irq, I need to either
plug a headset, or plug-and-unplug headphones.

So basically, detection fails because we don't get the "button pressed"
irq prior to the mechanical switch irq. Do you know what could explain
the MBHC not firing the "button released" irq when unplugging headset?


Thanks,
-- 
Damien

[toc] | [prev] | [next] | [standalone]


#1708392 — Re: [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support

FromSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Date2017-08-10 12:10 +0200
SubjectRe: [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support
Message-ID<ucSzE-4aC-21@gated-at.bofh.it>
In reply to#1707959
Hi Damien,
Thanks for testing.

On 09/08/17 22:10, Damien Riegel wrote:
> Hi Srinivas,
> 
> On Wed, Aug 09, 2017 at 06:49:25PM +0200, srinivas.kandagatla@linaro.org wrote:
>> From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
>>
>> MBHC (MultiButton Headset Control) support is available in pm8921 in two
>> blocks, one to detect mechanical headset insertion and removal and other
>> block to support headset type detection and 5 button detection and othe
>> features like impedance calculation.
>>
>> This patch 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.
>>
>> Tested it on DB410c with Audio Mezz board with 4 pole and 3 pole
>> headset/headphones.
> 
> I have the same issue with this patchset, KEY_MEDIA is being reported
> when unplugging a headset. I added a few traces and what I observe is
Am unable to reproduce the same issue, I tried atleast 6 different mix 
of headset/headphones.
here is my evtest log:  http://paste.ubuntu.com/25282592/

Could you explain bit more about your setup, so that I can try to 
reproduce the same issue.

My setup is DB410c + Audio Mezz board 
https://www.arrow.com/en/products/audiomezz/seeed-technology-limited


> that the "button pressed" irq is fired when unplugging, but no "button
> released" irq follows. To get a "button released" irq, I need to either
> plug a headset, or plug-and-unplug headphones.
> 
> So basically, detection fails because we don't get the "button pressed"
> irq prior to the mechanical switch irq. Do you know what could explain
> the MBHC not firing the "button released" irq when unplugging headset?
> 
Can you also share output of evetest and /proc/interrupts so that i can 
see if the extra logic of masking btn0 is creating the issue, we can 
also try removing the btn0 accessory detect logic and see if we get 
correct button press/releases.

thanks,
srini


> 
> Thanks,
> 

[toc] | [prev] | [next] | [standalone]


#1708633 — Re: [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support

FromDamien Riegel <damien.riegel@savoirfairelinux.com>
Date2017-08-10 15:40 +0200
SubjectRe: [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support
Message-ID<ucVQR-6aH-1@gated-at.bofh.it>
In reply to#1708392
Hi,

On Thu, Aug 10, 2017 at 11:02:34AM +0100, Srinivas Kandagatla wrote:
> Hi Damien,
> Thanks for testing.
> 
> On 09/08/17 22:10, Damien Riegel wrote:
> > Hi Srinivas,
> > 
> > On Wed, Aug 09, 2017 at 06:49:25PM +0200, srinivas.kandagatla@linaro.org wrote:
> > > From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> > > 
> > > MBHC (MultiButton Headset Control) support is available in pm8921 in two
> > > blocks, one to detect mechanical headset insertion and removal and other
> > > block to support headset type detection and 5 button detection and othe
> > > features like impedance calculation.
> > > 
> > > This patch 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.
> > > 
> > > Tested it on DB410c with Audio Mezz board with 4 pole and 3 pole
> > > headset/headphones.
> > 
> > I have the same issue with this patchset, KEY_MEDIA is being reported
> > when unplugging a headset. I added a few traces and what I observe is
> Am unable to reproduce the same issue, I tried atleast 6 different mix of
> headset/headphones.
> here is my evtest log:  http://paste.ubuntu.com/25282592/
> 
> Could you explain bit more about your setup, so that I can try to reproduce
> the same issue.
> 
> My setup is DB410c + Audio Mezz board
> https://www.arrow.com/en/products/audiomezz/seeed-technology-limited

I'm using a hardware based on Intrinsyc Open-Q 410 Development Kit:
https://www.intrinsyc.com/snapdragon-embedded-development-kits/snapdragon-410-development-kit/

We use the same SoM with a different carrier board, but connections to
the jack connector are routed the same way on both carrier boards.

> > that the "button pressed" irq is fired when unplugging, but no "button
> > released" irq follows. To get a "button released" irq, I need to either
> > plug a headset, or plug-and-unplug headphones.
> > 
> > So basically, detection fails because we don't get the "button pressed"
> > irq prior to the mechanical switch irq. Do you know what could explain
> > the MBHC not firing the "button released" irq when unplugging headset?
> > 
> Can you also share output of evetest and /proc/interrupts so that i can see
> if the extra logic of masking btn0 is creating the issue, we can also try
> removing the btn0 accessory detect logic and see if we get correct button
> press/releases.

It's definitely what's causing the headphones to be reported as headset,
but not what's causing the interrupt not to be triggered in the first
place. I don't have access to the hardware right now, so I'll provide
you with logs next week.

Thanks,
-- 
Damien

[toc] | [prev] | [next] | [standalone]


#1710968 — Re: [alsa-devel] [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support

FromDamien Riegel <damien.riegel@savoirfairelinux.com>
Date2017-08-14 16:20 +0200
SubjectRe: [alsa-devel] [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support
Message-ID<ueonM-5bN-37@gated-at.bofh.it>
In reply to#1708633
Hi,


On Thu, Aug 10, 2017 at 09:33:29AM -0400, Damien Riegel wrote:
> Hi,
> 
> On Thu, Aug 10, 2017 at 11:02:34AM +0100, Srinivas Kandagatla wrote:
> > Hi Damien,
> > Thanks for testing.
> > 
> > On 09/08/17 22:10, Damien Riegel wrote:
> > > Hi Srinivas,
> > > 
> > > On Wed, Aug 09, 2017 at 06:49:25PM +0200, srinivas.kandagatla@linaro.org wrote:
> > > > From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> > > > 
> > > > MBHC (MultiButton Headset Control) support is available in pm8921 in two
> > > > blocks, one to detect mechanical headset insertion and removal and other
> > > > block to support headset type detection and 5 button detection and othe
> > > > features like impedance calculation.
> > > > 
> > > > This patch 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.
> > > > 
> > > > Tested it on DB410c with Audio Mezz board with 4 pole and 3 pole
> > > > headset/headphones.
> > > 
> > > I have the same issue with this patchset, KEY_MEDIA is being reported
> > > when unplugging a headset. I added a few traces and what I observe is
> > Am unable to reproduce the same issue, I tried atleast 6 different mix of
> > headset/headphones.
> > here is my evtest log:  http://paste.ubuntu.com/25282592/
> > 
> > Could you explain bit more about your setup, so that I can try to reproduce
> > the same issue.
> > 
> > My setup is DB410c + Audio Mezz board
> > https://www.arrow.com/en/products/audiomezz/seeed-technology-limited
> 
> I'm using a hardware based on Intrinsyc Open-Q 410 Development Kit:
> https://www.intrinsyc.com/snapdragon-embedded-development-kits/snapdragon-410-development-kit/
> 
> We use the same SoM with a different carrier board, but connections to
> the jack connector are routed the same way on both carrier boards.
> 
> > > that the "button pressed" irq is fired when unplugging, but no "button
> > > released" irq follows. To get a "button released" irq, I need to either
> > > plug a headset, or plug-and-unplug headphones.
> > > 
> > > So basically, detection fails because we don't get the "button pressed"
> > > irq prior to the mechanical switch irq. Do you know what could explain
> > > the MBHC not firing the "button released" irq when unplugging headset?
> > > 
> > Can you also share output of evetest and /proc/interrupts so that i can see
> > if the extra logic of masking btn0 is creating the issue, we can also try
> > removing the btn0 accessory detect logic and see if we get correct button
> > press/releases.
> 
> It's definitely what's causing the headphones to be reported as headset,
> but not what's causing the interrupt not to be triggered in the first
> place. I don't have access to the hardware right now, so I'll provide
> you with logs next week.

I did the test, and addded the content of /proc/interrupts.

    https://paste.ubuntu.com/25312443/

As you can see, after "[INSERT HEADPHONE]", we only get "mbhc switch
irq", but not "mbhc btn press irq". Let me know if you need more
details.

As I said before, I don't see that 100% of the time, but I don't do
anything special to trigger it either (like pulling the cable extra
slowly or whatnot), it just happens.


Thank you,
-- 
Damien

[toc] | [prev] | [next] | [standalone]


#1711194 — Re: [alsa-devel] [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support

FromSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Date2017-08-14 18:40 +0200
SubjectRe: [alsa-devel] [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support
Message-ID<ueqzg-6tX-9@gated-at.bofh.it>
In reply to#1710968

On 14/08/17 15:12, Damien Riegel wrote:
> Hi,
> 
> 
> On Thu, Aug 10, 2017 at 09:33:29AM -0400, Damien Riegel wrote:
>> Hi,
>>
>> On Thu, Aug 10, 2017 at 11:02:34AM +0100, Srinivas Kandagatla wrote:
>>> Hi Damien,
>>> Thanks for testing.
>>>
>>> On 09/08/17 22:10, Damien Riegel wrote:
>>>> Hi Srinivas,
>>>>
>>>> On Wed, Aug 09, 2017 at 06:49:25PM +0200, srinivas.kandagatla@linaro.org wrote:
>>>>> From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
>>>>>
>>>>> MBHC (MultiButton Headset Control) support is available in pm8921 in two
>>>>> blocks, one to detect mechanical headset insertion and removal and other
>>>>> block to support headset type detection and 5 button detection and othe
>>>>> features like impedance calculation.
>>>>>
>>>>> This patch 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.
>>>>>
>>>>> Tested it on DB410c with Audio Mezz board with 4 pole and 3 pole
>>>>> headset/headphones.
>>>>
>>>> I have the same issue with this patchset, KEY_MEDIA is being reported
>>>> when unplugging a headset. I added a few traces and what I observe is
>>> Am unable to reproduce the same issue, I tried atleast 6 different mix of
>>> headset/headphones.
>>> here is my evtest log:  http://paste.ubuntu.com/25282592/
>>>
>>> Could you explain bit more about your setup, so that I can try to reproduce
>>> the same issue.
>>>
>>> My setup is DB410c + Audio Mezz board
>>> https://www.arrow.com/en/products/audiomezz/seeed-technology-limited
>>
>> I'm using a hardware based on Intrinsyc Open-Q 410 Development Kit:
>> https://www.intrinsyc.com/snapdragon-embedded-development-kits/snapdragon-410-development-kit/
>>
>> We use the same SoM with a different carrier board, but connections to
>> the jack connector are routed the same way on both carrier boards.
>>
>>>> that the "button pressed" irq is fired when unplugging, but no "button
>>>> released" irq follows. To get a "button released" irq, I need to either
>>>> plug a headset, or plug-and-unplug headphones.
>>>>
>>>> So basically, detection fails because we don't get the "button pressed"
>>>> irq prior to the mechanical switch irq. Do you know what could explain
>>>> the MBHC not firing the "button released" irq when unplugging headset?
>>>>
>>> Can you also share output of evetest and /proc/interrupts so that i can see
>>> if the extra logic of masking btn0 is creating the issue, we can also try
>>> removing the btn0 accessory detect logic and see if we get correct button
>>> press/releases.
>>
>> It's definitely what's causing the headphones to be reported as headset,
>> but not what's causing the interrupt not to be triggered in the first
>> place. I don't have access to the hardware right now, so I'll provide
>> you with logs next week.
> 
> I did the test, and addded the content of /proc/interrupts.
> 
>      https://paste.ubuntu.com/25312443/
> 
> As you can see, after "[INSERT HEADPHONE]", we only get "mbhc switch
> irq", but not "mbhc btn press irq". Let me know if you need more
> details.
> 
> As I said before, I don't see that 100% of the time, but I don't do
> anything special to trigger it either (like pulling the cable extra
> slowly or whatnot), it just happens.

Looking at the interrupts count its clear that there was a real button 
press event from the hardware, so My suspect is the voltage threshold 
values programmed for the buttons, which might not be very much correct 
if you are using same values as db410c. These values are partly board 
specific.

Can you tune those values and give it a try, specially btn0 values.


thanks,
srini


> 
> 
> Thank you,
> 

[toc] | [prev] | [next] | [standalone]


#1713199 — Re: [alsa-devel] [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support

FromDamien Riegel <damien.riegel@savoirfairelinux.com>
Date2017-08-16 20:00 +0200
SubjectRe: [alsa-devel] [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support
Message-ID<ufaLM-1FQ-19@gated-at.bofh.it>
In reply to#1711194
On Mon, Aug 14, 2017 at 05:34:53PM +0100, Srinivas Kandagatla wrote:
> 
> 
> On 14/08/17 15:12, Damien Riegel wrote:
> > Hi,
> > 
> > 
> > On Thu, Aug 10, 2017 at 09:33:29AM -0400, Damien Riegel wrote:
> > > Hi,
> > > 
> > > On Thu, Aug 10, 2017 at 11:02:34AM +0100, Srinivas Kandagatla wrote:
> > > > Hi Damien,
> > > > Thanks for testing.
> > > > 
> > > > On 09/08/17 22:10, Damien Riegel wrote:
> > > > > Hi Srinivas,
> > > > > 
> > > > > On Wed, Aug 09, 2017 at 06:49:25PM +0200, srinivas.kandagatla@linaro.org wrote:
> > > > > > From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> > > > > > 
> > > > > > MBHC (MultiButton Headset Control) support is available in pm8921 in two
> > > > > > blocks, one to detect mechanical headset insertion and removal and other
> > > > > > block to support headset type detection and 5 button detection and othe
> > > > > > features like impedance calculation.
> > > > > > 
> > > > > > This patch 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.
> > > > > > 
> > > > > > Tested it on DB410c with Audio Mezz board with 4 pole and 3 pole
> > > > > > headset/headphones.
> > > > > 
> > > > > I have the same issue with this patchset, KEY_MEDIA is being reported
> > > > > when unplugging a headset. I added a few traces and what I observe is
> > > > Am unable to reproduce the same issue, I tried atleast 6 different mix of
> > > > headset/headphones.
> > > > here is my evtest log:  http://paste.ubuntu.com/25282592/
> > > > 
> > > > Could you explain bit more about your setup, so that I can try to reproduce
> > > > the same issue.
> > > > 
> > > > My setup is DB410c + Audio Mezz board
> > > > https://www.arrow.com/en/products/audiomezz/seeed-technology-limited
> > > 
> > > I'm using a hardware based on Intrinsyc Open-Q 410 Development Kit:
> > > https://www.intrinsyc.com/snapdragon-embedded-development-kits/snapdragon-410-development-kit/
> > > 
> > > We use the same SoM with a different carrier board, but connections to
> > > the jack connector are routed the same way on both carrier boards.
> > > 
> > > > > that the "button pressed" irq is fired when unplugging, but no "button
> > > > > released" irq follows. To get a "button released" irq, I need to either
> > > > > plug a headset, or plug-and-unplug headphones.
> > > > > 
> > > > > So basically, detection fails because we don't get the "button pressed"
> > > > > irq prior to the mechanical switch irq. Do you know what could explain
> > > > > the MBHC not firing the "button released" irq when unplugging headset?
> > > > > 
> > > > Can you also share output of evetest and /proc/interrupts so that i can see
> > > > if the extra logic of masking btn0 is creating the issue, we can also try
> > > > removing the btn0 accessory detect logic and see if we get correct button
> > > > press/releases.
> > > 
> > > It's definitely what's causing the headphones to be reported as headset,
> > > but not what's causing the interrupt not to be triggered in the first
> > > place. I don't have access to the hardware right now, so I'll provide
> > > you with logs next week.
> > 
> > I did the test, and addded the content of /proc/interrupts.
> > 
> >      https://paste.ubuntu.com/25312443/
> > 
> > As you can see, after "[INSERT HEADPHONE]", we only get "mbhc switch
> > irq", but not "mbhc btn press irq". Let me know if you need more
> > details.
> > 
> > As I said before, I don't see that 100% of the time, but I don't do
> > anything special to trigger it either (like pulling the cable extra
> > slowly or whatnot), it just happens.
> 
> Looking at the interrupts count its clear that there was a real button press
> event from the hardware, so My suspect is the voltage threshold values
> programmed for the buttons, which might not be very much correct if you are
> using same values as db410c. These values are partly board specific.
> 
> Can you tune those values and give it a try, specially btn0 values.

Correct me if I'm wrong, but if the design is the same, the values
should be more a less the same as well, right? Moreover, the driver
detects the right key press in normal use cases.

Anyway, I tried to tweak the values but ended up with the same results.
Pressing btn0 brings the DC tension to 0V, so I'm not sure changing the
detection threshold of btn0 has any impact.

Another explanation could be the jack connector. I did a few tests on
the Open-Q 410 [1] and could not reproduce the issue of the spurious key
when unplugging headset, it only happens on the in-house device. So I
guess they have slightly different jack connectors and only one kind
triggers that issue. With that conclusion:


Tested-by: Damien Riegel <damien.riegel@savoirfairelinux.com>

[1] https://www.intrinsyc.com/snapdragon-embedded-development-kits/snapdragon-410-development-kit/

Thank you,
-- 
Damien

[toc] | [prev] | [next] | [standalone]


#1713782 — Re: [alsa-devel] [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support

FromSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Date2017-08-17 12:20 +0200
SubjectRe: [alsa-devel] [PATCH v3 3/5] ASoC: codecs: msm8916-wcd-analog: add MBHC support
Message-ID<ufq4b-3s3-45@gated-at.bofh.it>
In reply to#1713199

On 16/08/17 18:48, Damien Riegel wrote:
> Correct me if I'm wrong, but if the design is the same, the values
> should be more a less the same as well, right? Moreover, the driver
> detects the right key press in normal use cases.
You are partly correct, but these values might change according to your 
board layout and there is button tuning procedure to derive these 
threshold values for each board according to OEM design requirements.

thanks,
srini

[toc] | [prev] | [next] | [standalone]


#1707518 — [PATCH v3 2/5] ASoC: codecs: msm8916-wcd-analog: get micbias voltage from dt

Fromsrinivas.kandagatla@linaro.org
Date2017-08-09 19:00 +0200
Subject[PATCH v3 2/5] ASoC: codecs: msm8916-wcd-analog: get micbias voltage from dt
Message-ID<ucCuT-1ua-45@gated-at.bofh.it>
In reply to#1707492
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]


#1708725 — Re: [PATCH v3 2/5] ASoC: codecs: msm8916-wcd-analog: get micbias voltage from dt

FromMark Brown <broonie@kernel.org>
Date2017-08-10 17:30 +0200
SubjectRe: [PATCH v3 2/5] ASoC: codecs: msm8916-wcd-analog: get micbias voltage from dt
Message-ID<ucXzj-7tV-3@gated-at.bofh.it>
In reply to#1707518

[Multipart message — attachments visible in raw view] — view raw

On Wed, Aug 09, 2017 at 06:49:24PM +0200, srinivas.kandagatla@linaro.org wrote:

> -	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)

We seem to have just completely lost this ramp time handling?

[toc] | [prev] | [next] | [standalone]


#1709727 — Re: [PATCH v3 2/5] ASoC: codecs: msm8916-wcd-analog: get micbias voltage from dt

FromSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Date2017-08-11 17:20 +0200
SubjectRe: [PATCH v3 2/5] ASoC: codecs: msm8916-wcd-analog: get micbias voltage from dt
Message-ID<udjTc-59s-13@gated-at.bofh.it>
In reply to#1708725

On 10/08/17 16:24, Mark Brown wrote:
> On Wed, Aug 09, 2017 at 06:49:24PM +0200, srinivas.kandagatla@linaro.org wrote:
> 
>> -	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)
> 
> We seem to have just completely lost this ramp time handling?
Yes, will take care of this in next version.

> 

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web