From patchwork Mon Jan 28 17:57:34 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 2057151 Return-Path: X-Original-To: patchwork-spi-devel-general@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from lists.sourceforge.net (lists.sourceforge.net [216.34.181.88]) by patchwork1.kernel.org (Postfix) with ESMTP id 878BF3FD49 for ; Mon, 28 Jan 2013 17:58:03 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=sfs-ml-2.v29.ch3.sourceforge.com) by sfs-ml-2.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1Tzsy2-0007hg-7v; Mon, 28 Jan 2013 17:58:02 +0000 Received: from sog-mx-4.v43.ch3.sourceforge.com ([172.29.43.194] helo=mx.sourceforge.net) by sfs-ml-2.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1Tzsy0-0007gA-Il for spi-devel-general@lists.sourceforge.net; Mon, 28 Jan 2013 17:58:00 +0000 X-ACL-Warn: Received: from moutng.kundenserver.de ([212.227.17.8]) by sog-mx-4.v43.ch3.sourceforge.com with esmtps (TLSv1:RC4-SHA:128) (Exim 4.76) id 1Tzsxu-0007l3-OZ for spi-devel-general@lists.sourceforge.net; Mon, 28 Jan 2013 17:57:59 +0000 Received: from wuerfel.lan (HSI-KBW-46-223-90-92.hsi.kabel-badenwuerttemberg.de [46.223.90.92]) by mrelayeu.kundenserver.de (node=mrbap3) with ESMTP (Nemesis) id 0MGi7V-1UDJES0opF-00DWXq; Mon, 28 Jan 2013 18:57:41 +0100 From: Arnd Bergmann To: linux-arm-kernel@vger.kernel.org Subject: [PATCH 2/5] spi: pl022: use generic DMA slave configuration if possible Date: Mon, 28 Jan 2013 17:57:34 +0000 Message-Id: <1359395857-1235-3-git-send-email-arnd@arndb.de> X-Mailer: git-send-email 1.8.0 In-Reply-To: <1359395857-1235-1-git-send-email-arnd@arndb.de> References: <1359395857-1235-1-git-send-email-arnd@arndb.de> X-Provags-ID: V02:K0:8N3JD/UK9lgs0TS+dFageb8lS4R03lR45Oh4HOr4eLF 2kdE0VEqtzM1D/juw7+m9ex4nNjqoIDgHFtQJSyi4Ww8WePPdV ioMjFgmMXnHq7s2BsVKAMBMelq5TX5SsP59EWzf8PmJoYbfuyL PR4e+/vZfc02jnF11shNusqP+Z/c0FTcybYNgsvtKeAGBWXZUj nfB/h47I8IGHYI32wUs64SndbIHXoJ5W9PrOiuNGhyv9Pchy8N mCbPWE8lMqSAfWOzIQ+2sAE7jr2f8Nbp6EThz5usKANzXV1ZXv vlkr/sVyiKeUWXyOEs39QYJjclhK7SCz2TUgSe7fBv8gEctFzP a8Pb2IEh3B00QhkAQMR0HODA4P/f9mkG1IWo44CaG X-Spam-Score: -0.0 (/) X-Spam-Report: Spam Filtering performed by mx.sourceforge.net. See http://spamassassin.org/tag/ for more details. -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [212.227.17.8 listed in list.dnswl.org] -0.0 SPF_HELO_PASS SPF: HELO matches SPF record X-Headers-End: 1Tzsxu-0007l3-OZ Cc: Vinod Koul , Arnd Bergmann , Viresh Kumar , devicetree-discuss@lists.ozlabs.org, Mark Brown , spi-devel-general@lists.sourceforge.net, Andy Shevchenko X-BeenThere: spi-devel-general@lists.sourceforge.net X-Mailman-Version: 2.1.9 Precedence: list List-Id: Linux SPI core/device drivers discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: spi-devel-general-bounces@lists.sourceforge.net With the new OF DMA binding, it is possible to completely avoid the need for platform_data for configuring a DMA channel. In cases where the platform has already been converted, calling dma_request_slave_channel should get all the necessary information from the device tree. Like the patch that converts the dw_dma controller, this is completely untested and is looking for someone to try it out. Signed-off-by: Arnd Bergmann Cc: Grant Likely Cc: Mark Brown Cc: spi-devel-general@lists.sourceforge.net Cc: Viresh Kumar Cc: Andy Shevchenko Cc: Vinod Koul Cc: devicetree-discuss@lists.ozlabs.org Cc: linux-arm-kernel@vger.kernel.org Acked-by: Grant Likely Acked-by: Linus Walleij --- drivers/spi/spi-pl022.c | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c index b0fe393..371cc66f 100644 --- a/drivers/spi/spi-pl022.c +++ b/drivers/spi/spi-pl022.c @@ -1139,6 +1139,35 @@ err_no_rxchan: return -ENODEV; } +static int pl022_dma_autoprobe(struct pl022 *pl022) +{ + struct device *dev = &pl022->adev->dev; + + /* automatically configure DMA channels from platform, normally using DT */ + pl022->dma_rx_channel = dma_request_slave_channel(dev, "rx"); + if (!pl022->dma_rx_channel) + goto err_no_rxchan; + + pl022->dma_tx_channel = dma_request_slave_channel(dev, "tx"); + if (!pl022->dma_tx_channel) + goto err_no_txchan; + + pl022->dummypage = kmalloc(PAGE_SIZE, GFP_KERNEL); + if (!pl022->dummypage) + goto err_no_dummypage; + + return 0; + +err_no_dummypage: + dma_release_channel(pl022->dma_tx_channel); + pl022->dma_tx_channel = NULL; +err_no_txchan: + dma_release_channel(pl022->dma_rx_channel); + pl022->dma_rx_channel = NULL; +err_no_rxchan: + return -ENODEV; +} + static void terminate_dma(struct pl022 *pl022) { struct dma_chan *rxchan = pl022->dma_rx_channel; @@ -1167,6 +1196,11 @@ static inline int configure_dma(struct pl022 *pl022) return -ENODEV; } +static inline int pl022_dma_autoprobe(struct pl022 *pl022) +{ + return 0; +} + static inline int pl022_dma_probe(struct pl022 *pl022) { return 0; @@ -2226,8 +2260,13 @@ static int pl022_probe(struct amba_device *adev, const struct amba_id *id) goto err_no_irq; } - /* Get DMA channels */ - if (platform_info->enable_dma) { + /* Get DMA channels, try autoconfiguration first */ + status = pl022_dma_autoprobe(pl022); + + /* If that failed, use channels from platform_info */ + if (status == 0) + platform_info->enable_dma = 1; + else if (platform_info->enable_dma) { status = pl022_dma_probe(pl022); if (status != 0) platform_info->enable_dma = 0;