Received: by 10.223.185.116 with SMTP id b49csp3682633wrg; Mon, 19 Feb 2018 04:20:18 -0800 (PST) X-Google-Smtp-Source: AH8x227jscQ9ppC9aS3vP+Gvp2L+TxuQSiff9InIb+9mv9bVpYGoW6bLh/fqDVASr0N8yzxHud7B X-Received: by 2002:a17:902:7006:: with SMTP id y6-v6mr14042164plk.37.1519042817982; Mon, 19 Feb 2018 04:20:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519042817; cv=none; d=google.com; s=arc-20160816; b=ju8grA7behS2IWqEVAyox07xc+DGc8m/kG5qMPcVdlxT5j8QlX4l/10sOTADsrclSl sCnrwrwlJst2dUNv8GVqabH/VUcbIKQeRMWlApY1JTU0RNUvukJLNdDqJvRRciTgmYS2 Z2YbvTAjxFjjDxsDRBvYhY4D1uDzaZNnXc3BctHkbOTodZeuZ35+pzHO1gIUFlJG5wft FW2SAV3x0klCi/Jr3csFWOHtWcZSxLg5GG01eCy9wzT+p9C/unwyPJgvwRblhB1loyYr DvsIhIzCRQ3wni0C7OPQdd/4nHmH1hGjTYQGoBAkMS1Nq+LF/gfn3tC9pknRAigAw84W RoDQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:date:message-id:in-reply-to:subject:cc:to :from:dkim-signature:arc-authentication-results; bh=vJg2lRHSkevmxluLts8E5BpZQXs927mpZ+ScGhTSOlw=; b=XBNp/hSj4i71bnNzwFGeLbtXfobHjPUDNnmyBO02nxuT/DkwaE5cmgWwEsDjKp8Uqh AMou58K6AWOzmJ9x9kYa0g6vKgpcbAPin+J5xCTwBMen65AnqQWxTIH6VqnaTNTzFmaY 9SbLwQdoDkEY9m72BGPgzg69wmC0yR6I0RhPnJSuAwtIXPfHcR1NQnPDs8g94cpMjM0K hYip8L1nkikLf2VpJAFVGeFa8xUpFYeszu1hUbCZu7akLDcVcHQKd6G0RW0c0t3NcVaE IbSUCoeNcx+mCRiKRQ/BOh8FU4cN2nDQR7vhML7SCn/WPSEqJCpNWdh1Ne1gDI296tP8 pTsw== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@sirena.org.uk header.s=20170815-heliosphere header.b=QPB8f5Si; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s1si2326008pgb.64.2018.02.19.04.20.03; Mon, 19 Feb 2018 04:20:17 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=fail header.i=@sirena.org.uk header.s=20170815-heliosphere header.b=QPB8f5Si; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752682AbeBSMSU (ORCPT + 99 others); Mon, 19 Feb 2018 07:18:20 -0500 Received: from heliosphere.sirena.org.uk ([172.104.155.198]:58042 "EHLO heliosphere.sirena.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752579AbeBSMSS (ORCPT ); Mon, 19 Feb 2018 07:18:18 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sirena.org.uk; s=20170815-heliosphere; h=Date:Message-Id:In-Reply-To: Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:References: List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner: List-Archive; bh=vJg2lRHSkevmxluLts8E5BpZQXs927mpZ+ScGhTSOlw=; b=QPB8f5SiDObU 9x0Kb0xHgkLb1FTxAy+Lsr0D+0Cjm2YUCkLDMNKhtOyhFjjZfq1lYp53w6+2oObvr0YRVuH6fue73 8nsqktNeTbQZBL9mB4a5V/RN8wvLdCL25Jvsa7+u+GybyTDUbh0LQAfP1Hd6yiDUghUp5PBm7Mc4M Ke0Mw=; Received: from debutante.sirena.org.uk ([2001:470:1f1d:6b5::3] helo=debutante) by heliosphere.sirena.org.uk with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1enkOR-0003T1-8g; Mon, 19 Feb 2018 12:18:03 +0000 Received: from broonie by debutante with local (Exim 4.90_1) (envelope-from ) id 1enkOQ-0002gp-H9; Mon, 19 Feb 2018 12:18:02 +0000 From: Mark Brown To: Matthias Kaehlcke Cc: Mark Brown , Liam Girdwood , Mark Brown , Rob Herring , Mark Rutland , Jaroslav Kysela , Takashi Iwai , Peter Ujfalusi , devicetree@vger.kernel.org, alsa-devel@alsa-project.org, huang lin , Brian Norris , linux-kernel@vger.kernel.org, Dylan Reid , alsa-devel@alsa-project.org Subject: Applied "ASoC: dmic: Add optional wakeup delay" to the asoc tree In-Reply-To: <20180216175312.88465-1-mka@chromium.org> Message-Id: Date: Mon, 19 Feb 2018 12:18:02 +0000 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The patch ASoC: dmic: Add optional wakeup delay has been applied to the asoc tree at https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted. You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed. If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced. Please add any relevant lists and maintainers to the CCs when replying to this mail. Thanks, Mark From 05c9b302eda71083840392d74ce62dd1e1f30621 Mon Sep 17 00:00:00 2001 From: Matthias Kaehlcke Date: Fri, 16 Feb 2018 09:53:12 -0800 Subject: [PATCH] ASoC: dmic: Add optional wakeup delay On some systems a delay is needed after switching on the clocks, to allow the output to stabilize and avoid a popping noise at the beginning of the recording. Add the optional device tree property 'wakeup-delay-ms' and apply the specified delay after enabling the mic. A blocking delay can't be applied in dmic_daiops_trigger() since the function is called in atomic context. Instead use a DAPM event handler to set the enable GPIO and apply the delay in the handler. Signed-off-by: Matthias Kaehlcke Reviewed-by: Peter Ujfalusi Signed-off-by: Mark Brown --- Documentation/devicetree/bindings/sound/dmic.txt | 2 + sound/soc/codecs/dmic.c | 63 +++++++++++++----------- 2 files changed, 37 insertions(+), 28 deletions(-) diff --git a/Documentation/devicetree/bindings/sound/dmic.txt b/Documentation/devicetree/bindings/sound/dmic.txt index f7bf65611453..e957b4136716 100644 --- a/Documentation/devicetree/bindings/sound/dmic.txt +++ b/Documentation/devicetree/bindings/sound/dmic.txt @@ -8,6 +8,7 @@ Required properties: Optional properties: - dmicen-gpios: GPIO specifier for dmic to control start and stop - num-channels: Number of microphones on this DAI + - wakeup-delay-ms: Delay (in ms) after enabling the DMIC Example node: @@ -15,4 +16,5 @@ Example node: compatible = "dmic-codec"; dmicen-gpios = <&gpio4 3 GPIO_ACTIVE_HIGH>; num-channels = <1>; + wakeup-delay-ms <50>; }; diff --git a/sound/soc/codecs/dmic.c b/sound/soc/codecs/dmic.c index 32a8f71d51f1..bac5bbb2dd59 100644 --- a/sound/soc/codecs/dmic.c +++ b/sound/soc/codecs/dmic.c @@ -19,6 +19,7 @@ * */ +#include #include #include #include @@ -29,34 +30,33 @@ #include #include -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); +struct dmic { + struct gpio_desc *gpio_en; + int wakeup_delay; +}; - if (!dmic_en) - return 0; +static int dmic_aif_event(struct snd_soc_dapm_widget *w, + struct snd_kcontrol *kcontrol, int event) { + struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); + struct dmic *dmic = snd_soc_codec_get_drvdata(codec); - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - gpiod_set_value(dmic_en, 1); + switch (event) { + case SND_SOC_DAPM_POST_PMU: + if (dmic->gpio_en) + gpiod_set_value(dmic->gpio_en, 1); + + if (dmic->wakeup_delay) + msleep(dmic->wakeup_delay); break; - case SNDRV_PCM_TRIGGER_STOP: - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - gpiod_set_value(dmic_en, 0); + case SND_SOC_DAPM_POST_PMD: + if (dmic->gpio_en) + gpiod_set_value(dmic->gpio_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 = { @@ -68,26 +68,33 @@ 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_component_probe(struct snd_soc_component *component) { - struct gpio_desc *dmic_en; + struct dmic *dmic; + + dmic = devm_kzalloc(component->dev, sizeof(*dmic), GFP_KERNEL); + if (!dmic) + return -ENOMEM; + + dmic->gpio_en = devm_gpiod_get_optional(component->dev, + "dmicen", GPIOD_OUT_LOW); + if (IS_ERR(dmic->gpio_en)) + return PTR_ERR(dmic->gpio_en); - dmic_en = devm_gpiod_get_optional(component->dev, - "dmicen", GPIOD_OUT_LOW); - if (IS_ERR(dmic_en)) - return PTR_ERR(dmic_en); + device_property_read_u32(component->dev, "wakeup-delay-ms", + &dmic->wakeup_delay); - snd_soc_component_set_drvdata(component, dmic_en); + snd_soc_component_set_drvdata(component, dmic); 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), + SND_SOC_DAPM_AIF_OUT_E("DMIC AIF", "Capture", 0, + SND_SOC_NOPM, 0, 0, dmic_aif_event, + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_INPUT("DMic"), }; -- 2.16.1