From patchwork Fri Aug 25 17:09:47 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: 9922547 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 5395D603FA for ; Fri, 25 Aug 2017 17:16:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3BEFD28414 for ; Fri, 25 Aug 2017 17:16:27 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3119128419; Fri, 25 Aug 2017 17:16:27 +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.3 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,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 7864F28417 for ; Fri, 25 Aug 2017 17:16:26 +0000 (UTC) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 67F0D2673F5; Fri, 25 Aug 2017 19:10:00 +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 426982673FC; Fri, 25 Aug 2017 19:09:58 +0200 (CEST) Received: from mail-pg0-f42.google.com (mail-pg0-f42.google.com [74.125.83.42]) by alsa0.perex.cz (Postfix) with ESMTP id 302082673F1 for ; Fri, 25 Aug 2017 19:09:55 +0200 (CEST) Received: by mail-pg0-f42.google.com with SMTP id 63so2092070pgc.2 for ; Fri, 25 Aug 2017 10:09:55 -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=z0Pkd/Kryxx+K7/ZWyinQroVVvBrYDDcGKpNYVmfmnQ=; b=LUrOzVCpx8Bf3Mu9sKXsY/M3z/q1+WS9P7DgGuOL9lq4rNgCLWXo21KAGg1NHCtLbn 4EE9/6613nW4DMZ0rj2+oB2sZvQYvsRXR9zjTzxaodyoaWetRI2KXUmFTiX4cs/+yKMk W0l1RIrl676ihXFwJaI3RaNuDTUcWzHO49/Zg= 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=z0Pkd/Kryxx+K7/ZWyinQroVVvBrYDDcGKpNYVmfmnQ=; b=mhBOk5uA2+aNJoWrkqQHOTe6HuCo3FPJYfqU4Fcabf+2UG+I8rX0Kh73enk1lXgL/F peQGSoXFEqOuDqZSVBL/XuK+bPoc/LBJ8yVCEdc7sacmicAvwcsO+oE8Jzwwc9w1NoGK DFP93G6gr1V2aNxIJpmDFRfEVKKLzBM70Jee1Az0emCPim6xqo2qqyI1ZFjUQt2IrUmD Rq5tvdGXhmsC1XXD21Wzg3mXU8l7yFNi77eXJ1Rw0VZ87FdLyN500JpzN+gKEwz1s89L jnIHyIx++eEEreb351RbmCDMoM3vBH5k6m1WVW/Fe5jVpjp9/p9ECOcJfQZp/WuZ66TV fPqg== X-Gm-Message-State: AHYfb5iZpI8h73H1LfppVINPDlowAolkb+vMCApvS1TUu7E8++6fxBAH i4jwo9HwwqmFcJQXS9hQ7A== X-Received: by 10.98.8.24 with SMTP id c24mr10507684pfd.236.1503680994050; Fri, 25 Aug 2017 10:09:54 -0700 (PDT) Received: from hychaoz840.tpe.corp.google.com ([2401:fa00:1:b:988:946c:cbf2:5af2]) by smtp.gmail.com with ESMTPSA id j186sm11972937pge.75.2017.08.25.10.09.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 Aug 2017 10:09:52 -0700 (PDT) From: Hsin-Yu Chao To: broonie@kernel.org, lgirdwood@gmail.com Date: Sat, 26 Aug 2017 01:09:47 +0800 Message-Id: <20170825170947.32241-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 Subject: [alsa-devel] [PATCH v2] 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 | 63 +++++++++++++++++++++++++++++++++++++++++++++++ sound/soc/codecs/rt5514.h | 3 +++ 2 files changed, 66 insertions(+) diff --git a/sound/soc/codecs/rt5514.c b/sound/soc/codecs/rt5514.c index a2722177470e..250581082e9d 100644 --- a/sound/soc/codecs/rt5514.c +++ b/sound/soc/codecs/rt5514.c @@ -335,6 +335,39 @@ static int rt5514_dsp_voice_wake_up_put(struct snd_kcontrol *kcontrol, fw = NULL; } + if (rt5514->model_buf && rt5514->model_len) { +#if IS_ENABLED(CONFIG_SND_SOC_RT5514_SPI) + int ret; + + 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 + dev_err(codec->dev, + "No SPI driver for loading firmware\n"); +#endif + } else { + request_firmware(&fw, RT5514_FIRMWARE3, + codec->dev); + if (fw) { +#if IS_ENABLED(CONFIG_SND_SOC_RT5514_SPI) + rt5514_spi_burst_write(0x4ff80000, + fw->data, + ((fw->size/8)+1)*8); +#else + dev_err(codec->dev, + "No SPI driver to load fw\n"); +#endif + release_firmware(fw); + fw = NULL; + } + } + /* DSP run */ regmap_write(rt5514->i2c_regmap, 0x18002f00, 0x00055148); @@ -349,6 +382,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 +421,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__ */