Received: by 10.192.165.156 with SMTP id m28csp611875imm; Mon, 16 Apr 2018 06:02:27 -0700 (PDT) X-Google-Smtp-Source: AIpwx480poNzUaXKpRTUvd23cEt2sKMQjoQrVIAaFppnobI7+cU7o+WrL8W789GbZbu4vdM7o6aB X-Received: by 10.99.116.8 with SMTP id p8mr12795460pgc.327.1523883747329; Mon, 16 Apr 2018 06:02:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523883747; cv=none; d=google.com; s=arc-20160816; b=AUwrCy7fWhgDEKdnfvmD/03seNDyoW5otnqw8KKBFHMg3YYKnrkx+dSd58AdYIRUjF 2NhbpfsST3JndI0L5Rt7J09zIwsitMEPHIdjxvv3c7DQlbey+O61oC3wYVgy0N5a21ge mPpXp6vPnkWiKA+CjmXrr6dI7c3c+RyfwKG2Dqg9KbOCI2DcG0EhYlR1rpO6qvpp6cOD XtDNOIbU4mGhw1EFbwU9Usc1ang2ANUcQqvP2qgTMeYfkWlBQOIdkmxe+T/ow10bpPUL hH0N1Rlz+JSl4Co1PXSHcLnCp9N84MWUaRdS1D1ny115vN7MAFbJgD9anp9tK7HvZ/xP Is+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:arc-authentication-results; bh=iYQYC0VmJanmxJkvB2UsMVZab5z30gp2kKKvPqOLxwU=; b=iAAxRakSebQ/5a+3sSLyZPMblQ52lAtREtaM59aR+/uRH15+4TUWdPLyfk2Rrjy1eq fywm8IevQNl5mTTce0RrDl4DZdJ+kom+UAxEz3R+/+KNAlrAIEWKdnO2Nz9hd5Z9W+Rq 8h2uIokFP/WzOidkdi8AYpFvuHK8pcr9zcdMX9/ybP5K4A74dZMdruOtDFAaLe9OaW5z dJSwGVAL+X+sBWGuz2W9jwGhdkNypEVPr0TCSdnJttxfWYGY16bkLU4SNpzw+BkJgX2c lhpHwE2udVKwVJCOfmSK1bFvzDfm1uywOBKLgHUY+lHyyOpjEhZeuzaTcEz2kV6001Md p0Qw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a1si10046660pfn.314.2018.04.16.06.01.37; Mon, 16 Apr 2018 06:02:27 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753577AbeDPMra (ORCPT + 99 others); Mon, 16 Apr 2018 08:47:30 -0400 Received: from mx07-00178001.pphosted.com ([62.209.51.94]:56133 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751113AbeDPMr1 (ORCPT ); Mon, 16 Apr 2018 08:47:27 -0400 Received: from pps.filterd (m0046668.ppops.net [127.0.0.1]) by mx07-.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id w3GCdfKK024790; Mon, 16 Apr 2018 14:46:50 +0200 Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 2hbd6csbem-1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT); Mon, 16 Apr 2018 14:46:50 +0200 Received: from zeta.dmz-eu.st.com (zeta.dmz-eu.st.com [164.129.230.9]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 0376531; Mon, 16 Apr 2018 12:46:49 +0000 (GMT) Received: from Webmail-eu.st.com (gpxdag5node6.st.com [10.75.127.79]) by zeta.dmz-eu.st.com (STMicroelectronics) with ESMTP id BE32B2B2C; Mon, 16 Apr 2018 12:46:49 +0000 (GMT) Received: from [10.48.0.167] (10.75.127.122) by GPXDAG5NODE6.st.com (10.75.127.79) with Microsoft SMTP Server (TLS) id 15.0.1347.2; Mon, 16 Apr 2018 14:46:48 +0200 Subject: Re: [PATCH v3 2/6] mfd: stm32-timers: add support for dmas To: Lee Jones CC: , , , , , , , , , , , References: <1522404084-24903-1-git-send-email-fabrice.gasnier@st.com> <1522404084-24903-3-git-send-email-fabrice.gasnier@st.com> <20180416122217.u7h3wawpdx3kj4wd@dell> From: Fabrice Gasnier Message-ID: <7531300c-7b7e-75c9-ea5b-8ca01b684c45@st.com> Date: Mon, 16 Apr 2018 14:46:47 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 In-Reply-To: <20180416122217.u7h3wawpdx3kj4wd@dell> Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 7bit X-Originating-IP: [10.75.127.122] X-ClientProxiedBy: GPXDAG2NODE4.st.com (10.75.127.68) To GPXDAG5NODE6.st.com (10.75.127.79) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-04-16_07:,, signatures=0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 04/16/2018 02:22 PM, Lee Jones wrote: > On Fri, 30 Mar 2018, Fabrice Gasnier wrote: > >> STM32 Timers can support up to 7 DMA requests: >> - 4 channels, update, compare and trigger. >> Optionally request part, or all DMAs from stm32-timers MFD core. >> >> Also add routine to implement burst reads using DMA from timer registers. >> This is exported. So, it can be used by child drivers, PWM capture >> for instance (but not limited to). >> >> Signed-off-by: Fabrice Gasnier >> Reviewed-by: Benjamin Gaignard >> --- >> Changes in v3: >> - Basically Lee's comments: >> - rather create a struct stm32_timers_dma, and place a reference to it >> in existing ddata (instead of adding priv struct). >> - rather use a struct device in exported routine prototype, and use >> standard helpers instead of ddata. Get rid of to_stm32_timers_priv(). >> - simplify error handling in probe (remove a goto) >> - comment on devm_of_platform_*populate() usage. >> >> Changes in v2: >> - Abstract DMA handling from child driver: move it to MFD core >> - Add comments on optional dma support >> --- >> drivers/mfd/stm32-timers.c | 219 ++++++++++++++++++++++++++++++++++++++- >> include/linux/mfd/stm32-timers.h | 32 ++++++ >> 2 files changed, 249 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/mfd/stm32-timers.c b/drivers/mfd/stm32-timers.c >> index 1d347e5..98191ec 100644 >> --- a/drivers/mfd/stm32-timers.c >> +++ b/drivers/mfd/stm32-timers.c >> @@ -4,16 +4,165 @@ >> * Author: Benjamin Gaignard >> */ >> >> +#include >> +#include >> +#include >> #include >> #include >> #include >> #include >> >> +#define STM32_TIMERS_MAX_REGISTERS 0x3fc >> + >> +struct stm32_timers_dma { >> + struct completion completion; >> + phys_addr_t phys_base; >> + struct mutex lock; /* protect dma access */ > > Nit: I like comments to use good grammar i.e. capital letters to > start a sentence and 's/dma/DMA/'. Or better still, drop the comment, > we know what the lock is for. > >> + struct dma_chan *chan; >> + struct dma_chan *chans[STM32_TIMERS_MAX_DMAS]; > > This requires explanation. Maybe a kerneldoc header would be good here. Hi Lee, I'll add kerneldoc in next version. > > [...] > >> +/** >> + * stm32_timers_dma_burst_read - Read from timers registers using DMA. >> + * >> + * Read from STM32 timers registers using DMA on a single event. >> + * @dev: reference to stm32_timers MFD device >> + * @buf: dma'able destination buffer >> + * @id: stm32_timers_dmas event identifier (ch[1..4], up, trig or com) >> + * @reg: registers start offset for DMA to read from (like CCRx for capture) >> + * @num_reg: number of registers to read upon each dma request, starting @reg. >> + * @bursts: number of bursts to read (e.g. like two for pwm period capture) >> + * @tmo_ms: timeout (milliseconds) >> + */ >> +int stm32_timers_dma_burst_read(struct device *dev, u32 *buf, >> + enum stm32_timers_dmas id, u32 reg, >> + unsigned int num_reg, unsigned int bursts, >> + unsigned long tmo_ms) >> +{ >> + struct stm32_timers *ddata = dev_get_drvdata(dev); >> + unsigned long timeout = msecs_to_jiffies(tmo_ms); >> + struct regmap *regmap = ddata->regmap; >> + struct stm32_timers_dma *dma = ddata->dma; >> + size_t len = num_reg * bursts * sizeof(u32); >> + struct dma_async_tx_descriptor *desc; >> + struct dma_slave_config config; >> + dma_cookie_t cookie; >> + dma_addr_t dma_buf; >> + u32 dbl, dba; >> + long err; >> + int ret; >> + >> + /* sanity check */ > > Proper grammar in all comments please. > > "Sanity check" > > [...] > >> + /* select dma channel in use */ > > Here too. > > Etc, etc, etc ... Okay, will take care of this. > >> + dma->chan = dma->chans[id]; >> + dma_buf = dma_map_single(dev, buf, len, DMA_FROM_DEVICE); >> + ret = dma_mapping_error(dev, dma_buf); >> + if (ret) >> + goto unlock; >> + >> + /* Prepare DMA read from timer registers, using DMA burst mode */ > > This is good. > [...] > > [...] > >> diff --git a/include/linux/mfd/stm32-timers.h b/include/linux/mfd/stm32-timers.h >> index 2aadab6..585a4de 100644 >> --- a/include/linux/mfd/stm32-timers.h >> +++ b/include/linux/mfd/stm32-timers.h >> @@ -8,6 +8,8 @@ >> #define _LINUX_STM32_GPTIMER_H_ >> >> #include >> +#include >> +#include >> #include > > [...] > >> +enum stm32_timers_dmas { >> + STM32_TIMERS_DMA_CH1, >> + STM32_TIMERS_DMA_CH2, >> + STM32_TIMERS_DMA_CH3, >> + STM32_TIMERS_DMA_CH4, >> + STM32_TIMERS_DMA_UP, >> + STM32_TIMERS_DMA_TRIG, >> + STM32_TIMERS_DMA_COM, >> + STM32_TIMERS_MAX_DMAS, >> +}; >> + >> +struct stm32_timers_dma; > > Why don't you move the declaration into here? To follow previous discussions we had in V1 and V2, this is to avoid sharing all the information with child drivers, e.g. passing physical address of parent MFD into child devices. I should probably add a comment there ? Something like: /* STM32 timers MFD parent internal struct to handle DMA transfers */ struct stm32_timers_dma; Do you agree with this ? Thanks for reviewing, BR, Fabrice > > Then you don't need to forward declare. > >> struct stm32_timers { >> struct clk *clk; >> struct regmap *regmap; >> u32 max_arr; >> + struct stm32_timers_dma *dma; >> }; >> + >> +int stm32_timers_dma_burst_read(struct device *dev, u32 *buf, >> + enum stm32_timers_dmas id, u32 reg, >> + unsigned int num_reg, unsigned int bursts, >> + unsigned long tmo_ms); >> #endif >