Received: by 10.223.185.116 with SMTP id b49csp624878wrg; Fri, 16 Feb 2018 04:43:00 -0800 (PST) X-Google-Smtp-Source: AH8x224nzWr7oSDDwDmKAooP5jT4q1bn8GQ+2h7az9b6THI+EBjLIo7rQXm0LYIJEOgIXCYNvGGQ X-Received: by 2002:a17:902:a504:: with SMTP id s4-v6mr5945091plq.43.1518784979975; Fri, 16 Feb 2018 04:42:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518784979; cv=none; d=google.com; s=arc-20160816; b=TZXaOpcRi0le+eRqZuAZ/pKoJUNaxuF0Wpv24kT2XVUrlJmCs7aoqkEK4daZLg3+m4 cbgsNZ1c7D/x3Xaok9O7e04pH+lnlzOFFRt5GJQEFu+KfHijYJOqWm9VjwZihnrm+G6h i5AMBbXJicg4xQcXAblrHnswuNwVBxqJbAQSiUu1RXPox+ed0KMEQH4r5IiHwIWLd43B XRA3TbkdhnjuRhs0GjzZvLsEifUAR6LfRzE05mdbfeAPWZZOzouibA8UXKuoSlcHRGy0 cuFWz/zwOmY/ynUwxyLuti3NW3CNbUp8NMyBaBXVRdiKDV6UaNNwoZWTDG7nwS19+OSe JiiQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-transfer-encoding:content-disposition:mime-version :references:message-id:subject:cc:to:from:date:dkim-signature :arc-authentication-results; bh=9TrxtS8TEeK94GsOcKI3LsFcq3NrknJItrcY/uIh+RI=; b=wjktfk6TOKMWDiajYIg91ls339D9R8z7ilHXWW3SvXwmciWUn/aP1dzgHStjNMMCKv FSDvytc0gqojppQjh+CH6rN2zwQ4O8FD086hTivwAZmqnb1NZyRYVjXnFjz8z0Jvrakq QexH/oO2Q6PvdI/0bXwV/z6G0xHbPYfmL6P/rF7nS0FVKj0jbkJTrN44aI9TBw5Dclko NT3chMnTbXifQeTn5b0YMP9mEEXLw5X8TL7DrpIYKF5fSqRYf2HgyqqQ7w7m81gdtkR/ 4WjMnJaceWgTPfEjFeSx8XPlD3St4q+GzPUig5PGyWhNFW9rh/JWFl0ELy1e5g38xbeH Vumg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=iNbZaCMf; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 3-v6si516768plp.583.2018.02.16.04.42.44; Fri, 16 Feb 2018 04:42:59 -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=pass header.i=@chromium.org header.s=google header.b=iNbZaCMf; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1166238AbeBOSSG (ORCPT + 99 others); Thu, 15 Feb 2018 13:18:06 -0500 Received: from mail-it0-f65.google.com ([209.85.214.65]:54866 "EHLO mail-it0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1163568AbeBOSSC (ORCPT ); Thu, 15 Feb 2018 13:18:02 -0500 Received: by mail-it0-f65.google.com with SMTP id p204so1561461itc.4 for ; Thu, 15 Feb 2018 10:18:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=9TrxtS8TEeK94GsOcKI3LsFcq3NrknJItrcY/uIh+RI=; b=iNbZaCMfPIapFfIbM4BMyI/iz/Q7YLlce/B+5gem8UVGeyYMpAA0Ffcg0x16xR+k/e FbWa90nuvQoNFT4lNgsQnducS7c8VfA0/GPXL37GP2v8vJ4g6SGHTwwBA+zVm7yFStv5 D/aSb/3U7l+KeAsvknzIs8I5SVX1WvOUN8ufo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=9TrxtS8TEeK94GsOcKI3LsFcq3NrknJItrcY/uIh+RI=; b=HgcyEy/ZULtrqLhnT9RnBj6Orfird5xdfmfE8UfamTpErtuYMXvkhEhpOAvm0BYekp 16Rn+Rtp7D8WfOvjMGhaNSyR9rzNCm9ODwNZgtNBYv+28ttB4PYHayDW7z3MYxN+WA+3 QctJdZ+eUBJp42sy7dILwQyCQhz1JER0ocbQ641uzOhJ9ajT49o9kCrA83LGf8b24s+B T9AZQgMIaVhPB4xR2CsC5LaAArITrNCb98D3BeaZNLjFykJJp6t8pdl+6ph1vHVhMrCX qUmakilvGTLKdL2AEUqSwT4dD8P+01onIBNxAyE9N5bPm+zSaBek56MHSyM0iWOaTiSj 70lQ== X-Gm-Message-State: APf1xPBRTrr13Zzr52SP4tNHuIjyZRg57Zdt/PzhYORt0uTKngPtP60U owMDfnCllUsH2JA6mjXxB3e3kQ== X-Received: by 10.36.244.74 with SMTP id u10mr4513588iti.87.1518718682096; Thu, 15 Feb 2018 10:18:02 -0800 (PST) Received: from localhost ([2620:0:1000:1501:9f72:a769:d80e:13c2]) by smtp.gmail.com with ESMTPSA id s32sm765742ite.1.2018.02.15.10.18.01 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 15 Feb 2018 10:18:01 -0800 (PST) Date: Thu, 15 Feb 2018 10:18:00 -0800 From: Matthias Kaehlcke To: Peter Ujfalusi Cc: Liam Girdwood , Mark Brown , Rob Herring , Mark Rutland , Jaroslav Kysela , Takashi Iwai , devicetree@vger.kernel.org, alsa-devel@alsa-project.org, huang lin , Brian Norris , linux-kernel@vger.kernel.org, Dylan Reid Subject: Re: [alsa-devel] [PATCH] ASoC: dmic: Add optional wakeup delay Message-ID: <20180215181800.GB99727@google.com> References: <20180214235156.81589-1-mka@chromium.org> <7c9d5202-bcac-f989-6be2-f286de15a5de@ti.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <7c9d5202-bcac-f989-6be2-f286de15a5de@ti.com> User-Agent: Mutt/1.9.2 (2017-12-15) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org El Thu, Feb 15, 2018 at 09:42:01AM +0200 Peter Ujfalusi ha dit: > > > On 2018-02-15 01:51, Matthias Kaehlcke wrote: > > On some systems a delay is needed after switching on the clocks, to allow > > the DMIC 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 in the new dmic_daiops_prepare(). > > > > Signed-off-by: Matthias Kaehlcke > > --- > > .../devicetree/bindings/sound/dmic.txt | 2 + > > sound/soc/codecs/dmic.c | 54 ++++++++++++++----- > > 2 files changed, 42 insertions(+), 14 deletions(-) > > > > diff --git a/Documentation/devicetree/bindings/sound/dmic.txt b/Documentation/devicetree/bindings/sound/dmic.txt > > index 54c8ef6498a8..de741c6609d0 100644 > > --- a/Documentation/devicetree/bindings/sound/dmic.txt > > +++ b/Documentation/devicetree/bindings/sound/dmic.txt > > @@ -7,10 +7,12 @@ Required properties: > > > > Optional properties: > > - dmicen-gpios: GPIO specifier for dmic to control start and stop > > + - wakeup-delay-ms: Delay (in ms) after enabling the DMIC > > > > Example node: > > > > dmic_codec: dmic@0 { > > compatible = "dmic-codec"; > > dmicen-gpios = <&gpio4 3 GPIO_ACTIVE_HIGH>; > > + wakeup-delay-ms <50>; > > }; > > diff --git a/sound/soc/codecs/dmic.c b/sound/soc/codecs/dmic.c > > index b88a1ee66f80..11f6abf11074 100644 > > --- a/sound/soc/codecs/dmic.c > > +++ b/sound/soc/codecs/dmic.c > > @@ -19,6 +19,7 @@ > > * > > */ > > > > +#include > > #include > > #include > > #include > > @@ -29,24 +30,38 @@ > > #include > > #include > > > > +struct dmic { > > + struct gpio_desc *gpio_en; > > + int wakeup_delay; > > +}; > > + > > +static int dmic_daiops_prepare(struct snd_pcm_substream *substream, > > + struct snd_soc_dai *dai) > > +{ > > + struct dmic *dmic = snd_soc_dai_get_drvdata(dai); > > + > > + if (dmic->gpio_en) > > + gpiod_set_value(dmic->gpio_en, 1); > > You don't need the 'if (dmic->gpio_en)' True, personally I think the if statement makes it clearer that the GPIO is optional. I'm fine with removing it if the general sense is that it's just noise. > > + > > + if (dmic->wakeup_delay) > > + msleep(dmic->wakeup_delay); > > + > > + return 0; > > +} > > + > > 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 *dmic = snd_soc_dai_get_drvdata(dai); > > > > - if (!dmic_en) > > + if (!dmic->gpio_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); > > + gpiod_set_value(dmic->gpio_en, 0); > > break; > > } > > What if instead of this trickery we try to handle the gpio/delay via > DAPM? SND_SOC_DAPM_AIF_OUT_E() might be just what we need? > > We could remove the trigger, and will have no need for the prepare > callback either.. SND_SOC_DAPM_AIF_OUT_E() looks promising, thanks for the pointer! > > @@ -54,6 +69,7 @@ static int dmic_daiops_trigger(struct snd_pcm_substream *substream, > > } > > > > static const struct snd_soc_dai_ops dmic_dai_ops = { > > + .prepare = dmic_daiops_prepare, > > .trigger = dmic_daiops_trigger, > > }; > > > > @@ -73,14 +89,24 @@ static struct snd_soc_dai_driver dmic_dai = { > > > > static int dmic_codec_probe(struct snd_soc_codec *codec) > > { > > - struct gpio_desc *dmic_en; > > + struct dmic *dmic; > > + int err; > > + > > + dmic = devm_kzalloc(codec->dev, sizeof(*dmic), GFP_KERNEL); > > + if (!dmic) > > + return -ENOMEM; > > + > > + dmic->gpio_en = devm_gpiod_get_optional(codec->dev, > > + "dmicen", GPIOD_OUT_LOW); > > + if (IS_ERR(dmic->gpio_en)) > > + return PTR_ERR(dmic->gpio_en); > > > > - dmic_en = devm_gpiod_get_optional(codec->dev, > > - "dmicen", GPIOD_OUT_LOW); > > - if (IS_ERR(dmic_en)) > > - return PTR_ERR(dmic_en); > > + err = device_property_read_u32(codec->dev, "wakeup-delay-ms", > > + &dmic->wakeup_delay); > > + if (err && (err != -EINVAL)) > > + return err; > > > > - snd_soc_codec_set_drvdata(codec, dmic_en); > > + snd_soc_codec_set_drvdata(codec, dmic); > > > > return 0; > > } > > > > - Péter > > Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. > Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki