From patchwork Wed Aug 23 10:29:31 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hsin-Yu Chao X-Patchwork-Id: 9917097 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8D850602CB for ; Wed, 23 Aug 2017 10:30:00 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7700228944 for ; Wed, 23 Aug 2017 10:30:00 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6842B2894D; Wed, 23 Aug 2017 10:30:00 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_NONE,T_DKIM_INVALID autolearn=no version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3B4BB28944 for ; Wed, 23 Aug 2017 10:29:57 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 555AD2671EB; Wed, 23 Aug 2017 12:29:54 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 7A2AF2671EC; Wed, 23 Aug 2017 12:29:52 +0200 (CEST) Received: from mail-pg0-f45.google.com (mail-pg0-f45.google.com [74.125.83.45]) by alsa0.perex.cz (Postfix) with ESMTP id 1DD062664EB for ; Wed, 23 Aug 2017 12:29:49 +0200 (CEST) Received: by mail-pg0-f45.google.com with SMTP id t3so5756272pgt.0 for ; Wed, 23 Aug 2017 03:29:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id; bh=ympBJTF0DgSTJ1ncTCyOQjUeSjtDcsq0OA22yaCsMLs=; b=cMS7aoB4/Kc/MTtpuvZtJkn9hWYf1iA7wBgINJwI4//m15C5H8s8eg7TywWL0VZF2c ZCtlSHu5WKD2b4x+pZput6HDq+gWvuxiBFygyycMA0ez6UPIP1u5Mc+zYwinWKT+zxES t+LDB6JfOhStsQS4wpwN/UoFZt7Qj9whlyf2A= 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=ympBJTF0DgSTJ1ncTCyOQjUeSjtDcsq0OA22yaCsMLs=; b=syQs3t6L+wjkENJnyM5kLAN9Ns1pV+2XLIp2eU9dA0GU2CfFkjg0ycKK/CLgUOq4+M UkgG0+R8BJubiHkEXYZErMG8d1YCczw/J1apn0sYTHU4r7aKb7LThBlTDXq1dhWkN4kg dMWZgAYYZBfXzaAQrlqon5UZR7lT/GIx19+JlOWcqqaOSv7P4iFv4+IqNa07cj3RQ7AC DmFgIBLRK2LZpXRniNEfY1ppz1BW29qzw155ZVv99+oQ8saILmuAIWHww22pKwbqEAmi AGAqV5mfjOmFJZSaggtv2ASM6KewIsfOkFInapJGnTbOp8DgX+xlRNVW/rrFjUbDKwXh BVvQ== X-Gm-Message-State: AHYfb5jqLNPQoIShjWwc66rgOSTpe5KpCO8lB73T/4NRF625e+LKG6Hv EJ6VM0+a0+7TN9xy X-Received: by 10.98.64.154 with SMTP id f26mr2290252pfd.21.1503484188996; Wed, 23 Aug 2017 03:29:48 -0700 (PDT) Received: from hychaoz840.tpe.corp.google.com ([2401:fa00:1:b:b8ab:e648:d81c:4cce]) by smtp.gmail.com with ESMTPSA id 70sm1840491pgd.48.2017.08.23.03.29.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 23 Aug 2017 03:29:47 -0700 (PDT) From: Hsin-Yu Chao To: broonie@kernel.org, lgirdwood@gmail.com Date: Wed, 23 Aug 2017 18:29:31 +0800 Message-Id: <20170823102931.184967-1-hychao@chromium.org> X-Mailer: git-send-email 2.12.2 Cc: oder_chiou@realtek.com, alsa-devel@alsa-project.org, Hsin-Yu Chao , dgreid@chromium.org Subject: [alsa-devel] [PATCH] ASoC: rt5514: expose Hotword Model control X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP This change exposes mixer control 'Hotword Model' for switching hotword model in runtime. This new function requires updated firmware to load hotword model at address 0x4ff80000. Signed-off-by: Hsin-Yu Chao --- sound/soc/codecs/rt5514.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++ sound/soc/codecs/rt5514.h | 3 +++ 2 files changed, 55 insertions(+) diff --git a/sound/soc/codecs/rt5514.c b/sound/soc/codecs/rt5514.c index a2722177470e..7482df8ff737 100644 --- a/sound/soc/codecs/rt5514.c +++ b/sound/soc/codecs/rt5514.c @@ -299,6 +299,7 @@ static int rt5514_dsp_voice_wake_up_put(struct snd_kcontrol *kcontrol, struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); struct snd_soc_codec *codec = rt5514->codec; const struct firmware *fw = NULL; + int ret = 0; if (ucontrol->value.integer.value[0] == rt5514->dsp_enabled) return 0; @@ -335,6 +336,27 @@ static int rt5514_dsp_voice_wake_up_put(struct snd_kcontrol *kcontrol, fw = NULL; } + if (rt5514->model_buf && rt5514->model_len) { + ret = rt5514_spi_burst_write(0x4ff80000, + rt5514->model_buf, + ((rt5514->model_len / 8) + 1) * 8); + if (ret) { + dev_err(codec->dev, + "Model load failed %d\n", ret); + return ret; + } + } else { + request_firmware(&fw, RT5514_FIRMWARE3, + codec->dev); + if (fw) { + rt5514_spi_burst_write(0x4ff80000, + fw->data, + ((fw->size/8)+1)*8); + release_firmware(fw); + fw = NULL; + } + } + /* DSP run */ regmap_write(rt5514->i2c_regmap, 0x18002f00, 0x00055148); @@ -349,6 +371,34 @@ static int rt5514_dsp_voice_wake_up_put(struct snd_kcontrol *kcontrol, return 0; } +static int rt5514_hotword_model_put(struct snd_kcontrol *kcontrol, + const unsigned int __user *bytes, unsigned int size) +{ + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct rt5514_priv *rt5514 = snd_soc_component_get_drvdata(component); + struct snd_soc_codec *codec = rt5514->codec; + int ret = 0; + + if (rt5514->model_buf || rt5514->model_len < size) { + if (rt5514->model_buf) + devm_kfree(codec->dev, rt5514->model_buf); + rt5514->model_buf = devm_kmalloc(codec->dev, size, GFP_KERNEL); + if (!rt5514->model_buf) { + ret = -ENOMEM; + goto done; + } + } + + /* Skips the TLV header. */ + bytes += 2; + + if (copy_from_user(rt5514->model_buf, bytes, size)) + ret = -EFAULT; +done: + rt5514->model_len = (ret ? 0 : size); + return ret; +} + static const struct snd_kcontrol_new rt5514_snd_controls[] = { SOC_DOUBLE_TLV("MIC Boost Volume", RT5514_ANA_CTRL_MICBST, RT5514_SEL_BSTL_SFT, RT5514_SEL_BSTR_SFT, 8, 0, bst_tlv), @@ -360,6 +410,8 @@ static const struct snd_kcontrol_new rt5514_snd_controls[] = { adc_vol_tlv), SOC_SINGLE_EXT("DSP Voice Wake Up", SND_SOC_NOPM, 0, 1, 0, rt5514_dsp_voice_wake_up_get, rt5514_dsp_voice_wake_up_put), + SND_SOC_BYTES_TLV("Hotword Model", 0x8504, + NULL, rt5514_hotword_model_put), }; /* ADC Mixer*/ diff --git a/sound/soc/codecs/rt5514.h b/sound/soc/codecs/rt5514.h index 02bc212a86d9..07475a9918d2 100644 --- a/sound/soc/codecs/rt5514.h +++ b/sound/soc/codecs/rt5514.h @@ -236,6 +236,7 @@ #define RT5514_FIRMWARE1 "rt5514_dsp_fw1.bin" #define RT5514_FIRMWARE2 "rt5514_dsp_fw2.bin" +#define RT5514_FIRMWARE3 "rt5514_dsp_fw3.bin" /* System Clock Source */ enum { @@ -262,6 +263,8 @@ struct rt5514_priv { int pll_in; int pll_out; int dsp_enabled; + u8 *model_buf; + unsigned int model_len; }; #endif /* __RT5514_H__ */