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