From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v2] dmaengine: ti: omap-dma: Fix OMAP1510 incorrect residue_granularity From: Janusz Krzysztofik Message-Id: <20180605165957.29616-1-jmkrzyszt@gmail.com> Date: Tue, 5 Jun 2018 18:59:57 +0200 To: Vinod Koul Cc: dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Ujfalusi , Jarkko Nikula , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , alsa-devel@alsa-project.org, linux-omap@vger.kernel.org, Aaro Koskinen , Tony Lindgren , linux-arm-kernel@lists.infradead.org, Janusz Krzysztofik List-ID: Q29tbWl0IDAxOThkN2JiOGEwYyAoIkFTb0M6IG9tYXAtbWNic3A6IENvbnZlcnQgdG8gdXNlIHRo ZSBzZG1hLXBjbQppbnN0ZWFkIG9mIG9tYXAtcGNtIikgcmVzdWx0ZWQgaW4gYnJva2VuIGF1ZGlv IHBsYXliYWNrIG9uIE9NQVAxNTEwCihkaXNjb3ZlcmVkIG9uIEFtc3RyYWQgRGVsdGEpLgoKV2hl biBydW5uaW5nIG9uIE9NQVAxNTEwLCBvbWFwLXBjbSB1c2VkIHRvIG9idGFpbiBETUEgb2Zmc2V0 IGZyb20Kc25kX2RtYWVuZ2luZV9wY21fcG9pbnRlcl9ub19yZXNpZHVlKCkgYmFzZWQgb24gRE1B IGludGVycnVwdCB0cmlnZ2VyZWQKc29mdHdhcmUgY2FsY3VsYXRpb25zIGluc3RlYWQgb2Ygc25k X2RtYWVuZ2luZV9wY21fcG9pbnRlcigpIHdoaWNoCmRlcGVuZGVkIG9uIHJlc2lkdWUgdmFsdWUg Y2FsY3VsYXRlZCBmcm9tIG9tYXBfZG1hX2dldF9zcmNfcG9zKCkuClNpbWlsYXIgY29kZSBwYXRo IGlzIHN0aWxsIGF2YWlsYWJsZSBpbiBub3cgdXNlZApzb3VuZC9zb2Mvc29jLWdlbmVyaWMtZG1h ZW5naW5lLXBjbS5jIGJ1dCBpdCBpcyBub3QgdHJpZ2dlcmVkLgoKSXQgd2FzIHZlcmlmaWVkIGFs cmVhZHkgYmVmb3JlIHRoYXQgb21hcF9nZXRfZG1hX3NyY19wb3MoKSBmcm9tCmFyY2gvYXJtL3Bs YXQtb21hcC9kbWEuYyBkaWRuJ3Qgd29yayBjb3JyZWN0bHkgZm9yIE9NQVAxNTEwIC0gc2VlCmNv bW1pdCAxYmRkNzQxOTkxMGMgKCJBU29DOiBPTUFQOiBmaXggT01BUDE1MTAgYnJva2VuIFBDTSBw b2ludGVyCmNhbGxiYWNrIikgZm9yIGRldGFpbHMuICBBcHBhcmVudGx5IHRoZSBzYW1lIGFwcGxp ZXMgdG8gaXRzIHN1Y2Nlc3NvciwKb21hcF9kbWFfZ2V0X3NyY19wb3MoKSBmcm9tIGRyaXZlcnMv ZG1hL3RpL29tYXAtZG1hLmMuCgpPbiB0aGUgb3RoZXIgaGFuZCwgc25kX2RtYWVuZ2luZV9wY21f cG9pbnRlcl9ub19yZXNpZHVlKCkgaXMgZGVzY3JpYmVkCmFzIGRlcHJlY2lhdGVkIGFuZCBkaXNj b3VyYWdlZCBmb3IgdXNlIGluIG5ldyBkcml2ZXJzIGJlY2F1c2Ugb2YgaXRzCnVucmVsaWFibGUg YWNjdXJhY3kuICBIb3dldmVyLCBpdCBzZWVtcyB0aGUgb25seSB3b3JraW5nIG9wdGlvbiBmb3IK T1BBTTE1MTAgbm93LCBhcyBsb25nIGFzIGEgc29mdHdhcmUgY2FsY3VsYXRlZCByZXNpZHVlIGlz IG5vdAppbXBsZW1lbnRlZCBhcyBPTUFQMTUxMCBmYWxsYmFjayBpbiBvbWFwLWRtYS4KClVzaW5n IHNuZF9kbWFlbmdpbmVfcGNtX3BvaW50ZXJfbm9fcmVzaWR1ZSgpIGNvZGUgcGF0aCBpbnN0ZWFk IG9mCnNuZF9kbWFlbmdpbmVfcGNtX3BvaW50ZXIoKSBpbiBzb3VuZC9zb2Mvc29jLWdlbmVyaWMt ZG1hZW5naW5lLXBjbS5jCmNhbiBiZSB0cmlnZ2VyZWQgaW4gdHdvIHdheXM6Ci0gYnkgcGFzc2lu ZyBwY20tPmZsYWdzIHw9IFNORF9ETUFFTkdJTkVfUENNX0ZMQUdfTk9fUkVTSURVRSBmcm9tCiAg c291bmQvc29jL29tYXAvc2RtYS1wY20uYywKLSBieSBwYXNzaW5nIGRtYV9jYXBzLnJlc2lkdWVf Z3JhbnVsYXJpdHkgPQogIERNQV9SRVNJRFVFX0dSQU5VTEFSSVRZX0RFU0NSSVBUT1IgZnJvbSBE TUEgZW5naW5lLgoKTGV0J3MgZG8gdGhlIGxhdHRlci4KCkNyZWF0ZWQgYW5kIHRlc3RlZCBhZ2Fp bnN0IG5leHQtMjAxODA1MzEgdGFnIGZyb20gbGludXgtbmV4dCB0cmVlLgoKU2lnbmVkLW9mZi1i eTogSmFudXN6IEtyenlzenRvZmlrIDxqbWtyenlzenRAZ21haWwuY29tPgpBY2tlZC1ieTogUGV0 ZXIgVWpmYWx1c2kgPHBldGVyLnVqZmFsdXNpQHRpLmNvbT4KLS0tCkNoYW5nZWxvZzoKdjI6IGZp eCBzdWJqZWN0IGFzIHJlcXVlc3RlZCBieSBQZXRlci4KCiBkcml2ZXJzL2RtYS90aS9vbWFwLWRt YS5jIHwgNiArKysrKy0KIDEgZmlsZSBjaGFuZ2VkLCA1IGluc2VydGlvbnMoKyksIDEgZGVsZXRp b24oLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS90aS9vbWFwLWRtYS5jIGIvZHJpdmVycy9k bWEvdGkvb21hcC1kbWEuYwppbmRleCBiNzNmYjUxZmJjODEuLjk2YjUwOTZjMjZkZCAxMDA2NDQK LS0tIGEvZHJpdmVycy9kbWEvdGkvb21hcC1kbWEuYworKysgYi9kcml2ZXJzL2RtYS90aS9vbWFw LWRtYS5jCkBAIC0xNDg1LDcgKzE0ODUsMTEgQEAgc3RhdGljIGludCBvbWFwX2RtYV9wcm9iZShz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogCW9kLT5kZGV2LnNyY19hZGRyX3dpZHRocyA9 IE9NQVBfRE1BX0JVU1dJRFRIUzsKIAlvZC0+ZGRldi5kc3RfYWRkcl93aWR0aHMgPSBPTUFQX0RN QV9CVVNXSURUSFM7CiAJb2QtPmRkZXYuZGlyZWN0aW9ucyA9IEJJVChETUFfREVWX1RPX01FTSkg fCBCSVQoRE1BX01FTV9UT19ERVYpOwotCW9kLT5kZGV2LnJlc2lkdWVfZ3JhbnVsYXJpdHkgPSBE TUFfUkVTSURVRV9HUkFOVUxBUklUWV9CVVJTVDsKKwlpZiAoX19kbWFfb21hcDE1eHgob2QtPnBs YXQtPmRtYV9hdHRyKSkKKwkJb2QtPmRkZXYucmVzaWR1ZV9ncmFudWxhcml0eSA9CisJCQkJRE1B X1JFU0lEVUVfR1JBTlVMQVJJVFlfREVTQ1JJUFRPUjsKKwllbHNlCisJCW9kLT5kZGV2LnJlc2lk dWVfZ3JhbnVsYXJpdHkgPSBETUFfUkVTSURVRV9HUkFOVUxBUklUWV9CVVJTVDsKIAlvZC0+ZGRl di5tYXhfYnVyc3QgPSBTWl8xNk0gLSAxOyAvKiBDQ0VOOiAyNGJpdCB1bnNpZ25lZCAqLwogCW9k LT5kZGV2LmRldiA9ICZwZGV2LT5kZXY7CiAJSU5JVF9MSVNUX0hFQUQoJm9kLT5kZGV2LmNoYW5u ZWxzKTsK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751952AbeFERAK (ORCPT ); Tue, 5 Jun 2018 13:00:10 -0400 Received: from mail-lf0-f68.google.com ([209.85.215.68]:42827 "EHLO mail-lf0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751803AbeFERAI (ORCPT ); Tue, 5 Jun 2018 13:00:08 -0400 X-Google-Smtp-Source: ADUXVKL8jjSwxuIts9+ygAJ0dBfZ4tJJU8qqHncjXAUZkINKBrNqc1JDlHKW1ncvwozK2NG/YS/IXg== From: Janusz Krzysztofik To: Vinod Koul Cc: dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, Peter Ujfalusi , Jarkko Nikula , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , alsa-devel@alsa-project.org, linux-omap@vger.kernel.org, Aaro Koskinen , Tony Lindgren , linux-arm-kernel@lists.infradead.org, Janusz Krzysztofik Subject: [PATCH v2] dmaengine: ti: omap-dma: Fix OMAP1510 incorrect residue_granularity Date: Tue, 5 Jun 2018 18:59:57 +0200 Message-Id: <20180605165957.29616-1-jmkrzyszt@gmail.com> X-Mailer: git-send-email 2.16.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit 0198d7bb8a0c ("ASoC: omap-mcbsp: Convert to use the sdma-pcm instead of omap-pcm") resulted in broken audio playback on OMAP1510 (discovered on Amstrad Delta). When running on OMAP1510, omap-pcm used to obtain DMA offset from snd_dmaengine_pcm_pointer_no_residue() based on DMA interrupt triggered software calculations instead of snd_dmaengine_pcm_pointer() which depended on residue value calculated from omap_dma_get_src_pos(). Similar code path is still available in now used sound/soc/soc-generic-dmaengine-pcm.c but it is not triggered. It was verified already before that omap_get_dma_src_pos() from arch/arm/plat-omap/dma.c didn't work correctly for OMAP1510 - see commit 1bdd7419910c ("ASoC: OMAP: fix OMAP1510 broken PCM pointer callback") for details. Apparently the same applies to its successor, omap_dma_get_src_pos() from drivers/dma/ti/omap-dma.c. On the other hand, snd_dmaengine_pcm_pointer_no_residue() is described as depreciated and discouraged for use in new drivers because of its unreliable accuracy. However, it seems the only working option for OPAM1510 now, as long as a software calculated residue is not implemented as OMAP1510 fallback in omap-dma. Using snd_dmaengine_pcm_pointer_no_residue() code path instead of snd_dmaengine_pcm_pointer() in sound/soc/soc-generic-dmaengine-pcm.c can be triggered in two ways: - by passing pcm->flags |= SND_DMAENGINE_PCM_FLAG_NO_RESIDUE from sound/soc/omap/sdma-pcm.c, - by passing dma_caps.residue_granularity = DMA_RESIDUE_GRANULARITY_DESCRIPTOR from DMA engine. Let's do the latter. Created and tested against next-20180531 tag from linux-next tree. Signed-off-by: Janusz Krzysztofik Acked-by: Peter Ujfalusi --- Changelog: v2: fix subject as requested by Peter. drivers/dma/ti/omap-dma.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/dma/ti/omap-dma.c b/drivers/dma/ti/omap-dma.c index b73fb51fbc81..96b5096c26dd 100644 --- a/drivers/dma/ti/omap-dma.c +++ b/drivers/dma/ti/omap-dma.c @@ -1485,7 +1485,11 @@ static int omap_dma_probe(struct platform_device *pdev) od->ddev.src_addr_widths = OMAP_DMA_BUSWIDTHS; od->ddev.dst_addr_widths = OMAP_DMA_BUSWIDTHS; od->ddev.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); - od->ddev.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST; + if (__dma_omap15xx(od->plat->dma_attr)) + od->ddev.residue_granularity = + DMA_RESIDUE_GRANULARITY_DESCRIPTOR; + else + od->ddev.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST; od->ddev.max_burst = SZ_16M - 1; /* CCEN: 24bit unsigned */ od->ddev.dev = &pdev->dev; INIT_LIST_HEAD(&od->ddev.channels); -- 2.16.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: jmkrzyszt@gmail.com (Janusz Krzysztofik) Date: Tue, 5 Jun 2018 18:59:57 +0200 Subject: [PATCH v2] dmaengine: ti: omap-dma: Fix OMAP1510 incorrect residue_granularity Message-ID: <20180605165957.29616-1-jmkrzyszt@gmail.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Commit 0198d7bb8a0c ("ASoC: omap-mcbsp: Convert to use the sdma-pcm instead of omap-pcm") resulted in broken audio playback on OMAP1510 (discovered on Amstrad Delta). When running on OMAP1510, omap-pcm used to obtain DMA offset from snd_dmaengine_pcm_pointer_no_residue() based on DMA interrupt triggered software calculations instead of snd_dmaengine_pcm_pointer() which depended on residue value calculated from omap_dma_get_src_pos(). Similar code path is still available in now used sound/soc/soc-generic-dmaengine-pcm.c but it is not triggered. It was verified already before that omap_get_dma_src_pos() from arch/arm/plat-omap/dma.c didn't work correctly for OMAP1510 - see commit 1bdd7419910c ("ASoC: OMAP: fix OMAP1510 broken PCM pointer callback") for details. Apparently the same applies to its successor, omap_dma_get_src_pos() from drivers/dma/ti/omap-dma.c. On the other hand, snd_dmaengine_pcm_pointer_no_residue() is described as depreciated and discouraged for use in new drivers because of its unreliable accuracy. However, it seems the only working option for OPAM1510 now, as long as a software calculated residue is not implemented as OMAP1510 fallback in omap-dma. Using snd_dmaengine_pcm_pointer_no_residue() code path instead of snd_dmaengine_pcm_pointer() in sound/soc/soc-generic-dmaengine-pcm.c can be triggered in two ways: - by passing pcm->flags |= SND_DMAENGINE_PCM_FLAG_NO_RESIDUE from sound/soc/omap/sdma-pcm.c, - by passing dma_caps.residue_granularity = DMA_RESIDUE_GRANULARITY_DESCRIPTOR from DMA engine. Let's do the latter. Created and tested against next-20180531 tag from linux-next tree. Signed-off-by: Janusz Krzysztofik Acked-by: Peter Ujfalusi --- Changelog: v2: fix subject as requested by Peter. drivers/dma/ti/omap-dma.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/dma/ti/omap-dma.c b/drivers/dma/ti/omap-dma.c index b73fb51fbc81..96b5096c26dd 100644 --- a/drivers/dma/ti/omap-dma.c +++ b/drivers/dma/ti/omap-dma.c @@ -1485,7 +1485,11 @@ static int omap_dma_probe(struct platform_device *pdev) od->ddev.src_addr_widths = OMAP_DMA_BUSWIDTHS; od->ddev.dst_addr_widths = OMAP_DMA_BUSWIDTHS; od->ddev.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); - od->ddev.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST; + if (__dma_omap15xx(od->plat->dma_attr)) + od->ddev.residue_granularity = + DMA_RESIDUE_GRANULARITY_DESCRIPTOR; + else + od->ddev.residue_granularity = DMA_RESIDUE_GRANULARITY_BURST; od->ddev.max_burst = SZ_16M - 1; /* CCEN: 24bit unsigned */ od->ddev.dev = &pdev->dev; INIT_LIST_HEAD(&od->ddev.channels); -- 2.16.1