diff mbox

[3/3] ASoC: dt: tegra: Enable headphone autodetection on PAZ00 board.

Message ID 1327517477-29785-1-git-send-email-leon@leon.nu
State Superseded, archived
Headers show

Commit Message

Leon Romanovsky Jan. 25, 2012, 6:51 p.m. UTC
This patch is adding support of headphone autodetection on PAZ00 board.

Signed-off-by: Leon Romanovsky <leon@leon.nu>
---
 arch/arm/boot/dts/tegra-paz00.dts |    1 +
 sound/soc/tegra/tegra_alc5632.c   |   40 +++++++++++++++++++++++++++++++++---
 2 files changed, 37 insertions(+), 4 deletions(-)

Comments

Stephen Warren Jan. 25, 2012, 10:31 p.m. UTC | #1
Leon Romanovsky wrote at Wednesday, January 25, 2012 11:51 AM:
> This patch is adding support of headphone autodetection on PAZ00 board.

> diff --git a/arch/arm/boot/dts/tegra-paz00.dts b/arch/arm/boot/dts/tegra-paz00.dts
> +		nvidia,hp-det-gpios = <&gpio 178 0>; /* gpio PW2 */

That isn't documented in the binding documentation. You may as well
just document the whole thing and add this to the .dts file in one patch
even if the feature isn't implemented yet in that patch.

> diff --git a/sound/soc/tegra/tegra_alc5632.c b/sound/soc/tegra/tegra_alc5632.c

> +#define GPIO_HP_DET     BIT(1)
> +
> +

Why two extra blank lines?

> +static struct snd_soc_jack_gpio tegra_alc5632_hp_jack_gpio = {
> +	.name = "Headphone detect",
> +	.report = SND_JACK_HEADPHONE,

I think that should be HEADSET not HEADPHONE, since it's a combo socket
for both headphones and a mic isn't it? (so perhaps the name should also
be "Headset detection"?

> -	struct tegra_alc5632 *alc5632 = snd_soc_card_get_drvdata(card);
> +	struct tegra_alc5632 *machine = snd_soc_card_get_drvdata(card);

I guess that's fine, but it makes the patch a little noisy and somewhat
obscures the real change. I guess it's useful to be consistent with
tegra_wm8903.c though.
Mark Brown Jan. 26, 2012, 10:45 a.m. UTC | #2
On Wed, Jan 25, 2012 at 02:31:06PM -0800, Stephen Warren wrote:
> Leon Romanovsky wrote at Wednesday, January 25, 2012 11:51 AM:

> > +static struct snd_soc_jack_gpio tegra_alc5632_hp_jack_gpio = {
> > +	.name = "Headphone detect",
> > +	.report = SND_JACK_HEADPHONE,

> I think that should be HEADSET not HEADPHONE, since it's a combo socket
> for both headphones and a mic isn't it? (so perhaps the name should also
> be "Headset detection"?

Unless the CODEC can do accessory detection on the mic in which case the
jack GPIO usually only reports headphone and then the CODEC detects if
it's a headset or headphone.
--
To unsubscribe from this list: send the line "unsubscribe linux-tegra" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/arch/arm/boot/dts/tegra-paz00.dts b/arch/arm/boot/dts/tegra-paz00.dts
index 692d20c..f95bade 100644
--- a/arch/arm/boot/dts/tegra-paz00.dts
+++ b/arch/arm/boot/dts/tegra-paz00.dts
@@ -64,6 +64,7 @@ 
 
 		nvidia,audio-codec = <&alc5632>;
 		nvidia,i2s-controller = <&tegra_i2s1>;
+		nvidia,hp-det-gpios = <&gpio 178 0>; /* gpio PW2 */
 	};
 
 	serial@70006000 {
diff --git a/sound/soc/tegra/tegra_alc5632.c b/sound/soc/tegra/tegra_alc5632.c
index 22348e8..ce211af 100644
--- a/sound/soc/tegra/tegra_alc5632.c
+++ b/sound/soc/tegra/tegra_alc5632.c
@@ -18,6 +18,7 @@ 
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 #include <linux/gpio.h>
+#include <linux/of_gpio.h>
 
 #include <sound/core.h>
 #include <sound/jack.h>
@@ -34,9 +35,14 @@ 
 
 #define DRV_NAME "tegra-alc5632"
 
+#define GPIO_HP_DET     BIT(1)
+
+
 struct tegra_alc5632 {
 	struct tegra_asoc_utils_data util_data;
 	struct platform_device *pcm_dev;
+	int gpio_requested;
+	int gpio_hp_det;
 };
 
 static int tegra_alc5632_asoc_hw_params(struct snd_pcm_substream *substream,
@@ -86,6 +92,13 @@  static struct snd_soc_jack_pin tegra_alc5632_hs_jack_pins[] = {
 	},
 };
 
+static struct snd_soc_jack_gpio tegra_alc5632_hp_jack_gpio = {
+	.name = "Headphone detect",
+	.report = SND_JACK_HEADPHONE,
+	.debounce_time = 150,
+	.invert = 1,
+};
+
 static const struct snd_soc_dapm_widget tegra_alc5632_dapm_widgets[] = {
 	SND_SOC_DAPM_SPK("Int Spk", NULL),
 	SND_SOC_DAPM_HP("Headset Stereophone", NULL),
@@ -114,6 +127,9 @@  static int tegra_alc5632_asoc_init(struct snd_soc_pcm_runtime *rtd)
 {
 	struct snd_soc_codec *codec = rtd->codec;
 	struct snd_soc_dapm_context *dapm = &codec->dapm;
+	struct device_node *np = codec->card->dev->of_node;
+	struct tegra_alc5632 *machine = snd_soc_card_get_drvdata(codec->card);
+	int ret;
 
 	snd_soc_jack_new(codec, "Headset Jack", SND_JACK_HEADSET,
 			 &tegra_alc5632_hs_jack);
@@ -121,6 +137,16 @@  static int tegra_alc5632_asoc_init(struct snd_soc_pcm_runtime *rtd)
 			ARRAY_SIZE(tegra_alc5632_hs_jack_pins),
 			tegra_alc5632_hs_jack_pins);
 
+	machine->gpio_hp_det = of_get_named_gpio(np, "nvidia,hp-det-gpios", 0);
+
+	if (gpio_is_valid(machine->gpio_hp_det)) {
+		tegra_alc5632_hp_jack_gpio.gpio = machine->gpio_hp_det;
+		snd_soc_jack_add_gpios(&tegra_alc5632_hs_jack,
+						1,
+						&tegra_alc5632_hp_jack_gpio);
+		machine->gpio_requested |= GPIO_HP_DET;
+	}
+
 	snd_soc_dapm_force_enable_pin(dapm, "MICBIAS1");
 
 	return 0;
@@ -243,13 +269,19 @@  err:
 static int __devexit tegra_alc5632_remove(struct platform_device *pdev)
 {
 	struct snd_soc_card *card = platform_get_drvdata(pdev);
-	struct tegra_alc5632 *alc5632 = snd_soc_card_get_drvdata(card);
+	struct tegra_alc5632 *machine = snd_soc_card_get_drvdata(card);
+
+	if (machine->gpio_requested & GPIO_HP_DET)
+		snd_soc_jack_free_gpios(&tegra_alc5632_hs_jack,
+					1,
+					&tegra_alc5632_hp_jack_gpio);
+	machine->gpio_requested = 0;
 
 	snd_soc_unregister_card(card);
 
-	tegra_asoc_utils_fini(&alc5632->util_data);
-	if (!IS_ERR(alc5632->pcm_dev))
-		platform_device_unregister(alc5632->pcm_dev);
+	tegra_asoc_utils_fini(&machine->util_data);
+	if (!IS_ERR(machine->pcm_dev))
+		platform_device_unregister(machine->pcm_dev);
 
 	return 0;
 }