Received: by 10.223.185.116 with SMTP id b49csp1347519wrg; Wed, 14 Feb 2018 15:53:31 -0800 (PST) X-Google-Smtp-Source: AH8x224nrYKD8zCHSrRnX35w5o1xZ/hmiUU7uCYKoTumX6YQii8mHvveWgBzOa8FUUWk10eT8UzF X-Received: by 10.98.160.142 with SMTP id p14mr707586pfl.151.1518652411367; Wed, 14 Feb 2018 15:53:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518652411; cv=none; d=google.com; s=arc-20160816; b=oPMNqFS44I3xltHGgPm4e0DEv2lFX43GKr6w5NfE/xTM8T5StoSTdAi18yO3UVKq5e NiCJ+REHbVnGX+ZONdo3AtRM7wO9j0H0uhzr4fN9bTnDDw3YKBNYkjp1xxpbDJlR6BQa lAf0aog87diYKQtJdL/IjXhcpP+aKYABGBbxFc26vEHyBacBPl5rReRy/XdqB2iPGrLw zgeAdQLeawe0Ek6IEtiUX6uBWY79KmgOk30PP8g/v+LyCW3qFGotDJXxm0FWbfJ8aw6Q yQppsHuHqrLyILZRrN2uRj0zcr2NOrzbpX2xF57IhQ1T/p7vUQeozZGG8eC9EVNmKX+b ejTw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=1f975NJNQt/NemX2xsydmQwWfB8MOk9JVnhiApPNW9E=; b=l0HM/BW0t4ASO7w5QDjgU4fSuDGfuCXaE5vFK3YJpqAPs9xe+jkQfCzjGj9EjsJw0w 6yf3ypqioIICMLzXlM7S2s5ZFeJYOlQPFWm5vNOXZl8Lhzjun6VZ1aoP5VgTK+KAPkEl AnVRn+6k1OBszOGTeyXucq4IFBgL0uSKiEHyKMbbWn7Op5yEaBwqnkmy3w5WFBFS81Rq jXw8PUjBsL2P7b0zVEqzVgEgo4Zq7QXK515DvT0V0EIl4aESVB00SHp1pZTsKKQJPioE pPlYEOAeSRGDbsQJyqeNvP7k2+ZP3ue+DauADg/5SK8FGLxopKV3M14q1IMw7SqIMw2W VX/Q== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (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 a65si2012830pfl.342.2018.02.14.15.53.16; Wed, 14 Feb 2018 15:53:31 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1032128AbeBNXwh (ORCPT + 99 others); Wed, 14 Feb 2018 18:52:37 -0500 Received: from mail-pg0-f67.google.com ([74.125.83.67]:38693 "EHLO mail-pg0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031901AbeBNXwf (ORCPT ); Wed, 14 Feb 2018 18:52:35 -0500 Received: by mail-pg0-f67.google.com with SMTP id l24so2855392pgc.5 for ; Wed, 14 Feb 2018 15:52:35 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=1f975NJNQt/NemX2xsydmQwWfB8MOk9JVnhiApPNW9E=; b=bVcZLdvKOfRYtPPQT5UCkfgY3kU7LLOSyCmZoZsa77UZQgaUObiZvUg2msLr+7DsMt eHb1rby80VQjnursOmw1P1M3wHaIk3tg4TmheJ+CZ0TPqV2k/jOWT88Gzp39Unu6Rcoc jNSqvhgnuTRdnxvYB/Yzj0meDW3DUJbsyuOFJwQerwuP+Lijt5BVwpXqp/dc0WZYgbtO t2tn1mo9Q+TdEjXVhGw+oj1pnrbTfkiHsFKQYBNEVzV2YTtGhWX2+vZa+MG+cgo8HElf D6g9sXOM42yVGEFrC9kuPoKsXilmTOYOvvhWS6u87xJVDW2SEEFDTjZWMm9eiTE2HhGk 1SNg== X-Gm-Message-State: APf1xPAgzfPK/S9MgTX3ktjR2KYQYvHBHzaILBXEE6PUYmOvlwR3er7e /FvUxXDrrpXSfz4IEfhJdUqFzg== X-Received: by 10.99.122.74 with SMTP id j10mr580743pgn.84.1518652354520; Wed, 14 Feb 2018 15:52:34 -0800 (PST) Received: from mka.mtv.corp.google.com ([2620:0:1000:1501:9f72:a769:d80e:13c2]) by smtp.gmail.com with ESMTPSA id x4sm37749677pgo.15.2018.02.14.15.52.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 14 Feb 2018 15:52:33 -0800 (PST) From: Matthias Kaehlcke To: Liam Girdwood , Mark Brown , Rob Herring , Mark Rutland , Jaroslav Kysela , Takashi Iwai Cc: alsa-devel@alsa-project.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Brian Norris , Dylan Reid , huang lin , Matthias Kaehlcke Subject: [PATCH] ASoC: dmic: Add optional wakeup delay Date: Wed, 14 Feb 2018 15:51:56 -0800 Message-Id: <20180214235156.81589-1-mka@chromium.org> X-Mailer: git-send-email 2.16.1.291.g4437f3f132-goog Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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; } @@ -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; } -- 2.16.1.291.g4437f3f132-goog