linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Arnd Bergmann <arnd@arndb.de>
To: "Russell King - ARM Linux" <linux@arm.linux.org.uk>
Cc: Lee Jones <lee.jones@linaro.org>,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, linus.walleij@stericsson.com,
	Chris Ball <cjb@laptop.org>,
	linux-mmc@vger.kernel.org
Subject: Re: [PATCH] mmc: mmci: Allow MMCI to request channels with information acquired from DT
Date: Thu, 18 Apr 2013 11:25:44 +0200	[thread overview]
Message-ID: <201304181125.44983.arnd@arndb.de> (raw)
In-Reply-To: <20130418081549.GE14496@n2100.arm.linux.org.uk>

On Thursday 18 April 2013, Russell King - ARM Linux wrote:
> On Thu, Apr 18, 2013 at 09:02:38AM +0100, Lee Jones wrote:
> > @@ -321,19 +323,21 @@ static void mmci_dma_setup(struct mmci_host *host)
> >        * attempt to use it bidirectionally, however if it is
> >        * is specified but cannot be located, DMA will be disabled.
> >        */
> > -     if (plat->dma_rx_param) {
> > -             host->dma_rx_channel = dma_request_channel(mask,
> > -                                                        plat->dma_filter,
> > -                                                        plat->dma_rx_param);
> > +     if (plat->dma_rx_param || np) {
> > +             host->dma_rx_channel = dma_request_slave_channel_compat(mask,
> > +                                                             plat->dma_filter,
> > +                                                             plat->dma_rx_param,
> > +                                                             &dev->dev, "rx");
> >               /* E.g if no DMA hardware is present */
> >               if (!host->dma_rx_channel)
> >                       dev_err(mmc_dev(host->mmc), "no RX DMA channel\n");
> 
> I don't think this is right - I think Arnd has been leading you up the
> garden path saying that this can be simplified.  Why?
> 
> If you look at what this code does, the DMA channels are optional.  If
> they're not provided, then you don't get an error or a warning printk from
> the code.  However, after your conversion, if you use DT and avoid giving
> the DMA information (which you have to avoid on the majority of ARM
> platforms) then "np" will be non-NULL, and
> dma_request_slave_channel_compat() will return NULL, causing the error
> and/or warning to be printed.

Right, so I guess we should print the warning only if plat->dma_filter
is non-NULL, or we don't use dma_request_slave_channel_compat, which
does not actually simplify the code here.

	Arnd

diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
index 375c109..c97bc92 100644
--- a/drivers/mmc/host/mmci.c
+++ b/drivers/mmc/host/mmci.c
@@ -298,20 +298,11 @@ static void mmci_init_sg(struct mmci_host *host, struct mmc_data *data)
  * no custom DMA interfaces are supported.
  */
 #ifdef CONFIG_DMA_ENGINE
-static void mmci_dma_setup(struct mmci_host *host)
+static int mmci_dma_plat_setup(struct mmci_host *host)
 {
 	struct mmci_platform_data *plat = host->plat;
-	const char *rxname, *txname;
 	dma_cap_mask_t mask;
 
-	if (!plat || !plat->dma_filter) {
-		dev_info(mmc_dev(host->mmc), "no DMA platform data\n");
-		return;
-	}
-
-	/* initialize pre request cookie */
-	host->next_data.cookie = 1;
-
 	/* Try to acquire a generic DMA engine slave channel */
 	dma_cap_zero(mask);
 	dma_cap_set(DMA_SLAVE, mask);
@@ -339,6 +330,25 @@ static void mmci_dma_setup(struct mmci_host *host)
 	} else {
 		host->dma_tx_channel = host->dma_rx_channel;
 	}
+}
+
+static void mmci_dma_setup(struct device *dev, struct mmci_host *host)
+{
+	const char *rxname, *txname;
+
+	host->dma_rx_channel = dma_request_slave_channel(dev, "rx");
+	host->dma_tx_channel = dma_request_slave_channel(dev, "tx");
+
+	if (!host->dma_rx_channel && !host->dma_tx_channel) {
+		if (host->plat && host->plat->dma_filter)
+			mmci_dma_plat_setup(host);
+		else
+			dev_info(mmc_dev(host->mmc), "no DMA platform data\n");
+			return;
+	}
+
+	/* initialize pre request cookie */
+	host->next_data.cookie = 1;
 
 	if (host->dma_rx_channel)
 		rxname = dma_chan_name(host->dma_rx_channel);

  reply	other threads:[~2013-04-18  9:25 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-04-17 13:32 [PATCH] mmc: mmci: Allow MMCI to request channels with information acquired from DT Lee Jones
2013-04-17 13:50 ` Arnd Bergmann
2013-04-17 15:04   ` Lee Jones
2013-04-17 15:31     ` Arnd Bergmann
2013-04-18  8:02       ` Lee Jones
2013-04-18  8:15         ` Russell King - ARM Linux
2013-04-18  9:25           ` Arnd Bergmann [this message]
2013-04-18  9:30             ` Russell King - ARM Linux
2013-04-18  8:21         ` Ulf Hansson
2013-04-24 10:58 Lee Jones
2013-04-30 13:01 ` Linus Walleij
2013-04-30 13:12   ` Lee Jones

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201304181125.44983.arnd@arndb.de \
    --to=arnd@arndb.de \
    --cc=cjb@laptop.org \
    --cc=lee.jones@linaro.org \
    --cc=linus.walleij@stericsson.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).