From patchwork Tue Oct 25 00:38:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kuninori Morimoto X-Patchwork-Id: 9393929 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 1CF7860231 for ; Tue, 25 Oct 2016 03:08:51 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0E885289E2 for ; Tue, 25 Oct 2016 03:08:51 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id F0E4828FF9; Tue, 25 Oct 2016 03:08:50 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.8 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED, RCVD_IN_DNSWL_NONE, T_DKIM_INVALID autolearn=no version=3.3.1 Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BFEAC289E2 for ; Tue, 25 Oct 2016 03:08:49 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id 1EB5E266E4C; Tue, 25 Oct 2016 05:08:48 +0200 (CEST) Received: from alsa0.perex.cz (localhost [127.0.0.1]) by alsa0.perex.cz (Postfix) with ESMTP id 4B30F26683E; Tue, 25 Oct 2016 05:06:30 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id E64E1266C5F; Tue, 25 Oct 2016 02:38:26 +0200 (CEST) Received: from relmlie1.idc.renesas.com (relmlor2.renesas.com [210.160.252.172]) by alsa0.perex.cz (Postfix) with ESMTP id 6148E26683E for ; Tue, 25 Oct 2016 02:38:20 +0200 (CEST) Received: from unknown (HELO relmlir2.idc.renesas.com) ([10.200.68.152]) by relmlie1.idc.renesas.com with ESMTP; 25 Oct 2016 09:38:19 +0900 Received: from relmlac3.idc.renesas.com (relmlac3.idc.renesas.com [10.200.69.23]) by relmlir2.idc.renesas.com (Postfix) with ESMTP id 1E64D48029; Tue, 25 Oct 2016 09:38:19 +0900 (JST) Received: by relmlac3.idc.renesas.com (Postfix, from userid 0) id 0B0D918070; Tue, 25 Oct 2016 09:38:19 +0900 (JST) Received: from relmlac3.idc.renesas.com (localhost [127.0.0.1]) by relmlac3.idc.renesas.com (Postfix) with ESMTP id 040BC1806F; Tue, 25 Oct 2016 09:38:19 +0900 (JST) Received: from relmlii2.idc.renesas.com [10.200.68.66] by relmlac3.idc.renesas.com with ESMTP id KAH21899; Tue, 25 Oct 2016 09:38:18 +0900 X-IronPort-AV: E=Sophos;i="5.31,543,1473087600"; d="scan'";a="223816585" Received: from mail-hk2apc01lp0214.outbound.protection.outlook.com (HELO APC01-HK2-obe.outbound.protection.outlook.com) ([65.55.88.214]) by relmlii2.idc.renesas.com with ESMTP/TLS/AES256-SHA; 25 Oct 2016 09:38:19 +0900 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=renesasgroup.onmicrosoft.com; s=selector1-renesas-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=nnt9Qt1Lqut4WvoE/SNpaYcb21hwW+ehk7qBN0+C0bk=; b=CbxXm60qZ2Ma+UNgESlAklagcfCKkurA/bmELYzoqvdkKfR6aO0GojfgRkGb/bQrpfequJ/E9RcjKRZSRxBM7YoxFqkcWJBOB4eRoRrB9h9J9UcRcSgo3VLKPVi7kiTvyJinWBc7YWK+yE/0OEhrxsDBLw7leUGsJLygSFv8ZJ0= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=kuninori.morimoto.gx@renesas.com; Received: from morimoto-PC.renesas.com (211.11.155.144) by KL1PR0601MB1448.apcprd06.prod.outlook.com (10.169.69.26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.679.12; Tue, 25 Oct 2016 00:38:16 +0000 Message-ID: <87wpgxb7bc.wl%kuninori.morimoto.gx@renesas.com> From: Kuninori Morimoto User-Agent: Wanderlust/2.15.9 Emacs/24.3 Mule/6.0 To: Mark Brown In-Reply-To: <878ttdcm17.wl%kuninori.morimoto.gx@renesas.com> References: <878ttdcm17.wl%kuninori.morimoto.gx@renesas.com> MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Date: Tue, 25 Oct 2016 00:38:16 +0000 X-Originating-IP: [211.11.155.144] X-ClientProxiedBy: TY1PR0201CA0024.apcprd02.prod.outlook.com (10.164.90.162) To KL1PR0601MB1448.apcprd06.prod.outlook.com (10.169.69.26) X-MS-Office365-Filtering-Correlation-Id: 93b3d5ed-a81e-4d44-fca8-08d3fc6f364d X-Microsoft-Exchange-Diagnostics: 1; KL1PR0601MB1448; 2:EryduEelfBDVJANDa7vmp0pKJJ3Ykusk7SUjT8cLJF8kXr9CZQmqfkOwdZMcud8sSbZV1nTAhL8Kgo8+bAAYGHYxFH9YfrDeW1u4OsxKuOSuntkgCGDgE2MxkAhmNh/BJI9+I3oX+2XLGZBzTC1JQ2t6oZ0/EDOw7jUn44b6iuKNbCay3Q1aHfYg7HCg7qe21aIBCFbnZCiCH7DtfCoQ/w==; 3:VxfU+cc+7ZJ/64WBqcH4wLZ7+yMxmxid98Ez+G0gptYW25iUv3qsPAdWBLQUjqxvZ/aqC5z/BA1x+D3MlOH2KyfMBpZgKIg5pjrKi4VW64HLRG3W1CO5cNfu5dvyfd/htdUvS9lGwAGeXDGXG9cvpg==; 25:ObxhIwWjKU/qmlOYpunszIErCwg1wKNV3cA6107HWQXnUK0Rj+1RNRxGx28ieJfh3kk/oz/IxcSRkO6YmknoNEz3Xm68cxP5KnDRygNi03c9EwpDV8lvawftKfuOPBFrfnsa4YcbL98zHfG/f73gZwzjmrEOMbuHwdR0++1jenGniL5NWdeJcObGggug3/++cL65Clv4ihcXOiGU4hS+5SOYppgqJleGs33QlVXLulaXZZok1KbRhmRZG9VbJIUggvAg1SjEykzYE2qhAu3n14UCZgGIdqs4RRkiiDOssetOtqXIVNqs7xB0YeLddGJmc2AVgXcfaoc1VsJVYaXhCsf+ByLlNtCgH3dYDFoVdfzhV7yasB+6MuIP+84Nc4Zoe5s/hbjb3461Mbo8vHKYuXDLvviUCFujex0TFj6mUZljQTnB13Pkw8e/8JUZvCmE X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:KL1PR0601MB1448; X-Microsoft-Exchange-Diagnostics: 1; KL1PR0601MB1448; 31:axdb9cHe2ltOZAHLK0ErdgPGzBjiG9W41s6Sf1lFK/1Y0WUx3P3/kaUb8Ogqqgr/8KBLQCeXntaWnyEfYa3hBOM+ET3DfFQCnLMv8LDg/ltgrayTsbr5UoM5QL8CWSbnnTQfhuGHTv0IW7k3mfImL93s2PnlooAyjyrxFVZfsLpgKDvIYEibQtJOJ2ScQArwsWenN4D1RrL1Yhd/yX78HIdYkSGpjz59U6eHJdy6/aSZ6B52Kn6HAjfYs40SJXnf; 20:D+/J1Em0tLW1lzdoZrAfZ8gtydIkZHNYPPVrEoMJHvPTzFh2oh9W+Lz8MSJDxlDZsrLkIlE9OCIzjazcmz9M1vBOFBkI2/7ftoSrHwrdH6ZFsQHiRFVVUbPFrQVHwByTdhionuV9sWv/5LAddp5xCv10agLx9v8vOd2raCKZxtgCqvrtBWzZegcynTnr2S4HyyPFw/reqtgp1yBE6eOWAFe55gvpdjxqQT0/zSZLI8GsMe+bVAe1+fRLB2XkJXttmLfEUZDixrIyRLOqF+3ctMB+qtTyXTsgXVzM6B9RjNIuZkyY1oaVEe3GwQj3YQD3AC8bsMa8mEVtxfDo6oGVS8jydpe7W+Lk5KLfR/OQYPyJxzfhkcUm/MZ5OhA4cXuCSNryU/kK1/mw5f/kL6jmR6nNF0NATjN45hYXGGN0jmiFMIkyBDDY50Z3RVGPJSZk3eYGik3xn2uNSRmHmF9ifRpTqmUa2SjsiyjpSDVmV73X4dAQr5kDX8nhgiCxplWV X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001)(6055026); SRVR:KL1PR0601MB1448; BCL:0; PCL:0; RULEID:; SRVR:KL1PR0601MB1448; X-Microsoft-Exchange-Diagnostics: 1; KL1PR0601MB1448; 4:RpZ8S+IRgpGEc3T8PbmjRCtNHSwo6bLKmie1qC2873drv1izMpuSXyoiEIc8SSbogu5kMMYa23MIqcV6bLjl+acwgjW3GE5MZl/YgNIs7ctuBU1yWRAqV04ScgjAM/xT1MWVkxe71wwq7/hBmVxi9l5FHuONj3sf9QMTtlo3y8d68mH8xrcoAN+lr7V6KbKa6P0HFRizKhr7oV5/fmYlAh7SJd4BEkzmS+s3h1CYKWcd4LZHDUO0mBmSft18iC3a69oLsNQ002TPzyNQqb4hEYwWeJgicV4lXS3btHgg6RB7LsvZNFLYOCyeLfFJoDDZ4tg90naA153NfzYslTUUSZf/2cViyzNdEYPrlw8AaVc+Xigwk4gALttS6+mTaiWJijMvwdUvfHBLR51Z0Uw8Ab2oBwj+q7WgRiS6jearoSM= X-Forefront-PRVS: 01068D0A20 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(7916002)(199003)(189002)(50986999)(53416004)(4001350100001)(229853001)(92566002)(86362001)(106356001)(69596002)(5660300001)(68736007)(50466002)(66066001)(77096005)(47776003)(101416001)(105586002)(6116002)(81166006)(8676002)(81156014)(586003)(305945005)(189998001)(7736002)(7846002)(19580405001)(4326007)(2906002)(3846002)(33646002)(110136003)(23726003)(42186005)(83506001)(97736004)(19580395003)(6916009)(54356999)(2950100002)(76176999)(36756003)(21314002)(16060500001); DIR:OUT; SFP:1102; SCL:1; SRVR:KL1PR0601MB1448; H:morimoto-PC.renesas.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; KL1PR0601MB1448; 23:00R7Zt3C8Vs1Apsc+j3BHbqHhOoYt/OF+T5ItWs?= =?us-ascii?Q?alzqmsR3vRyCqV4NyLC8obOBVhXy3iKAmKX7faQrQIEkXqU+dlmDdk2GK79i?= =?us-ascii?Q?B/hQd3b1iVQDJCfhyz3vrrR78s0fB6G4xRmFpLyERetItypCyGVLy95bsuA9?= =?us-ascii?Q?qm9JXXN34y3i+5T71Bl8NkaHfqrpi0JkdUQmwqTLaXYekK/3QGy8hqZmU8tu?= =?us-ascii?Q?6NM7pAJ5TjX0p7g49+/rRWeY937iKOHUF+CsiEew819Falh0F052YEb7qCRb?= =?us-ascii?Q?XRQEgfcZug4/qxodn9u6Ua9A3dLWYbXuxqcr7mwhUdzcf/SPqwREW6hrGR8p?= =?us-ascii?Q?P0SheKe+ZZ01vjJDYnhxCSf4nCbEuKq81yTDp+qxLU42Dk7UZnFACjByHXjd?= =?us-ascii?Q?XzZyuhpVWyIdgHo4k3nbKbp3vtfeZdJHXkj7v6dx0wUlhTiCWYW05xl6JKxW?= =?us-ascii?Q?R+jLQbW60AhpQbTTsHzKQIDcrsKLJttoUVEfqKuWEm1lvFWj3ChkhSd/iR0j?= =?us-ascii?Q?OjEK6jtV4ldd0/GuB6L+VtdHpDuQoU7f1B4wCI2lXK4n5VwnQ7z146G/pdVH?= =?us-ascii?Q?bBIuZHSMaboYGD+xD3ASoOpb8cuwERqGkFQckCrineg6xfEVx5qMIMiXPE0Z?= =?us-ascii?Q?GlFCuhfyXDbdLQm5YFcMPSeJtr+1j1S77jGnNMLirFxej4ZNy93DCjxhUgJt?= =?us-ascii?Q?Hf57S+uCUuH1ckG1f1qSDcutqRdBczyTyR+E4mrSORkLyyHA5svDiCLk3GiY?= =?us-ascii?Q?UtPO5BYYie8daXTmkc+LcoO8qfhDIzVW9x6goNuvxxJoP7MAYBvSPgFsWbsk?= =?us-ascii?Q?njkah9OCTumjcT8MR8hfbVhXvwV+D8mJs6mCP2ALcTk+t5rgUHhUGeRfpicW?= =?us-ascii?Q?mf9suauntDxWNv5+soUGo4qmUuCHL/fVNF0tN5V3zooFyZE0ZY1tSef3/xL2?= =?us-ascii?Q?9Xd51MzU6opDFHZmdYxj/Dc7RFXXcHI4eO5ZOHJr9PR6A167qDFeVV93NS4C?= =?us-ascii?Q?rP5cBO48UhwlMpqYy9aMQN7yB5x8UCsbONE03oEGwA5Kxwf4X0ZcPAKZTQSW?= =?us-ascii?Q?FQmgJT0moK6RMRF6c4AmBPuLtS+gF6b1ySK7cq8A1Yzc99L424U/dYiZOOaa?= =?us-ascii?Q?qDjeYfryBt8ddbZhhMRKkZaxgV20Y/zOJrwyG/R12Iz4sBYWmXZldQvZeJWG?= =?us-ascii?Q?3fFijTTfMzrkADAlxLyKBdyDrMaUn0qPvLC1I?= X-Microsoft-Exchange-Diagnostics: 1; KL1PR0601MB1448; 6:FRzCDdrel+k3HIyBWgRYU34S+Ok//Sji39fMjJb0w55gk6FaOcNPqLTgUuBpbWNc5orZJ1vld0RveE++lfytOmCLQdO0uSf74hcjwi21mSie82p/lagIghkmzJySsINsYV/WTGfG0dUzvVnNTYYjYRs8C4KnnY082Wk6hv2iXKz4GccVLHTp+REzLKMQHopkooFIMFzxoOxG9oUw4wxDp9fzu94S74oOCDdBnvKvwESvcfYh3XqnIpO9HbLSqJwGGvQEzmhFszVY6zXCjdUt2ncbhWXDcDVlaVKaM8Nsh6lqvkuDNesurWga0QaRUBbAaoCltXUDZsNde2xueMIsYEka+0SQV7p5kCNuMj47aco=; 5:GZo4BGEXMOGC+D2Z13sHx4y4vPpjkNa53JBgt8U1kW1nUamdb8SM3EkrRMN6Je7O2ps559CRaeCPA91ec7lh4jdFuvpY0oArxG7GH5FD+dcOWx0T+kpFy+G4ON3qua1WiorFiA/aZ3MSWrxelecTfEcDyhebZi5j7EaDa8hH5FU=; 24:9I6bJbao/zy8LFdQPHuXVQU9S3QaOseJnIZ39ZN1xxV/MhQlbLCdh9mPbzeaFrANPxfmaCnQPhY7uvifwuLVcqbLMuQqCx84IGv8alFQ3tQ= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; KL1PR0601MB1448; 7:xQ5FPRFw7CzJaM1iQFKS55AvdgirJ5RPdg6X0qGUjIuGdfLflBl4sL2dWiK2YGGxK7g6NXKWO95lcT4xtfQIh2TIKpvSnix0q1i6JpuCsrmPAnfU9yh7yYcLyPg1W9g91Ti3Vm0cBKTVNt1yGFVgNKnUxKtEdwx4QoDA3GiL6YfJSgpZkHHTE6gB6PuWMu1uP8QsbvFgMzvNDcPvtQl0I8XqsMrW+Io/16RWCCnGgmJ/Z17uZm8zg/+QRaPiIHSpPjQqH0LGrG7p93K1mS2MrhsTj0cPddxP4liDIh/2ltYoFI+qV6X6JHhb5okF0iXz5z/utSZq417Nqk0/wavVfa0taJEegUYXALyfscC4PSM=; 20:Gkh/7qzqBGWDuBpVnqYKnWXGlShvzkkqgEYx/TMvCxTaNGXY/ScqK1HJFmM3t2VbSzkWXC9L+JktswLPKwtMegA9Dgku6K2W0hHsPJ8rLMrapiG8cpe0hQEqSgtO2WEyijzmB0O0/vBYfXGjpV0v5OGPdwQWC019jur7RgmmOVE= X-OriginatorOrg: renesas.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Oct 2016 00:38:16.7577 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: KL1PR0601MB1448 Cc: Linux-ALSA , Simon Subject: [alsa-devel] [PATCH 8/8] ASoC: rsnd: use dma_sync_single_for_xxx() for IOMMU X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP From: Kuninori Morimoto IOMMU needs DMA mapping function to use it. One solution is that we can use DMA mapped dev on snd_pcm_lib_preallocate_pages_for_all() for SNDRV_DMA_TYPE_DEV. But pcm_new and dma map timing are mismatched. Thus, this patch uses SNDRV_DMA_TYPE_CONTINUOUS for pcm_new, and use dma_sync_single_for_xxx() for each transfer. Signed-off-by: Kuninori Morimoto --- sound/soc/sh/rcar/core.c | 4 +-- sound/soc/sh/rcar/dma.c | 84 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 82 insertions(+), 6 deletions(-) diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c index 9ffa299..912dc62 100644 --- a/sound/soc/sh/rcar/core.c +++ b/sound/soc/sh/rcar/core.c @@ -1126,8 +1126,8 @@ static int rsnd_pcm_new(struct snd_soc_pcm_runtime *rtd) return snd_pcm_lib_preallocate_pages_for_all( rtd->pcm, - SNDRV_DMA_TYPE_DEV, - rtd->card->snd_card->dev, + SNDRV_DMA_TYPE_CONTINUOUS, + snd_dma_continuous_data(GFP_KERNEL), PREALLOC_BUFFER, PREALLOC_BUFFER_MAX); } diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c index 27a5a2e..119aa8d 100644 --- a/sound/soc/sh/rcar/dma.c +++ b/sound/soc/sh/rcar/dma.c @@ -25,6 +25,10 @@ struct rsnd_dmaen { struct dma_chan *chan; + dma_addr_t dma_buf; + unsigned int dma_len; + unsigned int dma_period; + unsigned int dma_cnt; }; struct rsnd_dmapp { @@ -58,10 +62,38 @@ struct rsnd_dma_ctrl { /* * Audio DMAC */ +#define rsnd_dmaen_sync(dmaen, io, i) __rsnd_dmaen_sync(dmaen, io, i, 1) +#define rsnd_dmaen_unsync(dmaen, io, i) __rsnd_dmaen_sync(dmaen, io, i, 0) +static void __rsnd_dmaen_sync(struct rsnd_dmaen *dmaen, struct rsnd_dai_stream *io, + int i, int sync) +{ + struct device *dev = dmaen->chan->device->dev; + enum dma_data_direction dir; + int is_play = rsnd_io_is_play(io); + dma_addr_t buf; + int len, max; + size_t period; + + len = dmaen->dma_len; + period = dmaen->dma_period; + max = len / period; + i = i % max; + buf = dmaen->dma_buf + (period * i); + + dir = is_play ? DMA_TO_DEVICE : DMA_FROM_DEVICE; + + if (sync) + dma_sync_single_for_device(dev, buf, period, dir); + else + dma_sync_single_for_cpu(dev, buf, period, dir); +} + static void __rsnd_dmaen_complete(struct rsnd_mod *mod, struct rsnd_dai_stream *io) { struct rsnd_priv *priv = rsnd_mod_to_priv(mod); + struct rsnd_dma *dma = rsnd_mod_to_dma(mod); + struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma); bool elapsed = false; unsigned long flags; @@ -78,9 +110,22 @@ static void __rsnd_dmaen_complete(struct rsnd_mod *mod, */ spin_lock_irqsave(&priv->lock, flags); - if (rsnd_io_is_working(io)) + if (rsnd_io_is_working(io)) { + rsnd_dmaen_unsync(dmaen, io, dmaen->dma_cnt); + + /* + * Next period is already started. + * Let's sync Next Next period + * see + * rsnd_dmaen_start() + */ + rsnd_dmaen_sync(dmaen, io, dmaen->dma_cnt + 2); + elapsed = rsnd_dai_pointer_update(io, io->byte_per_period); + dmaen->dma_cnt++; + } + spin_unlock_irqrestore(&priv->lock, flags); if (elapsed) @@ -116,7 +161,12 @@ static int rsnd_dmaen_stop(struct rsnd_mod *mod, struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma); if (dmaen->chan) { + int is_play = rsnd_io_is_play(io); + dmaengine_terminate_all(dmaen->chan); + dma_unmap_single(dmaen->chan->device->dev, + dmaen->dma_buf, dmaen->dma_len, + is_play ? DMA_TO_DEVICE : DMA_FROM_DEVICE); } return 0; @@ -182,7 +232,11 @@ static int rsnd_dmaen_start(struct rsnd_mod *mod, struct device *dev = rsnd_priv_to_dev(priv); struct dma_async_tx_descriptor *desc; struct dma_slave_config cfg = {}; + dma_addr_t buf; + size_t len; + size_t period; int is_play = rsnd_io_is_play(io); + int i; int ret; cfg.direction = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM; @@ -199,10 +253,19 @@ static int rsnd_dmaen_start(struct rsnd_mod *mod, if (ret < 0) return ret; + len = snd_pcm_lib_buffer_bytes(substream); + period = snd_pcm_lib_period_bytes(substream); + buf = dma_map_single(dmaen->chan->device->dev, + substream->runtime->dma_area, + len, + is_play ? DMA_TO_DEVICE : DMA_FROM_DEVICE); + if (dma_mapping_error(dmaen->chan->device->dev, buf)) { + dev_err(dev, "dma map failed\n"); + return -EIO; + } + desc = dmaengine_prep_dma_cyclic(dmaen->chan, - substream->runtime->dma_addr, - snd_pcm_lib_buffer_bytes(substream), - snd_pcm_lib_period_bytes(substream), + buf, len, period, is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT | DMA_CTRL_ACK); @@ -214,6 +277,19 @@ static int rsnd_dmaen_start(struct rsnd_mod *mod, desc->callback = rsnd_dmaen_complete; desc->callback_param = rsnd_mod_get(dma); + dmaen->dma_buf = buf; + dmaen->dma_len = len; + dmaen->dma_period = period; + dmaen->dma_cnt = 0; + + /* + * synchronize this and next period + * see + * __rsnd_dmaen_complete() + */ + for (i = 0; i < 2; i++) + rsnd_dmaen_sync(dmaen, io, i); + if (dmaengine_submit(desc) < 0) { dev_err(dev, "dmaengine_submit() fail\n"); return -EIO;