Re: [PATCH 5/5] OMAP: GPIO: use PM runtime framework

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Kevin,

On Tue, Mar 8, 2011 at 13:23, Kevin Hilman <khilman@xxxxxx> wrote:
> "Varadarajan, Charulatha" <charu@xxxxxx> writes:
>
>> Kevin,
>>
>> On Tue, Mar 8, 2011 at 00:25, Kevin Hilman <khilman@xxxxxx> wrote:
>>> "Varadarajan, Charulatha" <charu@xxxxxx> writes:
>>>
>>> [...]
>>>
>>>>>> GPIO driver is modified to use dev_pm_ops instead of sysdev_class.
>>>>>> With this approach, gpio_bank_suspend() & gpio_bank_resume()
>>>>>> are not part of sys_dev_class.
>>>>>>
>>>>>> Usage of PM runtime get/put APIs in GPIO driver is as given below:
>>>>>> pm_runtime_get_sync():
>>>>>> * In the probe before accessing the GPIO registers
>>>>>> * at the beginning of omap_gpio_request()
>>>>>>       -only when one of the gpios is requested on a bank, in which,
>>>>>>        no other gpio is being used (when mod_usage becomes non-zero).
>>>>>
>>>>> When using runtime PM, bank->mod_usage acutally becomes redundant with
>>>>> usage counting already done at the runtime PM level.  IOW, checking
>>>>> bank->mod_usage is he equivalent of checking pm_runtime_suspended(), so
>>>>> I think you can totally get rid of bank->mod_usage.
>>>>
>>>> I wish to differ here. bank->mod_usage is filled for each GPIO pin in a bank.
>>>> Hence during request/free if pm_runtime_get_sync() is called for each GPIO
>>>> pin, then the count gets increased for each GPIO pin in a bank. But
>>>> gpio_prepare_for_idle/suspend calls pm_runtime_put() only once for
>>>> each bank. Hence there will be a count mismatch and hence this will lead
>>>> to problems and never a bank will get suspended.
>>>>
>>>> IMO it is required to have bank->mod_usage checks. Please correct
>>>> me if I am wrong.
>>>
>>> You're right, I see what you're saying now.  Thanks for clarifying.
>>
>> Okay.
>>
>>>
>>> In that case, keeping bank->mod_usage should be OK for now.
>>
>> Okay.
>>
>>>
>>> That being said, as I'm looking at the idle prepare/resume hooks
>>> something else came to mind.
>>>
>>> Most of what the idle prepare/resume mehods do should actually be done
>>> in the ->runtime_suspend() and ->runtime_resume() hooks (e.g. debounce
>>> clock disable, edge-detect stuff, context save/restore).  IOW, that
>>> stuff does not need to be done until the bank is actually
>>> disabled/enabled.  For example, prepare_for_idle itself could be a
>>> relatively simple check for bank->mod_usage and a call to
>>> pm_runtime_put_sync().
>>>
>>> What do you think?
>>
>> I also thought about this and my very old implementation with hwmod
>> series was like this. But,
>> a. prepare_for_idle has an Erratum 1.101 handling, debounce clock disable,
>>    context save based on offmode flag
>> b. omap_gpio_suspend has wkup related code handling in it along
>>    with context save w/o any flag
>
> Don't forget that the suspend path also calls prepare_for_idle (and
> resume path calls resume_from_idle) so that (b) actually includes (a).
> In fact, looking closer at the code, it appears we save context twice on
> a static suspend.

Yes. You are right. Will modify this.

>
>> c. gpio_free need not do any of the above mentioned stuff.
>
> But it would be harmless if the ->runtime_suspend/resume methods were
> called.  If bank->mod_usage were zero, these hooks would just return.
>
>> Similar for resume_after_idle, gpio_request, omap_resume.
>>
>> But the runtime_suspend/resume hooks would be called for all the above.
>>
>> Hence I thought that it might not be correct to move all the code from
>> prepare_for_idle() to runtime_suspend hook of GPIO. Similar for
>> resume_after_idle()
>> and runtime_resume hook.
>
> You're right, there are currently different paths for the 3 different
> users of the runtime PM API (your a, b & c above), but to me that leads
> to serious readability problems.   (NOTE: this isn't your fault, the
> current code suffers from this already, I'm just hoping we can clean it
> up with the runtime PM conversion.)
>
> I think this could be much cleaner if everything was moved to the
> ->runtime_suspend/resume hooks and a couple checks were added.  For
> example, the runtime_suspend would look like:
>
>  for each bank:
>
>    /* this handles the gpio_free case */
>    if (!bank->mod_usage)
>       continue;
>
>    /* debounce clock disable */
>
>    /* off-mode: remove triggering */
>
>    /* save context */
>
>    /* Extra stuff for static suspend */
>    if (bank->is_suspending)
>      /* set wakeup bits */

Okay. But I felt that adding more flags to manage this might look
ugly. But yes, this is better in terms of readability. Will do the
needful.

>
>> Also, from implementation point of view it needs to be taken care to
>> pass off_mode flag to runtime_suspend hook and use it only for
>> prepare_for idle and not for other cases
>> (omap_gpio_suspend/gpio_free).
>
> Actually, I'm not a big fan of the off_mode flag passed from the PM
> core.
>
> Here's what would be much nicer.  Each bank can get it's pwrdm from its
> hwmod.  So the ->runtime_suspend method should just read the next_state
> of its powerdomain to see if it's going off, and save context (and do
> errata workarounds) accordingly.

Ok. I will modify the GPIO driver to access these APIs directly
from runtime_suspend hook of GPIO to read the next_state
of its powerdomain.

> In addition, it will
> _get_context_loss_count() and store the counter.  The resume method then
> does _get_context_loss_count() again and compare to see if context needs
> to be restored.

Okay.

>
>> Do you still think that it is appropriate to do this code movement  from
>> prepare_for_idle() to GPIO's runtime_suspend?
>
> Based on the above suggestions, yes.

Thanks,
V Charulatha

<<snip>>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux