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 <[email protected]>
[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 <[email protected]>
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 <[email protected]>
---
.../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
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 <[email protected]>
---
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
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 <[email protected]>
---
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
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 <[email protected]>
> ---
> .../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
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
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 <[email protected]>
..
> +
> &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
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 <[email protected]>
>
> ...
>
>> +
>> &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
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 <[email protected]>
>>
>> ...
>>
>>> +
>>> &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