Skip to content

Commit

Permalink
ASoC: codec: use enable pin to control dmic start and stop
Browse files Browse the repository at this point in the history
on some board use enable pin to control dmic start and stop,
so add this feature in dmic driver.

Signed-off-by: Lin Huang <hl@rock-chips.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
  • Loading branch information
huang lin authored and Mark Brown committed Aug 17, 2017
1 parent 8c9741b commit 23c7159
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 2 deletions.
2 changes: 1 addition & 1 deletion sound/soc/codecs/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ config SND_SOC_ALL_CODECS
select SND_SOC_DA732X if I2C
select SND_SOC_DA9055 if I2C
select SND_SOC_DIO2125
select SND_SOC_DMIC
select SND_SOC_DMIC if GPIOLIB
select SND_SOC_ES8316 if I2C
select SND_SOC_ES8328_SPI if SPI_MASTER
select SND_SOC_ES8328_I2C if I2C
Expand Down
48 changes: 47 additions & 1 deletion sound/soc/codecs/dmic.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
*
*/

#include <linux/gpio.h>
#include <linux/gpio/consumer.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/module.h>
Expand All @@ -27,6 +29,34 @@
#include <sound/soc.h>
#include <sound/soc-dapm.h>

static int dmic_daiops_trigger(struct snd_pcm_substream *substream,
int cmd, struct snd_soc_dai *dai)
{
struct gpio_desc *dmic_en = snd_soc_dai_get_drvdata(dai);

if (!dmic_en)
return 0;

switch (cmd) {
case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
gpiod_set_value(dmic_en, 1);
break;
case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
gpiod_set_value(dmic_en, 0);
break;
}

return 0;
}

static const struct snd_soc_dai_ops dmic_dai_ops = {
.trigger = dmic_daiops_trigger,
};

static struct snd_soc_dai_driver dmic_dai = {
.name = "dmic-hifi",
.capture = {
Expand All @@ -38,8 +68,23 @@ static struct snd_soc_dai_driver dmic_dai = {
| SNDRV_PCM_FMTBIT_S24_LE
| SNDRV_PCM_FMTBIT_S16_LE,
},
.ops = &dmic_dai_ops,
};

static int dmic_codec_probe(struct snd_soc_codec *codec)
{
struct gpio_desc *dmic_en;

dmic_en = devm_gpiod_get_optional(codec->dev,
"dmicen", GPIOD_OUT_LOW);
if (IS_ERR(dmic_en))
return PTR_ERR(dmic_en);

snd_soc_codec_set_drvdata(codec, dmic_en);

return 0;
}

static const struct snd_soc_dapm_widget dmic_dapm_widgets[] = {
SND_SOC_DAPM_AIF_OUT("DMIC AIF", "Capture", 0,
SND_SOC_NOPM, 0, 0),
Expand All @@ -50,7 +95,8 @@ static const struct snd_soc_dapm_route intercon[] = {
{"DMIC AIF", NULL, "DMic"},
};

static struct snd_soc_codec_driver soc_dmic = {
static const struct snd_soc_codec_driver soc_dmic = {
.probe = dmic_codec_probe,
.component_driver = {
.dapm_widgets = dmic_dapm_widgets,
.num_dapm_widgets = ARRAY_SIZE(dmic_dapm_widgets),
Expand Down

0 comments on commit 23c7159

Please sign in to comment.