From nobody Sun Feb 8 19:43:53 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 984A0EB64D9 for ; Mon, 19 Jun 2023 10:17:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231922AbjFSKRE (ORCPT ); Mon, 19 Jun 2023 06:17:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59390 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231384AbjFSKRA (ORCPT ); Mon, 19 Jun 2023 06:17:00 -0400 Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com [IPv6:2a00:1450:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E867598 for ; Mon, 19 Jun 2023 03:16:58 -0700 (PDT) Received: by mail-wr1-x430.google.com with SMTP id ffacd0b85a97d-30e412a852dso2683406f8f.0 for ; Mon, 19 Jun 2023 03:16:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687169817; x=1689761817; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=VzGepGC6ZYnmZGsocL2P2Z4ZNGc2QuSBI4PBc8L8Xeo=; b=TeE5sjg5OrE2aYeX3pBftMim05QPJa+/1qvmbEQ7QqIESt06ME2tY/5wUULlHtheGN MlyFiC94sTyk3kzCrpXyrJeEPiecH0uvEUX5s0isGIOCV+u1979I/ihcn3ylReRR1dD2 gF8ikSN6IaM+dloiqmY4eR5e7UBWVsgPUTwehGhqFx91Fzu1A/JL6lt5THWWLibYFg7Y TayBkWuQsVZh8xE0mBIcsxiyfjphS+E7Low2ppJDRJthHifZiq8YMXfi77xCnhElMUgn 7IUJ6UdWQRcRAJeUi/T2GdS30Lz1GvFwvTYSBfQc6i5z/GzoH6v6200DB1dwk2lH8VkE i0pA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687169817; x=1689761817; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=VzGepGC6ZYnmZGsocL2P2Z4ZNGc2QuSBI4PBc8L8Xeo=; b=QMr5K0LZHVPj+SemenL+JYzPw7foqNTxB2W7Mw8WbQ1fvz7CQWbUZeJ/M0+zbaF+ej w6ngyJqZ2z0CYeIC+aSud85JSp2nBqeF1LMXpMQa7OOoLY6Alz7Ivnv8oxhoTN4plu5e Y9zLIRjM0iIteu0sAFbencarAn3dDIJiQ3IIXU4GwaFgci226v8tqcKcRE/q6i1xxPlG G3KZDtVfL8B5wxl0OR9HtuYK9f6xK/Lygh7qaHfBbjpbSknTDoYuxxtXO6BXV49oRgnf M0sicScurdj7gLioF65yjxqV5rFJ8UCiyZBs/RHHtnxBDrinYg8sonk2DlZDHeIz3I82 PSQg== X-Gm-Message-State: AC+VfDyqq8sqgXwDHL42Kd60ixD2kgCPwpPdpfMMTLTbPef/miNoPs1q 2SYlzDd0pFr0QQRfrWJqTSb+eA== X-Google-Smtp-Source: ACHHUZ6pAkcRKDuJ4mER66rw0TC0DL/95Zxf3iH5VEfKJr4ev+OM49ZLGU0BYRxcsKVlBBnIwgvMkA== X-Received: by 2002:a5d:4952:0:b0:30d:43ca:55ab with SMTP id r18-20020a5d4952000000b0030d43ca55abmr5394016wrs.38.1687169817457; Mon, 19 Jun 2023 03:16:57 -0700 (PDT) Received: from localhost.localdomain ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id c2-20020a5d5282000000b002fae7408544sm31146922wrv.108.2023.06.19.03.16.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jun 2023 03:16:56 -0700 (PDT) From: Srinivas Kandagatla To: broonie@kernel.org Cc: perex@perex.cz, tiwai@suse.com, lgirdwood@gmail.com, ckeepax@opensource.cirrus.com, kuninori.morimoto.gx@renesas.com, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, alsa-devel@alsa-project.org, Mohammad Rafi Shaik , Srinivas Kandagatla Subject: [PATCH v3 01/11] ASoC: qcom: SC7280: audioreach: Add sc7280 hardware param fixup callback Date: Mon, 19 Jun 2023 11:16:43 +0100 Message-Id: <20230619101653.9750-2-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> References: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Mohammad Rafi Shaik Add support to set backend params such as sampling rate and number of channels using backend params fixup callback. Also add no pcm check for hardware params constraints setting. Signed-off-by: Mohammad Rafi Shaik Signed-off-by: Srinivas Kandagatla --- sound/soc/qcom/sc7280.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/sound/soc/qcom/sc7280.c b/sound/soc/qcom/sc7280.c index da7469a6a267..787dd49e03f6 100644 --- a/sound/soc/qcom/sc7280.c +++ b/sound/soc/qcom/sc7280.c @@ -14,6 +14,7 @@ #include #include #include +#include =20 #include "../codecs/rt5682.h" #include "../codecs/rt5682s.h" @@ -196,8 +197,10 @@ static int sc7280_snd_hw_params(struct snd_pcm_substre= am *substream, struct sdw_stream_runtime *sruntime; int i; =20 - snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_CHANNELS, 2, 2); - snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_RATE, 48000, 480= 00); + if (!rtd->dai_link->no_pcm) { + snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_CHANNELS, 2, 2); + snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_RATE, 48000, 48= 000); + } =20 switch (cpu_dai->id) { case LPASS_CDC_DMA_TX3: @@ -358,6 +361,20 @@ static const struct snd_soc_dapm_widget sc7280_snd_wid= gets[] =3D { SND_SOC_DAPM_MIC("Headset Mic", NULL), }; =20 +static int sc7280_snd_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, + struct snd_pcm_hw_params *params) +{ + struct snd_interval *rate =3D hw_param_interval(params, SNDRV_PCM_HW_PARA= M_RATE); + struct snd_interval *channels =3D hw_param_interval(params, SNDRV_PCM_HW_= PARAM_CHANNELS); + struct snd_mask *fmt =3D hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); + + rate->min =3D rate->max =3D 48000; + channels->min =3D channels->max =3D 2; + snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S16_LE); + + return 0; +} + static int sc7280_snd_platform_probe(struct platform_device *pdev) { struct snd_soc_card *card; @@ -387,6 +404,8 @@ static int sc7280_snd_platform_probe(struct platform_de= vice *pdev) for_each_card_prelinks(card, i, link) { link->init =3D sc7280_init; link->ops =3D &sc7280_ops; + if (link->no_pcm =3D=3D 1) + link->be_hw_params_fixup =3D sc7280_snd_be_hw_params_fixup; } =20 return devm_snd_soc_register_card(dev, card); --=20 2.21.0 From nobody Sun Feb 8 19:43:53 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 26A81EB64DA for ; Mon, 19 Jun 2023 10:17:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231933AbjFSKRK (ORCPT ); Mon, 19 Jun 2023 06:17:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59396 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231901AbjFSKRB (ORCPT ); Mon, 19 Jun 2023 06:17:01 -0400 Received: from mail-wr1-x42a.google.com (mail-wr1-x42a.google.com [IPv6:2a00:1450:4864:20::42a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2AF7199 for ; Mon, 19 Jun 2023 03:17:00 -0700 (PDT) Received: by mail-wr1-x42a.google.com with SMTP id ffacd0b85a97d-307d20548adso2339792f8f.0 for ; Mon, 19 Jun 2023 03:17:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687169818; x=1689761818; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=RuQSolMY+GsunpVDUBYRLCP9uTfJjpPU4KcdicPOHq4=; b=wEV0ue9J+u2a2HLQ1CP4MMx4oGUdCkt99zwyjc1W2LXUU+UOnfNpWLbPyorE15KNuh U8NmkVrj022hXe0Zu+MXJ6IjR0ZDkR4U8Tdz1GjgGdFlq9wM+ChK/oftoibeGpZNb0OY SY8NPWh/scWhHbh/m020O0nK5HbJQbsW3lidlAwxPyxIZPAMQgJYwrpFK5YXlN8Ekg52 H9iq0M+OJeSsxY679hBNisfWGI0R4dDLtvfAHXXne+oGRTUBfhQqitqDPcmdwG3jCoRF PkfQi6Qswfa7rC1TNenqhpjjWGoQSO+fM3DvX4B0SS2kSNgRqM9drcAJzS0dtGyIaWGc tqeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687169818; x=1689761818; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RuQSolMY+GsunpVDUBYRLCP9uTfJjpPU4KcdicPOHq4=; b=Jnx/CuvaUT1rEgpGdh1HgK5Iz1U6rGDOckupgkcVOMYEQ+Q4Muh8R97EcNdbpY9Yh3 QJOoqYWcqa6ieSYXUcF5TmqTVh6XUZu/v3gWjko+AqNp7Bn5ircIXEgN/vtDCrT/1982 s7CQEQG+bbvJzhtL210qmIuLW9HLSMZpHAxtAuZUO+KEvt0IZbe7aT3kzt2mTfsTknnr N5OMHeGUSt1w8mTubmNZbecTNkQVBrSPVcWclQzBQL0pRQG4Dq6gy1BjGspuGh8wiVCp iikSHoShfFeilpemVhUbebrY25Vfquv6pqPdhN7VsyCBmK/WclDoPnGNF9Ynq09nId2d qE2w== X-Gm-Message-State: AC+VfDwfm27Oo5+8cqDCRaKZf+2CE6sR/vr5fCUs5vXJG+6m3MXnTNvW zuMacNqVhUO8cm9YY5DQ6sJ2sA== X-Google-Smtp-Source: ACHHUZ7BIVHsLCveYS2BY00A5DGsfQvOZmnevUwUYrB78+bxfIPEytNYbcdcNJd1tSwKU7IpnCOegw== X-Received: by 2002:a5d:464e:0:b0:30f:c1d6:61cf with SMTP id j14-20020a5d464e000000b0030fc1d661cfmr5503176wrs.51.1687169818587; Mon, 19 Jun 2023 03:16:58 -0700 (PDT) Received: from localhost.localdomain ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id c2-20020a5d5282000000b002fae7408544sm31146922wrv.108.2023.06.19.03.16.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jun 2023 03:16:58 -0700 (PDT) From: Srinivas Kandagatla To: broonie@kernel.org Cc: perex@perex.cz, tiwai@suse.com, lgirdwood@gmail.com, ckeepax@opensource.cirrus.com, kuninori.morimoto.gx@renesas.com, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, alsa-devel@alsa-project.org, Mohammad Rafi Shaik , Srinivas Kandagatla Subject: [PATCH v3 02/11] ASoC: q6dsp: q6apm: add end of stream events Date: Mon, 19 Jun 2023 11:16:44 +0100 Message-Id: <20230619101653.9750-3-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> References: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Mohammad Rafi Shaik EOS event from dsp is currently not sent to the dai drivers, add the missing callback. Signed-off-by: Mohammad Rafi Shaik Signed-off-by: Srinivas Kandagatla --- sound/soc/qcom/qdsp6/q6apm.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sound/soc/qcom/qdsp6/q6apm.c b/sound/soc/qcom/qdsp6/q6apm.c index a7a3f973eb6d..b07fee8ccac1 100644 --- a/sound/soc/qcom/qdsp6/q6apm.c +++ b/sound/soc/qcom/qdsp6/q6apm.c @@ -497,6 +497,9 @@ static int graph_callback(struct gpr_resp_pkt *data, vo= id *priv, int op) } break; case DATA_CMD_WR_SH_MEM_EP_EOS_RENDERED: + client_event =3D APM_CLIENT_EVENT_CMD_EOS_DONE; + if (graph->cb) + graph->cb(client_event, hdr->token, data->payload, graph->priv); break; case GPR_BASIC_RSP_RESULT: switch (result->opcode) { --=20 2.21.0 From nobody Sun Feb 8 19:43:53 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D2899EB64D9 for ; Mon, 19 Jun 2023 10:17:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231799AbjFSKRO (ORCPT ); Mon, 19 Jun 2023 06:17:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59414 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231910AbjFSKRC (ORCPT ); Mon, 19 Jun 2023 06:17:02 -0400 Received: from mail-wr1-x42c.google.com (mail-wr1-x42c.google.com [IPv6:2a00:1450:4864:20::42c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 079D598 for ; Mon, 19 Jun 2023 03:17:01 -0700 (PDT) Received: by mail-wr1-x42c.google.com with SMTP id ffacd0b85a97d-3113da5260dso773150f8f.2 for ; Mon, 19 Jun 2023 03:17:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687169819; x=1689761819; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=9JFL8jNKRrHzDOE8BEGRQfXvBY019VxhOr2ufujXe1U=; b=d5rsWEtrwYPU3hk50ll38maHjk7H4KVUW4qeJVHM1vYJkX5V703bjfz1cSBJa7GbCu ku/HpXX8X47EdUqR9aAVgJPUcWgNL4HoXh7c6jg/VqIDiL+KAOIUlH6HfFSz57C1BAkZ DSfnCsk1IKuE1efmNXIVPaSrCHBQaZdW+GDxnqZsOVaL8oWcVPrbzWu7QkZdk3+bjaL2 qbFaBwdRi77IQYgzZXnYKpPHFKBErEISKSTGtQruTlmxd+C93GGLbEO+pRkhjXRj3ytf n+u3Y+00lFj+83OJiQjCtGf1kjAaWNyDvS5Z7OVSYapfvcn60AGqPfLUo4F+BKI6F7JF Qesg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687169819; x=1689761819; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9JFL8jNKRrHzDOE8BEGRQfXvBY019VxhOr2ufujXe1U=; b=TTbaQApi2aE/AfYduP0tDMQ4xF3qamriUo3MTHeVEY+VR2/PAq4AnCkoKovPdOgGsU OLZV606kAmBKlGMW5vv0iw/lemIwDzgxMRWMMXDplAjGWS1i+NqPD2RGQK9C5/Cp21y0 cRS0XgwiMEhjXLZE8jR5sj+5HXSFxtSUk3j5pVCUDNVvhPuquVW4qqbE9m4D+9+eB7vF yegBEjFyDdiItzTabqZwjqlQsHpLJnBlRhcPhBVk2HcR2Zx4Fw1lhm6Jb7GmNZo/UAMQ lwJpMkKsDkLX2yfgW8Vit/vdApyO6KXW9N7SBJKJLyYsgQH3EZ9u+vSWY/ZvuxyyuC9e 2KyA== X-Gm-Message-State: AC+VfDyKcV28vmSRUPAKh3HOCZR0nwDqm6CxVzSJqMt/8AW3lkrPikpN yYPefUm7FuSPkXGcFU5AeSFdJA== X-Google-Smtp-Source: ACHHUZ5SJqR17WP/PXrxE8kDrua5KYQ+rNQy9+Dv1AOTu9r5nypm52CrkIsN1YgJtlFhvTrDT+5VNA== X-Received: by 2002:a5d:5305:0:b0:30f:d2d3:55a8 with SMTP id e5-20020a5d5305000000b0030fd2d355a8mr5902494wrv.11.1687169819499; Mon, 19 Jun 2023 03:16:59 -0700 (PDT) Received: from localhost.localdomain ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id c2-20020a5d5282000000b002fae7408544sm31146922wrv.108.2023.06.19.03.16.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jun 2023 03:16:58 -0700 (PDT) From: Srinivas Kandagatla To: broonie@kernel.org Cc: perex@perex.cz, tiwai@suse.com, lgirdwood@gmail.com, ckeepax@opensource.cirrus.com, kuninori.morimoto.gx@renesas.com, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, alsa-devel@alsa-project.org, Srinivas Kandagatla Subject: [PATCH v3 03/11] ASoC: q6dsp: audioreach: add helper function to set u32 param Date: Mon, 19 Jun 2023 11:16:45 +0100 Message-Id: <20230619101653.9750-4-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> References: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Some of the Audioreach commands take a u32 value, ex: PARAM_ID_MODULE_ENABLE. It makes more sense to provide a helper function so that other new commands can reuse this. Signed-off-by: Srinivas Kandagatla --- sound/soc/qcom/qdsp6/audioreach.c | 100 +++++++----------------------- sound/soc/qcom/qdsp6/audioreach.h | 2 + 2 files changed, 26 insertions(+), 76 deletions(-) diff --git a/sound/soc/qcom/qdsp6/audioreach.c b/sound/soc/qcom/qdsp6/audio= reach.c index 8d9410dcbd45..0acd4a75d5cd 100644 --- a/sound/soc/qcom/qdsp6/audioreach.c +++ b/sound/soc/qcom/qdsp6/audioreach.c @@ -732,33 +732,32 @@ static int audioreach_codec_dma_set_media_format(stru= ct q6apm_graph *graph, return rc; } =20 -static int audioreach_sal_limiter_enable(struct q6apm_graph *graph, - struct audioreach_module *module, bool enable) +int audioreach_send_u32_param(struct q6apm_graph *graph, struct audioreach= _module *module, + uint32_t param_id, uint32_t param_val) { struct apm_module_param_data *param_data; - struct param_id_sal_limiter_enable *limiter_enable; - int payload_size; struct gpr_pkt *pkt; - int rc; + uint32_t *param; + int rc, payload_size; void *p; =20 - payload_size =3D sizeof(*limiter_enable) + APM_MODULE_PARAM_DATA_SIZE; - - pkt =3D audioreach_alloc_apm_cmd_pkt(payload_size, APM_CMD_SET_CFG, 0); - if (IS_ERR(pkt)) - return PTR_ERR(pkt); + payload_size =3D sizeof(uint32_t) + APM_MODULE_PARAM_DATA_SIZE; + p =3D audioreach_alloc_apm_cmd_pkt(payload_size, APM_CMD_SET_CFG, 0); + if (IS_ERR(p)) + return -ENOMEM; =20 - p =3D (void *)pkt + GPR_HDR_SIZE + APM_CMD_HDR_SIZE; + pkt =3D p; + p =3D p + GPR_HDR_SIZE + APM_CMD_HDR_SIZE; =20 param_data =3D p; param_data->module_instance_id =3D module->instance_id; param_data->error_code =3D 0; - param_data->param_id =3D PARAM_ID_SAL_LIMITER_ENABLE; - param_data->param_size =3D sizeof(*limiter_enable); - p =3D p + APM_MODULE_PARAM_DATA_SIZE; - limiter_enable =3D p; + param_data->param_id =3D param_id; + param_data->param_size =3D sizeof(uint32_t); =20 - limiter_enable->enable_lim =3D enable; + p =3D p + APM_MODULE_PARAM_DATA_SIZE; + param =3D p; + *param =3D param_val; =20 rc =3D q6apm_send_cmd_sync(graph->apm, pkt, 0); =20 @@ -766,77 +765,26 @@ static int audioreach_sal_limiter_enable(struct q6apm= _graph *graph, =20 return rc; } +EXPORT_SYMBOL_GPL(audioreach_send_u32_param); + +static int audioreach_sal_limiter_enable(struct q6apm_graph *graph, + struct audioreach_module *module, bool enable) +{ + return audioreach_send_u32_param(graph, module, PARAM_ID_SAL_LIMITER_ENAB= LE, enable); +} =20 static int audioreach_sal_set_media_format(struct q6apm_graph *graph, struct audioreach_module *module, struct audioreach_module_config *cfg) { - struct apm_module_param_data *param_data; - struct param_id_sal_output_config *media_format; - int payload_size; - struct gpr_pkt *pkt; - int rc; - void *p; - - payload_size =3D sizeof(*media_format) + APM_MODULE_PARAM_DATA_SIZE; - - pkt =3D audioreach_alloc_apm_cmd_pkt(payload_size, APM_CMD_SET_CFG, 0); - if (IS_ERR(pkt)) - return PTR_ERR(pkt); - - p =3D (void *)pkt + GPR_HDR_SIZE + APM_CMD_HDR_SIZE; - - param_data =3D p; - param_data->module_instance_id =3D module->instance_id; - param_data->error_code =3D 0; - param_data->param_id =3D PARAM_ID_SAL_OUTPUT_CFG; - param_data->param_size =3D sizeof(*media_format); - p =3D p + APM_MODULE_PARAM_DATA_SIZE; - media_format =3D p; - - media_format->bits_per_sample =3D cfg->bit_width; - - rc =3D q6apm_send_cmd_sync(graph->apm, pkt, 0); - - kfree(pkt); - - return rc; + return audioreach_send_u32_param(graph, module, PARAM_ID_SAL_OUTPUT_CFG, = cfg->bit_width); } =20 static int audioreach_module_enable(struct q6apm_graph *graph, struct audioreach_module *module, bool enable) { - struct apm_module_param_data *param_data; - struct param_id_module_enable *param; - int payload_size; - struct gpr_pkt *pkt; - int rc; - void *p; - - payload_size =3D sizeof(*param) + APM_MODULE_PARAM_DATA_SIZE; - - pkt =3D audioreach_alloc_apm_cmd_pkt(payload_size, APM_CMD_SET_CFG, 0); - if (IS_ERR(pkt)) - return PTR_ERR(pkt); - - p =3D (void *)pkt + GPR_HDR_SIZE + APM_CMD_HDR_SIZE; - - param_data =3D p; - param_data->module_instance_id =3D module->instance_id; - param_data->error_code =3D 0; - param_data->param_id =3D PARAM_ID_MODULE_ENABLE; - param_data->param_size =3D sizeof(*param); - p =3D p + APM_MODULE_PARAM_DATA_SIZE; - param =3D p; - - param->enable =3D enable; - - rc =3D q6apm_send_cmd_sync(graph->apm, pkt, 0); - - kfree(pkt); - - return rc; + return audioreach_send_u32_param(graph, module, PARAM_ID_MODULE_ENABLE, e= nable); } =20 static int audioreach_mfc_set_media_format(struct q6apm_graph *graph, diff --git a/sound/soc/qcom/qdsp6/audioreach.h b/sound/soc/qcom/qdsp6/audio= reach.h index 3ebb81cd7cb0..18d8d243b06b 100644 --- a/sound/soc/qcom/qdsp6/audioreach.h +++ b/sound/soc/qcom/qdsp6/audioreach.h @@ -752,4 +752,6 @@ int audioreach_set_media_format(struct q6apm_graph *gra= ph, int audioreach_shared_memory_send_eos(struct q6apm_graph *graph); int audioreach_gain_set_vol_ctrl(struct q6apm *apm, struct audioreach_module *module, int vol); +int audioreach_send_u32_param(struct q6apm_graph *graph, struct audioreach= _module *module, + uint32_t param_id, uint32_t param_val); #endif /* __AUDIOREACH_H__ */ --=20 2.21.0 From nobody Sun Feb 8 19:43:53 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 641E8EB64DA for ; Mon, 19 Jun 2023 10:17:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231971AbjFSKRZ (ORCPT ); Mon, 19 Jun 2023 06:17:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59422 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231917AbjFSKRD (ORCPT ); Mon, 19 Jun 2023 06:17:03 -0400 Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0DBAB9B for ; Mon, 19 Jun 2023 03:17:02 -0700 (PDT) Received: by mail-wr1-x433.google.com with SMTP id ffacd0b85a97d-31122c346f4so3660215f8f.3 for ; Mon, 19 Jun 2023 03:17:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687169820; x=1689761820; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=4CabZ5vNQt3fVXdlNPDIEC+PWoUnQG/H1hmXckZrPM8=; b=AzTtw+9+OUva2zMO/PcC0xBcgizEGMiUVI50VujU1VYB05v5Dzq4eRlkcJ2dIYv2k+ /1/lMRyuYR/k90XvAXTO/D3k25ZQpKbI5hn7FCRBak847FNQKM935eES7MRVL2xT79lx 2sFr3cLMDPGm6h2cWg+NVwKTD6xhxK22ri2OzYlG0xMvaWtpkV70IqmMY0gXzkoGfWTH X9JkKTxDwEcuicg5w8bv4yQQ4FiZbCUsQjKrfKf/4ZCBlBloXtrZef0DQObhJTbH5EkO EtWMttc5hc6CJJeDgzzJrsWy9qhQJyOndYeEVO8Assi0bxvD7FrgrlO3Q27TeWFDXZx3 si1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687169820; x=1689761820; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4CabZ5vNQt3fVXdlNPDIEC+PWoUnQG/H1hmXckZrPM8=; b=esPJe2w0ogUAzvfYNbiZZBTw3XTMJfOdGyCVA/TIIK8hm1XJ2Do6uAIsw5WnooDAQn YxyQYRBdyYqod2VPXnffhxugVIY/d9es2l/1q+i4GFXfNjgkBOEcQu/0D25gttecw/aK vdg1nzYtA/0dd34XXz97mhpRPxcvWWU/q9vRJrRMkR/61AoABWbFadCdCYL2K8twVfho KwOE5IVkZ4lM5ozxXBba3jC+n3LRRAsLnZf5l/VQgiJu/20eb+HiweJdcZQgbqT7D9lY /+EqU5p1puN4L17vGt/JWcaeU6wLQiR8+v5dSHtAokMpNu6QaL3jipOcDw6pxEYk137r v40g== X-Gm-Message-State: AC+VfDz1GEQ7JPwGBNELO65IWMo1v+zL419O1P58Itd3E+hHuiVVM0f1 zdlODPNN35d8N/Fn0wrNZAP2BQ== X-Google-Smtp-Source: ACHHUZ6KsV55NlY81gGBGHo2bEA1KQrWMXPjeGpRaR//1XJ+7ISXhnxwMCwVtTf6VOzqvIsOWMG9ww== X-Received: by 2002:a5d:58d1:0:b0:30f:bcfd:c690 with SMTP id o17-20020a5d58d1000000b0030fbcfdc690mr8514768wrf.38.1687169820608; Mon, 19 Jun 2023 03:17:00 -0700 (PDT) Received: from localhost.localdomain ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id c2-20020a5d5282000000b002fae7408544sm31146922wrv.108.2023.06.19.03.16.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jun 2023 03:16:59 -0700 (PDT) From: Srinivas Kandagatla To: broonie@kernel.org Cc: perex@perex.cz, tiwai@suse.com, lgirdwood@gmail.com, ckeepax@opensource.cirrus.com, kuninori.morimoto.gx@renesas.com, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, alsa-devel@alsa-project.org, Srinivas Kandagatla , Mohammad Rafi Shaik Subject: [PATCH v3 04/11] ASoC: q6dsp: audioreach: Add placeholder decoder for compress playback Date: Mon, 19 Jun 2023 11:16:46 +0100 Message-Id: <20230619101653.9750-5-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> References: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add placeholder decoder graph module for compressed playback feature. Co-developed-by: Mohammad Rafi Shaik Signed-off-by: Mohammad Rafi Shaik Signed-off-by: Srinivas Kandagatla --- sound/soc/qcom/qdsp6/audioreach.c | 2 + sound/soc/qcom/qdsp6/audioreach.h | 14 +++++++ sound/soc/qcom/qdsp6/q6apm.c | 65 +++++++++++++++++++++++++++++++ sound/soc/qcom/qdsp6/q6apm.h | 4 ++ 4 files changed, 85 insertions(+) diff --git a/sound/soc/qcom/qdsp6/audioreach.c b/sound/soc/qcom/qdsp6/audio= reach.c index 0acd4a75d5cd..34cbc4d05918 100644 --- a/sound/soc/qcom/qdsp6/audioreach.c +++ b/sound/soc/qcom/qdsp6/audioreach.c @@ -1140,6 +1140,8 @@ int audioreach_set_media_format(struct q6apm_graph *g= raph, struct audioreach_mod case MODULE_ID_PCM_DEC: case MODULE_ID_PCM_ENC: case MODULE_ID_PCM_CNV: + case MODULE_ID_PLACEHOLDER_DECODER: + case MODULE_ID_PLACEHOLDER_ENCODER: rc =3D audioreach_pcm_set_media_format(graph, module, cfg); break; case MODULE_ID_DISPLAY_PORT_SINK: diff --git a/sound/soc/qcom/qdsp6/audioreach.h b/sound/soc/qcom/qdsp6/audio= reach.h index 18d8d243b06b..c4e03a49ac82 100644 --- a/sound/soc/qcom/qdsp6/audioreach.h +++ b/sound/soc/qcom/qdsp6/audioreach.h @@ -15,6 +15,8 @@ struct q6apm_graph; #define MODULE_ID_PCM_CNV 0x07001003 #define MODULE_ID_PCM_ENC 0x07001004 #define MODULE_ID_PCM_DEC 0x07001005 +#define MODULE_ID_PLACEHOLDER_ENCODER 0x07001008 +#define MODULE_ID_PLACEHOLDER_DECODER 0x07001009 #define MODULE_ID_SAL 0x07001010 #define MODULE_ID_MFC 0x07001015 #define MODULE_ID_CODEC_DMA_SINK 0x07001023 @@ -22,6 +24,9 @@ struct q6apm_graph; #define MODULE_ID_I2S_SINK 0x0700100A #define MODULE_ID_I2S_SOURCE 0x0700100B #define MODULE_ID_DATA_LOGGING 0x0700101A +#define MODULE_ID_AAC_DEC 0x0700101F +#define MODULE_ID_FLAC_DEC 0x0700102F +#define MODULE_ID_MP3_DECODE 0x0700103B #define MODULE_ID_DISPLAY_PORT_SINK 0x07001069 =20 #define APM_CMD_GET_SPF_STATE 0x01001021 @@ -608,6 +613,15 @@ struct param_id_vol_ctrl_master_gain { } __packed; =20 =20 +#define PARAM_ID_REMOVE_INITIAL_SILENCE 0x0800114B +#define PARAM_ID_REMOVE_TRAILING_SILENCE 0x0800115D + +#define PARAM_ID_REAL_MODULE_ID 0x0800100B + +struct param_id_placeholder_real_module_id { + uint32_t real_module_id; +} __packed; + /* Graph */ struct audioreach_connection { /* Connections */ diff --git a/sound/soc/qcom/qdsp6/q6apm.c b/sound/soc/qcom/qdsp6/q6apm.c index b07fee8ccac1..7bfac9492ab5 100644 --- a/sound/soc/qcom/qdsp6/q6apm.c +++ b/sound/soc/qcom/qdsp6/q6apm.c @@ -298,6 +298,71 @@ int q6apm_unmap_memory_regions(struct q6apm_graph *gra= ph, unsigned int dir) } EXPORT_SYMBOL_GPL(q6apm_unmap_memory_regions); =20 +int q6apm_remove_initial_silence(struct device *dev, struct q6apm_graph *g= raph, uint32_t samples) +{ + struct audioreach_module *module; + + module =3D q6apm_find_module_by_mid(graph, MODULE_ID_PLACEHOLDER_DECODER); + if (!module) + return -ENODEV; + + return audioreach_send_u32_param(graph, module, PARAM_ID_REMOVE_INITIAL_S= ILENCE, samples); +} +EXPORT_SYMBOL_GPL(q6apm_remove_initial_silence); + +int q6apm_remove_trailing_silence(struct device *dev, struct q6apm_graph *= graph, uint32_t samples) +{ + struct audioreach_module *module; + + module =3D q6apm_find_module_by_mid(graph, MODULE_ID_PLACEHOLDER_DECODER); + if (!module) + return -ENODEV; + + return audioreach_send_u32_param(graph, module, PARAM_ID_REMOVE_TRAILING_= SILENCE, samples); +} +EXPORT_SYMBOL_GPL(q6apm_remove_trailing_silence); + +int q6apm_enable_compress_module(struct device *dev, struct q6apm_graph *g= raph, bool en) +{ + struct audioreach_module *module; + + module =3D q6apm_find_module_by_mid(graph, MODULE_ID_PLACEHOLDER_DECODER); + if (!module) + return -ENODEV; + + return audioreach_send_u32_param(graph, module, PARAM_ID_MODULE_ENABLE, e= n); +} +EXPORT_SYMBOL_GPL(q6apm_enable_compress_module); + +int q6apm_set_real_module_id(struct device *dev, struct q6apm_graph *graph, + uint32_t codec_id) +{ + struct audioreach_module *module; + uint32_t module_id; + + module =3D q6apm_find_module_by_mid(graph, MODULE_ID_PLACEHOLDER_DECODER); + if (!module) + return -ENODEV; + + switch (codec_id) { + case SND_AUDIOCODEC_MP3: + module_id =3D MODULE_ID_MP3_DECODE; + break; + case SND_AUDIOCODEC_AAC: + module_id =3D MODULE_ID_AAC_DEC; + break; + case SND_AUDIOCODEC_FLAC: + module_id =3D MODULE_ID_FLAC_DEC; + break; + default: + return -EINVAL; + } + + return audioreach_send_u32_param(graph, module, PARAM_ID_REAL_MODULE_ID, + module_id); +} +EXPORT_SYMBOL_GPL(q6apm_set_real_module_id); + int q6apm_graph_media_format_pcm(struct q6apm_graph *graph, struct audiore= ach_module_config *cfg) { struct audioreach_graph_info *info =3D graph->info; diff --git a/sound/soc/qcom/qdsp6/q6apm.h b/sound/soc/qcom/qdsp6/q6apm.h index 7005be9b63e3..87d67faf5f1a 100644 --- a/sound/soc/qcom/qdsp6/q6apm.h +++ b/sound/soc/qcom/qdsp6/q6apm.h @@ -147,4 +147,8 @@ int q6apm_graph_get_rx_shmem_module_iid(struct q6apm_gr= aph *graph); =20 bool q6apm_is_adsp_ready(void); =20 +int q6apm_enable_compress_module(struct device *dev, struct q6apm_graph *g= raph, bool en); +int q6apm_remove_initial_silence(struct device *dev, struct q6apm_graph *g= raph, uint32_t samples); +int q6apm_remove_trailing_silence(struct device *dev, struct q6apm_graph *= graph, uint32_t samples); +int q6apm_set_real_module_id(struct device *dev, struct q6apm_graph *graph= , uint32_t codec_id); #endif /* __APM_GRAPH_ */ --=20 2.21.0 From nobody Sun Feb 8 19:43:53 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EAB1BEB64D9 for ; Mon, 19 Jun 2023 10:17:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229703AbjFSKRV (ORCPT ); Mon, 19 Jun 2023 06:17:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59436 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231384AbjFSKRF (ORCPT ); Mon, 19 Jun 2023 06:17:05 -0400 Received: from mail-wr1-x432.google.com (mail-wr1-x432.google.com [IPv6:2a00:1450:4864:20::432]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 451E113D for ; Mon, 19 Jun 2023 03:17:03 -0700 (PDT) Received: by mail-wr1-x432.google.com with SMTP id ffacd0b85a97d-3110a5f2832so3191624f8f.1 for ; Mon, 19 Jun 2023 03:17:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687169821; x=1689761821; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=iYs30udEL8nhpF3tCDr6b0n4CbAIdCAeMZJMw59Oucc=; b=s5rAk5fL+527HFVNAUOWsp4wnKx2MX4c5Ul3TFnLxc2r6hC5E7Suq4kRZ3BkXk7D7M 4YqEHVF7V3hIZEPybDue4dVIWh1Z/bPtVCMIwx0a01MUnhW4SBE3POPkfTrsJKxUN1K5 eQAewL53ELoqd/vJ5FbJz3KDRdEGCRc2hwxXHY+EnM4/8DMzWqUzV3yns/QAbb7w2vrH 8B+w9gImVo8ecwTqyxwuJ+7rMnQln+YBBlzz8ACN9hioq01NI0yGV8vK++nEu83mT2nv JXIHaLezqLjr5Vx7/DX6GwBit2pVg8XeM3DIxXWucZRJCpB7jYi2eue1QC30UJ6uQ5YG vZEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687169821; x=1689761821; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=iYs30udEL8nhpF3tCDr6b0n4CbAIdCAeMZJMw59Oucc=; b=Lo+fdVY+fHxk7I2Zs5cF1hVVUE6kitGlpPS7jOvy89TfThjsFszbGzUj74QRcKkBBo VDVkBYfycLZvqz3zm1ZVQPPTVMkDebe9R1hwL2ocrGP8sOQCkdP0HXzZcVNoSaOJC7Ub RDjIcHf9UnCAcV13pAt+WmaO15ITL40DQnuP1c7uvxMPzILaI0SwvciAtVrBoBJde+hS eE4mQbNOkamdkPvoDGuGlXThMGU+K4eyQNVdpKK+43VIbIqJs/Tr98yQ1EIXHRV4XW9S 256wmDGgTnD2Sy0pOvehep/VMoqtvTuFlxN7YIMLmztR2wXHrhi2SH2q3a/hN7ps4j1T Q8Qg== X-Gm-Message-State: AC+VfDw2g6pxXjknnMCQMy66JXXiFWkPTZ8ipMWhCB1WP8IMMADNm4RM BfhGWf4IrpSZZ1OEpespisl9kw== X-Google-Smtp-Source: ACHHUZ5nlFKBSPgL2hxULeGcw8a0m8INaIQY81kSCHA7LcAiEOx0bFvbB+1yAnBnYTWsi0BaY1MqlA== X-Received: by 2002:adf:f1c5:0:b0:307:7959:6461 with SMTP id z5-20020adff1c5000000b0030779596461mr8136462wro.31.1687169821671; Mon, 19 Jun 2023 03:17:01 -0700 (PDT) Received: from localhost.localdomain ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id c2-20020a5d5282000000b002fae7408544sm31146922wrv.108.2023.06.19.03.17.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jun 2023 03:17:01 -0700 (PDT) From: Srinivas Kandagatla To: broonie@kernel.org Cc: perex@perex.cz, tiwai@suse.com, lgirdwood@gmail.com, ckeepax@opensource.cirrus.com, kuninori.morimoto.gx@renesas.com, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, alsa-devel@alsa-project.org, Mohammad Rafi Shaik , Srinivas Kandagatla Subject: [PATCH v3 05/11] ASoC: q6dsp: audioreach: Add support to set compress format params Date: Mon, 19 Jun 2023 11:16:47 +0100 Message-Id: <20230619101653.9750-6-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> References: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Mohammad Rafi Shaik Add function for setting compress params. Signed-off-by: Mohammad Rafi Shaik Co-developed-by: Srinivas Kandagatla Signed-off-by: Srinivas Kandagatla --- sound/soc/qcom/qdsp6/audioreach.c | 139 ++++++++++++++++++++++++++---- sound/soc/qcom/qdsp6/audioreach.h | 28 ++++++ sound/soc/qcom/qdsp6/q6apm-dai.c | 1 + 3 files changed, 149 insertions(+), 19 deletions(-) diff --git a/sound/soc/qcom/qdsp6/audioreach.c b/sound/soc/qcom/qdsp6/audio= reach.c index 34cbc4d05918..ba262408b27a 100644 --- a/sound/soc/qcom/qdsp6/audioreach.c +++ b/sound/soc/qcom/qdsp6/audioreach.c @@ -834,6 +834,99 @@ static int audioreach_mfc_set_media_format(struct q6ap= m_graph *graph, return rc; } =20 +static int audioreach_set_compr_media_format(struct media_format *media_fm= t_hdr, + void *p, struct audioreach_module_config *mcfg) +{ + struct payload_media_fmt_aac_t *aac_cfg; + struct payload_media_fmt_pcm *mp3_cfg; + struct payload_media_fmt_flac_t *flac_cfg; + + switch (mcfg->fmt) { + case SND_AUDIOCODEC_MP3: + media_fmt_hdr->data_format =3D DATA_FORMAT_RAW_COMPRESSED; + media_fmt_hdr->fmt_id =3D MEDIA_FMT_ID_MP3; + media_fmt_hdr->payload_size =3D 0; + p =3D p + sizeof(*media_fmt_hdr); + mp3_cfg =3D p; + mp3_cfg->sample_rate =3D mcfg->sample_rate; + mp3_cfg->bit_width =3D mcfg->bit_width; + mp3_cfg->alignment =3D PCM_LSB_ALIGNED; + mp3_cfg->bits_per_sample =3D mcfg->bit_width; + mp3_cfg->q_factor =3D mcfg->bit_width - 1; + mp3_cfg->endianness =3D PCM_LITTLE_ENDIAN; + mp3_cfg->num_channels =3D mcfg->num_channels; + + if (mcfg->num_channels =3D=3D 1) { + mp3_cfg->channel_mapping[0] =3D PCM_CHANNEL_L; + } else if (mcfg->num_channels =3D=3D 2) { + mp3_cfg->channel_mapping[0] =3D PCM_CHANNEL_L; + mp3_cfg->channel_mapping[1] =3D PCM_CHANNEL_R; + } + break; + case SND_AUDIOCODEC_AAC: + media_fmt_hdr->data_format =3D DATA_FORMAT_RAW_COMPRESSED; + media_fmt_hdr->fmt_id =3D MEDIA_FMT_ID_AAC; + media_fmt_hdr->payload_size =3D sizeof(struct payload_media_fmt_aac_t); + p =3D p + sizeof(*media_fmt_hdr); + aac_cfg =3D p; + aac_cfg->aac_fmt_flag =3D 0; + aac_cfg->audio_obj_type =3D 5; + aac_cfg->num_channels =3D mcfg->num_channels; + aac_cfg->total_size_of_PCE_bits =3D 0; + aac_cfg->sample_rate =3D mcfg->sample_rate; + break; + case SND_AUDIOCODEC_FLAC: + media_fmt_hdr->data_format =3D DATA_FORMAT_RAW_COMPRESSED; + media_fmt_hdr->fmt_id =3D MEDIA_FMT_ID_FLAC; + media_fmt_hdr->payload_size =3D sizeof(struct payload_media_fmt_flac_t); + p =3D p + sizeof(*media_fmt_hdr); + flac_cfg =3D p; + flac_cfg->sample_size =3D mcfg->codec.options.flac_d.sample_size; + flac_cfg->num_channels =3D mcfg->num_channels; + flac_cfg->min_blk_size =3D mcfg->codec.options.flac_d.min_blk_size; + flac_cfg->max_blk_size =3D mcfg->codec.options.flac_d.max_blk_size; + flac_cfg->sample_rate =3D mcfg->sample_rate; + flac_cfg->min_frame_size =3D mcfg->codec.options.flac_d.min_frame_size; + flac_cfg->max_frame_size =3D mcfg->codec.options.flac_d.max_frame_size; + break; + default: + return -EINVAL; + } + + return 0; +} + +int audioreach_compr_set_param(struct q6apm_graph *graph, struct audioreac= h_module_config *mcfg) +{ + struct media_format *header; + struct gpr_pkt *pkt; + int iid, payload_size, rc; + void *p; + + payload_size =3D sizeof(struct apm_sh_module_media_fmt_cmd); + + iid =3D q6apm_graph_get_rx_shmem_module_iid(graph); + pkt =3D audioreach_alloc_cmd_pkt(payload_size, DATA_CMD_WR_SH_MEM_EP_MEDI= A_FORMAT, + 0, graph->port->id, iid); + + if (IS_ERR(pkt)) + return -ENOMEM; + + p =3D (void *)pkt + GPR_HDR_SIZE; + header =3D p; + rc =3D audioreach_set_compr_media_format(header, p, mcfg); + if (rc) { + kfree(pkt); + return rc; + } + + rc =3D gpr_send_port_pkt(graph->port, pkt); + kfree(pkt); + + return rc; +} +EXPORT_SYMBOL_GPL(audioreach_compr_set_param); + static int audioreach_i2s_set_media_format(struct q6apm_graph *graph, struct audioreach_module *module, struct audioreach_module_config *cfg) @@ -1037,25 +1130,33 @@ static int audioreach_shmem_set_media_format(struct= q6apm_graph *graph, p =3D p + APM_MODULE_PARAM_DATA_SIZE; =20 header =3D p; - header->data_format =3D DATA_FORMAT_FIXED_POINT; - header->fmt_id =3D MEDIA_FMT_ID_PCM; - header->payload_size =3D payload_size - sizeof(*header); - - p =3D p + sizeof(*header); - cfg =3D p; - cfg->sample_rate =3D mcfg->sample_rate; - cfg->bit_width =3D mcfg->bit_width; - cfg->alignment =3D PCM_LSB_ALIGNED; - cfg->bits_per_sample =3D mcfg->bit_width; - cfg->q_factor =3D mcfg->bit_width - 1; - cfg->endianness =3D PCM_LITTLE_ENDIAN; - cfg->num_channels =3D mcfg->num_channels; - - if (mcfg->num_channels =3D=3D 1) { - cfg->channel_mapping[0] =3D PCM_CHANNEL_L; - } else if (num_channels =3D=3D 2) { - cfg->channel_mapping[0] =3D PCM_CHANNEL_L; - cfg->channel_mapping[1] =3D PCM_CHANNEL_R; + if (mcfg->fmt =3D=3D SND_AUDIOCODEC_PCM) { + header->data_format =3D DATA_FORMAT_FIXED_POINT; + header->fmt_id =3D MEDIA_FMT_ID_PCM; + header->payload_size =3D payload_size - sizeof(*header); + + p =3D p + sizeof(*header); + cfg =3D p; + cfg->sample_rate =3D mcfg->sample_rate; + cfg->bit_width =3D mcfg->bit_width; + cfg->alignment =3D PCM_LSB_ALIGNED; + cfg->bits_per_sample =3D mcfg->bit_width; + cfg->q_factor =3D mcfg->bit_width - 1; + cfg->endianness =3D PCM_LITTLE_ENDIAN; + cfg->num_channels =3D mcfg->num_channels; + + if (mcfg->num_channels =3D=3D 1) + cfg->channel_mapping[0] =3D PCM_CHANNEL_L; + else if (num_channels =3D=3D 2) { + cfg->channel_mapping[0] =3D PCM_CHANNEL_L; + cfg->channel_mapping[1] =3D PCM_CHANNEL_R; + } + } else { + rc =3D audioreach_set_compr_media_format(header, p, mcfg); + if (rc) { + kfree(pkt); + return rc; + } } =20 rc =3D audioreach_graph_send_cmd_sync(graph, pkt, 0); diff --git a/sound/soc/qcom/qdsp6/audioreach.h b/sound/soc/qcom/qdsp6/audio= reach.h index c4e03a49ac82..dc089879b501 100644 --- a/sound/soc/qcom/qdsp6/audioreach.h +++ b/sound/soc/qcom/qdsp6/audioreach.h @@ -148,12 +148,15 @@ struct param_id_enc_bitrate_param { } __packed; =20 #define DATA_FORMAT_FIXED_POINT 1 +#define DATA_FORMAT_GENERIC_COMPRESSED 5 +#define DATA_FORMAT_RAW_COMPRESSED 6 #define PCM_LSB_ALIGNED 1 #define PCM_MSB_ALIGNED 2 #define PCM_LITTLE_ENDIAN 1 #define PCM_BIT_ENDIAN 2 =20 #define MEDIA_FMT_ID_PCM 0x09001000 +#define MEDIA_FMT_ID_MP3 0x09001009 #define PCM_CHANNEL_L 1 #define PCM_CHANNEL_R 2 #define SAMPLE_RATE_48K 48000 @@ -231,6 +234,28 @@ struct apm_media_format { uint32_t payload_size; } __packed; =20 +#define MEDIA_FMT_ID_FLAC 0x09001004 + +struct payload_media_fmt_flac_t { + uint16_t num_channels; + uint16_t sample_size; + uint16_t min_blk_size; + uint16_t max_blk_size; + uint32_t sample_rate; + uint32_t min_frame_size; + uint32_t max_frame_size; +} __packed; + +#define MEDIA_FMT_ID_AAC 0x09001001 + +struct payload_media_fmt_aac_t { + uint16_t aac_fmt_flag; + uint16_t audio_obj_type; + uint16_t num_channels; + uint16_t total_size_of_PCE_bits; + uint32_t sample_rate; +} __packed; + #define DATA_CMD_WR_SH_MEM_EP_EOS 0x04001002 #define WR_SH_MEM_EP_EOS_POLICY_LAST 1 #define WR_SH_MEM_EP_EOS_POLICY_EACH 2 @@ -730,6 +755,7 @@ struct audioreach_module_config { u32 channel_allocation; u32 sd_line_mask; int fmt; + struct snd_codec codec; u8 channel_map[AR_PCM_MAX_NUM_CHANNEL]; }; =20 @@ -768,4 +794,6 @@ int audioreach_gain_set_vol_ctrl(struct q6apm *apm, struct audioreach_module *module, int vol); int audioreach_send_u32_param(struct q6apm_graph *graph, struct audioreach= _module *module, uint32_t param_id, uint32_t param_val); +int audioreach_compr_set_param(struct q6apm_graph *graph, struct audioreac= h_module_config *mcfg); + #endif /* __AUDIOREACH_H__ */ diff --git a/sound/soc/qcom/qdsp6/q6apm-dai.c b/sound/soc/qcom/qdsp6/q6apm-= dai.c index 7f02f5b2c33f..9fff41ee98eb 100644 --- a/sound/soc/qcom/qdsp6/q6apm-dai.c +++ b/sound/soc/qcom/qdsp6/q6apm-dai.c @@ -155,6 +155,7 @@ static int q6apm_dai_prepare(struct snd_soc_component *= component, cfg.sample_rate =3D runtime->rate; cfg.num_channels =3D runtime->channels; cfg.bit_width =3D prtd->bits_per_sample; + cfg.fmt =3D SND_AUDIOCODEC_PCM; =20 if (prtd->state) { /* clear the previous setup if any */ --=20 2.21.0 From nobody Sun Feb 8 19:43:53 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5F65DEB64D9 for ; Mon, 19 Jun 2023 10:17:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231946AbjFSKRS (ORCPT ); Mon, 19 Jun 2023 06:17:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59440 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230522AbjFSKRF (ORCPT ); Mon, 19 Jun 2023 06:17:05 -0400 Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2822D1A6 for ; Mon, 19 Jun 2023 03:17:04 -0700 (PDT) Received: by mail-wr1-x42d.google.com with SMTP id ffacd0b85a97d-311167ba376so2970924f8f.1 for ; Mon, 19 Jun 2023 03:17:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687169822; x=1689761822; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hhDOcyfRIoE2cQHMZGlVdvXCRT+HvU3JTOnhcjqd13I=; b=K545tCci1GTfmEnyjn8i0zeEnnQq4kD+wGaUowMiGIfPnKKKsG9iwdbHcYM72jk4km NbUsDIGv4z1zDUspYUkKMHYkPtwgVVcYGJ2JPQtUFrwuoumHhBianHSJjjbt9QIQ8Gv3 ENkUz2UJVAnxCf9rjWxMcmtkdXfgQoUCdwZpEZRAIVLfJ4y3a8cXZi+NF8FFc9F70C8U K2+vhil7gSDTWz9yA+ph0NRd5lXuWj9bMc+/HYP30aKZotMvOVCbqfu0Oqh1qGHbxj92 NczQSKq/3Ns0iil16NlNKQj3wjS4QUbcm1wbK4T8kLixtSir8nVaQAqhDtXWl9rU6gv/ uxxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687169822; x=1689761822; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hhDOcyfRIoE2cQHMZGlVdvXCRT+HvU3JTOnhcjqd13I=; b=Le8XMo9j3SdN0cpdv/zjnjuVQJQgNxikD5vfW6IIOcBsUv9FURHEiCmqUhidnMKpDb 2GlspbYmftP0d1JEr7vwldIYbfwkxGbQFbwxhdQ8NTgvjCvdWWZ+09MO7XxkrjzDExfo UG5D8773/9oxWm/7BeG4Twjb1RdLP4QnRY6C3DRZVqnMh5Jdoo9Bcbw+ziO8PkGctheQ ejMvzyUgfosiDkOxw31Qj59s4cNBM3JT+jShK6wqHLlCInxB/2UVr7eIoJBbqjpNLQaP 8DMl5t481g4e35GyMD14X8PbNCZif+TmgumdquyQ8uF7ikM/yNxUkCSTivtpqQ8WICPM 3AEQ== X-Gm-Message-State: AC+VfDxwYhSrlR7ZGHXb3+ps9hKAfN1L/iKYvrJ2bw8S+L3N8dR9c6tz RToOsyIAGTfHMhnUtB5wKLPvPQ== X-Google-Smtp-Source: ACHHUZ6rFD9Xi0ixsLMYlGX+5AcwRfcQFbE58cljPfYsn+BKzSAKfColuB0CUTsPpZlELzAvg2dhRw== X-Received: by 2002:a5d:6711:0:b0:30f:c298:601d with SMTP id o17-20020a5d6711000000b0030fc298601dmr6654075wru.5.1687169822717; Mon, 19 Jun 2023 03:17:02 -0700 (PDT) Received: from localhost.localdomain ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id c2-20020a5d5282000000b002fae7408544sm31146922wrv.108.2023.06.19.03.17.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jun 2023 03:17:02 -0700 (PDT) From: Srinivas Kandagatla To: broonie@kernel.org Cc: perex@perex.cz, tiwai@suse.com, lgirdwood@gmail.com, ckeepax@opensource.cirrus.com, kuninori.morimoto.gx@renesas.com, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, alsa-devel@alsa-project.org, Mohammad Rafi Shaik , Srinivas Kandagatla Subject: [PATCH v3 06/11] ASoC: q6dsp: audioreach: Add gapless feature support Date: Mon, 19 Jun 2023 11:16:48 +0100 Message-Id: <20230619101653.9750-7-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> References: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: Mohammad Rafi Shaik Add support for setting EOS delay command and receive the EOS response from ADSP, for seamless compress offload playback feature. Co-developed-by: Mohammad Rafi Shaik Signed-off-by: Mohammad Rafi Shaik Signed-off-by: Srinivas Kandagatla --- sound/soc/qcom/qdsp6/audioreach.c | 11 +++++++++++ sound/soc/qcom/qdsp6/audioreach.h | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/sound/soc/qcom/qdsp6/audioreach.c b/sound/soc/qcom/qdsp6/audio= reach.c index ba262408b27a..5974c7929dd3 100644 --- a/sound/soc/qcom/qdsp6/audioreach.c +++ b/sound/soc/qcom/qdsp6/audioreach.c @@ -787,6 +787,14 @@ static int audioreach_module_enable(struct q6apm_graph= *graph, return audioreach_send_u32_param(graph, module, PARAM_ID_MODULE_ENABLE, e= nable); } =20 +static int audioreach_gapless_set_media_format(struct q6apm_graph *graph, + struct audioreach_module *module, + struct audioreach_module_config *cfg) +{ + return audioreach_send_u32_param(graph, module, PARAM_ID_EARLY_EOS_DELAY, + EARLY_EOS_DELAY_MS); +} + static int audioreach_mfc_set_media_format(struct q6apm_graph *graph, struct audioreach_module *module, struct audioreach_module_config *cfg) @@ -1270,6 +1278,9 @@ int audioreach_set_media_format(struct q6apm_graph *g= raph, struct audioreach_mod case MODULE_ID_MFC: rc =3D audioreach_mfc_set_media_format(graph, module, cfg); break; + case MODULE_ID_GAPLESS: + rc =3D audioreach_gapless_set_media_format(graph, module, cfg); + break; default: rc =3D 0; } diff --git a/sound/soc/qcom/qdsp6/audioreach.h b/sound/soc/qcom/qdsp6/audio= reach.h index dc089879b501..e38111ffd7b9 100644 --- a/sound/soc/qcom/qdsp6/audioreach.h +++ b/sound/soc/qcom/qdsp6/audioreach.h @@ -27,6 +27,7 @@ struct q6apm_graph; #define MODULE_ID_AAC_DEC 0x0700101F #define MODULE_ID_FLAC_DEC 0x0700102F #define MODULE_ID_MP3_DECODE 0x0700103B +#define MODULE_ID_GAPLESS 0x0700104D #define MODULE_ID_DISPLAY_PORT_SINK 0x07001069 =20 #define APM_CMD_GET_SPF_STATE 0x01001021 @@ -552,6 +553,8 @@ struct param_id_sal_limiter_enable { } __packed; =20 #define PARAM_ID_MFC_OUTPUT_MEDIA_FORMAT 0x08001024 +#define PARAM_ID_EARLY_EOS_DELAY 0x0800114C +#define EARLY_EOS_DELAY_MS 150 =20 struct param_id_mfc_media_format { uint32_t sample_rate; @@ -560,6 +563,10 @@ struct param_id_mfc_media_format { uint16_t channel_mapping[]; } __packed; =20 +struct param_id_gapless_early_eos_delay_t { + uint32_t early_eos_delay_ms; +} __packed; + struct media_format { uint32_t data_format; uint32_t fmt_id; --=20 2.21.0 From nobody Sun Feb 8 19:43:53 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1E901EB64D9 for ; Mon, 19 Jun 2023 10:17:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231979AbjFSKR1 (ORCPT ); Mon, 19 Jun 2023 06:17:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59436 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231945AbjFSKRN (ORCPT ); Mon, 19 Jun 2023 06:17:13 -0400 Received: from mail-wr1-x433.google.com (mail-wr1-x433.google.com [IPv6:2a00:1450:4864:20::433]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D2410E42 for ; Mon, 19 Jun 2023 03:17:05 -0700 (PDT) Received: by mail-wr1-x433.google.com with SMTP id ffacd0b85a97d-30fcda210cfso2969050f8f.3 for ; Mon, 19 Jun 2023 03:17:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687169824; x=1689761824; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=aMcEeKE/zt6hoVJVRWuQqq+48i5b+sqdr7X7eIAAcGg=; b=QDdlGZ1aLNOvrp+Kp76+3dNFfPuDAD7U4F+Ntjz4V6auxuVtZVZm3cqdvhGqEYMEp4 N70dxOuyIG0/CAWdC1epI10DAbqIb6UcDPPauJVaRS5+LnWUCnIzdJli5z6OeMdzAyVp rhVgXHkvNdh/2Sr0Hv0WwvHKeGAGTtPZ0kOmPTu8ku83aMbhJTexKQMtlNQZiPhRX+mW qTIK5Sgy8SvACZB8OFkHDjeZ2ypI8I6nU6bLFyi+7svuvAzZQbyYdev0N31s1ajuafR+ hMbig0G8q/Eo0CaXjBJyj8Gm0PAfcVkJjcOMjVoyo3cTWK0bdTxdEvplFEVVYp4Fx0d8 PkaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687169824; x=1689761824; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=aMcEeKE/zt6hoVJVRWuQqq+48i5b+sqdr7X7eIAAcGg=; b=f2oHexjtDjDBBkK+MxLQgcWl/AGvTvGelEasAhZBw9xTcnqCusDHLWraIvP0owqJuy b9eOt0wNmxf6xHBT0Nq3a9JuRf04oUK5+80p0LobkKmM2mDx2PVUKw/PF/i5ICt5+S9X Zu0cUMRKJWf1APcNSWKI/GgPQ4nihml9k1yQOS7yd6cX5yGa18aG7YkD3lNIoNidZaFi yn1FxQZVw3EaP4zWL1igT975Tu7Sy4xrePjGZns+RerGSjeXjN1xNxfHCHef4+tHr8kk /gsLdzicxlFvcNOw2plTyWn/lp5cq6/Y5L5/M4V36iaIZUTy+F2sYaBfwEKIS3fTN4dS Am2g== X-Gm-Message-State: AC+VfDydosBdgn1VX6XMAhuebCRxKOiANuYcOLNQ+hWfhsPzpjvxb1j0 I7dX10cad6qFyH9mKOE7CE0oog== X-Google-Smtp-Source: ACHHUZ4xptSZCqArQdHo4ETHPsMwGa11iEWiGEWbrCSQCS4eIneS6KOqCdUhqKZQz3n5Oo6jK1rUNw== X-Received: by 2002:a5d:63c5:0:b0:30f:cf93:4bb8 with SMTP id c5-20020a5d63c5000000b0030fcf934bb8mr6601009wrw.57.1687169824292; Mon, 19 Jun 2023 03:17:04 -0700 (PDT) Received: from localhost.localdomain ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id c2-20020a5d5282000000b002fae7408544sm31146922wrv.108.2023.06.19.03.17.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jun 2023 03:17:03 -0700 (PDT) From: Srinivas Kandagatla To: broonie@kernel.org Cc: perex@perex.cz, tiwai@suse.com, lgirdwood@gmail.com, ckeepax@opensource.cirrus.com, kuninori.morimoto.gx@renesas.com, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, alsa-devel@alsa-project.org, Srinivas Kandagatla , Mohammad Rafi Shaik Subject: [PATCH v3 07/11] ASoC: q6dsp: q6apm-dai: Add open/free compress DAI callbacks Date: Mon, 19 Jun 2023 11:16:49 +0100 Message-Id: <20230619101653.9750-8-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> References: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add q6apm open and free compress DAI callbacks to support compress offload playback. Include compress event handler callback also. Co-developed-by: Mohammad Rafi Shaik Signed-off-by: Mohammad Rafi Shaik Signed-off-by: Srinivas Kandagatla --- sound/soc/qcom/qdsp6/q6apm-dai.c | 136 +++++++++++++++++++++++++++++++ sound/soc/qcom/qdsp6/q6apm.h | 1 + 2 files changed, 137 insertions(+) diff --git a/sound/soc/qcom/qdsp6/q6apm-dai.c b/sound/soc/qcom/qdsp6/q6apm-= dai.c index 9fff41ee98eb..32df5db014d3 100644 --- a/sound/soc/qcom/qdsp6/q6apm-dai.c +++ b/sound/soc/qcom/qdsp6/q6apm-dai.c @@ -28,6 +28,8 @@ #define CAPTURE_MIN_PERIOD_SIZE 320 #define BUFFER_BYTES_MAX (PLAYBACK_MAX_NUM_PERIODS * PLAYBACK_MAX_PERIOD_S= IZE) #define BUFFER_BYTES_MIN (PLAYBACK_MIN_NUM_PERIODS * PLAYBACK_MIN_PERIOD_S= IZE) +#define COMPR_PLAYBACK_MAX_FRAGMENT_SIZE (128 * 1024) +#define COMPR_PLAYBACK_MAX_NUM_FRAGMENTS (16 * 4) #define SID_MASK_DEFAULT 0xF =20 enum stream_state { @@ -55,6 +57,7 @@ struct q6apm_dai_rtd { enum stream_state state; struct q6apm_graph *graph; spinlock_t lock; + bool notify_on_drain; }; =20 struct q6apm_dai_data { @@ -132,6 +135,69 @@ static void event_handler(uint32_t opcode, uint32_t to= ken, uint32_t *payload, vo } } =20 +static void event_handler_compr(uint32_t opcode, uint32_t token, + uint32_t *payload, void *priv) +{ + struct q6apm_dai_rtd *prtd =3D priv; + struct snd_compr_stream *substream =3D prtd->cstream; + unsigned long flags; + uint32_t wflags =3D 0; + uint64_t avail; + uint32_t bytes_written, bytes_to_write; + bool is_last_buffer =3D false; + + switch (opcode) { + case APM_CLIENT_EVENT_CMD_EOS_DONE: + spin_lock_irqsave(&prtd->lock, flags); + if (prtd->notify_on_drain) { + snd_compr_drain_notify(prtd->cstream); + prtd->notify_on_drain =3D false; + } else { + prtd->state =3D Q6APM_STREAM_STOPPED; + } + spin_unlock_irqrestore(&prtd->lock, flags); + break; + case APM_CLIENT_EVENT_DATA_WRITE_DONE: + spin_lock_irqsave(&prtd->lock, flags); + bytes_written =3D token >> APM_WRITE_TOKEN_LEN_SHIFT; + prtd->copied_total +=3D bytes_written; + snd_compr_fragment_elapsed(substream); + + if (prtd->state !=3D Q6APM_STREAM_RUNNING) { + spin_unlock_irqrestore(&prtd->lock, flags); + break; + } + + avail =3D prtd->bytes_received - prtd->bytes_sent; + + if (avail > prtd->pcm_count) { + bytes_to_write =3D prtd->pcm_count; + } else { + if (substream->partial_drain || prtd->notify_on_drain) + is_last_buffer =3D true; + bytes_to_write =3D avail; + } + + if (bytes_to_write) { + if (substream->partial_drain && is_last_buffer) + wflags |=3D APM_LAST_BUFFER_FLAG; + + q6apm_write_async(prtd->graph, + bytes_to_write, 0, 0, wflags); + + prtd->bytes_sent +=3D bytes_to_write; + + if (prtd->notify_on_drain && is_last_buffer) + audioreach_shared_memory_send_eos(prtd->graph); + } + + spin_unlock_irqrestore(&prtd->lock, flags); + break; + default: + break; + } +} + static int q6apm_dai_prepare(struct snd_soc_component *component, struct snd_pcm_substream *substream) { @@ -387,6 +453,75 @@ static int q6apm_dai_pcm_new(struct snd_soc_component = *component, struct snd_soc return snd_pcm_set_fixed_buffer_all(rtd->pcm, SNDRV_DMA_TYPE_DEV, compone= nt->dev, size); } =20 +static int q6apm_dai_compr_open(struct snd_soc_component *component, + struct snd_compr_stream *stream) +{ + struct snd_soc_pcm_runtime *rtd =3D stream->private_data; + struct snd_soc_dai *cpu_dai =3D asoc_rtd_to_cpu(rtd, 0); + struct snd_compr_runtime *runtime =3D stream->runtime; + struct q6apm_dai_rtd *prtd; + struct q6apm_dai_data *pdata; + struct device *dev =3D component->dev; + int ret, size; + int graph_id; + + graph_id =3D cpu_dai->driver->id; + pdata =3D snd_soc_component_get_drvdata(component); + if (!pdata) + return -EINVAL; + + prtd =3D kzalloc(sizeof(*prtd), GFP_KERNEL); + if (prtd =3D=3D NULL) + return -ENOMEM; + + prtd->cstream =3D stream; + prtd->graph =3D q6apm_graph_open(dev, (q6apm_cb)event_handler_compr, prtd= , graph_id); + if (IS_ERR(prtd->graph)) { + ret =3D PTR_ERR(prtd->graph); + kfree(prtd); + return ret; + } + + runtime->private_data =3D prtd; + runtime->dma_bytes =3D BUFFER_BYTES_MAX; + size =3D COMPR_PLAYBACK_MAX_FRAGMENT_SIZE * COMPR_PLAYBACK_MAX_NUM_FRAGME= NTS; + ret =3D snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, dev, size, &prtd->dma_buf= fer); + if (ret) + return ret; + + if (pdata->sid < 0) + prtd->phys =3D prtd->dma_buffer.addr; + else + prtd->phys =3D prtd->dma_buffer.addr | (pdata->sid << 32); + + snd_compr_set_runtime_buffer(stream, &prtd->dma_buffer); + spin_lock_init(&prtd->lock); + + q6apm_enable_compress_module(dev, prtd->graph, true); + return 0; +} + +static int q6apm_dai_compr_free(struct snd_soc_component *component, + struct snd_compr_stream *stream) +{ + struct snd_compr_runtime *runtime =3D stream->runtime; + struct q6apm_dai_rtd *prtd =3D runtime->private_data; + + q6apm_graph_stop(prtd->graph); + q6apm_unmap_memory_regions(prtd->graph, SNDRV_PCM_STREAM_PLAYBACK); + q6apm_graph_close(prtd->graph); + snd_dma_free_pages(&prtd->dma_buffer); + prtd->graph =3D NULL; + kfree(prtd); + runtime->private_data =3D NULL; + + return 0; +} +static const struct snd_compress_ops q6apm_dai_compress_ops =3D { + .open =3D q6apm_dai_compr_open, + .free =3D q6apm_dai_compr_free, +}; + static const struct snd_soc_component_driver q6apm_fe_dai_component =3D { .name =3D DRV_NAME, .open =3D q6apm_dai_open, @@ -396,6 +531,7 @@ static const struct snd_soc_component_driver q6apm_fe_d= ai_component =3D { .hw_params =3D q6apm_dai_hw_params, .pointer =3D q6apm_dai_pointer, .trigger =3D q6apm_dai_trigger, + .compress_ops =3D &q6apm_dai_compress_ops, }; =20 static int q6apm_dai_probe(struct platform_device *pdev) diff --git a/sound/soc/qcom/qdsp6/q6apm.h b/sound/soc/qcom/qdsp6/q6apm.h index 87d67faf5f1a..d187d88c0a8c 100644 --- a/sound/soc/qcom/qdsp6/q6apm.h +++ b/sound/soc/qcom/qdsp6/q6apm.h @@ -45,6 +45,7 @@ #define APM_WRITE_TOKEN_LEN_SHIFT 16 =20 #define APM_MAX_SESSIONS 8 +#define APM_LAST_BUFFER_FLAG BIT(30) =20 struct q6apm { struct device *dev; --=20 2.21.0 From nobody Sun Feb 8 19:43:53 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1A917EB64D9 for ; Mon, 19 Jun 2023 10:17:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232003AbjFSKRb (ORCPT ); Mon, 19 Jun 2023 06:17:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59646 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230499AbjFSKRP (ORCPT ); Mon, 19 Jun 2023 06:17:15 -0400 Received: from mail-wr1-x42a.google.com (mail-wr1-x42a.google.com [IPv6:2a00:1450:4864:20::42a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0E790E59 for ; Mon, 19 Jun 2023 03:17:07 -0700 (PDT) Received: by mail-wr1-x42a.google.com with SMTP id ffacd0b85a97d-311367a3e12so1983135f8f.2 for ; Mon, 19 Jun 2023 03:17:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687169825; x=1689761825; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Sys5TdhsIRvy1RJtrPRmzzTf1MuduWY9oZx3ELz0gpM=; b=cUWb4upmBaLp26qcGEFTIUOex7qyJ6XSbeJnL0DMJfSmVyf1Kzinq75EJk2mSNy7Ma LGP/GyqEmB0IMk00k2ax0HQSawey79vn58f7Ef8X+crQhxvkZu4DYmvSONx42oaOClEu qRe/RhTquxhqfe2ekHAmfM5qJodHwCRQbirjIGtsIjd18EEe0KyR/BcpvABGf8FAtwX+ OvaOwCgCDvleBZLKGNVeUjyjiLZC9FN6FhkjPbwE7QJpP4/cn+CmtR3Egj+lzkLVygwc Of7PTyq6doN3NLjn47uaGK6vcDtX7fAEjiqphyx3FvfwiomF0C6rt/tmrwAo8jdAuNFo aQsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687169825; x=1689761825; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Sys5TdhsIRvy1RJtrPRmzzTf1MuduWY9oZx3ELz0gpM=; b=fTnYPKbMwDcPZXeAQ+C2/rRJNHoKaVK3rrruM+UuE+reWGUhU4YVAkKJdJXvQmGSRi lIp5VWSzcgUQIEwJ2opcxKYLKhcSJTJeih0b7lX/bp0fSYJvXU6JpdJVb4FYs1Y6wi6S f0HgsoYZaBf2NsqPdUqxGMgGvU0w9YxCeDPq+U8TRn+voVFNogFB+nC4Z39AIBPuRQi9 dj0DnbIJ9ni8+hbYmBDi3nKeOvEqoeBU4zQBM+IrvAg37nAieadS/S2oLv6gUDMf3Wf1 aFHlxzBIQpMelO/c6OIlfE+eYC4FneL4gHskfTkBvvc4vjrRD2R7Mli34L40AVOcihKe vBMw== X-Gm-Message-State: AC+VfDw7znH+VSqJGGsyy55m20nQmcW5snx0113qWaQzImHrmYjz5mII c4qn0W3EtOcllkClBtxXhn7WM5A6E5KX63jL0ng= X-Google-Smtp-Source: ACHHUZ69d7ZaC5DAxHI5Amjpfc4qJJKsrdGiqhyJPz2JqPWO9aGl2us1iOxQB3382Pk/1CuPSrHJeA== X-Received: by 2002:a5d:570b:0:b0:309:4da8:7713 with SMTP id a11-20020a5d570b000000b003094da87713mr7237177wrv.64.1687169825370; Mon, 19 Jun 2023 03:17:05 -0700 (PDT) Received: from localhost.localdomain ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id c2-20020a5d5282000000b002fae7408544sm31146922wrv.108.2023.06.19.03.17.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jun 2023 03:17:04 -0700 (PDT) From: Srinivas Kandagatla To: broonie@kernel.org Cc: perex@perex.cz, tiwai@suse.com, lgirdwood@gmail.com, ckeepax@opensource.cirrus.com, kuninori.morimoto.gx@renesas.com, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, alsa-devel@alsa-project.org, Srinivas Kandagatla , Mohammad Rafi Shaik Subject: [PATCH v3 08/11] ASoC: q6dsp: q6apm-dai: Add compress DAI and codec caps get callbacks Date: Mon, 19 Jun 2023 11:16:50 +0100 Message-Id: <20230619101653.9750-9-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> References: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add q6apm get compress DAI capabilities and codec capabilities callbacks to support compress offload playback. Co-developed-by: Mohammad Rafi Shaik Signed-off-by: Mohammad Rafi Shaik Signed-off-by: Srinivas Kandagatla --- sound/soc/qcom/qdsp6/q6apm-dai.c | 53 ++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/sound/soc/qcom/qdsp6/q6apm-dai.c b/sound/soc/qcom/qdsp6/q6apm-= dai.c index 32df5db014d3..d43705bf523a 100644 --- a/sound/soc/qcom/qdsp6/q6apm-dai.c +++ b/sound/soc/qcom/qdsp6/q6apm-dai.c @@ -30,8 +30,25 @@ #define BUFFER_BYTES_MIN (PLAYBACK_MIN_NUM_PERIODS * PLAYBACK_MIN_PERIOD_S= IZE) #define COMPR_PLAYBACK_MAX_FRAGMENT_SIZE (128 * 1024) #define COMPR_PLAYBACK_MAX_NUM_FRAGMENTS (16 * 4) +#define COMPR_PLAYBACK_MIN_FRAGMENT_SIZE (8 * 1024) +#define COMPR_PLAYBACK_MIN_NUM_FRAGMENTS (4) #define SID_MASK_DEFAULT 0xF =20 +static const struct snd_compr_codec_caps q6apm_compr_caps =3D { + .num_descriptors =3D 1, + .descriptor[0].max_ch =3D 2, + .descriptor[0].sample_rates =3D { 8000, 11025, 12000, 16000, 22050, + 24000, 32000, 44100, 48000, 88200, + 96000, 176400, 192000 }, + .descriptor[0].num_sample_rates =3D 13, + .descriptor[0].bit_rate[0] =3D 320, + .descriptor[0].bit_rate[1] =3D 128, + .descriptor[0].num_bitrates =3D 2, + .descriptor[0].profiles =3D 0, + .descriptor[0].modes =3D SND_AUDIOCHANMODE_MP3_STEREO, + .descriptor[0].formats =3D 0, +}; + enum stream_state { Q6APM_STREAM_IDLE =3D 0, Q6APM_STREAM_STOPPED, @@ -41,6 +58,7 @@ enum stream_state { struct q6apm_dai_rtd { struct snd_pcm_substream *substream; struct snd_compr_stream *cstream; + struct snd_codec codec; struct snd_compr_params codec_param; struct snd_dma_buffer dma_buffer; phys_addr_t phys; @@ -54,6 +72,7 @@ struct q6apm_dai_rtd { uint16_t bits_per_sample; uint16_t source; /* Encoding source bit mask */ uint16_t session_id; + bool next_track; enum stream_state state; struct q6apm_graph *graph; spinlock_t lock; @@ -517,9 +536,43 @@ static int q6apm_dai_compr_free(struct snd_soc_compone= nt *component, =20 return 0; } + +static int q6apm_dai_compr_get_caps(struct snd_soc_component *component, + struct snd_compr_stream *stream, + struct snd_compr_caps *caps) +{ + caps->direction =3D SND_COMPRESS_PLAYBACK; + caps->min_fragment_size =3D COMPR_PLAYBACK_MIN_FRAGMENT_SIZE; + caps->max_fragment_size =3D COMPR_PLAYBACK_MAX_FRAGMENT_SIZE; + caps->min_fragments =3D COMPR_PLAYBACK_MIN_NUM_FRAGMENTS; + caps->max_fragments =3D COMPR_PLAYBACK_MAX_NUM_FRAGMENTS; + caps->num_codecs =3D 3; + caps->codecs[0] =3D SND_AUDIOCODEC_MP3; + caps->codecs[1] =3D SND_AUDIOCODEC_AAC; + caps->codecs[2] =3D SND_AUDIOCODEC_FLAC; + + return 0; +} + +static int q6apm_dai_compr_get_codec_caps(struct snd_soc_component *compon= ent, + struct snd_compr_stream *stream, + struct snd_compr_codec_caps *codec) +{ + switch (codec->codec) { + case SND_AUDIOCODEC_MP3: + *codec =3D q6apm_compr_caps; + break; + default: + break; + } + + return 0; +} static const struct snd_compress_ops q6apm_dai_compress_ops =3D { .open =3D q6apm_dai_compr_open, .free =3D q6apm_dai_compr_free, + .get_caps =3D q6apm_dai_compr_get_caps, + .get_codec_caps =3D q6apm_dai_compr_get_codec_caps, }; =20 static const struct snd_soc_component_driver q6apm_fe_dai_component =3D { --=20 2.21.0 From nobody Sun Feb 8 19:43:53 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C1A58EB64DA for ; Mon, 19 Jun 2023 10:17:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231398AbjFSKRd (ORCPT ); Mon, 19 Jun 2023 06:17:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59736 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231942AbjFSKRQ (ORCPT ); Mon, 19 Jun 2023 06:17:16 -0400 Received: from mail-wr1-x429.google.com (mail-wr1-x429.google.com [IPv6:2a00:1450:4864:20::429]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EB2CFE6E for ; Mon, 19 Jun 2023 03:17:07 -0700 (PDT) Received: by mail-wr1-x429.google.com with SMTP id ffacd0b85a97d-311183ef595so2978401f8f.0 for ; Mon, 19 Jun 2023 03:17:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687169826; x=1689761826; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8UTtnacXFhkaa2mZeZWdPy27iLwDS43g1aootOIyr7w=; b=K87vDtXv1eApSrwu3I7xQDm3u1Xqm2uvm5TTdetvU9fpgYbcAw18SzhP+k3w6A7ehq VsMgqHUtgycoZiBOnvgitT79/FSrmWKXF6GB3KbMfE8GSrBWQkCWEMOG/9hYBpPNMWSi yWU+XpXNexfvy+J6B9a/oSWUhj1SswnjnryJ2zaO1qhmoGwwsxCLpyALFRfDq/4jj+5z a3eEhXpa5/xfEUlLSRY001BzVVLTkkKLvNwSybF8nSzzIeGdxb16PSU9hW6fsbB7FtSb xasA+lzimf/4XUvvcPmnwpslGFGSPMKw7deCO/mpwH9mHySOlBe6S59tj9e+tbYRD3F+ WuAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687169826; x=1689761826; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8UTtnacXFhkaa2mZeZWdPy27iLwDS43g1aootOIyr7w=; b=DWmlf9fdJh6upMINGY5PUbtrbMGqUUR0wczJgJKTK+xx5Nb6slK/Nvp3WvVuqV3COk 3Bl0wU7Bap2Rnkzo5kn7E2x2joYxQtERLCF+ME++4ttoHubiEIWTvkLdUgBg36xSPoD4 NdJJ3NBjXtsqf8WV3kfgB1+YQ3pthKJBZfYF+pwwY8j9NPYE8kYFZlE2c1OIm9+QANB1 Q04gsCSFyURMNuRBh39wv03DqLHOqWbXLeAfOW2n4/EAlg0EpAOoLyjcehKZCdzvF7Cg 515vjXszgoTKguhof1ubIx7UWrw44l44yg/DnjJatyi0RT6yDoW7anvRcz0ddEDq9jEc ChnQ== X-Gm-Message-State: AC+VfDxPJKwPFYAglo27H9V4fub+JX4OjXJW0vBYsg5xUDa6dKVo6Cdu N9EnWJ8VG3Ajhvl647eHduaSnw== X-Google-Smtp-Source: ACHHUZ5E4xdZH3LDu1+ktZXx7Nhw6BKYaUfDOR8Ml82SrAN2yOWWW1tsgOhPdcuh7JRa5nTu0H/26Q== X-Received: by 2002:a5d:698f:0:b0:30a:d459:8f72 with SMTP id g15-20020a5d698f000000b0030ad4598f72mr7394877wru.60.1687169826500; Mon, 19 Jun 2023 03:17:06 -0700 (PDT) Received: from localhost.localdomain ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id c2-20020a5d5282000000b002fae7408544sm31146922wrv.108.2023.06.19.03.17.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jun 2023 03:17:05 -0700 (PDT) From: Srinivas Kandagatla To: broonie@kernel.org Cc: perex@perex.cz, tiwai@suse.com, lgirdwood@gmail.com, ckeepax@opensource.cirrus.com, kuninori.morimoto.gx@renesas.com, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, alsa-devel@alsa-project.org, Srinivas Kandagatla , Mohammad Rafi Shaik Subject: [PATCH v3 09/11] ASoC: q6dsp: q6apm-dai: Add trigger/pointer compress DAI callbacks Date: Mon, 19 Jun 2023 11:16:51 +0100 Message-Id: <20230619101653.9750-10-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> References: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add q6apm trigger and pointer compress DAI callbacks to support compress offload playback. Co-developed-by: Mohammad Rafi Shaik Signed-off-by: Mohammad Rafi Shaik Signed-off-by: Srinivas Kandagatla --- sound/soc/qcom/qdsp6/q6apm-dai.c | 67 ++++++++++++++++++++++++++++++++ sound/soc/qcom/qdsp6/q6apm.h | 1 + 2 files changed, 68 insertions(+) diff --git a/sound/soc/qcom/qdsp6/q6apm-dai.c b/sound/soc/qcom/qdsp6/q6apm-= dai.c index d43705bf523a..9543b79ce83d 100644 --- a/sound/soc/qcom/qdsp6/q6apm-dai.c +++ b/sound/soc/qcom/qdsp6/q6apm-dai.c @@ -568,11 +568,78 @@ static int q6apm_dai_compr_get_codec_caps(struct snd_= soc_component *component, =20 return 0; } + +static int q6apm_dai_compr_pointer(struct snd_soc_component *component, + struct snd_compr_stream *stream, + struct snd_compr_tstamp *tstamp) +{ + struct snd_compr_runtime *runtime =3D stream->runtime; + struct q6apm_dai_rtd *prtd =3D runtime->private_data; + unsigned long flags; + + spin_lock_irqsave(&prtd->lock, flags); + tstamp->copied_total =3D prtd->copied_total; + tstamp->byte_offset =3D prtd->copied_total % prtd->pcm_size; + spin_unlock_irqrestore(&prtd->lock, flags); + + return 0; +} + +static int q6apm_dai_compr_trigger(struct snd_soc_component *component, + struct snd_compr_stream *stream, int cmd) +{ + struct snd_compr_runtime *runtime =3D stream->runtime; + struct q6apm_dai_rtd *prtd =3D runtime->private_data; + int ret =3D 0; + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + ret =3D q6apm_write_async(prtd->graph, prtd->pcm_count, 0, 0, NO_TIMESTA= MP); + break; + case SNDRV_PCM_TRIGGER_STOP: + break; + case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + break; + case SND_COMPR_TRIGGER_NEXT_TRACK: + prtd->next_track =3D true; + break; + case SND_COMPR_TRIGGER_DRAIN: + case SND_COMPR_TRIGGER_PARTIAL_DRAIN: + prtd->notify_on_drain =3D true; + break; + default: + ret =3D -EINVAL; + break; + } + + return ret; +} + +static int q6apm_dai_compr_ack(struct snd_soc_component *component, struct= snd_compr_stream *stream, + size_t count) +{ + struct snd_compr_runtime *runtime =3D stream->runtime; + struct q6apm_dai_rtd *prtd =3D runtime->private_data; + unsigned long flags; + + spin_lock_irqsave(&prtd->lock, flags); + prtd->bytes_received +=3D count; + spin_unlock_irqrestore(&prtd->lock, flags); + + return count; +} + static const struct snd_compress_ops q6apm_dai_compress_ops =3D { .open =3D q6apm_dai_compr_open, .free =3D q6apm_dai_compr_free, .get_caps =3D q6apm_dai_compr_get_caps, .get_codec_caps =3D q6apm_dai_compr_get_codec_caps, + .pointer =3D q6apm_dai_compr_pointer, + .trigger =3D q6apm_dai_compr_trigger, + .ack =3D q6apm_dai_compr_ack, }; =20 static const struct snd_soc_component_driver q6apm_fe_dai_component =3D { diff --git a/sound/soc/qcom/qdsp6/q6apm.h b/sound/soc/qcom/qdsp6/q6apm.h index d187d88c0a8c..8ee40732ce9e 100644 --- a/sound/soc/qcom/qdsp6/q6apm.h +++ b/sound/soc/qcom/qdsp6/q6apm.h @@ -46,6 +46,7 @@ =20 #define APM_MAX_SESSIONS 8 #define APM_LAST_BUFFER_FLAG BIT(30) +#define NO_TIMESTAMP 0xFF00 =20 struct q6apm { struct device *dev; --=20 2.21.0 From nobody Sun Feb 8 19:43:53 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E3078EB64D9 for ; Mon, 19 Jun 2023 10:17:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232004AbjFSKRg (ORCPT ); Mon, 19 Jun 2023 06:17:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59670 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231952AbjFSKRS (ORCPT ); Mon, 19 Jun 2023 06:17:18 -0400 Received: from mail-wr1-x429.google.com (mail-wr1-x429.google.com [IPv6:2a00:1450:4864:20::429]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AFC7010C1 for ; Mon, 19 Jun 2023 03:17:09 -0700 (PDT) Received: by mail-wr1-x429.google.com with SMTP id ffacd0b85a97d-30e3caa6aa7so3247034f8f.1 for ; Mon, 19 Jun 2023 03:17:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687169828; x=1689761828; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0jmFbS7HPXuVPo+Ttg6W++jAmeGcDWis3QnGP8fIhMU=; b=wy9CQ5VTjjJKyhnudYc6Tzx0GC4cGmsexR7mqUP65SLBywiqJeqPlYkCZKqkRYGmGj 0euK9Yci70dqdesZoqJLE7SugOZ8j+XtrLvOckhbq+9HDgCnzD8gIgpaj3b6QaDG1LOl rZE7jRUXsNsaSyip7hcbTs28iOcLP2MHCQwCXhZdI4WbvJOAWX9kpb6/q4r/mHQwCj4G 4Piq+qWW9ZFQT8bgNPIUxPLBbmBsCviWql/+64tHy6PcmD36aEOBESy8qK168mbm6eEM Lq+ofnZA+GveTZ2EyLonzWe2QvWPFYzMNey/tDyzjpioMu+8Lyst9HYnyMiSLhZlGCBL w1CA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687169828; x=1689761828; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0jmFbS7HPXuVPo+Ttg6W++jAmeGcDWis3QnGP8fIhMU=; b=g8KGMnyzIZmyoAcnUrsLiUxiFG0TvTrTQRNfaKohu7pZXLJzzEuC27vfwjN6v+lzkH cYp3Pb1J9HWHEJ16PZ4Kit3mg2l+/gUkRkkWriQpUskpIVzJp9uO/84hRTO381lT0NrS Zr+PlFSNbHjMYVcCH8oQBYh/+CvbHalOdiZuqBpYD4chPUnE8Ds+xAfMn5xpjb47dqTY XdQi52P0HYIM8UoM8d32LAxsdUwXAiJoc4Tpz4QpXAOhgRmMBMgk94Rtqx10/3cW/x2a VuUXkJ3Mcak9XsAP5LbOvAbe6I4CjW/FsrGrcmEvQNkpWH7u3Mx/2dacpTupT70SvorF ik6Q== X-Gm-Message-State: AC+VfDx4IHEtxiFBT3OhgL3Wu8CSgD6GA/Cbk8h4mZ51DC0nth+j4ZRY /V3luRmRpwyPAIZ5t/ml1pfoyg== X-Google-Smtp-Source: ACHHUZ79GAF/rMepsxEO8EbbcqC5rfSTBEWArAY5CuoL4lXM+FTQV0Ep868fL2F2hoL5TNbq1ev8/g== X-Received: by 2002:a5d:595a:0:b0:311:1a91:cdac with SMTP id e26-20020a5d595a000000b003111a91cdacmr7112812wri.57.1687169827878; Mon, 19 Jun 2023 03:17:07 -0700 (PDT) Received: from localhost.localdomain ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id c2-20020a5d5282000000b002fae7408544sm31146922wrv.108.2023.06.19.03.17.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jun 2023 03:17:07 -0700 (PDT) From: Srinivas Kandagatla To: broonie@kernel.org Cc: perex@perex.cz, tiwai@suse.com, lgirdwood@gmail.com, ckeepax@opensource.cirrus.com, kuninori.morimoto.gx@renesas.com, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, alsa-devel@alsa-project.org, Srinivas Kandagatla , Mohammad Rafi Shaik Subject: [PATCH v3 10/11] ASoC: q6dsp: q6apm-dai: Add compress set params and metadata DAI callbacks Date: Mon, 19 Jun 2023 11:16:52 +0100 Message-Id: <20230619101653.9750-11-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> References: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add q6apm compress DAI callbacks for setting params and metadata to support compress offload playback. Co-developed-by: Mohammad Rafi Shaik Signed-off-by: Mohammad Rafi Shaik Signed-off-by: Srinivas Kandagatla --- sound/soc/qcom/qdsp6/q6apm-dai.c | 107 +++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/sound/soc/qcom/qdsp6/q6apm-dai.c b/sound/soc/qcom/qdsp6/q6apm-= dai.c index 9543b79ce83d..c67147e5388b 100644 --- a/sound/soc/qcom/qdsp6/q6apm-dai.c +++ b/sound/soc/qcom/qdsp6/q6apm-dai.c @@ -76,6 +76,8 @@ struct q6apm_dai_rtd { enum stream_state state; struct q6apm_graph *graph; spinlock_t lock; + uint32_t initial_samples_drop; + uint32_t trailing_samples_drop; bool notify_on_drain; }; =20 @@ -632,6 +634,109 @@ static int q6apm_dai_compr_ack(struct snd_soc_compone= nt *component, struct snd_c return count; } =20 +static int q6apm_dai_compr_set_params(struct snd_soc_component *component, + struct snd_compr_stream *stream, + struct snd_compr_params *params) +{ + struct snd_compr_runtime *runtime =3D stream->runtime; + struct q6apm_dai_rtd *prtd =3D runtime->private_data; + struct q6apm_dai_data *pdata; + struct audioreach_module_config cfg; + struct snd_codec *codec =3D ¶ms->codec; + int dir =3D stream->direction; + int ret; + + pdata =3D snd_soc_component_get_drvdata(component); + if (!pdata) + return -EINVAL; + + prtd->periods =3D runtime->fragments; + prtd->pcm_count =3D runtime->fragment_size; + prtd->pcm_size =3D runtime->fragments * runtime->fragment_size; + prtd->bits_per_sample =3D 16; + + prtd->pos =3D 0; + + if (prtd->next_track !=3D true) { + memcpy(&prtd->codec, codec, sizeof(*codec)); + + ret =3D q6apm_set_real_module_id(component->dev, prtd->graph, codec->id); + if (ret) + return ret; + + cfg.direction =3D dir; + cfg.sample_rate =3D codec->sample_rate; + cfg.num_channels =3D 2; + cfg.bit_width =3D prtd->bits_per_sample; + cfg.fmt =3D codec->id; + memcpy(&cfg.codec, codec, sizeof(*codec)); + + ret =3D q6apm_graph_media_format_shmem(prtd->graph, &cfg); + if (ret < 0) + return ret; + + ret =3D q6apm_graph_media_format_pcm(prtd->graph, &cfg); + if (ret) + return ret; + + ret =3D q6apm_map_memory_regions(prtd->graph, SNDRV_PCM_STREAM_PLAYBACK, + prtd->phys, (prtd->pcm_size / prtd->periods), + prtd->periods); + if (ret < 0) + return -ENOMEM; + + ret =3D q6apm_graph_prepare(prtd->graph); + if (ret) + return ret; + + ret =3D q6apm_graph_start(prtd->graph); + if (ret) + return ret; + + } else { + cfg.direction =3D dir; + cfg.sample_rate =3D codec->sample_rate; + cfg.num_channels =3D 2; + cfg.bit_width =3D prtd->bits_per_sample; + cfg.fmt =3D codec->id; + memcpy(&cfg.codec, codec, sizeof(*codec)); + + ret =3D audioreach_compr_set_param(prtd->graph, &cfg); + if (ret < 0) + return ret; + } + prtd->state =3D Q6APM_STREAM_RUNNING; + + return 0; +} + +static int q6apm_dai_compr_set_metadata(struct snd_soc_component *componen= t, + struct snd_compr_stream *stream, + struct snd_compr_metadata *metadata) +{ + struct snd_compr_runtime *runtime =3D stream->runtime; + struct q6apm_dai_rtd *prtd =3D runtime->private_data; + int ret =3D 0; + + switch (metadata->key) { + case SNDRV_COMPRESS_ENCODER_PADDING: + prtd->trailing_samples_drop =3D metadata->value[0]; + q6apm_remove_trailing_silence(component->dev, prtd->graph, + prtd->trailing_samples_drop); + break; + case SNDRV_COMPRESS_ENCODER_DELAY: + prtd->initial_samples_drop =3D metadata->value[0]; + q6apm_remove_initial_silence(component->dev, prtd->graph, + prtd->initial_samples_drop); + break; + default: + ret =3D -EINVAL; + break; + } + + return ret; +} + static const struct snd_compress_ops q6apm_dai_compress_ops =3D { .open =3D q6apm_dai_compr_open, .free =3D q6apm_dai_compr_free, @@ -640,6 +745,8 @@ static const struct snd_compress_ops q6apm_dai_compress= _ops =3D { .pointer =3D q6apm_dai_compr_pointer, .trigger =3D q6apm_dai_compr_trigger, .ack =3D q6apm_dai_compr_ack, + .set_params =3D q6apm_dai_compr_set_params, + .set_metadata =3D q6apm_dai_compr_set_metadata, }; =20 static const struct snd_soc_component_driver q6apm_fe_dai_component =3D { --=20 2.21.0 From nobody Sun Feb 8 19:43:53 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 932ECEB64D9 for ; Mon, 19 Jun 2023 10:17:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231396AbjFSKRm (ORCPT ); Mon, 19 Jun 2023 06:17:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59646 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231958AbjFSKRT (ORCPT ); Mon, 19 Jun 2023 06:17:19 -0400 Received: from mail-wr1-x42b.google.com (mail-wr1-x42b.google.com [IPv6:2a00:1450:4864:20::42b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6859A10D2 for ; Mon, 19 Jun 2023 03:17:10 -0700 (PDT) Received: by mail-wr1-x42b.google.com with SMTP id ffacd0b85a97d-311275efaf8so1929119f8f.3 for ; Mon, 19 Jun 2023 03:17:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1687169829; x=1689761829; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7txYCxaVdCIzUmWm+LpJfmUPkElgoh9gHNmxHigBQcU=; b=nRWtKAtYtZwQ37U5rmUB4JNSYm73slYhfU2qV3poD/fHYVfbfqiULogkJ5BqgcNKyl yXBVtAri2IGb8PQkNptDRAnrAXe/9VD9FoT0zsWCTvzfOA8wc3qujmcHOfgn2SLYmvUE KgkJUqkq2+EnNSKjM5ofw35CVs6/n2NL42/2VWHowCJ6dEMGQY8ONpa0D7RNLj6xXFTu jP0a5dxRzZJUd2kFRUUkBVQyIr3gfjJif1S3pCgT1UIaFR/DlgSnKEpqnESDergK59S9 sSZSH2JX2+HBxGpuw6THiYPOn6YYPD/MeLWR2x5Pbkxbiw7Ax8BrYeAoVH5OUK3DKvk9 JPZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687169829; x=1689761829; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7txYCxaVdCIzUmWm+LpJfmUPkElgoh9gHNmxHigBQcU=; b=CCbYWngYBHlij3mTRonYZIoEutj2aE1AS+XEViJzGAMOxGesYwxUjLjyVUrtG6Hbpz rP4cGAI6Qy5+kDUPQWLVOg2URC0h8dOoEpYmvcMHmUMxOhtde/IbpxJ3+T0QXOzOZ1Pe zRy0M1ZCPpRHdQRMTtKxdefwDIy3snUt0z2YZD7M+nneU46XOcv/ds+zY1DaWygHfOeU nb2Wxaa2CRzB9H6wRELLFlExBOKdN7LY5SsCYOawGXBxvTnkT/cwMhHHyd1QZ8p1Tl95 QMZ9OjO3xZxXzzoop6DyO6gEHQdEPIqa2SZoxHBVToG22r5dYVNcNgJ9ekNvFZd9X8bt Gs3Q== X-Gm-Message-State: AC+VfDwd8qQ2SG5e3h05h9dhxmH0qjfaSHPzG33Ka37TdYsd82zhDxI3 lfYK57pB3sCixgYDYlclsd4kYw== X-Google-Smtp-Source: ACHHUZ62UqNE78KOzcO6WZERXpwNqPBVI+AS7V7RFiGFsoO6+/Yt0jcotfsbe2XHpKTG089aTTCDeg== X-Received: by 2002:a5d:6e42:0:b0:306:31fb:1c3e with SMTP id j2-20020a5d6e42000000b0030631fb1c3emr5220830wrz.26.1687169828987; Mon, 19 Jun 2023 03:17:08 -0700 (PDT) Received: from localhost.localdomain ([5.133.47.210]) by smtp.gmail.com with ESMTPSA id c2-20020a5d5282000000b002fae7408544sm31146922wrv.108.2023.06.19.03.17.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jun 2023 03:17:08 -0700 (PDT) From: Srinivas Kandagatla To: broonie@kernel.org Cc: perex@perex.cz, tiwai@suse.com, lgirdwood@gmail.com, ckeepax@opensource.cirrus.com, kuninori.morimoto.gx@renesas.com, linux-kernel@vger.kernel.org, pierre-louis.bossart@linux.intel.com, alsa-devel@alsa-project.org, Srinivas Kandagatla , Mohammad Rafi Shaik Subject: [PATCH v3 11/11] ASoC: q6dsp: q6apm-dai: Add mmap and copy compress DAI callbacks Date: Mon, 19 Jun 2023 11:16:53 +0100 Message-Id: <20230619101653.9750-12-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> References: <20230619101653.9750-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add q6apm mmap and copy compress DAI callbacks to support compress offload playback. Co-developed-by: Mohammad Rafi Shaik Signed-off-by: Mohammad Rafi Shaik Signed-off-by: Srinivas Kandagatla --- sound/soc/qcom/qdsp6/q6apm-dai.c | 81 ++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/sound/soc/qcom/qdsp6/q6apm-dai.c b/sound/soc/qcom/qdsp6/q6apm-= dai.c index c67147e5388b..5eb0b864c740 100644 --- a/sound/soc/qcom/qdsp6/q6apm-dai.c +++ b/sound/soc/qcom/qdsp6/q6apm-dai.c @@ -737,6 +737,85 @@ static int q6apm_dai_compr_set_metadata(struct snd_soc= _component *component, return ret; } =20 +static int q6apm_dai_compr_mmap(struct snd_soc_component *component, + struct snd_compr_stream *stream, + struct vm_area_struct *vma) +{ + struct snd_compr_runtime *runtime =3D stream->runtime; + struct q6apm_dai_rtd *prtd =3D runtime->private_data; + struct device *dev =3D component->dev; + + return dma_mmap_coherent(dev, vma, prtd->dma_buffer.area, prtd->dma_buffe= r.addr, + prtd->dma_buffer.bytes); +} + +static int q6apm_compr_copy(struct snd_soc_component *component, + struct snd_compr_stream *stream, char __user *buf, + size_t count) +{ + struct snd_compr_runtime *runtime =3D stream->runtime; + struct q6apm_dai_rtd *prtd =3D runtime->private_data; + void *dstn; + unsigned long flags; + size_t copy; + u32 wflags =3D 0; + u32 app_pointer; + u32 bytes_received; + uint32_t bytes_to_write; + int avail, bytes_in_flight =3D 0; + + bytes_received =3D prtd->bytes_received; + + /** + * Make sure that next track data pointer is aligned at 32 bit boundary + * This is a Mandatory requirement from DSP data buffers alignment + */ + if (prtd->next_track) + bytes_received =3D ALIGN(prtd->bytes_received, prtd->pcm_count); + + app_pointer =3D bytes_received/prtd->pcm_size; + app_pointer =3D bytes_received - (app_pointer * prtd->pcm_size); + dstn =3D prtd->dma_buffer.area + app_pointer; + + if (count < prtd->pcm_size - app_pointer) { + if (copy_from_user(dstn, buf, count)) + return -EFAULT; + } else { + copy =3D prtd->pcm_size - app_pointer; + if (copy_from_user(dstn, buf, copy)) + return -EFAULT; + if (copy_from_user(prtd->dma_buffer.area, buf + copy, count - copy)) + return -EFAULT; + } + + spin_lock_irqsave(&prtd->lock, flags); + bytes_in_flight =3D prtd->bytes_received - prtd->copied_total; + + if (prtd->next_track) { + prtd->next_track =3D false; + prtd->copied_total =3D ALIGN(prtd->copied_total, prtd->pcm_count); + prtd->bytes_sent =3D ALIGN(prtd->bytes_sent, prtd->pcm_count); + } + + prtd->bytes_received =3D bytes_received + count; + + /* Kick off the data to dsp if its starving!! */ + if (prtd->state =3D=3D Q6APM_STREAM_RUNNING && (bytes_in_flight =3D=3D 0)= ) { + bytes_to_write =3D prtd->pcm_count; + avail =3D prtd->bytes_received - prtd->bytes_sent; + + if (avail < prtd->pcm_count) + bytes_to_write =3D avail; + + q6apm_write_async(prtd->graph, bytes_to_write, 0, 0, wflags); + prtd->bytes_sent +=3D bytes_to_write; + } + + spin_unlock_irqrestore(&prtd->lock, flags); + + return count; +} + static const struct snd_compress_ops q6apm_dai_compress_ops =3D { .open =3D q6apm_dai_compr_open, .free =3D q6apm_dai_compr_free, @@ -747,6 +826,8 @@ static const struct snd_compress_ops q6apm_dai_compress= _ops =3D { .ack =3D q6apm_dai_compr_ack, .set_params =3D q6apm_dai_compr_set_params, .set_metadata =3D q6apm_dai_compr_set_metadata, + .mmap =3D q6apm_dai_compr_mmap, + .copy =3D q6apm_compr_copy, }; =20 static const struct snd_soc_component_driver q6apm_fe_dai_component =3D { --=20 2.21.0