From patchwork Fri Mar 25 04:02:34 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Chen X-Patchwork-Id: 8668481 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 11E639F36E for ; Fri, 25 Mar 2016 04:05:06 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 14A07202AE for ; Fri, 25 Mar 2016 04:05:05 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 07F09201ED for ; Fri, 25 Mar 2016 04:05:04 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1ajIxq-0007H8-4A; Fri, 25 Mar 2016 04:03:10 +0000 Received: from mail-pa0-x244.google.com ([2607:f8b0:400e:c03::244]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1ajIxn-00078V-K5 for linux-arm-kernel@lists.infradead.org; Fri, 25 Mar 2016 04:03:08 +0000 Received: by mail-pa0-x244.google.com with SMTP id fl4so5351799pad.2 for ; Thu, 24 Mar 2016 21:02:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=HG8pyDVR+pwSRTBoGtnt9dqtXmA8EgHavSu/69O0G7M=; b=RTndoGAYu0ZE+xcl0nQ11XZJVxcXyxiaC4pXI/PTXZrn7rs/vSfkm0GX609q0fk6Eo 96zBf6F9GX9bh0ZkbsNNlN407lBezDDfZI799ARioNx8NH3XEjXkTF7zed9XWzVw6bkM cwgQP5KIW/Unpf/xEt2/ilBkcdLl6/bAw2MR9dVP/77Jgy8K2wz80PpbliFXVaGzh6v1 lgaRIj1AOC8pVg+LsPZ4t/cb2sAsswlOEYW3C87Dpa6+akjug/mFjXWjD7jbeW55B4cD KEgBqp/Bt/4U+Pf2AIhXkbZpXscpZsR566wusKCD3TLtv2P7HuFRr5WtJmQi+wMHHKIF 3ppQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=HG8pyDVR+pwSRTBoGtnt9dqtXmA8EgHavSu/69O0G7M=; b=FdMmStJz4MbwpV5T8KfRG0/ltdn4Z5lgV7odz1ns7cinI1Whn51LRUURhPq6I/iLLZ bF5v/CrlN7e0kS3eDD5jdKfqUjPVVFnyxkzPeNwNiojh7xCSzKQJZzO4fAMwk0CWIqAf DLF6de80Kv6eMGcd1b9Ou9OUwU+JNbjbAg/vTqPdahz1MywWjinyWBEdUtll8wSDS972 HeEYJC/8K48cTgSOwizQb1yuXTHw11jXqDbOvTIzfsqnu9lO4uiFnQHbJ2p1241Ww3QO iO5NwhJnJSi81WZNkRxTzttzbS1vCyDQf/UT86ziPOJsTpvS+yCG1Tz/Z0WBoQyL9JA0 1weg== X-Gm-Message-State: AD7BkJI3951O/+/ZofUOsYN3TQYdv4ZCC04ii92LDYu2m9vU8EpkdXYrMXQOIAEWFtrQNQ== X-Received: by 10.66.255.39 with SMTP id an7mr17981341pad.2.1458878565453; Thu, 24 Mar 2016 21:02:45 -0700 (PDT) Received: from peterchendt (gate-zmy3.freescale.com. [192.88.167.1]) by smtp.gmail.com with ESMTPSA id r65sm13151085pfa.27.2016.03.24.21.02.38 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Thu, 24 Mar 2016 21:02:43 -0700 (PDT) Date: Fri, 25 Mar 2016 12:02:34 +0800 From: Peter Chen To: Bjorn Andersson Subject: Re: [PATCH] usb: chipidea: Configure DMA properties and ops from DT Message-ID: <20160325040234.GA6185@peterchendt> References: <1456119133-16114-1-git-send-email-bjorn.andersson@linaro.org> <56CADCE9.9090305@linaro.org> <20160222220750.GI21240@tuxbot> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160324_210307_781743_0ACDCBD7 X-CRM114-Status: GOOD ( 28.29 ) X-Spam-Score: -2.7 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Peter Chen , linux@arm.linux.org.uk, Arnd Bergmann , Greg Kroah-Hartman , Rajesh Bhagat , "linux-usb@vger.kernel.org" , lkml , Srinivas Kandagatla , linux-arm-msm , Li Yang , "linux-arm-kernel@lists.infradead.org" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, T_DKIM_INVALID, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP On Tue, Mar 08, 2016 at 07:40:08PM -0800, Bjorn Andersson wrote: > On Tue, Mar 8, 2016 at 11:52 AM, Li Yang wrote: > > On Wed, Mar 2, 2016 at 4:59 PM, Li Yang wrote: > >> On Mon, Feb 22, 2016 at 4:07 PM, Bjorn Andersson > >> wrote: > >>> On Mon 22 Feb 02:03 PST 2016, Srinivas Kandagatla wrote: > >>> > >>>> > >>>> > >>>> On 22/02/16 05:32, Bjorn Andersson wrote: > >>>> >On certain platforms (e.g. ARM64) the dma_ops needs to be explicitly set > >>>> >to be able to do DMA allocations, so use the of_dma_configure() helper > >>>> >to populate the dma properties and assign an appropriate dma_ops. > [..] > >>>> None of the drivers call of_dma_configure() explicitly, which makes me feel > >>>> that we are doing something wrong. TBH, this should be handled in more > >>>> generic way rather than driver like this having an explicit call to > >>>> of_dma_configure(). > >>>> > >>> > > I had the chance to go through this with Arnd and the verdict is that > devices not described in DT should not do DMA (or allocate buffers for > doing DMA). > > So I believe the solution is to fall back on Peter's description; the > chipidea driver is the core driver and the Qualcomm code should just > be a platform layer. > > My suggestion is that we turn the chipidea core into a set of APIs > that can called by the platform specific pieces. That way we will have > the chipidea core be the device described in the DT. > Hi Bjorn, After reading the DMA documentation Russell supplied and several related DMA APIs, would you please try below patch on your ARM64 platform? Since the core device has no device node at all, I don't know why your patch can work, or am I missing something? From bcf7eaf694d29fb7557a9406fb6c89213216069c Mon Sep 17 00:00:00 2001 From: Peter Chen Date: Fri, 25 Mar 2016 11:54:21 +0800 Subject: [PATCH 1/1] usb: chipidea: add DMA mask configuration API Signed-off-by: Peter Chen --- drivers/usb/chipidea/ci_hdrc_msm.c | 6 ++++++ drivers/usb/chipidea/core.c | 25 +++++++++++++++++++++++++ include/linux/usb/chipidea.h | 2 ++ 3 files changed, 33 insertions(+) diff --git a/drivers/usb/chipidea/ci_hdrc_msm.c b/drivers/usb/chipidea/ci_hdrc_msm.c index 3889809..43ceb38 100644 --- a/drivers/usb/chipidea/ci_hdrc_msm.c +++ b/drivers/usb/chipidea/ci_hdrc_msm.c @@ -5,6 +5,7 @@ * only version 2 as published by the Free Software Foundation. */ +#include #include #include #include @@ -56,6 +57,7 @@ static int ci_hdrc_msm_probe(struct platform_device *pdev) { struct platform_device *plat_ci; struct usb_phy *phy; + int ret; dev_dbg(&pdev->dev, "ci_hdrc_msm_probe\n"); @@ -70,6 +72,10 @@ static int ci_hdrc_msm_probe(struct platform_device *pdev) ci_hdrc_msm_platdata.usb_phy = phy; + ret = ci_hdrc_set_dma_mask(&pdev->dev, DMA_BIT_MASK(64)); + if (ret) + return ret; + plat_ci = ci_hdrc_add_device(&pdev->dev, pdev->resource, pdev->num_resources, &ci_hdrc_msm_platdata); diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index 69426e6..b8ca5e3 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c @@ -62,6 +62,7 @@ #include #include #include +#include #include #include #include @@ -811,6 +812,30 @@ static void ci_extcon_unregister(struct ci_hdrc *ci) static DEFINE_IDA(ci_ida); +/** + * ci_hdrc_set_dma_mask + * + * Set dma mask and coherent dma mask for glue layer device, and the core + * device will inherit these values. If the 'dma-ranges' is specified at + * DT, it will use this value for both dma mask and coherent dma mask. + * + * @dev: a pointer to the device struct of glue layer device + * @ci_coherent_dma_mask: the mask for both dma_mask and cohrent_dma_mask + */ +int ci_hdrc_set_dma_mask(struct device *dev, u64 ci_coherent_dma_mask) +{ + int ret = dma_set_mask_and_coherent(dev, ci_coherent_dma_mask); + if (ret) { + dev_err(dev, "dma_set_mask_and_coherent fails\n"); + return ret; + } + + if (dev_of_node(dev)) + of_dma_configure(dev, dev->of_node); + + return ret; +} + struct platform_device *ci_hdrc_add_device(struct device *dev, struct resource *res, int nres, struct ci_hdrc_platform_data *platdata) diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h index 5dd75fa..8649930 100644 --- a/include/linux/usb/chipidea.h +++ b/include/linux/usb/chipidea.h @@ -84,4 +84,6 @@ struct platform_device *ci_hdrc_add_device(struct device *dev, /* Remove ci hdrc device */ void ci_hdrc_remove_device(struct platform_device *pdev); +int ci_hdrc_set_dma_mask(struct device *dev, u64 ci_coherent_dma_mask); + #endif