Skip to content

Commit

Permalink
ASoC: simple-card: Add mic and hp detect gpios.
Browse files Browse the repository at this point in the history
Allow Headphone and Microphone jack detect gpios to be specified in
device tree.  This will allow a few systems including rk3288_max98090
to use simple-card instead of having their own board file.

Signed-off-by: Dylan Reid <[email protected]>
Signed-off-by: Mark Brown <[email protected]>
  • Loading branch information
dgreid authored and broonie committed Oct 2, 2014
1 parent 04a0b8e commit 3fe2403
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Documentation/devicetree/bindings/sound/simple-card.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ Optional properties:
source.
- simple-audio-card,mclk-fs : Multiplication factor between stream rate and codec
mclk.
- simple-audio-card,hp_det_gpio : Reference to GPIO that signals when
headphones are attached.
- simple-audio-card,mic_det_gpio : Reference to GPIO that signals when
a microphone is attached.

Optional subnodes:

Expand Down
73 changes: 73 additions & 0 deletions sound/soc/generic/simple-card.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,13 @@
*/
#include <linux/clk.h>
#include <linux/device.h>
#include <linux/gpio.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>
#include <linux/string.h>
#include <sound/jack.h>
#include <sound/simple_card.h>
#include <sound/soc-dai.h>
#include <sound/soc.h>
Expand All @@ -25,6 +28,8 @@ struct simple_card_data {
struct asoc_simple_dai codec_dai;
} *dai_props;
unsigned int mclk_fs;
int gpio_hp_det;
int gpio_mic_det;
struct snd_soc_dai_link dai_link[]; /* dynamically allocated */
};

Expand Down Expand Up @@ -54,6 +59,32 @@ static struct snd_soc_ops asoc_simple_card_ops = {
.hw_params = asoc_simple_card_hw_params,
};

static struct snd_soc_jack simple_card_hp_jack;
static struct snd_soc_jack_pin simple_card_hp_jack_pins[] = {
{
.pin = "Headphones",
.mask = SND_JACK_HEADPHONE,
},
};
static struct snd_soc_jack_gpio simple_card_hp_jack_gpio = {
.name = "Headphone detection",
.report = SND_JACK_HEADPHONE,
.debounce_time = 150,
};

static struct snd_soc_jack simple_card_mic_jack;
static struct snd_soc_jack_pin simple_card_mic_jack_pins[] = {
{
.pin = "Mic Jack",
.mask = SND_JACK_MICROPHONE,
},
};
static struct snd_soc_jack_gpio simple_card_mic_jack_gpio = {
.name = "Mic detection",
.report = SND_JACK_MICROPHONE,
.debounce_time = 150,
};

static int __asoc_simple_card_dai_init(struct snd_soc_dai *dai,
struct asoc_simple_dai *set)
{
Expand Down Expand Up @@ -109,6 +140,28 @@ static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd)
if (ret < 0)
return ret;

if (gpio_is_valid(priv->gpio_hp_det)) {
snd_soc_jack_new(codec->codec, "Headphones", SND_JACK_HEADPHONE,
&simple_card_hp_jack);
snd_soc_jack_add_pins(&simple_card_hp_jack,
ARRAY_SIZE(simple_card_hp_jack_pins),
simple_card_hp_jack_pins);

simple_card_hp_jack_gpio.gpio = priv->gpio_hp_det;
snd_soc_jack_add_gpios(&simple_card_hp_jack, 1,
&simple_card_hp_jack_gpio);
}

if (gpio_is_valid(priv->gpio_mic_det)) {
snd_soc_jack_new(codec->codec, "Mic Jack", SND_JACK_MICROPHONE,
&simple_card_mic_jack);
snd_soc_jack_add_pins(&simple_card_mic_jack,
ARRAY_SIZE(simple_card_mic_jack_pins),
simple_card_mic_jack_pins);
simple_card_mic_jack_gpio.gpio = priv->gpio_mic_det;
snd_soc_jack_add_gpios(&simple_card_mic_jack, 1,
&simple_card_mic_jack_gpio);
}
return 0;
}

Expand Down Expand Up @@ -383,6 +436,16 @@ static int asoc_simple_card_parse_of(struct device_node *node,
return ret;
}

priv->gpio_hp_det = of_get_named_gpio(node,
"simple-audio-card,hp-det-gpio", 0);
if (priv->gpio_hp_det == -EPROBE_DEFER)
return -EPROBE_DEFER;

priv->gpio_mic_det = of_get_named_gpio(node,
"simple-audio-card,mic-det-gpio", 0);
if (priv->gpio_mic_det == -EPROBE_DEFER)
return -EPROBE_DEFER;

if (!priv->snd_card.name)
priv->snd_card.name = priv->snd_card.dai_link->name;

Expand Down Expand Up @@ -502,6 +565,16 @@ static int asoc_simple_card_probe(struct platform_device *pdev)

static int asoc_simple_card_remove(struct platform_device *pdev)
{
struct snd_soc_card *card = platform_get_drvdata(pdev);
struct simple_card_data *priv = snd_soc_card_get_drvdata(card);

if (gpio_is_valid(priv->gpio_hp_det))
snd_soc_jack_free_gpios(&simple_card_hp_jack, 1,
&simple_card_hp_jack_gpio);
if (gpio_is_valid(priv->gpio_mic_det))
snd_soc_jack_free_gpios(&simple_card_mic_jack, 1,
&simple_card_mic_jack_gpio);

return asoc_simple_card_unref(pdev);
}

Expand Down

0 comments on commit 3fe2403

Please sign in to comment.