[PATCH 5/7] Serial: OMAP: add runtime pm support for omap-serial driver
Govindraj
govindraj.ti at gmail.com
Wed Mar 9 10:07:11 EST 2011
On Wed, Mar 9, 2011 at 7:18 AM, Kevin Hilman <khilman at ti.com> wrote:
> Govindraj <govindraj.ti at gmail.com> writes:
>
> [...]
>
>>> This function should not be needed.
>>>
>>> The timer should be replaced by the auto-suspend feature of runtime PM.
>>
>> If I use autosuspend based on timer runtime framework
>> will disable clocks based on autosuspend timeout.
>>
>> But if I cut clocks outside sram idle path module level wakeup
>> will not work.
>> if I cut func clocks outside prepare for idle
>> wake_up is a problem.
>
> As I mentioned in the other thread, module wakeups are not the problem,
> rather the module generating the interrupt is the problem. So cutting
> clocks outside prepare_for_idle path is not the problem. It's the
> re-enabling of the clocks that is important.
>
>> So I am going with existing model where we are cutting clocks in
>> prepare idle and enabling the clock back in resume_idle based on
>> wakeup event as any other combination doesn't seem to work.
>>
>> [As stated in other thread to reproduce the issue
>> with module level wakeup]
>>
>> Even with existing framework if I try to experiment
>> by cutting clocks after uart timeout in allow_sleep
>> func, module level wakeup doesn't seem to happen.
>>>
>>> Instead of calling omap_port_disable() callers should call
>>> pm_runtime_put_autosuspend(), and the console_stop() should be part of
>>> the ->runtime_suspend() callback.
>>>
>>> Also, why do you check for pm_runtime_suspended()? Just call it for
>>> every time and we get runtime PM use-counting and statistics for free
>>> and the ->runtime_suspend() callback will be called when the usecount
>>> goes to zero.
>>>
>>
>> Yes correct, but I can't balance the put_sync and get_sync
>> as said above. I can call put_sync only once in prepare_idle
>> to cut clocks. But having put_sync outside prepare_idle, if
>> clocks are cut module level wakeup doesn't seem to happen.
>>
>>
>>>> +static void serial_omap_inactivity_timer(unsigned long uart_no)
>>>> +{
>>>> + struct uart_omap_port *up = ui[uart_no];
>>>> +
>>>> + up->can_sleep = 1;
>>>> + omap_uart_smart_idle(up);
>>>> +}
>>>
>>> This will not be needed if using the autosuspend feature.
>>
>> Using autosuspend, module level wakeup will not happen
>> since autosuspend cuts clocks outside prepare_idle
>> based on autosuspend timeout.
>
> OK, I get the point. You mentioned module level wakeups about 10 times
> in this message. ;)
>
> However, rather than continue to hack around this problem we need to
> understand the root cause. Thanks to Paul, I think I undersand the root
> cause as explained in the other thread, and I think there's a relatively
> easy way to make them work.
>
> So here's an experiment to try with autosuspend. I suspect this will
> work, just hack it up to prove the concept. If it works, we can make
> something more generic. Here are a few alternatives to try. I may
> experiment with some of them tomorrow as well, but please let me know
> what you try:
>
> Using autosuspend, clocks will get cut independently of the idle path.
> Then, use the PRCM ISR detection of UART module wakeups to call the
> UART's interrupt handler. The interrupt handler will pm_runtime_get(),
> enable the clocks, and then take care of the interrupt. Done.
>
> Alternatively, you could test it on current code by simply removing the
> resume_from_idle call from the idle path and calling it instead from the
> PRCM ISR when UART module wakeups are detected.
I remember doing similar experiment didn't seem to help,
>
> Another option to experiment with: use PRCM ISR to trigger a SW
> interrupt of the UART IRQ (cf. MPU_INTC.INTCPS_ISR_SETn registers.)
> This may be the cleanest approach, and not require calling into the
> driver, but I'm not sure if the normal interrupt clearing process will
> also clear the SW interrupt.
need to check this.
>
> The best longer-term solution is will be to use the chained PRCM
> interrupt handler[1] (not yet finished.) Using that, drivers could
> directly register for their individual module wakeup interrupts.
Agree.
>
> Kevin
>
> [1] http://marc.info/?l=linux-omap&m=129258489308837&w=2
>
>
More information about the linux-arm-kernel
mailing list