From patchwork Thu Dec 29 12:19:31 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Szyprowski X-Patchwork-Id: 9491179 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 C0BF260453 for ; Thu, 29 Dec 2016 12:19:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AE9F820007 for ; Thu, 29 Dec 2016 12:19:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A1CDF25250; Thu, 29 Dec 2016 12:19:47 +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=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4414C20007 for ; Thu, 29 Dec 2016 12:19:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752656AbcL2MTn (ORCPT ); Thu, 29 Dec 2016 07:19:43 -0500 Received: from mailout3.w1.samsung.com ([210.118.77.13]:35837 "EHLO mailout3.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752654AbcL2MTm (ORCPT ); Thu, 29 Dec 2016 07:19:42 -0500 Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout3.w1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0OIY00FUX4WR1D10@mailout3.w1.samsung.com>; Thu, 29 Dec 2016 12:19:39 +0000 (GMT) Received: from eusmges5.samsung.com (unknown [203.254.199.245]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20161229121938eucas1p12feae6acdce22a6059864e606f3183c8~UuVsNUWum3053430534eucas1p1S; Thu, 29 Dec 2016 12:19:38 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges5.samsung.com (EUCPMTA) with SMTP id 6F.9E.10572.95FF4685; Thu, 29 Dec 2016 12:19:37 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20161229121937eucas1p11cd0bb98b21699b0f773ecaeb7c29d26~UuVrlhopL3052430524eucas1p1a; Thu, 29 Dec 2016 12:19:37 +0000 (GMT) X-AuditID: cbfec7f5-f79676d00000294c-28-5864ff593894 Received: from eusync2.samsung.com ( [203.254.199.212]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id AC.F2.03557.18FF4685; Thu, 29 Dec 2016 12:20:17 +0000 (GMT) Received: from AMDC2765.digital.local ([106.116.147.25]) by eusync2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OIY00KNH4WLJB40@eusync2.samsung.com>; Thu, 29 Dec 2016 12:19:37 +0000 (GMT) From: Marek Szyprowski To: linux-spi@vger.kernel.org, linux-samsung-soc@vger.kernel.org Cc: Marek Szyprowski , Andi Shyti , Mark Brown , Sylwester Nawrocki , Krzysztof Kozlowski , Bartlomiej Zolnierkiewicz , Inki Dae , Javier Martinez Canillas Subject: [PATCH] spi: s3c64xx: Don't request/release DMA channels for each SPI transfer Date: Thu, 29 Dec 2016 13:19:31 +0100 Message-id: <1483013971-26446-1-git-send-email-m.szyprowski@samsung.com> X-Mailer: git-send-email 1.9.1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrOIsWRmVeSWpSXmKPExsWy7djP87qR/1MiDH690LPYfuQZq8XGGetZ LaY+fMJmMen+BBaLN2/XMFmcP7+B3WLG+X1MFo0fb7JbrD1yl93i8Jt2Vgcuj02rOtk8tvTf Zffo27KK0ePzJrkAligum5TUnMyy1CJ9uwSujHd/bzIWbFWsePb6KlsDY5tMFyMnh4SAicTW 2YfYIGwxiQv31gPZXBxCAksZJZr+rIFyPjNKPD33ig2mY/rKm4wQiWWMEtdW/2eGcBqYJFb8 uQ5WxSZgKNH1tgvMFhFwkGh6cA5sFLPAbSaJ5XPXgiWEBSIl1k6+xgxiswioSvz9cIkdxOYV 8JC4eP8iC8Q6OYmTxyazgjRLCDxnk/jweCHQbg4gR1Zi0wFmiBoXiSM7VkDVC0u8Or6FHcKW kejsOMgEYfcDPdSqDWHPYJQ495YXwraWOHz8IiuIzSzAJzFp23RmiPG8Eh1tQhAlHhJbZ56F Guko8eHVGzBbSCBW4mNHJ/sERukFjAyrGEVSS4tz01OLTfWKE3OLS/PS9ZLzczcxAqP39L/j X3cwLj1mdYhRgINRiYdXQiYlQog1say4MvcQowQHs5IIb/QfoBBvSmJlVWpRfnxRaU5q8SFG aQ4WJXHePQuuhAsJpCeWpGanphakFsFkmTg4pRoYjS/I7Pp0UfoQG/vSCal/fZyjl9x6vvqG 5J6Y9uSSNtnTUdbrrWrlVzivv7Vy/d+Cb3mNf7rmHluW2fP2zut/KR8Vfl9IuJrd+zD0p01A wNLYyCVt2ruytjhNvP39qkR0FAuLxKMT53de4XfWDxGwf98uNG33sdQkl6/dztpfDyrF3X7g mXt7uhJLcUaioRZzUXEiANb5bd3aAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrDLMWRmVeSWpSXmKPExsVy+t/xK7qN/1MiDHpWmlpsP/KM1WLjjPWs FlMfPmGzmHR/AovFm7drmCzOn9/AbjHj/D4mi8aPN9kt1h65y25x+E07qwOXx6ZVnWweW/rv snv0bVnF6PF5k1wAS5SbTUZqYkpqkUJqXnJ+SmZeuq1SaIibroWSQl5ibqqtUoSub0iQkkJZ Yk4pkGdkgAYcnAPcg5X07RLcMt79vclYsFWx4tnrq2wNjG0yXYycHBICJhLTV95khLDFJC7c W8/WxcjFISSwhFFi35deRginiUni2vJ/LCBVbAKGEl1vu9hAbBEBB4mmB+fAOpgF7jNJnG/r YQJJCAtESkye/R7MZhFQlfj74RI7iM0r4CFx8f5FFoh1chInj01mncDIvYCRYRWjSGppcW56 brGhXnFibnFpXrpecn7uJkZgyG479nPzDsZLG4MPMQpwMCrx8ErIpEQIsSaWFVfmHmKU4GBW EuGN/gMU4k1JrKxKLcqPLyrNSS0+xGgKtHwis5Rocj4wnvJK4g1NDM0tDY2MLSzMjYyUxHlL PlwJFxJITyxJzU5NLUgtgulj4uCUamDMUom64rK6avttQSNp62vyl5dPVJ+/p3LpFXvfmoo5 e5l5MrT/Kv+z/PDwzu/wILGvl3UdnRfu+GpvJjZz1fm/1gES6vGblnWX3hXz/vM0m/uVxnSD Im8NrqOnV35UaevcdsFK/ELP5tlBQlI5a86uNX66fgVj2E73ClWHY/ucHn79c+GzIKOzEktx RqKhFnNRcSIAdIuP6m8CAAA= X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20161229121937eucas1p11cd0bb98b21699b0f773ecaeb7c29d26 X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRs=?= =?UTF-8?B?7IK87ISx7KCE7J6QG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Global-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRtT?= =?UTF-8?B?YW1zdW5nIEVsZWN0cm9uaWNzG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDAyQ0QwMjczOTI=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20161229121937eucas1p11cd0bb98b21699b0f773ecaeb7c29d26 X-RootMTR: 20161229121937eucas1p11cd0bb98b21699b0f773ecaeb7c29d26 References: Sender: linux-spi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-spi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Requesting a DMA channel might be a time consuming operation, so there is no need to acquire and release DMA channel for each SPI transfer. DMA channels can be requested during driver probe and kept all the time, also because there are no shared nor dynamically allocated channels on Samsung S3C/S5P/Exynos platforms. While moving dma_requrest_slave_channel calls, lets switch to dma_request_slave_channel_reason(), which returns error codes on failure, which can be properly propagated to the caller (this for example defers SPI probe when DMA controller is not yet available). Signed-off-by: Marek Szyprowski Reviewed-by: Andi Shyti Tested-by: Andi Shyti Reviewed-by: Krzysztof Kozlowski --- drivers/spi/spi-s3c64xx.c | 57 ++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c index 28dfdce4beae..849ee82483e4 100644 --- a/drivers/spi/spi-s3c64xx.c +++ b/drivers/spi/spi-s3c64xx.c @@ -341,43 +341,16 @@ static void s3c64xx_spi_set_cs(struct spi_device *spi, bool enable) static int s3c64xx_spi_prepare_transfer(struct spi_master *spi) { struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(spi); - struct device *dev = &sdd->pdev->dev; if (is_polling(sdd)) return 0; - /* Acquire DMA channels */ - sdd->rx_dma.ch = dma_request_slave_channel(dev, "rx"); - if (!sdd->rx_dma.ch) { - dev_err(dev, "Failed to get RX DMA channel\n"); - return -EBUSY; - } spi->dma_rx = sdd->rx_dma.ch; - - sdd->tx_dma.ch = dma_request_slave_channel(dev, "tx"); - if (!sdd->tx_dma.ch) { - dev_err(dev, "Failed to get TX DMA channel\n"); - dma_release_channel(sdd->rx_dma.ch); - return -EBUSY; - } spi->dma_tx = sdd->tx_dma.ch; return 0; } -static int s3c64xx_spi_unprepare_transfer(struct spi_master *spi) -{ - struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(spi); - - /* Free DMA channels */ - if (!is_polling(sdd)) { - dma_release_channel(sdd->rx_dma.ch); - dma_release_channel(sdd->tx_dma.ch); - } - - return 0; -} - static bool s3c64xx_spi_can_dma(struct spi_master *master, struct spi_device *spi, struct spi_transfer *xfer) @@ -1094,7 +1067,6 @@ static int s3c64xx_spi_probe(struct platform_device *pdev) master->prepare_transfer_hardware = s3c64xx_spi_prepare_transfer; master->prepare_message = s3c64xx_spi_prepare_message; master->transfer_one = s3c64xx_spi_transfer_one; - master->unprepare_transfer_hardware = s3c64xx_spi_unprepare_transfer; master->num_chipselect = sci->num_cs; master->dma_alignment = 8; master->bits_per_word_mask = SPI_BPW_MASK(32) | SPI_BPW_MASK(16) | @@ -1161,6 +1133,24 @@ static int s3c64xx_spi_probe(struct platform_device *pdev) } } + if (!is_polling(sdd)) { + /* Acquire DMA channels */ + sdd->rx_dma.ch = dma_request_slave_channel_reason(&pdev->dev, + "rx"); + if (IS_ERR(sdd->rx_dma.ch)) { + dev_err(&pdev->dev, "Failed to get RX DMA channel\n"); + ret = PTR_ERR(sdd->rx_dma.ch); + goto err_disable_io_clk; + } + sdd->tx_dma.ch = dma_request_slave_channel_reason(&pdev->dev, + "tx"); + if (IS_ERR(sdd->tx_dma.ch)) { + dev_err(&pdev->dev, "Failed to get TX DMA channel\n"); + ret = PTR_ERR(sdd->tx_dma.ch); + goto err_release_tx_dma; + } + } + pm_runtime_set_autosuspend_delay(&pdev->dev, AUTOSUSPEND_TIMEOUT); pm_runtime_use_autosuspend(&pdev->dev); pm_runtime_set_active(&pdev->dev); @@ -1206,6 +1196,12 @@ static int s3c64xx_spi_probe(struct platform_device *pdev) pm_runtime_disable(&pdev->dev); pm_runtime_set_suspended(&pdev->dev); + if (!is_polling(sdd)) + dma_release_channel(sdd->rx_dma.ch); +err_release_tx_dma: + if (!is_polling(sdd)) + dma_release_channel(sdd->tx_dma.ch); +err_disable_io_clk: clk_disable_unprepare(sdd->ioclk); err_disable_src_clk: clk_disable_unprepare(sdd->src_clk); @@ -1226,6 +1222,11 @@ static int s3c64xx_spi_remove(struct platform_device *pdev) writel(0, sdd->regs + S3C64XX_SPI_INT_EN); + if (!is_polling(sdd)) { + dma_release_channel(sdd->rx_dma.ch); + dma_release_channel(sdd->tx_dma.ch); + } + clk_disable_unprepare(sdd->ioclk); clk_disable_unprepare(sdd->src_clk);