Received: by 10.223.176.46 with SMTP id f43csp4199394wra; Tue, 23 Jan 2018 05:59:12 -0800 (PST) X-Google-Smtp-Source: AH8x2241tOY1vlFtuX9ytQijpeb88+qpSqtVuQ+xzGgGCYGHI2Yvi/hbmJSeI1Rqms7U5ZlEQnE7 X-Received: by 2002:a17:902:bf45:: with SMTP id u5-v6mr92793pls.136.1516715952024; Tue, 23 Jan 2018 05:59:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516715951; cv=none; d=google.com; s=arc-20160816; b=EJbm/Q3H8A23wkfyjuN0yWpw1+dga0mZTCo+XmAlMZewdJZBvD0FzfQS8N3N2zSIun 0nTUPmxLW15H102G2VTioFklaHgtSKRjor/AINZUb3A4yL8SWU4XU1KlLeXR+8zXG2ap E/dxxKwPrXiMssRt7Tt4EDB/e6YttOuHujkpr31XGpgcNwDj9m/wWhryxSxStQYNUUbj kCYUOJ7duYsO5XATYhmLfUgs8nPgsYC5K/GJK179gcYwuyPjeSEbenbDfn5VME9EUi6G rehe5y2WpxHN07cQmLLH61oE5ZFwQ0dT/VEEpmnzMq3DjKtUG4J6OPGRJGqXKuf39x7t UpmQ== 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=5sQsBNlXuCY+FOEJpRjs74QLzjF3CAQBKXy3PbTbVkM=; b=qGSlXV4QIQBs7yRGCxitBVQdp80b6qGRm1IMfQlWXaiFWTcATeec0ZuynMQ55WX/U8 cHUlYc/LNt8TSmtnmwuP1q95kPNVRFi7XdKcxeguTnznAK8g16HF2+4YTSdfzC/O3Cw8 qhiPeaciTQCDJMOT3Yb3GwLdJt8xHY8jaubplDDZPGbwjocNzvcq+xxKmS6qE64Y+qRl nvc/inhgIHzPXE7LrOaRM/JTuyRWjmNilokbwemMFcvmUhMb9fzsgqB4TYI8HHIyfzyq HNpNSYDReCxYWM3WAzR9JM3QECMbQMnZzCZJSceOjQEdQr4PiC/dTW9Wyj+nw6Infoit c3Hg== 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 t24si1515457pfe.136.2018.01.23.05.58.57; Tue, 23 Jan 2018 05:59:11 -0800 (PST) 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 S1751878AbeAWN6Z (ORCPT + 99 others); Tue, 23 Jan 2018 08:58:25 -0500 Received: from mx08-00178001.pphosted.com ([91.207.212.93]:36458 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751710AbeAWN6W (ORCPT ); Tue, 23 Jan 2018 08:58:22 -0500 Received: from pps.filterd (m0046660.ppops.net [127.0.0.1]) by mx08-.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id w0NDsWTK012447; Tue, 23 Jan 2018 14:57:51 +0100 Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx08-00178001.pphosted.com with ESMTP id 2fnaj6qe3q-1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT); Tue, 23 Jan 2018 14:57:51 +0100 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 32B2638; Tue, 23 Jan 2018 13:57:51 +0000 (GMT) Received: from Webmail-eu.st.com (sfhdag5node3.st.com [10.75.127.15]) by zeta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 0231F28AD; Tue, 23 Jan 2018 13:57:50 +0000 (GMT) Received: from [10.48.0.167] (10.75.127.44) by SFHDAG5NODE3.st.com (10.75.127.15) with Microsoft SMTP Server (TLS) id 15.0.1347.2; Tue, 23 Jan 2018 14:57:50 +0100 Subject: Re: [PATCH 4/8] mfd: stm32-timers: add support for dmas To: Lee Jones CC: , , , , , , , , , , , References: <1516106631-18722-1-git-send-email-fabrice.gasnier@st.com> <1516106631-18722-5-git-send-email-fabrice.gasnier@st.com> <20180123133234.xmep76cgdremnj47@dell> From: Fabrice Gasnier Message-ID: Date: Tue, 23 Jan 2018 14:57:49 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: <20180123133234.xmep76cgdremnj47@dell> Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 7bit X-Originating-IP: [10.75.127.44] X-ClientProxiedBy: SFHDAG3NODE1.st.com (10.75.127.7) To SFHDAG5NODE3.st.com (10.75.127.15) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2018-01-23_04:,, signatures=0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 01/23/2018 02:32 PM, Lee Jones wrote: > On Tue, 16 Jan 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, keep reference of device's bus address to allow child drivers to >> transfer data from/to device by using dma. >> >> Signed-off-by: Fabrice Gasnier >> --- >> drivers/mfd/stm32-timers.c | 37 ++++++++++++++++++++++++++++++++++++- >> include/linux/mfd/stm32-timers.h | 14 ++++++++++++++ >> 2 files changed, 50 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/mfd/stm32-timers.c b/drivers/mfd/stm32-timers.c >> index a6675a4..372b51e 100644 >> --- a/drivers/mfd/stm32-timers.c >> +++ b/drivers/mfd/stm32-timers.c >> @@ -29,6 +29,23 @@ static void stm32_timers_get_arr_size(struct stm32_timers *ddata) >> regmap_write(ddata->regmap, TIM_ARR, 0x0); >> } >> >> +static void stm32_timers_dma_probe(struct device *dev, >> + struct stm32_timers *ddata) >> +{ >> + int i; >> + char name[4]; >> + >> + for (i = STM32_TIMERS_DMA_CH1; i <= STM32_TIMERS_DMA_CH4; i++) { >> + snprintf(name, ARRAY_SIZE(name), "ch%1d", i + 1); >> + ddata->dmas[i] = dma_request_slave_channel(dev, name); > > And if any of them fail? Hi Lee, If some of these fails, reference will be NULL. It is checked in child driver (pwm for instance) at runtime. Support is being added as an option: pwm capture will simply be unavailable in this case (fail with error). > >> + } >> + ddata->dmas[STM32_TIMERS_DMA_UP] = dma_request_slave_channel(dev, "up"); >> + ddata->dmas[STM32_TIMERS_DMA_TRIG] = >> + dma_request_slave_channel(dev, "trig"); >> + ddata->dmas[STM32_TIMERS_DMA_COM] = >> + dma_request_slave_channel(dev, "com"); > > Can you format these in the same why. This hurts my eyes. I use enum values and try to match as possible with reference manual for "up", "trig" & "com" names. Would have some suggestion to beautify this? > >> +} >> + >> static int stm32_timers_probe(struct platform_device *pdev) >> { >> struct device *dev = &pdev->dev; >> @@ -44,6 +61,7 @@ static int stm32_timers_probe(struct platform_device *pdev) >> mmio = devm_ioremap_resource(dev, res); >> if (IS_ERR(mmio)) >> return PTR_ERR(mmio); >> + ddata->phys_base = res->start; > > What do you use this for? This is used in in child driver (pwm) for capture data transfer by dma. > >> ddata->regmap = devm_regmap_init_mmio_clk(dev, "int", mmio, >> &stm32_timers_regmap_cfg); >> @@ -56,9 +74,25 @@ static int stm32_timers_probe(struct platform_device *pdev) >> >> stm32_timers_get_arr_size(ddata); >> >> + stm32_timers_dma_probe(dev, ddata); >> + > > Surely this can fail? Yes. Same as above. Thanks for reviewing, Best Regards, Fabrice > >> platform_set_drvdata(pdev, ddata); >> >> - return devm_of_platform_populate(&pdev->dev); >> + return of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); >> +} >> + >> +static int stm32_timers_remove(struct platform_device *pdev) >> +{ >> + struct stm32_timers *ddata = platform_get_drvdata(pdev); >> + int i; >> + >> + of_platform_depopulate(&pdev->dev); >> + >> + for (i = 0; i < STM32_TIMERS_MAX_DMAS; i++) >> + if (ddata->dmas[i]) >> + dma_release_channel(ddata->dmas[i]); >> + >> + return 0; >> } >> >> static const struct of_device_id stm32_timers_of_match[] = { >> @@ -69,6 +103,7 @@ static int stm32_timers_probe(struct platform_device *pdev) >> >> static struct platform_driver stm32_timers_driver = { >> .probe = stm32_timers_probe, >> + .remove = stm32_timers_remove, >> .driver = { >> .name = "stm32-timers", >> .of_match_table = stm32_timers_of_match, >> diff --git a/include/linux/mfd/stm32-timers.h b/include/linux/mfd/stm32-timers.h >> index ce7346e..2b4ffb9 100644 >> --- a/include/linux/mfd/stm32-timers.h >> +++ b/include/linux/mfd/stm32-timers.h >> @@ -10,6 +10,7 @@ >> #define _LINUX_STM32_GPTIMER_H_ >> >> #include >> +#include >> #include >> >> #define TIM_CR1 0x00 /* Control Register 1 */ >> @@ -67,9 +68,22 @@ >> #define TIM_BDTR_BKF_SHIFT 16 >> #define TIM_BDTR_BK2F_SHIFT 20 >> >> +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 { >> struct clk *clk; >> struct regmap *regmap; >> + phys_addr_t phys_base; >> u32 max_arr; >> + struct dma_chan *dmas[STM32_TIMERS_MAX_DMAS]; >> }; >> #endif >