Received: by 10.223.185.116 with SMTP id b49csp1373259wrg; Wed, 14 Feb 2018 16:23:54 -0800 (PST) X-Google-Smtp-Source: AH8x227zOaKNTxLVrbTi0P2I70LU+DWeTNHv2PjFLqa1uBSZRD/G+hMpPtNP0FhVTko5OVBf7wVo X-Received: by 10.99.152.10 with SMTP id q10mr673970pgd.212.1518654234771; Wed, 14 Feb 2018 16:23:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518654234; cv=none; d=google.com; s=arc-20160816; b=y5TFLM77v7v2ebInw3Hc6EB1x7aKO4iNhv/J2VegkVSNE831mY3RdR9VqfzFlKfj1n /y0tbPj2QCJ6taswCMi5+eEAraeitAdMaYxdaoyH/nwm0fF/k309HhE+tvVyyHRuLDTf m3D8I7hxpxmz0DzUGCHHzzvcOohdS1k/9ONw3CrAuSRj7F9KiJAwnaVa7iuErJpmI79Y 2TbY4Pd0QGm4zwmJz7Is7E7wjR9owWtN1rC9pIJgkY6rpe1E3TMddWdr8jWT4hS0jveV OYQXxmsJtj83F7MKQ3ifbvA/u5LynJ4+YumC3oJIpDAhvvpl4VtWLimLsiFxuD1rVQbY 6qKQ== 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-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature:arc-authentication-results; bh=ugFf4KUNCwbnVsGW+Q/GrcyLPE5PKaerlgsvXfrOFhg=; b=0vb9OB3foag3jX0YTrOp6Eq/y4s6HFtxeWlyeMKXSDdxkYfZCv1JkG22U8jc0S9vMK cxDJxx98pztddgYVBLjTzY7hUS6ia58SJ67w5inEPnxMMUAjoutm39OO/3iw1vR8empA Ky9MshAREeFHQEb+/TdLtjoLeTurKig5Qp8Il7R1RlZ1Mof7S9zam5ACo36z4z7ztRWO 7YXjBiDzfH6nGnJwEGagpwk0Ps2/6R53YkkSASkwfIiN5xwmbGjt6IDdLKwpMd17EnCI UjvPGRCwMsodicAcm4iQ8frf2H54zXLuqkNHEcEKzWyJCkuEEi3+9iY0NoGUjWJgkgBl Bqkw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=IOQZ9FHE; 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 m22si2995495pgv.643.2018.02.14.16.23.40; Wed, 14 Feb 2018 16:23:54 -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=IOQZ9FHE; 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 S1032221AbeBOAXA (ORCPT + 99 others); Wed, 14 Feb 2018 19:23:00 -0500 Received: from mail-pg0-f65.google.com ([74.125.83.65]:35429 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1032127AbeBOAW5 (ORCPT ); Wed, 14 Feb 2018 19:22:57 -0500 Received: by mail-pg0-f65.google.com with SMTP id l131so2907386pga.2 for ; Wed, 14 Feb 2018 16:22:57 -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:in-reply-to:user-agent; bh=ugFf4KUNCwbnVsGW+Q/GrcyLPE5PKaerlgsvXfrOFhg=; b=IOQZ9FHEfMsni/uQtq2jiC+xPaRcM7WAqzV3VDUMUxRqgSmvK4dO3z05GpxE0fJUm4 X8lsPWCxnwESULxr4wjH9mmsp5erAcH0bI07dAbViUEtTC3QdTj0IZsc4GmKojIAhaNN R4bx1PBbJl5LjYOrR11tS7tQF6/OclSXc9SVI= 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:in-reply-to:user-agent; bh=ugFf4KUNCwbnVsGW+Q/GrcyLPE5PKaerlgsvXfrOFhg=; b=HBfoYwxDx4jWFh+eOyVvdxbUwaxtgf38O8BsohqqeSF2gY4p4CO1Ax60+yNjeP/a08 gIy1XeYBAOqvc9FOor/1x8sEpqtQMP8p7cHMgIRX6WesKl1REljqq+16gOWka3gBIBR3 oPTvsruTpYwBeAxkZs2jm7u7aawwARRl+9EMu4KZd/oyoC0rHMTLHOcOfzrN7F8RRLNI cO3PzblVWQ9DDxX+eFszdvUPMwgTz5VKI6U6Szb0cfVmGDTd28Zm5TeaHMfll/uvm3uC 5Gcca8Yz1rdKMzl/0LmE2ceP+QUPnSILgbFAExliVbGgin+2nQnpWESNKOBMcUT7RtJ2 UqHw== X-Gm-Message-State: APf1xPBluqeN+wxfUEn2WArKtJzTnV3ALEHGsK6dbFOZLey5LlvY4Ssp ZYw8j9iVnSVCi0ZK7aV5V8v6ZQ== X-Received: by 10.98.227.8 with SMTP id g8mr805553pfh.200.1518654177156; Wed, 14 Feb 2018 16:22:57 -0800 (PST) Received: from rodete-desktop-imager.corp.google.com ([2620:0:1000:1501:da1a:a5c1:68e:d948]) by smtp.gmail.com with ESMTPSA id a28sm36039091pfe.70.2018.02.14.16.22.55 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 14 Feb 2018 16:22:56 -0800 (PST) Date: Wed, 14 Feb 2018 16:22:54 -0800 From: Brian Norris To: Matthias Kaehlcke Cc: Liam Girdwood , Mark Brown , Rob Herring , Mark Rutland , Jaroslav Kysela , Takashi Iwai , alsa-devel@alsa-project.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Dylan Reid , huang lin Subject: Re: [PATCH] ASoC: dmic: Add optional wakeup delay Message-ID: <20180215002253.GA12697@rodete-desktop-imager.corp.google.com> References: <20180214235156.81589-1-mka@chromium.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180214235156.81589-1-mka@chromium.org> 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 Hi Matthias, On Wed, Feb 14, 2018 at 03:51:56PM -0800, 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); > + > + 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; N00b question: are you sure this is legit? Is it possible to get START/STOP/START (or similar) with no prepare() in between? > } > > @@ -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)) You really want to be strict about error codes? What about -ENXIO ("no suitable firmware interface is present")? Seems like we should ignore that one too. In practice, it looks like many drivers that are reading optional properties like this just tend to ignore the return code entirely. Brian > + return err; > > - snd_soc_codec_set_drvdata(codec, dmic_en); > + snd_soc_codec_set_drvdata(codec, dmic); > > return 0; > } > -- > 2.16.1.291.g4437f3f132-goog >