From patchwork Wed Sep 26 10:23:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srinivas Kandagatla X-Patchwork-Id: 147560 Delivered-To: patch@linaro.org Received: by 2002:a2e:8595:0:0:0:0:0 with SMTP id b21-v6csp532572lji; Wed, 26 Sep 2018 03:26:05 -0700 (PDT) X-Google-Smtp-Source: ACcGV626pJW2/Pw+toUadadk6Kg3uZPTZRWU+YjjJ77PlWUtIIHWQJaR1emD9McEkqIaPdYkdxV+ X-Received: by 2002:a63:8442:: with SMTP id k63-v6mr5067836pgd.388.1537957565114; Wed, 26 Sep 2018 03:26:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537957565; cv=none; d=google.com; s=arc-20160816; b=VlqOHKDQlUmn8EKu/h7l4hSLJWyxKr5+UrX0/xr9F4MCPjA0gc6KxFXsRoVPVOvSjF mI6yzaPta0n/ooINuFVq2QQxCfFbwAhqs0WyO1H/ayKgeT9+cW0RfaX9+OyTvqGHmq9/ cTV2vkr0kti2p5WeOR23UampVDE7tpODMpLdnruNgcZfFzkFqWJLl/YemE0rOEL0Va76 MIILq/cw0+FqB14oVoG4UVQfaovIll9SvsXa0peNAeOv5qLp5uZm1OuEv93XVRg08rxN WXUdoY7PiRhRyTjhtJjfSKWWHh6nUXYZzpK6+hrV/p6+scH93g5yUeISwxLfs1uADxc1 C8Fg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=7HEPUdBWDT21/CbUw0qj1CFFc0ibgZ+M4DOX00nfRHk=; b=bGInFEH0n2Cxhbd4HPWqIQNyH7H9sRS6j6fTGfY/1b8hbrogkTAN/a9qcelITD4LdY NUQQe6WKMuG2dNLJRaTA85kp1sZro5BgRKKRGW2xhlPwr2+0D0NL0XhinOHTuNDvwnee xG17yV6TWWtzYi9jR5pCMiYSvg5rnnFsVoH8EFRcdSPfnIvcBweYBvMnzd+kx1murg9t GXFPJYdcZJrzua3rP+05KRa92KuRmvBDPASI2WPr+Gg5M3KRLgvvgiWr6XTiyl/o+djQ RzcPYs1b2aT8G/2ii9+mGrhgNy7fKVHWJ3mFU6eFY5AMREFgS45p/E2WC4jpoQ6qkisD siXQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=V7ermJss; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j9-v6si4477361plk.153.2018.09.26.03.26.04; Wed, 26 Sep 2018 03:26:05 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=V7ermJss; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727761AbeIZQiR (ORCPT + 32 others); Wed, 26 Sep 2018 12:38:17 -0400 Received: from mail-wm1-f68.google.com ([209.85.128.68]:40171 "EHLO mail-wm1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727637AbeIZQiR (ORCPT ); Wed, 26 Sep 2018 12:38:17 -0400 Received: by mail-wm1-f68.google.com with SMTP id o2-v6so1688941wmh.5 for ; Wed, 26 Sep 2018 03:26:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=7HEPUdBWDT21/CbUw0qj1CFFc0ibgZ+M4DOX00nfRHk=; b=V7ermJsspmGGZkAixJ06hvGrqfb+can4oZ+NeNgKdvFO5410gXDuzUvrJrUG5fF00q TGrFwIRnXw5e966e5qGEioSNAuwB9mIRFpRkJRqYf8S05vaR63vVS0tm9tdluf+5UCx3 LRQDm3+cwEL+olhxnZhpOHBN9MwWWKCu3du9U= 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=7HEPUdBWDT21/CbUw0qj1CFFc0ibgZ+M4DOX00nfRHk=; b=sbHT76EbRVegt7tPaVTZ4jVNyrCZOJbHXqHfd5lkluIexNL8oAm0+pXiFPu+JHHC0U /nIwj6JJsgudDPpoQCor/xVaWVJpOTX+FvHHa9qqKFOfYgPD9TroiLLS2uPbzlAb8pwc UMGrrWuNhwoLobQD5Hu/wgj1LgzMB/HmdAGm2BE6hrwZDn+fxh5R5vURA1WrwveOHjrr R8ax3qDTYIBlpconNMbqsWBkn8c/elcN0Pa9VMPYGT0D9hecKHHS991qES2zp4ffjBhA QGx+buqx9GrAch/SsMSDQSSa14q4NQ2uC2GpLOhM+6ETlyk3N7VgsZFkj9GqwErCqmVX srhg== X-Gm-Message-State: ABuFfogiGTW/8+nV7ObS41jpMSDWLgxMYgggznBoIX9nntAOMNYd7ZSq nqm3OyBSxtfPJfHavp4S09d4nw== X-Received: by 2002:a1c:7305:: with SMTP id d5-v6mr3672366wmb.53.1537957559455; Wed, 26 Sep 2018 03:25:59 -0700 (PDT) Received: from localhost.localdomain (cpc90716-aztw32-2-0-cust92.18-1.cable.virginm.net. [86.26.100.93]) by smtp.gmail.com with ESMTPSA id b12sm4442648wrx.11.2018.09.26.03.25.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 26 Sep 2018 03:25:58 -0700 (PDT) From: Srinivas Kandagatla To: broonie@kernel.org, alsa-devel@alsa-project.org, robh+dt@kernel.org Cc: linux-kernel@vger.kernel.org, vkoul@kernel.org, bgoswami@codeaurora.org, rohitkr@codeaurora.org, lgirdwood@gmail.com, tiwai@suse.com, devicetree@vger.kernel.org, mark.rutland@arm.com, Srinivas Kandagatla Subject: [PATCH v2 3/5] ASoC: q6asm-dai: dt-bindings: Add support to compress dais Date: Wed, 26 Sep 2018 11:23:47 +0100 Message-Id: <20180926102349.23481-4-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180926102349.23481-1-srinivas.kandagatla@linaro.org> References: <20180926102349.23481-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch adds board specific bindings required for dais, In particular for compressed dais and dai direction. Board specific setup involves setting up some of dais as compressed dais and also specify direction of any dai. Some of the dais might only support capture/playback depending on the board level wiring. These two new dt properties will allow such flexibilty at board level dts. Signed-off-by: Srinivas Kandagatla Reviewed-by: Vinod Koul Reviewed-by: Rob Herring --- .../devicetree/bindings/sound/qcom,q6asm.txt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) -- 2.19.0 diff --git a/Documentation/devicetree/bindings/sound/qcom,q6asm.txt b/Documentation/devicetree/bindings/sound/qcom,q6asm.txt index f9c7bd8c1bc0..9f5378c51686 100644 --- a/Documentation/devicetree/bindings/sound/qcom,q6asm.txt +++ b/Documentation/devicetree/bindings/sound/qcom,q6asm.txt @@ -27,6 +27,28 @@ used by the apr service device. Value type: Definition: Must be 1 +== ASM DAI is subnode of "dais" and represent a dai, it includes board specific +configuration of each dai. Must contain the following properties. + +- reg + Usage: required + Value type: + Definition: Must be dai id + +- direction: + Usage: Required for Compress offload dais + Value type: + Definition: Specifies the direction of the dai stream + 0 for both tx and rx + 1 for only tx (Capture/Encode) + 2 for only rx (Playback/Decode) + +- is-compress-dai: + Usage: Required for Compress offload dais + Value type: + Definition: present for Compress offload dais + + = EXAMPLE q6asm@7 { @@ -35,5 +57,10 @@ q6asm@7 { q6asmdai: dais { compatible = "qcom,q6asm-dais"; #sound-dai-cells = <1>; + mm@0 { + reg = <0>; + direction = <2>; + is-compress-dai; + }; }; }; From patchwork Wed Sep 26 10:23:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srinivas Kandagatla X-Patchwork-Id: 147561 Delivered-To: patch@linaro.org Received: by 2002:a2e:8595:0:0:0:0:0 with SMTP id b21-v6csp532626lji; Wed, 26 Sep 2018 03:26:08 -0700 (PDT) X-Google-Smtp-Source: ACcGV62BKrjr9hqnwfZMumE1TPwLIDmL7GjaAGMns2IDVAUzb2vVX0oYgeZFR/+kuuvs0kgokTqX X-Received: by 2002:a63:7a50:: with SMTP id j16-v6mr5133033pgn.112.1537957568276; Wed, 26 Sep 2018 03:26:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537957568; cv=none; d=google.com; s=arc-20160816; b=pd0N5T5ZpDt9sG9OVv0p03V1fnTCumMeSF0jojEkE9YfZilNgsvNXTIXUt0xWlIAbG gKvLq2k/fdeWZ3ZAKMRquYn3kNHPH2ikCqMh1ivNLBLpT4rSpClIQo8HxSwN5i9cDB4y QberqEEnX0/bJ14nRRcX+SOTj+GEz6odWbuFCg5yOqacfAw9sFbAZKsJtsdJC0TBTJmZ AdNJjwet7SCvHF18qHvIcxpIAikfHSKd5UCvkQHP9d9zcmtzIoPJ2wDpPq31akLd0WcV 5pDWdknXi2npP8NgLGLvcGG8VtV+ZwAqcnQx3qXfgnSM8aVtvE6dPnNtUiHEVRADdx9F cVMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=mFjadR6BsgPuHP9WgDqWOULIM9tP8Tkl7i3Z5EXFShQ=; b=Uk4jXKTLCUF9Fx2qtjydHqHXGBxYxprP3eG+etgRxa1w+o7nJ/bW7jwOz5rue0k/ud BFbzKc5Qo+mLk4F1JHcUUCAUYfBiZtb66XyP/YAZt5ej8cL37xRIp1IZgBOE/0QOdHtP ho8UTgnayMmCEgvpAAP/p/cWf0Y4uF40/xFBakrelQKwL1x0UjHbd/FSuPSULp59gkR9 UEUtRXmbLu8EjIZ4rS56QPlwk9vwEepvirRpQHNIFj1XGiiBNTU20KN9qCpFgh1QWvU1 iJpnpCilpriEF29nBgGW6WPj1Exshv/4X4u42uCroq3gQDUnE8pFYS1xJ80JG94Ab54D /lqQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=e43z3rL+; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i64-v6si4676298pfb.314.2018.09.26.03.26.08; Wed, 26 Sep 2018 03:26:08 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=e43z3rL+; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727872AbeIZQiU (ORCPT + 32 others); Wed, 26 Sep 2018 12:38:20 -0400 Received: from mail-wm1-f51.google.com ([209.85.128.51]:50670 "EHLO mail-wm1-f51.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726802AbeIZQiS (ORCPT ); Wed, 26 Sep 2018 12:38:18 -0400 Received: by mail-wm1-f51.google.com with SMTP id s12-v6so1694585wmc.0 for ; Wed, 26 Sep 2018 03:26:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=mFjadR6BsgPuHP9WgDqWOULIM9tP8Tkl7i3Z5EXFShQ=; b=e43z3rL+N5vhsGt0DCWQU4wbwdPS3YiL15rftgl0WqdWQ6JhQ5M2yXnkEQjVWJAo6k Bqbl6LZFST3bp6Fpyqilvo3qgkEq750tnHG+YlRhOWhQ9j38U3bgkiAPA6vdfNYjGuSy m5eDVL2999XW8PtmVJ4N4VTOsQ2HoHRwOqUaE= 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=mFjadR6BsgPuHP9WgDqWOULIM9tP8Tkl7i3Z5EXFShQ=; b=OiOiLSzEl23MkEsNxmmZkje3FByaEOkLNsuRvAaRD8q8upz5z4zVyUdqj88C+HemcS yVkYoU5ZSpcKo5K8vG5TXtHyB++J6S7Q9oaGhhMiNIUDwfGs10x9zGDEspgVbw4GBr0R 5VNyPpIt95AmhCReExgO0XgiyWualfJfyb9rr5TMGeDX57farWKV72Tc9McvgyARXTrX nwCwfeyYwRi4r7BL+4wU38L00LWDfK1pJosvnt2e4UbRt/OuXHku7EWkZ19NQyO9S0xh qnUoupxVZYYv4CHbWn1zWBoc2IRGjhOOKaVxuziik5HsGaxXHNRJDZMM2ihzH9dycvNx h7kw== X-Gm-Message-State: ABuFfoi0Qo81vpMt2O0H7O0pDOPId2yc/vNrypd0EyJhE1esO3jIcAvE iHSbVbY8dQJuej2iRjJPSbSmiTQOOw4= X-Received: by 2002:a1c:89cd:: with SMTP id l196-v6mr3757018wmd.7.1537957560789; Wed, 26 Sep 2018 03:26:00 -0700 (PDT) Received: from localhost.localdomain (cpc90716-aztw32-2-0-cust92.18-1.cable.virginm.net. [86.26.100.93]) by smtp.gmail.com with ESMTPSA id b12sm4442648wrx.11.2018.09.26.03.25.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 26 Sep 2018 03:26:00 -0700 (PDT) From: Srinivas Kandagatla To: broonie@kernel.org, alsa-devel@alsa-project.org, robh+dt@kernel.org Cc: linux-kernel@vger.kernel.org, vkoul@kernel.org, bgoswami@codeaurora.org, rohitkr@codeaurora.org, lgirdwood@gmail.com, tiwai@suse.com, devicetree@vger.kernel.org, mark.rutland@arm.com, Srinivas Kandagatla Subject: [PATCH v2 4/5] ASoC: qdsp6: q6asm: add support to MP3 format Date: Wed, 26 Sep 2018 11:23:48 +0100 Message-Id: <20180926102349.23481-5-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180926102349.23481-1-srinivas.kandagatla@linaro.org> References: <20180926102349.23481-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Signed-off-by: Srinivas Kandagatla --- sound/soc/qcom/qdsp6/q6asm.c | 5 +++++ 1 file changed, 5 insertions(+) -- 2.19.0 diff --git a/sound/soc/qcom/qdsp6/q6asm.c b/sound/soc/qcom/qdsp6/q6asm.c index 2b2c7233bb5f..e98aee1baadd 100644 --- a/sound/soc/qcom/qdsp6/q6asm.c +++ b/sound/soc/qcom/qdsp6/q6asm.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,7 @@ #define ASM_PARAM_ID_ENCDEC_ENC_CFG_BLK_V2 0x00010DA3 #define ASM_SESSION_CMD_RUN_V2 0x00010DAA #define ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2 0x00010DA5 +#define ASM_MEDIA_FMT_MP3 0x00010BE9 #define ASM_DATA_CMD_WRITE_V2 0x00010DAB #define ASM_DATA_CMD_READ_V2 0x00010DAC #define ASM_SESSION_CMD_SUSPEND 0x00010DEC @@ -869,6 +871,9 @@ int q6asm_open_write(struct audio_client *ac, uint32_t format, open->postprocopo_id = ASM_NULL_POPP_TOPOLOGY; switch (format) { + case SND_AUDIOCODEC_MP3: + open->dec_fmt_id = ASM_MEDIA_FMT_MP3; + break; case FORMAT_LINEAR_PCM: open->dec_fmt_id = ASM_MEDIA_FMT_MULTI_CHANNEL_PCM_V2; break; From patchwork Wed Sep 26 10:23:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srinivas Kandagatla X-Patchwork-Id: 147562 Delivered-To: patch@linaro.org Received: by 2002:a2e:8595:0:0:0:0:0 with SMTP id b21-v6csp532667lji; Wed, 26 Sep 2018 03:26:10 -0700 (PDT) X-Google-Smtp-Source: ACcGV60kJ0jkGx8xigFItaXnXHs4hEauE2kCnX++ftI3f5iQyQbLgNG+AvMHy1whwypGByxGiaTJ X-Received: by 2002:a17:902:a715:: with SMTP id w21-v6mr5442591plq.61.1537957570806; Wed, 26 Sep 2018 03:26:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537957570; cv=none; d=google.com; s=arc-20160816; b=tsSNQMbSpHualyNDTUBfxGa9hzss0drbqs2an8QaO7ItW+msSmWLfubHgVoeO0OkF/ InTR+EVXLVzCaTDcDiH+Mdz2WblSqaUcfMYE5yM+xo/aMXUqr3RxxyGAY/StkCTU9bPG sXXzf8Nro7eCZTXxZfMv3Sj4wPADFhRRxuPb0oX7C0G9z4pA1A/jIGzlsQl5Iz2QAnKJ hLwzbOgtjJz5WrwL++VduxTGl1WD8lUL9iJFYYWangozzFEurfvR6INCiVZKYEZvEt8Z lgHcAEpQNuQzF2zpNxcKaLV8JyB+QARkICKUovM5eKS3rNQ4dDILDRMFNtgPPY8AmIhZ fSvw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=IaAY04PJJzszAqazH0nKlHWHeHF7Lsvg/lVMk+d0uuo=; b=ZlvFb4AiqFB+RPnNOIJgmclAHIbZoSh+BGhH8Zy96NXFYB4tB9GfpdX5e8eZ2LxXkj 6U6jl6BrOBDQzTKAJzsFiei+gSk7snjMdamW03Oq0V4pnV6uWJyi7WygY8wtNYeKpVMg QKM2PllxCQShapxMN9DtKgzvARmP6GmZzEzxzPJgFMNquOiJSbS3GK9BnnSbpgDcAcuZ pNWMW/SduW55/J5+y8zB5wi3tGHJVorRsNT6mdsZSCouSIOkqUszt0GXa3SCWlqAVPf2 b27Mlh9Sm2N1AUKuafylGzloZLUGKR1miTrX5GwZfgoFB4Vh1UswX4uZ/6CNF89wwyzK 7TDQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=MMdY1p4a; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 3-v6si4878947pgi.473.2018.09.26.03.26.10; Wed, 26 Sep 2018 03:26:10 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=MMdY1p4a; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728062AbeIZQiW (ORCPT + 32 others); Wed, 26 Sep 2018 12:38:22 -0400 Received: from mail-wm1-f65.google.com ([209.85.128.65]:34377 "EHLO mail-wm1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727771AbeIZQiV (ORCPT ); Wed, 26 Sep 2018 12:38:21 -0400 Received: by mail-wm1-f65.google.com with SMTP id y3-v6so657096wma.1 for ; Wed, 26 Sep 2018 03:26:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=IaAY04PJJzszAqazH0nKlHWHeHF7Lsvg/lVMk+d0uuo=; b=MMdY1p4aRRlpPergKXpCQtyo3QjscAiX27AqcuFbaESV/mFiSICsGyiQZUYXU0MkNQ 5P9X85GjHSO+Fh24gejCz7KlPohE2m1SSeOVkSG7GhEqflXc0O5Dn9+VY5n/M8tc14OF fQQmLc4I7EwwDv+QO8rla2BxRUuIVWtkt+lyM= 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=IaAY04PJJzszAqazH0nKlHWHeHF7Lsvg/lVMk+d0uuo=; b=OfEhoB4p6ZI9+1Y3dJe4kKeZL8R6mbVZSKzC81/g+Qzl/mRI6UKY8YaHUn4GIQL11V rZOirN0XmTvQX6k9JbY6oy3Pg5DMQtxqiodc0h1YOVBeuIiNavpuo/8h4JJ9tlOp/ySe 41Jv70fA76pBDQXPxaSRPAZHeZsgY+GIMNJAiBi0Yi0W789zTxOuHd81esgsK/kE4Dag rkapKTxG78/iOg4cm49ABvbfSe5Jz4rxV+Ui6VsxU8chkQE8htfRNxdVEK1ANggZr8VK R8g+Sz9heB5aFY2iX+vobdHQOxSfuJegZwOTAyaHL8N0gBt3XxdnJ9xdvon1psTqrwZl lnlg== X-Gm-Message-State: ABuFfogYdLVJ6K/xGDWGZ25MCmNVBJsDcqiBKRRkpja6uZ/hMrQ7o/jm oI3u/RTo7gULWeq1R8dIhFcHUg== X-Received: by 2002:a1c:7704:: with SMTP id t4-v6mr3769955wmi.136.1537957562211; Wed, 26 Sep 2018 03:26:02 -0700 (PDT) Received: from localhost.localdomain (cpc90716-aztw32-2-0-cust92.18-1.cable.virginm.net. [86.26.100.93]) by smtp.gmail.com with ESMTPSA id b12sm4442648wrx.11.2018.09.26.03.26.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 26 Sep 2018 03:26:01 -0700 (PDT) From: Srinivas Kandagatla To: broonie@kernel.org, alsa-devel@alsa-project.org, robh+dt@kernel.org Cc: linux-kernel@vger.kernel.org, vkoul@kernel.org, bgoswami@codeaurora.org, rohitkr@codeaurora.org, lgirdwood@gmail.com, tiwai@suse.com, devicetree@vger.kernel.org, mark.rutland@arm.com, Srinivas Kandagatla Subject: [PATCH v2 5/5] ASoC: qdsp6: q6asm-dai: Add support to compress offload Date: Wed, 26 Sep 2018 11:23:49 +0100 Message-Id: <20180926102349.23481-6-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180926102349.23481-1-srinivas.kandagatla@linaro.org> References: <20180926102349.23481-1-srinivas.kandagatla@linaro.org> MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch adds MP3 playback support in q6asm dais, adding other codec support should be pretty trivial. Signed-off-by: Srinivas Kandagatla --- sound/soc/qcom/Kconfig | 1 + sound/soc/qcom/qdsp6/q6asm-dai.c | 377 ++++++++++++++++++++++++++++++- 2 files changed, 377 insertions(+), 1 deletion(-) -- 2.19.0 diff --git a/sound/soc/qcom/Kconfig b/sound/soc/qcom/Kconfig index 2a4c912d1e48..ebf991bb546c 100644 --- a/sound/soc/qcom/Kconfig +++ b/sound/soc/qcom/Kconfig @@ -66,6 +66,7 @@ config SND_SOC_QDSP6_ASM tristate config SND_SOC_QDSP6_ASM_DAI + select SND_SOC_COMPRESS tristate config SND_SOC_QDSP6 diff --git a/sound/soc/qcom/qdsp6/q6asm-dai.c b/sound/soc/qcom/qdsp6/q6asm-dai.c index 9db9a2944ef2..57b8abcbebcd 100644 --- a/sound/soc/qcom/qdsp6/q6asm-dai.c +++ b/sound/soc/qcom/qdsp6/q6asm-dai.c @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include #include @@ -31,6 +33,16 @@ #define CAPTURE_MIN_PERIOD_SIZE 320 #define SID_MASK_DEFAULT 0xF +/* Default values used if user space does not set */ +#define COMPR_PLAYBACK_MIN_FRAGMENT_SIZE (8 * 1024) +#define COMPR_PLAYBACK_MAX_FRAGMENT_SIZE (128 * 1024) +#define COMPR_PLAYBACK_MIN_NUM_FRAGMENTS (4) +#define COMPR_PLAYBACK_MAX_NUM_FRAGMENTS (16 * 4) +#define Q6ASM_DAI_TX_RX 0 +#define Q6ASM_DAI_TX 1 +#define Q6ASM_DAI_RX 2 + + enum stream_state { Q6ASM_STREAM_IDLE = 0, Q6ASM_STREAM_STOPPED, @@ -39,11 +51,22 @@ enum stream_state { struct q6asm_dai_rtd { struct snd_pcm_substream *substream; + struct snd_compr_stream *cstream; + struct snd_compr_params codec_param; + struct snd_dma_buffer dma_buffer; + phys_addr_t phys; + spinlock_t lock; + unsigned int pcm_size; unsigned int pcm_count; unsigned int pcm_irq_pos; /* IRQ position */ unsigned int periods; + + unsigned int bytes_sent; + unsigned int bytes_received; + unsigned int copied_total; + uint16_t bits_per_sample; uint16_t source; /* Encoding source bit mask */ struct audio_client *audio_client; @@ -139,6 +162,21 @@ static struct snd_pcm_hw_constraint_list constraints_sample_rates = { .mask = 0, }; +static const struct snd_compr_codec_caps q6asm_compr_caps = { + .num_descriptors = 1, + .descriptor[0].max_ch = 2, + .descriptor[0].sample_rates = { 8000, 11025, 12000, 16000, 22050, + 24000, 32000, 44100, 48000, 88200, + 96000, 176400, 192000 }, + .descriptor[0].num_sample_rates = 13, + .descriptor[0].bit_rate[0] = 320, + .descriptor[0].bit_rate[1] = 128, + .descriptor[0].num_bitrates = 2, + .descriptor[0].profiles = 0, + .descriptor[0].modes = SND_AUDIOCHANMODE_MP3_STEREO, + .descriptor[0].formats = 0, +}; + static void event_handler(uint32_t opcode, uint32_t token, uint32_t *payload, void *priv) { @@ -461,6 +499,306 @@ static struct snd_pcm_ops q6asm_dai_ops = { .mmap = q6asm_dai_mmap, }; +static void compress_event_handler(uint32_t opcode, uint32_t token, + uint32_t *payload, void *priv) +{ + struct q6asm_dai_rtd *prtd = priv; + struct snd_compr_stream *substream = prtd->cstream; + unsigned long flags; + uint64_t avail; + + switch (opcode) { + case ASM_CLIENT_EVENT_CMD_RUN_DONE: + spin_lock_irqsave(&prtd->lock, flags); + if (!prtd->bytes_sent) { + q6asm_write_async(prtd->audio_client, prtd->pcm_count, + 0, 0, NO_TIMESTAMP); + prtd->bytes_sent += prtd->pcm_count; + } + + spin_unlock_irqrestore(&prtd->lock, flags); + break; + + case ASM_CLIENT_EVENT_CMD_EOS_DONE: + prtd->state = Q6ASM_STREAM_STOPPED; + break; + + case ASM_CLIENT_EVENT_DATA_WRITE_DONE: + spin_lock_irqsave(&prtd->lock, flags); + + prtd->copied_total += prtd->pcm_count; + snd_compr_fragment_elapsed(substream); + + if (prtd->state != Q6ASM_STREAM_RUNNING) { + spin_unlock_irqrestore(&prtd->lock, flags); + break; + } + + avail = prtd->bytes_received - prtd->bytes_sent; + + if (avail >= prtd->pcm_count) { + q6asm_write_async(prtd->audio_client, + prtd->pcm_count, 0, 0, NO_TIMESTAMP); + prtd->bytes_sent += prtd->pcm_count; + } + + spin_unlock_irqrestore(&prtd->lock, flags); + break; + + default: + break; + } +} + +static int q6asm_dai_compr_open(struct snd_compr_stream *stream) +{ + struct snd_soc_pcm_runtime *rtd = stream->private_data; + struct snd_soc_component *c = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct snd_compr_runtime *runtime = stream->runtime; + struct snd_soc_dai *cpu_dai = rtd->cpu_dai; + struct q6asm_dai_data *pdata; + struct device *dev = c->dev; + struct q6asm_dai_rtd *prtd; + int stream_id, size, ret; + + stream_id = cpu_dai->driver->id; + pdata = snd_soc_component_get_drvdata(c); + if (!pdata) { + dev_err(dev, "Drv data not found ..\n"); + return -EINVAL; + } + + prtd = kzalloc(sizeof(*prtd), GFP_KERNEL); + if (!prtd) + return -ENOMEM; + + prtd->cstream = stream; + prtd->audio_client = q6asm_audio_client_alloc(dev, + (q6asm_cb)compress_event_handler, + prtd, stream_id, LEGACY_PCM_MODE); + if (!prtd->audio_client) { + dev_err(dev, "Could not allocate memory\n"); + kfree(prtd); + return -ENOMEM; + } + + size = COMPR_PLAYBACK_MAX_FRAGMENT_SIZE * + COMPR_PLAYBACK_MAX_NUM_FRAGMENTS; + ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, dev, size, + &prtd->dma_buffer); + if (ret) { + dev_err(dev, "Cannot allocate buffer(s)\n"); + return ret; + } + + if (pdata->sid < 0) + prtd->phys = prtd->dma_buffer.addr; + else + prtd->phys = prtd->dma_buffer.addr | (pdata->sid << 32); + + snd_compr_set_runtime_buffer(stream, &prtd->dma_buffer); + spin_lock_init(&prtd->lock); + runtime->private_data = prtd; + + return 0; +} + +static int q6asm_dai_compr_free(struct snd_compr_stream *stream) +{ + struct snd_compr_runtime *runtime = stream->runtime; + struct q6asm_dai_rtd *prtd = runtime->private_data; + struct snd_soc_pcm_runtime *rtd = stream->private_data; + + if (prtd->audio_client) { + if (prtd->state) + q6asm_cmd(prtd->audio_client, CMD_CLOSE); + + snd_dma_free_pages(&prtd->dma_buffer); + q6asm_unmap_memory_regions(stream->direction, + prtd->audio_client); + q6asm_audio_client_free(prtd->audio_client); + prtd->audio_client = NULL; + } + q6routing_stream_close(rtd->dai_link->id, stream->direction); + kfree(prtd); + + return 0; +} + +static int q6asm_dai_compr_set_params(struct snd_compr_stream *stream, + struct snd_compr_params *params) +{ + struct snd_compr_runtime *runtime = stream->runtime; + struct q6asm_dai_rtd *prtd = runtime->private_data; + struct snd_soc_pcm_runtime *rtd = stream->private_data; + struct snd_soc_component *c = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + int dir = stream->direction; + struct q6asm_dai_data *pdata; + struct device *dev = c->dev; + int ret; + + memcpy(&prtd->codec_param, params, sizeof(*params)); + + pdata = snd_soc_component_get_drvdata(c); + if (!pdata) + return -EINVAL; + + if (!prtd || !prtd->audio_client) { + dev_err(dev, "private data null or audio client freed\n"); + return -EINVAL; + } + + prtd->periods = runtime->fragments; + prtd->pcm_count = runtime->fragment_size; + prtd->pcm_size = runtime->fragments * runtime->fragment_size; + prtd->bits_per_sample = 16; + if (dir == SND_COMPRESS_PLAYBACK) { + ret = q6asm_open_write(prtd->audio_client, params->codec.id, + prtd->bits_per_sample); + + if (ret < 0) { + dev_err(dev, "q6asm_open_write failed\n"); + q6asm_audio_client_free(prtd->audio_client); + prtd->audio_client = NULL; + return ret; + } + } + + prtd->session_id = q6asm_get_session_id(prtd->audio_client); + ret = q6routing_stream_open(rtd->dai_link->id, LEGACY_PCM_MODE, + prtd->session_id, dir); + if (ret) { + dev_err(dev, "Stream reg failed ret:%d\n", ret); + return ret; + } + + ret = q6asm_map_memory_regions(dir, prtd->audio_client, prtd->phys, + (prtd->pcm_size / prtd->periods), + prtd->periods); + + if (ret < 0) { + dev_err(dev, "Buffer Mapping failed ret:%d\n", ret); + return -ENOMEM; + } + + prtd->state = Q6ASM_STREAM_RUNNING; + + return 0; +} + +static int q6asm_dai_compr_trigger(struct snd_compr_stream *stream, int cmd) +{ + struct snd_compr_runtime *runtime = stream->runtime; + struct q6asm_dai_rtd *prtd = runtime->private_data; + int ret = 0; + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + ret = q6asm_run_nowait(prtd->audio_client, 0, 0, 0); + break; + case SNDRV_PCM_TRIGGER_STOP: + prtd->state = Q6ASM_STREAM_STOPPED; + ret = q6asm_cmd_nowait(prtd->audio_client, CMD_EOS); + break; + case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + ret = q6asm_cmd_nowait(prtd->audio_client, CMD_PAUSE); + break; + default: + ret = -EINVAL; + break; + } + + return ret; +} + +static int q6asm_dai_compr_pointer(struct snd_compr_stream *stream, + struct snd_compr_tstamp *tstamp) +{ + struct snd_compr_runtime *runtime = stream->runtime; + struct q6asm_dai_rtd *prtd = runtime->private_data; + unsigned long flags; + + spin_lock_irqsave(&prtd->lock, flags); + + tstamp->copied_total = prtd->copied_total; + tstamp->byte_offset = prtd->copied_total % prtd->pcm_size; + + spin_unlock_irqrestore(&prtd->lock, flags); + + return 0; +} + +static int q6asm_dai_compr_ack(struct snd_compr_stream *stream, + size_t count) +{ + struct snd_compr_runtime *runtime = stream->runtime; + struct q6asm_dai_rtd *prtd = runtime->private_data; + unsigned long flags; + + spin_lock_irqsave(&prtd->lock, flags); + prtd->bytes_received += count; + spin_unlock_irqrestore(&prtd->lock, flags); + + return count; +} + +static int q6asm_dai_compr_mmap(struct snd_compr_stream *stream, + struct vm_area_struct *vma) +{ + struct snd_compr_runtime *runtime = stream->runtime; + struct q6asm_dai_rtd *prtd = runtime->private_data; + struct snd_soc_pcm_runtime *rtd = stream->private_data; + struct snd_soc_component *c = snd_soc_rtdcom_lookup(rtd, DRV_NAME); + struct device *dev = c->dev; + + return dma_mmap_coherent(dev, vma, + prtd->dma_buffer.area, prtd->dma_buffer.addr, + prtd->dma_buffer.bytes); +} + +static int q6asm_dai_compr_get_caps(struct snd_compr_stream *stream, + struct snd_compr_caps *caps) +{ + caps->direction = SND_COMPRESS_PLAYBACK; + caps->min_fragment_size = COMPR_PLAYBACK_MIN_FRAGMENT_SIZE; + caps->max_fragment_size = COMPR_PLAYBACK_MAX_FRAGMENT_SIZE; + caps->min_fragments = COMPR_PLAYBACK_MIN_NUM_FRAGMENTS; + caps->max_fragments = COMPR_PLAYBACK_MAX_NUM_FRAGMENTS; + caps->num_codecs = 1; + caps->codecs[0] = SND_AUDIOCODEC_MP3; + + return 0; +} + +static int q6asm_dai_compr_get_codec_caps(struct snd_compr_stream *stream, + struct snd_compr_codec_caps *codec) +{ + switch (codec->codec) { + case SND_AUDIOCODEC_MP3: + *codec = q6asm_compr_caps; + break; + default: + break; + } + + return 0; +} + +static struct snd_compr_ops q6asm_dai_compr_ops = { + .open = q6asm_dai_compr_open, + .free = q6asm_dai_compr_free, + .set_params = q6asm_dai_compr_set_params, + .pointer = q6asm_dai_compr_pointer, + .trigger = q6asm_dai_compr_trigger, + .get_caps = q6asm_dai_compr_get_caps, + .get_codec_caps = q6asm_dai_compr_get_codec_caps, + .mmap = q6asm_dai_compr_mmap, + .ack = q6asm_dai_compr_ack, +}; + static int q6asm_dai_pcm_new(struct snd_soc_pcm_runtime *rtd) { struct snd_pcm_substream *psubstream, *csubstream; @@ -548,7 +886,7 @@ static const struct snd_soc_component_driver q6asm_fe_dai_component = { .ops = &q6asm_dai_ops, .pcm_new = q6asm_dai_pcm_new, .pcm_free = q6asm_dai_pcm_free, - + .compr_ops = &q6asm_dai_compr_ops, }; static struct snd_soc_dai_driver q6asm_fe_dais[] = { @@ -562,6 +900,41 @@ static struct snd_soc_dai_driver q6asm_fe_dais[] = { Q6ASM_FEDAI_DRIVER(8), }; +static int of_q6asm_parse_dai_data(struct device *dev, + struct q6asm_dai_data *pdata) +{ + static struct snd_soc_dai_driver *dai_drv; + struct snd_soc_pcm_stream empty_stream; + struct device_node *node; + int ret, id, dir; + + memset(&empty_stream, 0, sizeof(empty_stream)); + + for_each_child_of_node(dev->of_node, node) { + ret = of_property_read_u32(node, "reg", &id); + if (ret || id > MAX_SESSIONS || id < 0) { + dev_err(dev, "valid dai id not found:%d\n", ret); + continue; + } + + dai_drv = &q6asm_fe_dais[id]; + + ret = of_property_read_u32(node, "direction", &dir); + if (ret) + continue; + + if (dir == Q6ASM_DAI_RX) + dai_drv->capture = empty_stream; + else if (dir == Q6ASM_DAI_TX) + dai_drv->playback = empty_stream; + + if (of_property_read_bool(node, "is-compress-dai")) + dai_drv->compress_new = snd_soc_new_compress; + } + + return 0; +} + static int q6asm_dai_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -582,6 +955,8 @@ static int q6asm_dai_probe(struct platform_device *pdev) dev_set_drvdata(dev, pdata); + of_q6asm_parse_dai_data(dev, pdata); + return devm_snd_soc_register_component(dev, &q6asm_fe_dai_component, q6asm_fe_dais, ARRAY_SIZE(q6asm_fe_dais));