Message ID | 1359395857-1235-3-git-send-email-arnd@arndb.de (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
On Mon, 28 Jan 2013 17:57:34 +0000, Arnd Bergmann <arnd@arndb.de> wrote: > 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 <arnd@arndb.de> > Cc: Grant Likely <grant.likely@secretlab.ca> > Cc: Mark Brown <broonie@opensource.wolfsonmicro.com> > Cc: spi-devel-general@lists.sourceforge.net > Cc: Viresh Kumar <viresh.kumar@linaro.org> > Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com> > Cc: Vinod Koul <vinod.koul@linux.intel.com> > Cc: devicetree-discuss@lists.ozlabs.org > Cc: linux-arm-kernel@vger.kernel.org > --- > drivers/spi/spi-pl022.c | 43 +++++++++++++++++++++++++++++++++++++++++-- > 1 file changed, 41 insertions(+), 2 deletions(-) Acked-by: Grant Likely <grant.likely@secretlab.ca> > > 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; > -- > 1.8.0 >
On Mon, Jan 28, 2013 at 6:57 PM, Arnd Bergmann <arnd@arndb.de> wrote: > 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 <arnd@arndb.de> This looks correct to me atleast: Acked-by: Linus Walleij <linus.walleij@linaro.org> Yours, Linus Walleij ------------------------------------------------------------------------------ Free Next-Gen Firewall Hardware Offer Buy your Sophos next-gen firewall before the end March 2013 and get the hardware for free! Learn more. http://p.sf.net/sfu/sophos-d2d-feb
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;
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 <arnd@arndb.de> Cc: Grant Likely <grant.likely@secretlab.ca> Cc: Mark Brown <broonie@opensource.wolfsonmicro.com> Cc: spi-devel-general@lists.sourceforge.net Cc: Viresh Kumar <viresh.kumar@linaro.org> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Cc: Vinod Koul <vinod.koul@linux.intel.com> Cc: devicetree-discuss@lists.ozlabs.org Cc: linux-arm-kernel@vger.kernel.org --- drivers/spi/spi-pl022.c | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-)