From: Fabrice Gasnier <fabrice.gasnier@st.com>
To: Lee Jones <lee.jones@linaro.org>
Cc: thierry.reding@gmail.com, robh+dt@kernel.org,
alexandre.torgue@st.com, benjamin.gaignard@linaro.org,
mark.rutland@arm.com, linux@armlinux.org.uk,
mcoquelin.stm32@gmail.com, benjamin.gaignard@st.com,
devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, linux-pwm@vger.kernel.org
Subject: Re: [PATCH 4/8] mfd: stm32-timers: add support for dmas
Date: Tue, 23 Jan 2018 14:57:49 +0100 [thread overview]
Message-ID: <e611b40f-bd37-aa2d-afd9-997b86d55441@st.com> (raw)
In-Reply-To: <20180123133234.xmep76cgdremnj47@dell>
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 <fabrice.gasnier@st.com>
>> ---
>> 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 <linux/clk.h>
>> +#include <linux/dmaengine.h>
>> #include <linux/regmap.h>
>>
>> #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
>
next prev parent reply other threads:[~2018-01-23 13:57 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-01-16 12:43 [PATCH 0/8] Add support for PWM input capture on STM32 Fabrice Gasnier
2018-01-16 12:43 ` [PATCH 1/8] pwm: stm32: fix, remove unused struct device Fabrice Gasnier
2018-01-16 12:43 ` [PATCH 2/8] pwm: stm32: protect common prescaler for all channels Fabrice Gasnier
2018-01-16 12:43 ` [PATCH 3/8] dt-bindings: mfd: stm32-timers: add support for dmas Fabrice Gasnier
2018-01-16 12:43 ` [PATCH 4/8] " Fabrice Gasnier
[not found] ` <1516106631-18722-5-git-send-email-fabrice.gasnier-qxv4g6HH51o@public.gmane.org>
2018-01-23 13:32 ` Lee Jones
2018-01-23 13:57 ` Fabrice Gasnier [this message]
[not found] ` <e611b40f-bd37-aa2d-afd9-997b86d55441-qxv4g6HH51o@public.gmane.org>
2018-01-23 15:30 ` Lee Jones
2018-01-23 15:52 ` Fabrice Gasnier
[not found] ` <ee021839-3298-d01b-8890-619aca0399a7-qxv4g6HH51o@public.gmane.org>
2018-01-23 16:41 ` Lee Jones
2018-01-24 8:40 ` Fabrice Gasnier
2018-01-24 14:56 ` Lee Jones
2018-01-24 15:30 ` Fabrice Gasnier
2018-01-24 15:43 ` cas
2018-01-16 12:43 ` [PATCH 5/8] pwm: stm32: add capture support Fabrice Gasnier
2018-01-16 12:43 ` [PATCH 6/8] pwm: stm32: improve capture by tuning counter prescaler Fabrice Gasnier
[not found] ` <1516106631-18722-1-git-send-email-fabrice.gasnier-qxv4g6HH51o@public.gmane.org>
2018-01-16 12:43 ` [PATCH 7/8] pwm: stm32: use input prescaler to improve period capture Fabrice Gasnier
2018-01-16 12:43 ` [PATCH 8/8] ARM: dts: stm32: Enable pwm3 input capture on stm32f429i-eval Fabrice Gasnier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e611b40f-bd37-aa2d-afd9-997b86d55441@st.com \
--to=fabrice.gasnier@st.com \
--cc=alexandre.torgue@st.com \
--cc=benjamin.gaignard@linaro.org \
--cc=benjamin.gaignard@st.com \
--cc=devicetree@vger.kernel.org \
--cc=lee.jones@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pwm@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=mark.rutland@arm.com \
--cc=mcoquelin.stm32@gmail.com \
--cc=robh+dt@kernel.org \
--cc=thierry.reding@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox