[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1b64a3c6-a8b9-34d7-96cc-95b93ca1a392@gmail.com>
Date: Fri, 31 Jan 2020 17:22:53 +0300
From: Dmitry Osipenko <digetx@...il.com>
To: Jon Hunter <jonathanh@...dia.com>,
Laxman Dewangan <ldewangan@...dia.com>,
Vinod Koul <vkoul@...nel.org>,
Dan Williams <dan.j.williams@...el.com>,
Thierry Reding <thierry.reding@...il.com>,
Michał Mirosław <mirq-linux@...e.qmqm.pl>
Cc: dmaengine@...r.kernel.org, linux-tegra@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH v6 11/16] dmaengine: tegra-apb: Keep clock enabled only
during of DMA transfer
31.01.2020 12:02, Jon Hunter пишет:
>
> On 30/01/2020 20:04, Dmitry Osipenko wrote:
>
> ...
>
>>>> The tegra_dma_stop() should put RPM anyways, which is missed in yours
>>>> sample. Please see handle_continuous_head_request().
>>>
>>> Yes and that is deliberate. The cyclic transfers the transfers *should*
>>> not stop until terminate_all is called. The tegra_dma_stop in
>>> handle_continuous_head_request() is an error condition and so I am not
>>> sure it is actually necessary to call pm_runtime_put() here.
>>
>> But then tegra_dma_stop() shouldn't unset the "busy" mark.
>
> True.
>
>>>> I'm also finding the explicit get/put a bit easier to follow in the
>>>> code, don't you think so?
>>>
>>> I can see that, but I was thinking that in the case of cyclic transfers,
>>> it should only really be necessary to call the get/put at the beginning
>>> and end. So in my mind there should only be two exit points which are
>>> the ISR handler for SG and terminate_all for SG and cyclic.
>>
>> Alright, I'll update this patch.
>
> Hmmm ... I am wondering if we should not mess with that and leave how
> you have it.
I took another look and seems my current v6 should be more correct because:
1. If "busy" is unset in tegra_dma_stop(), then the RPM should be put
there since tegra_dma_terminate_all() won't put RPM in this case:
if (!tdc->busy)
goto skip_dma_stop;
2. We can't move the "busy" unsetting into the terminate because then
tegra_dma_stop() will be invoked twice. Although, one option could be to
remove the tegra_dma_stop() from the error paths of
handle_continuous_head_request(), but I'm not sure that this is correct
to do.
Powered by blists - more mailing lists