Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751770AbcDTQOP (ORCPT ); Wed, 20 Apr 2016 12:14:15 -0400 Received: from mail-sn1nam02on0050.outbound.protection.outlook.com ([104.47.36.50]:10413 "EHLO NAM02-SN1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750717AbcDTQOM (ORCPT ); Wed, 20 Apr 2016 12:14:12 -0400 Authentication-Results: spf=pass (sender IP is 149.199.60.100) smtp.mailfrom=xilinx.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=bestguesspass action=none header.from=xilinx.com; Date: Wed, 20 Apr 2016 09:12:01 -0700 From: =?utf-8?B?U8O2cmVu?= Brinkmann To: Appana Durga Kedareswara Rao CC: Soren Brinkmann , "robh+dt@kernel.org" , "pawel.moll@arm.com" , "mark.rutland@arm.com" , "ijc+devicetree@hellion.org.uk" , "galak@codeaurora.org" , Michal Simek , "vinod.koul@intel.com" , "dan.j.williams@intel.com" , "moritz.fischer@ettus.com" , "laurent.pinchart@ideasonboard.com" , "luis@debethencourt.com" , Anirudha Sarangi , Punnaiah Choudary Kalluri , Shubhrajyoti Datta , "devicetree@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "dmaengine@vger.kernel.org" Subject: Re: [PATCH v2 2/2] dmaengine: vdma: Add clock support Message-ID: <20160420161201.GS7128@xsjsorenbubuntu> References: <1461152599-28858-1-git-send-email-appanad@xilinx.com> <1461152599-28858-2-git-send-email-appanad@xilinx.com> <20160420143622.GP7128@xsjsorenbubuntu> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-RCIS-Action: ALLOW X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.0.0.1202-22272.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:149.199.60.100;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(979002)(6009001)(2980300002)(438002)(189002)(377424004)(199003)(377454003)(13464003)(24454002)(47776003)(50466002)(85202003)(33716001)(83506001)(19580405001)(6806005)(2950100001)(19580395003)(106466001)(5008740100001)(23676002)(76176999)(586003)(4001450100002)(93886004)(2870700001)(87936001)(11100500001)(50986999)(1220700001)(9686002)(4326007)(85182001)(1076002)(63266004)(1096002)(81166005)(77096005)(33656002)(2906002)(54356999)(86362001)(110136002)(189998001)(9786002)(76506005)(57986006)(36386004)(4001350100001)(92566002)(107986001)(5001870100001)(969003)(989001)(999001)(1009001)(1019001);DIR:OUT;SFP:1101;SCL:1;SRVR:SN1NAM02HT148;H:xsj-pvapsmtpgw02;FPR:;SPF:Pass;MLV:ovrnspm;MX:1;A:1;PTR:unknown-60-100.xilinx.com,xapps1.xilinx.com;LANG:en; X-MS-Office365-Filtering-Correlation-Id: 1e3f1baa-56fc-43b7-7555-08d36936ce59 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(8251501002);SRVR:SN1NAM02HT148; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(9101521026)(601004)(2401047)(8121501046)(13017025)(5005006)(13024025)(13015025)(13023025)(13018025)(10201501046)(3002001);SRVR:SN1NAM02HT148;BCL:0;PCL:0;RULEID:;SRVR:SN1NAM02HT148; X-Forefront-PRVS: 0918748D70 X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Apr 2016 16:14:09.4866 (UTC) X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c;Ip=[149.199.60.100];Helo=[xsj-pvapsmtpgw02] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1NAM02HT148 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5867 Lines: 153 On Wed, 2016-04-20 at 07:55:27 -0700, Appana Durga Kedareswara Rao wrote: > Hi Soren, > > > -----Original Message----- > > From: Sören Brinkmann [mailto:soren.brinkmann@xilinx.com] > > Sent: Wednesday, April 20, 2016 8:06 PM > > To: Appana Durga Kedareswara Rao > > Cc: robh+dt@kernel.org; pawel.moll@arm.com; mark.rutland@arm.com; > > ijc+devicetree@hellion.org.uk; galak@codeaurora.org; Michal Simek > > ; vinod.koul@intel.com; dan.j.williams@intel.com; > > Appana Durga Kedareswara Rao ; > > moritz.fischer@ettus.com; laurent.pinchart@ideasonboard.com; > > luis@debethencourt.com; Anirudha Sarangi ; Punnaiah > > Choudary Kalluri ; Shubhrajyoti Datta > > ; devicetree@vger.kernel.org; linux-arm- > > kernel@lists.infradead.org; linux-kernel@vger.kernel.org; > > dmaengine@vger.kernel.org > > Subject: Re: [PATCH v2 2/2] dmaengine: vdma: Add clock support > > > > On Wed, 2016-04-20 at 17:13:19 +0530, Kedareswara rao Appana wrote: > > > Added basic clock support. The clocks are requested at probe and > > > released at remove. > > > > > > Signed-off-by: Kedareswara rao Appana > > > --- > > > Changes for v2: > > > --> None. > > > > > > drivers/dma/xilinx/xilinx_vdma.c | 56 > > > ++++++++++++++++++++++++++++++++++++++++ > > > 1 file changed, 56 insertions(+) > > > > > > diff --git a/drivers/dma/xilinx/xilinx_vdma.c > > > b/drivers/dma/xilinx/xilinx_vdma.c > > > index 70caea6..d526029 100644 > > > --- a/drivers/dma/xilinx/xilinx_vdma.c > > > +++ b/drivers/dma/xilinx/xilinx_vdma.c > > > @@ -44,6 +44,7 @@ > > > #include > > > #include > > > #include > > > +#include > > > > > > #include "../dmaengine.h" > > > > > > @@ -352,6 +353,8 @@ struct xilinx_dma_chan { > > > * @flush_on_fsync: Flush on frame sync > > > * @ext_addr: Indicates 64 bit addressing is supported by dma device > > > * @dmatype: DMA ip type > > > + * @clks: pointer to array of clocks > > > + * @numclks: number of clocks available > > > */ > > > struct xilinx_dma_device { > > > void __iomem *regs; > > > @@ -362,6 +365,8 @@ struct xilinx_dma_device { > > > u32 flush_on_fsync; > > > bool ext_addr; > > > enum xdma_ip_type dmatype; > > > + struct clk **clks; > > > + int numclks; > > > }; > > > > > > /* Macros */ > > > @@ -1731,6 +1736,26 @@ int xilinx_vdma_channel_set_config(struct > > > dma_chan *dchan, } EXPORT_SYMBOL(xilinx_vdma_channel_set_config); > > > > > > +static int xdma_clk_init(struct xilinx_dma_device *xdev, bool enable) > > > +{ > > > + int i = 0, ret; > > > + > > > + for (i = 0; i < xdev->numclks; i++) { > > > + if (enable) { > > > + ret = clk_prepare_enable(xdev->clks[i]); > > > + if (ret) { > > > + dev_err(xdev->dev, > > > + "failed to enable the axidma clock\n"); > > > + return ret; > > > + } > > > + } else { > > > + clk_disable_unprepare(xdev->clks[i]); > > > + } > > > + } > > > + > > > + return 0; > > > +} > > > + > > > /* ----------------------------------------------------------------------------- > > > * Probe and remove > > > */ > > > @@ -1919,6 +1944,7 @@ static int xilinx_dma_probe(struct platform_device > > *pdev) > > > struct resource *io; > > > u32 num_frames, addr_width; > > > int i, err; > > > + const char *str; > > > > > > /* Allocate and initialize the DMA engine structure */ > > > xdev = devm_kzalloc(&pdev->dev, sizeof(*xdev), GFP_KERNEL); @@ > > > -1965,6 +1991,32 @@ static int xilinx_dma_probe(struct platform_device > > *pdev) > > > /* Set the dma mask bits */ > > > dma_set_mask(xdev->dev, DMA_BIT_MASK(addr_width)); > > > > > > + xdev->numclks = of_property_count_strings(pdev->dev.of_node, > > > + "clock-names"); > > > + if (xdev->numclks > 0) { > > > + xdev->clks = devm_kmalloc_array(&pdev->dev, xdev->numclks, > > > + sizeof(struct clk *), > > > + GFP_KERNEL); > > > + if (!xdev->clks) > > > + return -ENOMEM; > > > + > > > + for (i = 0; i < xdev->numclks; i++) { > > > + of_property_read_string_index(pdev->dev.of_node, > > > + "clock-names", i, &str); > > > + xdev->clks[i] = devm_clk_get(xdev->dev, str); > > > + if (IS_ERR(xdev->clks[i])) { > > > + if (PTR_ERR(xdev->clks[i]) == -ENOENT) > > > + xdev->clks[i] = NULL; > > > + else > > > + return PTR_ERR(xdev->clks[i]); > > > + } > > > + } > > > + > > > + err = xdma_clk_init(xdev, true); > > > + if (err) > > > + return err; > > > + } > > > > I guess this works, but the relation to the binding is a little loose, IMHO. Instead > > of using the clock names from the binding this is just using whatever is provided > > in DT and enabling it. Also, all the clocks here are handled as optional feature, > > while binding - and I guess reality too - have them as mandatory. > > It would be nicer if the driver specifically asks for the clocks it needs and return > > an error if a mandatory clock is missing. > > Here DMA channels are configurable I mean if user select only mm2s channel then we will have > Only 3 clocks. If user selects both mm2s and s2mm channels we will have 5 clocks. > That’s why reading the number of clocks from the clock-names property. > > And also the AXI DMA/CDMA Ip support also getting added to this driver for those IP's also the clocks are configurable > For AXI DMA it is either 3 or 4 clocks and for AXI CDMA it is 2 clocks. > > That's why I thought it is the proper solution. > > If you have any better idea please let me know will try in that way... I guess the driver know all these things: whether it controls vdma or cdma, what interfaces it has and how many channels? Based on that, I guess it should be possible to derive what clocks are required for correct operation. Sören