Re: [PATCH v6 11/16] dmaengine: tegra-apb: Keep clock enabled only during of DMA transfer

From: Jon Hunter
Date: Mon Feb 03 2020 - 06:37:52 EST



On 01/02/2020 15:13, Dmitry Osipenko wrote:
> 31.01.2020 17:22, Dmitry Osipenko ÐÐÑÐÑ:
>> 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.
>
> Jon, I realized that my v6 variant is wrong too because
> tegra_dma_terminate_all() -> tdc->isr_handler() will put RPM, and thus,
> the RPM enable-count will be wrecked in this case.

Did you see my other suggestion to move the pm_runtime_put() outside of
tegra_dma_stop? There are only a few call sites for tegra_dma_stop and
so if we call pm_runtime_put() after calling tegra_dma_stop this should
simplify matters.

Jon

--
nvpublic