linux-samsung-soc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] ASoC: samsung: midas-audio: Add GPIO-based headset jack detection
@ 2024-05-03 18:55 Artur Weber
  2024-05-03 18:55 ` [PATCH 1/3] ASoC: dt-bindings: samsung,midas-audio: " Artur Weber
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Artur Weber @ 2024-05-03 18:55 UTC (permalink / raw)
  To: Sylwester Nawrocki, Krzysztof Kozlowski
  Cc: Liam Girdwood, Mark Brown, Rob Herring, Conor Dooley,
	Jaroslav Kysela, Takashi Iwai, Alim Akhtar, alsa-devel,
	linux-sound, devicetree, linux-kernel, linux-arm-kernel,
	linux-samsung-soc, ~postmarketos/upstreaming, Artur Weber

Many of Samsung's Exynos 4 devices share the same midas-audio driver
to handle the codec setup. While most of these devices, including the
Midas itself, use the jack detection provided by the WM8994 driver,
other devices such as the Samsung Galaxy Tab 3 8.0 (lt01) use two GPIOs
and an ADC channel to determine jack insertion, the jack's type, and
button presses (for headsets with volume up/down/play buttons).

In the downstream kernel, this behavior is implemented in the sec-jack
driver[1], and the per-device settings are configured in *-jack.c files
in the mach folder (see e.g. the Tab 3's implementation[2]).

This patchset implements this mechanism in the midas_wm1811.c driver,
and adds new DTS options to allow for its configuration. It also
enables jack detection for the Samsung Galaxy Tab 3 8.0.

A very similar mechanism was already present in the aries_wm8994.c
driver[3]; this implementation heavily borrows from it, though there
are a few extra cleanups as well.

Signed-off-by: Artur Weber <aweber.kernel@gmail.com>

[1] https://github.com/gr8nole/android_kernel_samsung_smdk4x12/blob/lineage-14.1/drivers/misc/sec_jack.c
[2] https://github.com/gr8nole/android_kernel_samsung_smdk4x12/blob/lineage-14.1/arch/arm/mach-exynos/tab3-jack.c
[3] https://github.com/torvalds/linux/blob/master/sound/soc/samsung/aries_wm8994.c

---
Artur Weber (3):
      ASoC: dt-bindings: samsung,midas-audio: Add GPIO-based headset jack detection
      ASoC: samsung: midas_wm1811: Add GPIO-based headset jack detection
      ARM: dts: samsung: exynos4212-tab3: Fix headset mic, add jack detection

 .../bindings/sound/samsung,midas-audio.yaml        |  30 +++
 arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi     |  23 +-
 sound/soc/samsung/Kconfig                          |   2 +-
 sound/soc/samsung/midas_wm1811.c                   | 265 ++++++++++++++++++++-
 4 files changed, 305 insertions(+), 15 deletions(-)
---
base-commit: e67572cd2204894179d89bd7b984072f19313b03
change-id: 20240502-midas-wm1811-gpio-jack-b10226b17ecc

Best regards,
-- 
Artur Weber <aweber.kernel@gmail.com>


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/3] ASoC: dt-bindings: samsung,midas-audio: Add GPIO-based headset jack detection
  2024-05-03 18:55 [PATCH 0/3] ASoC: samsung: midas-audio: Add GPIO-based headset jack detection Artur Weber
@ 2024-05-03 18:55 ` Artur Weber
  2024-05-06  6:28   ` Krzysztof Kozlowski
  2024-05-03 18:55 ` [PATCH 2/3] ASoC: samsung: midas_wm1811: " Artur Weber
  2024-05-03 18:55 ` [PATCH 3/3] ARM: dts: samsung: exynos4212-tab3: Fix headset mic, add " Artur Weber
  2 siblings, 1 reply; 9+ messages in thread
From: Artur Weber @ 2024-05-03 18:55 UTC (permalink / raw)
  To: Sylwester Nawrocki, Krzysztof Kozlowski
  Cc: Liam Girdwood, Mark Brown, Rob Herring, Conor Dooley,
	Jaroslav Kysela, Takashi Iwai, Alim Akhtar, alsa-devel,
	linux-sound, devicetree, linux-kernel, linux-arm-kernel,
	linux-samsung-soc, ~postmarketos/upstreaming, Artur Weber

Some Samsung devices that share the midas-audio driver use a GPIO-based
approach to headset jack detection, as opposed to using the built-in
jack detection provided by the wm8994 driver.

Add DT configuration values that allow for describing these setups.

Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
 .../bindings/sound/samsung,midas-audio.yaml        | 30 ++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/Documentation/devicetree/bindings/sound/samsung,midas-audio.yaml b/Documentation/devicetree/bindings/sound/samsung,midas-audio.yaml
index 6ec80f529d84..9f521131f2b3 100644
--- a/Documentation/devicetree/bindings/sound/samsung,midas-audio.yaml
+++ b/Documentation/devicetree/bindings/sound/samsung,midas-audio.yaml
@@ -61,6 +61,36 @@ properties:
     maxItems: 1
     description: GPIO pin for line out selection
 
+  headset-detect-gpios:
+    maxItems: 1
+    description: GPIO for detection of headset insertion
+
+  headset-key-gpios:
+    maxItems: 1
+    description: GPIO for detection of headset key press
+
+  io-channels:
+    maxItems: 1
+    description: IO channel to read micbias voltage for headset detection
+
+  io-channel-names:
+    const: headset-detect
+
+  headset-4pole-threshold-microvolt:
+    minItems: 2
+    maxItems: 2
+    description: |
+      Array containing minimum and maximum IO channel value for 4-pole
+      (with microphone/button) headsets. If the IO channel value is
+      outside of this range, a 3-pole headset is assumed.
+
+  headset-button-threshold-microvolt:
+    minItems: 3
+    maxItems: 3
+    description: |
+      Array of minimum (inclusive) IO channel values for headset button
+      detection, in order: "Media", "Volume Up" and "Volume Down".
+
 required:
   - compatible
   - cpu

-- 
2.45.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/3] ASoC: samsung: midas_wm1811: Add GPIO-based headset jack detection
  2024-05-03 18:55 [PATCH 0/3] ASoC: samsung: midas-audio: Add GPIO-based headset jack detection Artur Weber
  2024-05-03 18:55 ` [PATCH 1/3] ASoC: dt-bindings: samsung,midas-audio: " Artur Weber
@ 2024-05-03 18:55 ` Artur Weber
  2024-05-06  6:30   ` Krzysztof Kozlowski
  2024-05-03 18:55 ` [PATCH 3/3] ARM: dts: samsung: exynos4212-tab3: Fix headset mic, add " Artur Weber
  2 siblings, 1 reply; 9+ messages in thread
From: Artur Weber @ 2024-05-03 18:55 UTC (permalink / raw)
  To: Sylwester Nawrocki, Krzysztof Kozlowski
  Cc: Liam Girdwood, Mark Brown, Rob Herring, Conor Dooley,
	Jaroslav Kysela, Takashi Iwai, Alim Akhtar, alsa-devel,
	linux-sound, devicetree, linux-kernel, linux-arm-kernel,
	linux-samsung-soc, ~postmarketos/upstreaming, Artur Weber

Some Samsung devices that use the midas_wm1811 driver use a GPIO-based
method for detecting whether the headset jack is plugged in, as well as
detecting which headset buttons are pressed. There are two GPIOs:
a "headset detect" GPIO responsible for detecting jack insertion, and
a "headset key" GPIO which triggers when a button on the headset is
pressed. The plug type and the button pressed are determined based
on information from an ADC channel.

Add support for the GPIO-based headset jack detection mechanism,
and make it configurable from the device tree.

This implementation borrows somewhat from the aries_wm8994.c driver,
though there are a few changes to make the code cleaner, and to add
support for DT-based configuration.

Notably, a dependency on IIO is introduced, to accommodate the ADC
reading requirement.

Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
 sound/soc/samsung/Kconfig        |   2 +-
 sound/soc/samsung/midas_wm1811.c | 265 +++++++++++++++++++++++++++++++++++++--
 2 files changed, 256 insertions(+), 11 deletions(-)

diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig
index 93c2b1b08d0a..4b1ea7b2c796 100644
--- a/sound/soc/samsung/Kconfig
+++ b/sound/soc/samsung/Kconfig
@@ -140,7 +140,7 @@ config SND_SOC_SAMSUNG_ARIES_WM8994
 
 config SND_SOC_SAMSUNG_MIDAS_WM1811
 	tristate "SoC I2S Audio support for Midas boards"
-	depends on SND_SOC_SAMSUNG
+	depends on SND_SOC_SAMSUNG && IIO
 	select SND_SAMSUNG_I2S
 	select SND_SOC_WM8994
 	help
diff --git a/sound/soc/samsung/midas_wm1811.c b/sound/soc/samsung/midas_wm1811.c
index f31244156ff6..bbffb9301cbf 100644
--- a/sound/soc/samsung/midas_wm1811.c
+++ b/sound/soc/samsung/midas_wm1811.c
@@ -7,7 +7,9 @@
 
 #include <linux/clk.h>
 #include <linux/gpio/consumer.h>
+#include <linux/iio/consumer.h>
 #include <linux/mfd/wm8994/registers.h>
+#include <linux/input-event-codes.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/regulator/consumer.h>
@@ -31,6 +33,9 @@ struct midas_priv {
 	struct regulator *reg_submic_bias;
 	struct gpio_desc *gpio_fm_sel;
 	struct gpio_desc *gpio_lineout_sel;
+	struct gpio_desc *gpio_headset_detect;
+	struct gpio_desc *gpio_headset_key;
+	struct iio_channel *adc_headset_detect;
 	unsigned int fll1_rate;
 
 	struct snd_soc_jack headset_jack;
@@ -47,6 +52,109 @@ static struct snd_soc_jack_pin headset_jack_pins[] = {
 	},
 };
 
+/*
+ * min_mv/max_mv values in this struct are set up based on DT values.
+ */
+static struct snd_soc_jack_zone headset_jack_zones[] = {
+	{ .jack_type = SND_JACK_HEADPHONE, },
+	{ .jack_type = SND_JACK_HEADSET, },
+	{ .jack_type = SND_JACK_HEADPHONE, },
+};
+
+/*
+ * This is used for manual detection in headset_key_check, we reuse the
+ * structure since it's convenient.
+ *
+ * min_mv/max_mv values in this struct are set up based on DT values.
+ */
+static struct snd_soc_jack_zone headset_key_zones[] = {
+	{ .jack_type = SND_JACK_BTN_0, },  /* Media */
+	{ .jack_type = SND_JACK_BTN_1, },  /* Volume Up */
+	{ .jack_type = SND_JACK_BTN_2, },  /* Volume Down */
+};
+
+static int headset_jack_check(void *data)
+{
+	struct midas_priv *priv = (struct midas_priv *) data;
+	int adc, jack_type, ret;
+
+	if (!gpiod_get_value_cansleep(priv->gpio_headset_detect))
+		return 0;
+
+	/* Temporarily enable micbias for ADC measurement */
+	ret = regulator_enable(priv->reg_mic_bias);
+	if (ret)
+		pr_err("%s: Failed to enable micbias: %d\n", __func__, ret);
+
+	/* Sleep for a small amount of time to get the value to stabilize */
+	msleep(20);
+
+	ret = iio_read_channel_processed(priv->adc_headset_detect, &adc);
+	if (ret) {
+		pr_err("%s: Failed to read ADC (%d), assuming headphones\n",
+		       __func__, ret);
+		return SND_JACK_HEADPHONE;
+	}
+	pr_debug("%s: ADC value is %d\n", __func__, adc);
+
+	jack_type = snd_soc_jack_get_type(&priv->headset_jack, adc);
+
+	/* Disable micbias if the jack is not a headset */
+	if ((jack_type & SND_JACK_HEADSET) != SND_JACK_HEADSET) {
+		ret = regulator_disable(priv->reg_mic_bias);
+		if (ret)
+			pr_err("%s: Failed to disable micbias: %d\n",
+			       __func__, ret);
+	}
+
+	return jack_type;
+}
+
+static int headset_key_check(void *data)
+{
+	struct midas_priv *priv = (struct midas_priv *) data;
+	int adc, i, ret;
+
+	if (!gpiod_get_value_cansleep(priv->gpio_headset_key))
+		return 0;
+
+	/* Filter out keypresses when 4 pole jack not detected */
+	if (!(priv->headset_jack.status & SND_JACK_MICROPHONE))
+		return 0;
+
+	ret = iio_read_channel_processed(priv->adc_headset_detect, &adc);
+	if (ret) {
+		pr_err("%s: Failed to read ADC (%d), can't detect key type\n",
+		       __func__, ret);
+		return 0;
+	}
+	pr_debug("%s: ADC value is %d\n", __func__, adc);
+
+	for (i = 0; i < ARRAY_SIZE(headset_key_zones); i++) {
+		if (adc >= headset_key_zones[i].min_mv &&
+		    adc <= headset_key_zones[i].max_mv) {
+			return headset_key_zones[i].jack_type;
+		}
+	}
+
+	return 0;
+}
+
+static struct snd_soc_jack_gpio headset_gpio[] = {
+	{
+		.name = "Headset Jack",
+		.report = SND_JACK_HEADSET,
+		.debounce_time = 150,
+		.jack_status_check = headset_jack_check,
+	},
+	{
+		.name = "Headset Key",
+		.report = SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2,
+		.debounce_time = 30,
+		.jack_status_check = headset_key_check,
+	},
+};
+
 static int midas_start_fll1(struct snd_soc_pcm_runtime *rtd, unsigned int rate)
 {
 	struct snd_soc_card *card = rtd->card;
@@ -315,18 +423,67 @@ static int midas_late_probe(struct snd_soc_card *card)
 		return ret;
 	}
 
-	ret = snd_soc_card_jack_new_pins(card, "Headset",
-					 SND_JACK_HEADSET | SND_JACK_MECHANICAL |
-					 SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2 |
-					 SND_JACK_BTN_3 | SND_JACK_BTN_4 | SND_JACK_BTN_5,
-					 &priv->headset_jack,
-					 headset_jack_pins,
-					 ARRAY_SIZE(headset_jack_pins));
-	if (ret)
+	if (!priv->gpio_headset_detect) {
+		ret = snd_soc_card_jack_new_pins(card, "Headset",
+				 SND_JACK_HEADSET | SND_JACK_MECHANICAL |
+				 SND_JACK_BTN_0 | SND_JACK_BTN_1 |
+				 SND_JACK_BTN_2 | SND_JACK_BTN_3 |
+				 SND_JACK_BTN_4 | SND_JACK_BTN_5,
+				 &priv->headset_jack,
+				 headset_jack_pins,
+				 ARRAY_SIZE(headset_jack_pins));
+		if (ret)
+			return ret;
+
+		wm8958_mic_detect(aif1_dai->component, &priv->headset_jack,
+				  NULL, NULL, NULL, NULL);
+	} else {
+		/* Some devices (n8000, t310) use a GPIO to detect the jack. */
+		ret = snd_soc_card_jack_new_pins(card, "Headset",
+				SND_JACK_HEADSET | SND_JACK_BTN_0 |
+				SND_JACK_BTN_1 | SND_JACK_BTN_2,
+				&priv->headset_jack,
+				headset_jack_pins,
+				ARRAY_SIZE(headset_jack_pins));
+		if (ret) {
+			dev_err(card->dev,
+				"Failed to set up headset pins: %d\n", ret);
+			return ret;
+		}
+
+		ret = snd_soc_jack_add_zones(&priv->headset_jack,
+				ARRAY_SIZE(headset_jack_zones),
+				headset_jack_zones);
+		if (ret) {
+			dev_err(card->dev,
+				"Failed to set up headset zones: %d\n", ret);
+			return ret;
+		}
+
+		headset_gpio[0].data = priv;
+		headset_gpio[0].desc = priv->gpio_headset_detect;
+
+		headset_gpio[1].data = priv;
+		headset_gpio[1].desc = priv->gpio_headset_key;
+
+		snd_jack_set_key(priv->headset_jack.jack,
+				 SND_JACK_BTN_0, KEY_MEDIA);
+		snd_jack_set_key(priv->headset_jack.jack,
+				 SND_JACK_BTN_1, KEY_VOLUMEUP);
+		snd_jack_set_key(priv->headset_jack.jack,
+				 SND_JACK_BTN_2, KEY_VOLUMEDOWN);
+
+		ret = snd_soc_jack_add_gpios(&priv->headset_jack,
+				ARRAY_SIZE(headset_gpio),
+				headset_gpio);
+		if (ret)
+			dev_err(card->dev,
+				"Failed to set up headset jack GPIOs: %d\n",
+				ret);
+
 		return ret;
+	}
 
-	wm8958_mic_detect(aif1_dai->component, &priv->headset_jack,
-			  NULL, NULL, NULL, NULL);
 	return 0;
 }
 
@@ -433,6 +590,9 @@ static int midas_probe(struct platform_device *pdev)
 	struct snd_soc_card *card = &midas_card;
 	struct device *dev = &pdev->dev;
 	static struct snd_soc_dai_link *dai_link;
+	enum iio_chan_type channel_type;
+	u32 fourpole_threshold[2];
+	u32 button_threshold[3];
 	struct midas_priv *priv;
 	int ret, i;
 
@@ -468,6 +628,91 @@ static int midas_probe(struct platform_device *pdev)
 		return PTR_ERR(priv->gpio_lineout_sel);
 	}
 
+	priv->gpio_headset_detect = devm_gpiod_get_optional(dev,
+				"headset-detect", GPIOD_IN);
+	if (IS_ERR(priv->gpio_headset_detect)) {
+		dev_err(dev, "Failed to get headset jack detect GPIO\n");
+		return PTR_ERR(priv->gpio_headset_detect);
+	}
+
+	if (priv->gpio_headset_detect) {
+		priv->adc_headset_detect = devm_iio_channel_get(dev,
+							"headset-detect");
+		if (IS_ERR(priv->adc_headset_detect)) {
+			dev_err(dev, "Failed to get ADC channel\n");
+			return PTR_ERR(priv->adc_headset_detect);
+		}
+
+		ret = iio_get_channel_type(priv->adc_headset_detect,
+					   &channel_type);
+		if (ret) {
+			dev_err(dev, "Failed to get ADC channel type\n");
+			return ret;
+		}
+
+		if (channel_type != IIO_VOLTAGE) {
+			dev_err(dev, "ADC channel is not voltage\n");
+			return ret;
+		}
+
+		priv->gpio_headset_key = devm_gpiod_get(dev, "headset-key",
+							GPIOD_IN);
+		if (IS_ERR(priv->gpio_headset_key)) {
+			dev_err(dev, "Failed to get headset key gpio\n");
+			return PTR_ERR(priv->gpio_headset_key);
+		}
+
+		ret = of_property_read_u32_array(dev->of_node,
+				"headset-4pole-threshold-microvolt",
+				fourpole_threshold,
+				ARRAY_SIZE(fourpole_threshold));
+		if (ret) {
+			dev_err(dev, "Failed to get 4-pole jack detection threshold\n");
+			return ret;
+		}
+
+		if (fourpole_threshold[0] > fourpole_threshold[1]) {
+			dev_err(dev, "Invalid 4-pole jack detection threshold value\n");
+			return -EINVAL;
+		}
+
+		headset_jack_zones[0].max_mv = (fourpole_threshold[0]);
+		headset_jack_zones[1].min_mv = (fourpole_threshold[0] + 1);
+
+		headset_jack_zones[1].max_mv = (fourpole_threshold[1]);
+		headset_jack_zones[2].min_mv = (fourpole_threshold[1] + 1);
+
+		ret = of_property_read_u32_array(dev->of_node,
+				"headset-button-threshold-microvolt",
+				button_threshold,
+				ARRAY_SIZE(button_threshold));
+		if (ret) {
+			dev_err(dev, "Failed to get headset button detection threshold\n");
+			return ret;
+		}
+
+		if (button_threshold[0] > button_threshold[1] ||
+		    button_threshold[1] > button_threshold[2]) {
+			dev_err(dev, "Invalid headset button detection threshold value\n");
+			return -EINVAL;
+		}
+
+		for (i = 0; i < 3; i++) {
+			if (i != 0 && button_threshold[i] <= 0) {
+				dev_err(dev, "Invalid headset button detection threshold value\n");
+				return -EINVAL;
+			}
+
+			headset_key_zones[i].min_mv = button_threshold[i];
+
+			if (i == 2)
+				headset_key_zones[i].max_mv = UINT_MAX;
+			else
+				headset_key_zones[i].max_mv = \
+						(button_threshold[i+1] - 1);
+		}
+	}
+
 	ret = snd_soc_of_parse_card_name(card, "model");
 	if (ret < 0) {
 		dev_err(dev, "Card name is not specified\n");

-- 
2.45.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/3] ARM: dts: samsung: exynos4212-tab3: Fix headset mic, add jack detection
  2024-05-03 18:55 [PATCH 0/3] ASoC: samsung: midas-audio: Add GPIO-based headset jack detection Artur Weber
  2024-05-03 18:55 ` [PATCH 1/3] ASoC: dt-bindings: samsung,midas-audio: " Artur Weber
  2024-05-03 18:55 ` [PATCH 2/3] ASoC: samsung: midas_wm1811: " Artur Weber
@ 2024-05-03 18:55 ` Artur Weber
  2024-05-06  6:31   ` Krzysztof Kozlowski
  2 siblings, 1 reply; 9+ messages in thread
From: Artur Weber @ 2024-05-03 18:55 UTC (permalink / raw)
  To: Sylwester Nawrocki, Krzysztof Kozlowski
  Cc: Liam Girdwood, Mark Brown, Rob Herring, Conor Dooley,
	Jaroslav Kysela, Takashi Iwai, Alim Akhtar, alsa-devel,
	linux-sound, devicetree, linux-kernel, linux-arm-kernel,
	linux-samsung-soc, ~postmarketos/upstreaming, Artur Weber

Add the necessary properties to the samsung,midas-audio node to allow
for headset jack detection, set up the mic bias regulator GPIO and fix
some other small issues with the sound setup.

Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
---
 arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi b/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi
index e5254e32aa8f..a059857e3054 100644
--- a/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi
+++ b/arch/arm/boot/dts/samsung/exynos4212-tab3.dtsi
@@ -285,6 +285,8 @@ mic_bias_reg: voltage-regulator-4 {
 		regulator-name = "MICBIAS_LDO_2.8V";
 		regulator-min-microvolt = <2800000>;
 		regulator-max-microvolt = <2800000>;
+		gpio = <&gpm0 0 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
 	};
 
 	submic_bias_reg: voltage-regulator-5 {
@@ -297,8 +299,17 @@ submic_bias_reg: voltage-regulator-5 {
 	sound: sound {
 		compatible = "samsung,midas-audio";
 		model = "TAB3";
+
 		mic-bias-supply = <&mic_bias_reg>;
 		submic-bias-supply = <&submic_bias_reg>;
+		lineout-sel-gpios = <&gpj1 2 GPIO_ACTIVE_HIGH>;
+
+		headset-detect-gpios = <&gpx0 4 GPIO_ACTIVE_LOW>;
+		headset-key-gpios = <&gpx3 6 GPIO_ACTIVE_LOW>;
+		headset-4pole-threshold-microvolt = <710 2000>;
+		headset-button-threshold-microvolt = <0 130 260>;
+		io-channel-names = "headset-detect";
+		io-channels = <&adc 0>;
 
 		audio-routing = "HP", "HPOUT1L",
 				"HP", "HPOUT1R",
@@ -345,6 +356,11 @@ wlan_pwrseq: sdhci3-pwrseq {
 	};
 };
 
+&adc {
+	vdd-supply = <&ldo3_reg>;
+	status = "okay";
+};
+
 &bus_acp {
 	devfreq = <&bus_dmc>;
 	status = "okay";
@@ -505,12 +521,11 @@ &i2c_4 {
 	wm1811: audio-codec@1a {
 		compatible = "wlf,wm1811";
 		reg = <0x1a>;
-		clocks = <&pmu_system_controller 0>;
-		clock-names = "MCLK1";
+		clocks = <&pmu_system_controller 0>,
+			 <&s5m8767_osc S2MPS11_CLK_BT>;
+		clock-names = "MCLK1", "MCLK2";
 		interrupt-controller;
 		#interrupt-cells = <2>;
-		interrupt-parent = <&gpx3>;
-		interrupts = <6 IRQ_TYPE_LEVEL_HIGH>;
 
 		gpio-controller;
 		#gpio-cells = <2>;

-- 
2.45.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/3] ASoC: dt-bindings: samsung,midas-audio: Add GPIO-based headset jack detection
  2024-05-03 18:55 ` [PATCH 1/3] ASoC: dt-bindings: samsung,midas-audio: " Artur Weber
@ 2024-05-06  6:28   ` Krzysztof Kozlowski
  0 siblings, 0 replies; 9+ messages in thread
From: Krzysztof Kozlowski @ 2024-05-06  6:28 UTC (permalink / raw)
  To: Artur Weber, Sylwester Nawrocki, Krzysztof Kozlowski
  Cc: Liam Girdwood, Mark Brown, Rob Herring, Conor Dooley,
	Jaroslav Kysela, Takashi Iwai, Alim Akhtar, alsa-devel,
	linux-sound, devicetree, linux-kernel, linux-arm-kernel,
	linux-samsung-soc, ~postmarketos/upstreaming

On 03/05/2024 20:55, Artur Weber wrote:
> Some Samsung devices that share the midas-audio driver use a GPIO-based
> approach to headset jack detection, as opposed to using the built-in
> jack detection provided by the wm8994 driver.
> 
> Add DT configuration values that allow for describing these setups.
> 
> Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
> ---
>  .../bindings/sound/samsung,midas-audio.yaml        | 30 ++++++++++++++++++++++
>  1 file changed, 30 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/sound/samsung,midas-audio.yaml b/Documentation/devicetree/bindings/sound/samsung,midas-audio.yaml
> index 6ec80f529d84..9f521131f2b3 100644
> --- a/Documentation/devicetree/bindings/sound/samsung,midas-audio.yaml
> +++ b/Documentation/devicetree/bindings/sound/samsung,midas-audio.yaml
> @@ -61,6 +61,36 @@ properties:
>      maxItems: 1
>      description: GPIO pin for line out selection
>  
> +  headset-detect-gpios:
> +    maxItems: 1
> +    description: GPIO for detection of headset insertion
> +
> +  headset-key-gpios:
> +    maxItems: 1
> +    description: GPIO for detection of headset key press
> +
> +  io-channels:
> +    maxItems: 1
> +    description: IO channel to read micbias voltage for headset detection
> +
> +  io-channel-names:
> +    const: headset-detect
> +
> +  headset-4pole-threshold-microvolt:

You need vendor prefix for this and next property.

> +    minItems: 2
> +    maxItems: 2
> +    description: |

Do not need '|' unless you need to preserve formatting.



Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] ASoC: samsung: midas_wm1811: Add GPIO-based headset jack detection
  2024-05-03 18:55 ` [PATCH 2/3] ASoC: samsung: midas_wm1811: " Artur Weber
@ 2024-05-06  6:30   ` Krzysztof Kozlowski
  0 siblings, 0 replies; 9+ messages in thread
From: Krzysztof Kozlowski @ 2024-05-06  6:30 UTC (permalink / raw)
  To: Artur Weber, Sylwester Nawrocki, Krzysztof Kozlowski
  Cc: Liam Girdwood, Mark Brown, Rob Herring, Conor Dooley,
	Jaroslav Kysela, Takashi Iwai, Alim Akhtar, alsa-devel,
	linux-sound, devicetree, linux-kernel, linux-arm-kernel,
	linux-samsung-soc, ~postmarketos/upstreaming

On 03/05/2024 20:55, Artur Weber wrote:
> Some Samsung devices that use the midas_wm1811 driver use a GPIO-based
> method for detecting whether the headset jack is plugged in, as well as
> detecting which headset buttons are pressed. There are two GPIOs:
> a "headset detect" GPIO responsible for detecting jack insertion, and
> a "headset key" GPIO which triggers when a button on the headset is
> pressed. The plug type and the button pressed are determined based
> on information from an ADC channel.

...

>  
> @@ -433,6 +590,9 @@ static int midas_probe(struct platform_device *pdev)
>  	struct snd_soc_card *card = &midas_card;
>  	struct device *dev = &pdev->dev;
>  	static struct snd_soc_dai_link *dai_link;
> +	enum iio_chan_type channel_type;
> +	u32 fourpole_threshold[2];
> +	u32 button_threshold[3];
>  	struct midas_priv *priv;
>  	int ret, i;
>  
> @@ -468,6 +628,91 @@ static int midas_probe(struct platform_device *pdev)
>  		return PTR_ERR(priv->gpio_lineout_sel);
>  	}
>  
> +	priv->gpio_headset_detect = devm_gpiod_get_optional(dev,
> +				"headset-detect", GPIOD_IN);
> +	if (IS_ERR(priv->gpio_headset_detect)) {
> +		dev_err(dev, "Failed to get headset jack detect GPIO\n");

syntax is:
return dev_err_probe()

> +		return PTR_ERR(priv->gpio_headset_detect);
> +	}
> +
> +	if (priv->gpio_headset_detect) {
> +		priv->adc_headset_detect = devm_iio_channel_get(dev,
> +							"headset-detect");
> +		if (IS_ERR(priv->adc_headset_detect)) {
> +			dev_err(dev, "Failed to get ADC channel\n");

return dev_err_probe()

> +			return PTR_ERR(priv->adc_headset_detect);
> +		}
> +

> +		ret = iio_get_channel_type(priv->adc_headset_detect,
> +					   &channel_type);
> +		if (ret) {
> +			dev_err(dev, "Failed to get ADC channel type\n");
> +			return ret;
> +		}
> +
> +		if (channel_type != IIO_VOLTAGE) {
> +			dev_err(dev, "ADC channel is not voltage\n");
> +			return ret;
> +		}
> +
> +		priv->gpio_headset_key = devm_gpiod_get(dev, "headset-key",
> +							GPIOD_IN);
> +		if (IS_ERR(priv->gpio_headset_key)) {
> +			dev_err(dev, "Failed to get headset key gpio\n");

return dev_err_probe()



Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] ARM: dts: samsung: exynos4212-tab3: Fix headset mic, add jack detection
  2024-05-03 18:55 ` [PATCH 3/3] ARM: dts: samsung: exynos4212-tab3: Fix headset mic, add " Artur Weber
@ 2024-05-06  6:31   ` Krzysztof Kozlowski
  2024-05-07 12:44     ` Artur Weber
  0 siblings, 1 reply; 9+ messages in thread
From: Krzysztof Kozlowski @ 2024-05-06  6:31 UTC (permalink / raw)
  To: Artur Weber, Sylwester Nawrocki, Krzysztof Kozlowski
  Cc: Liam Girdwood, Mark Brown, Rob Herring, Conor Dooley,
	Jaroslav Kysela, Takashi Iwai, Alim Akhtar, alsa-devel,
	linux-sound, devicetree, linux-kernel, linux-arm-kernel,
	linux-samsung-soc, ~postmarketos/upstreaming

On 03/05/2024 20:55, Artur Weber wrote:
> Add the necessary properties to the samsung,midas-audio node to allow
> for headset jack detection, set up the mic bias regulator GPIO and fix
> some other small issues with the sound setup.
> 
> Signed-off-by: Artur Weber <aweber.kernel@gmail.com>

...

> +
>  &bus_acp {
>  	devfreq = <&bus_dmc>;
>  	status = "okay";
> @@ -505,12 +521,11 @@ &i2c_4 {
>  	wm1811: audio-codec@1a {
>  		compatible = "wlf,wm1811";
>  		reg = <0x1a>;
> -		clocks = <&pmu_system_controller 0>;
> -		clock-names = "MCLK1";
> +		clocks = <&pmu_system_controller 0>,
> +			 <&s5m8767_osc S2MPS11_CLK_BT>;
> +		clock-names = "MCLK1", "MCLK2";
>  		interrupt-controller;
>  		#interrupt-cells = <2>;
> -		interrupt-parent = <&gpx3>;
> -		interrupts = <6 IRQ_TYPE_LEVEL_HIGH>;

Does not look related at all to the patch.


Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] ARM: dts: samsung: exynos4212-tab3: Fix headset mic, add jack detection
  2024-05-06  6:31   ` Krzysztof Kozlowski
@ 2024-05-07 12:44     ` Artur Weber
  2024-05-07 14:53       ` Krzysztof Kozlowski
  0 siblings, 1 reply; 9+ messages in thread
From: Artur Weber @ 2024-05-07 12:44 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Sylwester Nawrocki, Krzysztof Kozlowski
  Cc: Liam Girdwood, Mark Brown, Rob Herring, Conor Dooley,
	Jaroslav Kysela, Takashi Iwai, Alim Akhtar, alsa-devel,
	linux-sound, devicetree, linux-kernel, linux-arm-kernel,
	linux-samsung-soc, ~postmarketos/upstreaming

On 6.05.2024 08:31, Krzysztof Kozlowski wrote:
> On 03/05/2024 20:55, Artur Weber wrote:
>> Add the necessary properties to the samsung,midas-audio node to allow
>> for headset jack detection, set up the mic bias regulator GPIO and fix
>> some other small issues with the sound setup.
>>
>> Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
> 
> ...
> 
>> +
>>   &bus_acp {
>>   	devfreq = <&bus_dmc>;
>>   	status = "okay";
>> @@ -505,12 +521,11 @@ &i2c_4 {
>>   	wm1811: audio-codec@1a {
>>   		compatible = "wlf,wm1811";
>>   		reg = <0x1a>;
>> -		clocks = <&pmu_system_controller 0>;
>> -		clock-names = "MCLK1";
>> +		clocks = <&pmu_system_controller 0>,
>> +			 <&s5m8767_osc S2MPS11_CLK_BT>;
>> +		clock-names = "MCLK1", "MCLK2";
>>   		interrupt-controller;
>>   		#interrupt-cells = <2>;
>> -		interrupt-parent = <&gpx3>;
>> -		interrupts = <6 IRQ_TYPE_LEVEL_HIGH>;
> 
> Does not look related at all to the patch.

I rolled up two small changes to the wm1811 audio codec config here:

- Dropped incorrect interrupt parent - GPX3-6 is the headset key GPIO,
   and does not seem to be the interrupt parent like on Midas (downstream
   calls it GPIO_HDMI_CEC on Midas, whereas for Tab 3 it's
   GPIO_EAR_SEND_END, so they definitely serve different functions).

- Added the MCLK2 clock as specified in the schematics, to more
   accurately describe the hardware.

I included them here since the whole patch modifies properties related
to audio (this section is what "fix some other small issues with the
sound setup" in the commit message refers to), but I can split it up
into a separate commit if it's necessary.

Best regards
Artur

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] ARM: dts: samsung: exynos4212-tab3: Fix headset mic, add jack detection
  2024-05-07 12:44     ` Artur Weber
@ 2024-05-07 14:53       ` Krzysztof Kozlowski
  0 siblings, 0 replies; 9+ messages in thread
From: Krzysztof Kozlowski @ 2024-05-07 14:53 UTC (permalink / raw)
  To: Artur Weber, Sylwester Nawrocki, Krzysztof Kozlowski
  Cc: Liam Girdwood, Mark Brown, Rob Herring, Conor Dooley,
	Jaroslav Kysela, Takashi Iwai, Alim Akhtar, alsa-devel,
	linux-sound, devicetree, linux-kernel, linux-arm-kernel,
	linux-samsung-soc, ~postmarketos/upstreaming

On 07/05/2024 14:44, Artur Weber wrote:
> On 6.05.2024 08:31, Krzysztof Kozlowski wrote:
>> On 03/05/2024 20:55, Artur Weber wrote:
>>> Add the necessary properties to the samsung,midas-audio node to allow
>>> for headset jack detection, set up the mic bias regulator GPIO and fix
>>> some other small issues with the sound setup.
>>>
>>> Signed-off-by: Artur Weber <aweber.kernel@gmail.com>
>>
>> ...
>>
>>> +
>>>   &bus_acp {
>>>   	devfreq = <&bus_dmc>;
>>>   	status = "okay";
>>> @@ -505,12 +521,11 @@ &i2c_4 {
>>>   	wm1811: audio-codec@1a {
>>>   		compatible = "wlf,wm1811";
>>>   		reg = <0x1a>;
>>> -		clocks = <&pmu_system_controller 0>;
>>> -		clock-names = "MCLK1";
>>> +		clocks = <&pmu_system_controller 0>,
>>> +			 <&s5m8767_osc S2MPS11_CLK_BT>;
>>> +		clock-names = "MCLK1", "MCLK2";
>>>   		interrupt-controller;
>>>   		#interrupt-cells = <2>;
>>> -		interrupt-parent = <&gpx3>;
>>> -		interrupts = <6 IRQ_TYPE_LEVEL_HIGH>;
>>
>> Does not look related at all to the patch.
> 
> I rolled up two small changes to the wm1811 audio codec config here:


https://elixir.bootlin.com/linux/v6.8-rc5/source/Documentation/process/submitting-patches.rst#L171



Best regards,
Krzysztof


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2024-05-07 14:53 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-05-03 18:55 [PATCH 0/3] ASoC: samsung: midas-audio: Add GPIO-based headset jack detection Artur Weber
2024-05-03 18:55 ` [PATCH 1/3] ASoC: dt-bindings: samsung,midas-audio: " Artur Weber
2024-05-06  6:28   ` Krzysztof Kozlowski
2024-05-03 18:55 ` [PATCH 2/3] ASoC: samsung: midas_wm1811: " Artur Weber
2024-05-06  6:30   ` Krzysztof Kozlowski
2024-05-03 18:55 ` [PATCH 3/3] ARM: dts: samsung: exynos4212-tab3: Fix headset mic, add " Artur Weber
2024-05-06  6:31   ` Krzysztof Kozlowski
2024-05-07 12:44     ` Artur Weber
2024-05-07 14:53       ` Krzysztof Kozlowski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).