From patchwork Wed Nov 19 09:47:15 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 412314 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 18167140170 for ; Wed, 19 Nov 2014 20:47:35 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753542AbaKSJrd (ORCPT ); Wed, 19 Nov 2014 04:47:33 -0500 Received: from mout.kundenserver.de ([212.227.126.131]:53252 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753125AbaKSJra (ORCPT ); Wed, 19 Nov 2014 04:47:30 -0500 Received: from wuerfel.localnet (HSI-KBW-149-172-15-242.hsi13.kabel-badenwuerttemberg.de [149.172.15.242]) by mrelayeu.kundenserver.de (node=mreue007) with ESMTP (Nemesis) id 0LlLpD-1YQ59n0D1L-00bO7N; Wed, 19 Nov 2014 10:47:16 +0100 From: Arnd Bergmann To: linux-arm-kernel@lists.infradead.org Cc: Wolfram Sang , Ludovic Desroches , nicolas.ferre@atmel.com, linux-i2c@vger.kernel.org Subject: Re: [PATCH] i2c: at91: introduce probe deferring Date: Wed, 19 Nov 2014 10:47:15 +0100 Message-ID: <5216790.dAh2H6iKq8@wuerfel> User-Agent: KMail/4.11.5 (Linux/3.16.0-10-generic; KDE/4.11.5; x86_64; ; ) In-Reply-To: <20141119091647.GB1439@katana> References: <1415972879-26509-1-git-send-email-ludovic.desroches@atmel.com> <20141119091647.GB1439@katana> MIME-Version: 1.0 X-Provags-ID: V02:K0:p+Hv9Iu6/j5xGMtY5ClEiI0Z4y+S1RfHpH0QR25tMGv tcJ3Gnt03mxQLbTj8QoVNLpULLgE157vWXg5SMOQWzAfWJeXVd K3L+kBWhAe67WC0RhD2RgS7EQo0rAYZ3wRbKLiRICgyVy9dV+q iGLEFJ495Htek2TeRmSHP7z3Rb3FTR0SchsInihqdgkcEb/tJm c2k1ak1MaEhZ69ixpWuSl2138mRIhgCRpzvMOF9GZ3v6OWObB2 lgD5ODvxnyMhKwqW0XXS3rzTNEbc48i/ObcFQWy52TaENP1Nr6 qXNVUwByKeTon89F6EkbojTlE+0leJb1O8o40CtraYsikaFc1V HF7J4ACIXxt6s44iLOQI= X-UI-Out-Filterresults: notjunk:1; Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org On Wednesday 19 November 2014 10:16:47 Wolfram Sang wrote: > On Fri, Nov 14, 2014 at 02:47:59PM +0100, Ludovic Desroches wrote: > > Return probe defer if requesting a dma channel without a dma controller probed. > > > > Signed-off-by: Ludovic Desroches > > --- > > drivers/i2c/busses/i2c-at91.c | 22 ++++++++++++++++------ > > 1 file changed, 16 insertions(+), 6 deletions(-) > > > > diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c > > index 77fb647..df3f4c4 100644 > > --- a/drivers/i2c/busses/i2c-at91.c > > +++ b/drivers/i2c/busses/i2c-at91.c > > @@ -679,14 +679,21 @@ static int at91_twi_configure_dma(struct at91_twi_dev *dev, u32 phy_addr) > > dma_cap_zero(mask); > > dma_cap_set(DMA_SLAVE, mask); > > > > - dma->chan_tx = dma_request_slave_channel_compat(mask, filter, pdata, > > - dev->dev, "tx"); > > - if (!dma->chan_tx) { > > + dma->chan_tx = dma_request_slave_channel_reason(dev->dev, "tx"); > > Will it cause regressions if you drop the compat-version of requesting > a channel? I got curious about this, since the patch looks obviously wrong, but actually it's ok. However the entire DMA support for non-DT platforms can be dropped in this driver, see patch below > > + if (IS_ERR(dma->chan_tx)) { > > + ret = PTR_ERR(dma->chan_tx); > > + if (ret == -EPROBE_DEFER) { > > + dev_warn(dev->dev, "no DMA channel available at the moment\n"); > > I'd say drop this warning. The core usually prints when deferred probing > takes place. Definitely yes. Arnd 8<--- [PATCH] i2c: at91: remove legacy DMA supoprt Since at91sam9g45 is now DT-only, all DMA capable users of this driver are using the DT case, and the legacy support can be removed. While at it, fix the deferred probe case. Signed-off-by: Arnd Bergmann Acked-by: Ludovic Desroches --- To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c index 917d54588d95..534f4c07bfb6 100644 --- a/drivers/i2c/busses/i2c-at91.c +++ b/drivers/i2c/busses/i2c-at91.c @@ -72,8 +72,6 @@ struct at91_twi_pdata { unsigned clk_max_div; unsigned clk_offset; bool has_unre_flag; - bool has_dma_support; - struct at_dma_slave dma_slave; }; struct at91_twi_dma { @@ -541,35 +539,30 @@ static struct at91_twi_pdata at91rm9200_config = { .clk_max_div = 5, .clk_offset = 3, .has_unre_flag = true, - .has_dma_support = false, }; static struct at91_twi_pdata at91sam9261_config = { .clk_max_div = 5, .clk_offset = 4, .has_unre_flag = false, - .has_dma_support = false, }; static struct at91_twi_pdata at91sam9260_config = { .clk_max_div = 7, .clk_offset = 4, .has_unre_flag = false, - .has_dma_support = false, }; static struct at91_twi_pdata at91sam9g20_config = { .clk_max_div = 7, .clk_offset = 4, .has_unre_flag = false, - .has_dma_support = false, }; static struct at91_twi_pdata at91sam9g10_config = { .clk_max_div = 7, .clk_offset = 4, .has_unre_flag = false, - .has_dma_support = false, }; static const struct platform_device_id at91_twi_devtypes[] = { @@ -598,7 +591,6 @@ static struct at91_twi_pdata at91sam9x5_config = { .clk_max_div = 7, .clk_offset = 4, .has_unre_flag = false, - .has_dma_support = true, }; static const struct of_device_id atmel_twi_dt_ids[] = { @@ -627,30 +619,11 @@ static const struct of_device_id atmel_twi_dt_ids[] = { MODULE_DEVICE_TABLE(of, atmel_twi_dt_ids); #endif -static bool filter(struct dma_chan *chan, void *pdata) -{ - struct at91_twi_pdata *sl_pdata = pdata; - struct at_dma_slave *sl; - - if (!sl_pdata) - return false; - - sl = &sl_pdata->dma_slave; - if (sl && (sl->dma_dev == chan->device->dev)) { - chan->private = sl; - return true; - } else { - return false; - } -} - static int at91_twi_configure_dma(struct at91_twi_dev *dev, u32 phy_addr) { int ret = 0; - struct at91_twi_pdata *pdata = dev->pdata; struct dma_slave_config slave_config; struct at91_twi_dma *dma = &dev->dma; - dma_cap_mask_t mask; memset(&slave_config, 0, sizeof(slave_config)); slave_config.src_addr = (dma_addr_t)phy_addr + AT91_TWI_RHR; @@ -661,22 +634,17 @@ static int at91_twi_configure_dma(struct at91_twi_dev *dev, u32 phy_addr) slave_config.dst_maxburst = 1; slave_config.device_fc = false; - dma_cap_zero(mask); - dma_cap_set(DMA_SLAVE, mask); - - dma->chan_tx = dma_request_slave_channel_compat(mask, filter, pdata, - dev->dev, "tx"); - if (!dma->chan_tx) { - dev_err(dev->dev, "can't get a DMA channel for tx\n"); - ret = -EBUSY; + dma->chan_tx = dma_request_slave_channel_reason(dev->dev, "tx"); + if (IS_ERR(dma->chan_tx)) { + ret = PTR_ERR(dma->chan_tx); + dma->chan_tx = NULL; goto error; } - dma->chan_rx = dma_request_slave_channel_compat(mask, filter, pdata, - dev->dev, "rx"); - if (!dma->chan_rx) { - dev_err(dev->dev, "can't get a DMA channel for rx\n"); - ret = -EBUSY; + dma->chan_rx = dma_request_slave_channel_reason(dev->dev, "rx"); + if (IS_ERR(dma->chan_rx)) { + ret = PTR_ERR(dma->chan_rx); + dma->chan_rx = NULL; goto error; } @@ -697,6 +665,7 @@ static int at91_twi_configure_dma(struct at91_twi_dev *dev, u32 phy_addr) sg_init_table(&dma->sg, 1); dma->buf_mapped = false; dma->xfer_in_progress = false; + dev->use_dma = true; dev_info(dev->dev, "using %s (tx) and %s (rx) for DMA transfers\n", dma_chan_name(dma->chan_tx), dma_chan_name(dma->chan_rx)); @@ -704,7 +673,8 @@ static int at91_twi_configure_dma(struct at91_twi_dev *dev, u32 phy_addr) return ret; error: - dev_info(dev->dev, "can't use DMA\n"); + if (ret != -EPROBE_DEFER) + dev_info(dev->dev, "can't use DMA, error %d\n", ret); if (dma->chan_rx) dma_release_channel(dma->chan_rx); if (dma->chan_tx) @@ -772,10 +742,8 @@ static int at91_twi_probe(struct platform_device *pdev) } clk_prepare_enable(dev->clk); - if (dev->pdata->has_dma_support) { - if (at91_twi_configure_dma(dev, phy_addr) == 0) - dev->use_dma = true; - } + if (dev->of_node) + at91_twi_configure_dma(dev, phy_addr); rc = of_property_read_u32(dev->dev->of_node, "clock-frequency", &bus_clk_rate);