diff mbox

[PATCHv2,2/5] driver: serial: omap: prevent runtime PM for "no_console_suspend"

Message ID 1366638237-6880-3-git-send-email-sourav.poddar@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Poddar, Sourav April 22, 2013, 1:43 p.m. UTC
The driver manages "no_console_suspend" by preventing runtime PM
during the suspend path, which forces the console UART to stay awake.

Signed-off-by: Sourav Poddar <sourav.poddar@ti.com>
---
 drivers/tty/serial/omap-serial.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

Comments

Felipe Balbi April 22, 2013, 2:31 p.m. UTC | #1
Hi,

On Mon, Apr 22, 2013 at 07:13:54PM +0530, Sourav Poddar wrote:
> The driver manages "no_console_suspend" by preventing runtime PM
> during the suspend path, which forces the console UART to stay awake.
> 
> Signed-off-by: Sourav Poddar <sourav.poddar@ti.com>
> ---
>  drivers/tty/serial/omap-serial.c |    5 ++++-
>  1 files changed, 4 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
> index 08332f3..640b14e 100644
> --- a/drivers/tty/serial/omap-serial.c
> +++ b/drivers/tty/serial/omap-serial.c
> @@ -1582,7 +1582,7 @@ static int serial_omap_runtime_suspend(struct device *dev)
>  	struct uart_omap_port *up = dev_get_drvdata(dev);
>  	struct omap_uart_port_info *pdata = dev->platform_data;
>  
> -	if (!up)
> +	if (!up || (!console_suspend_enabled && uart_console(&up->port)))
>  		return -EINVAL;

-EBUSY would be a better value for uart_console case, so this check
should be splitted accordingly. Likewise on second hunk.
Grygorii Strashko April 22, 2013, 2:48 p.m. UTC | #2
On 04/22/2013 04:43 PM, Sourav Poddar wrote:
> The driver manages "no_console_suspend" by preventing runtime PM
> during the suspend path, which forces the console UART to stay awake.
>
> Signed-off-by: Sourav Poddar <sourav.poddar@ti.com>
> ---
>   drivers/tty/serial/omap-serial.c |    5 ++++-
>   1 files changed, 4 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
> index 08332f3..640b14e 100644
> --- a/drivers/tty/serial/omap-serial.c
> +++ b/drivers/tty/serial/omap-serial.c
> @@ -1582,7 +1582,7 @@ static int serial_omap_runtime_suspend(struct device *dev)
>   	struct uart_omap_port *up = dev_get_drvdata(dev);
>   	struct omap_uart_port_info *pdata = dev->platform_data;
>   
> -	if (!up)
> +	if (!up || (!console_suspend_enabled && uart_console(&up->port)))
>   		return -EINVAL;
Hi Sourav,
No ) You will block Runtime PM for console UART forever, but instead
it need to be blocked only during suspend - autosuspend should continue 
working.
But this will be not easy, again, -
because System suspend isn't synchronized with Runtime PM (I mean,
serial_omap_suspend/resume() may be called from one thread and
serial_omap_runtime_suspend/resume() from another at same time).
And now, serial_omap_suspend() callback is the only one place where you
can detect that system is going to sleep.

Personally, i don't believe in such approach (my experiences from K3.4 
said me
that there will be more problems than benefits).

And, I like combination of "no_console_suspend" in bootargs +
"ti,no_idle_on_suspend" for console UART in DT, because 1) it's debug 
option and 2) until
smth. will be decided about OMAP OCP Bus it can be used.

It's just my opinion.

Regards,
-grygorii
>   
>   	if (!pdata)
> @@ -1614,6 +1614,9 @@ static int serial_omap_runtime_resume(struct device *dev)
>   
>   	int loss_cnt = serial_omap_get_context_loss_count(up);
>   
> +	if (!console_suspend_enabled && uart_console(&up->port))
> +		return -EINVAL;
> +
>   	if (loss_cnt < 0) {
>   		dev_err(dev, "serial_omap_get_context_loss_count failed : %d\n",
>   			loss_cnt);

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Kevin Hilman April 22, 2013, 6:36 p.m. UTC | #3
Grygorii Strashko <grygorii.strashko@ti.com> writes:

> On 04/22/2013 04:43 PM, Sourav Poddar wrote:
>> The driver manages "no_console_suspend" by preventing runtime PM
>> during the suspend path, which forces the console UART to stay awake.
>>
>> Signed-off-by: Sourav Poddar <sourav.poddar@ti.com>
>> ---
>>   drivers/tty/serial/omap-serial.c |    5 ++++-
>>   1 files changed, 4 insertions(+), 1 deletions(-)
>>
>> diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
>> index 08332f3..640b14e 100644
>> --- a/drivers/tty/serial/omap-serial.c
>> +++ b/drivers/tty/serial/omap-serial.c
>> @@ -1582,7 +1582,7 @@ static int serial_omap_runtime_suspend(struct device *dev)
>>   	struct uart_omap_port *up = dev_get_drvdata(dev);
>>   	struct omap_uart_port_info *pdata = dev->platform_data;
>>   -	if (!up)
>> +	if (!up || (!console_suspend_enabled && uart_console(&up->port)))
>>   		return -EINVAL;
> Hi Sourav,
> No ) You will block Runtime PM for console UART forever, but instead
> it need to be blocked only during suspend - autosuspend should
> continue working.

Correct.  

Sourav, as I mentioned when I suggested this approach, it should be done
*only* during suspend.

> But this will be not easy, again, -
> because System suspend isn't synchronized with Runtime PM (I mean,
> serial_omap_suspend/resume() may be called from one thread and
> serial_omap_runtime_suspend/resume() from another at same time).
> And now, serial_omap_suspend() callback is the only one place where you
> can detect that system is going to sleep.

So set an 'is_suspending' flag in ->suspend (it may need to be in
->prepare) and clear it in ->resume (->complete), and check the flag in
the ->runtime_supend() callback.  It's not uncommon for drivers to have
such a flag for various reasons.

> Personally, i don't believe in such approach (my experiences from K3.4
> said me that there will be more problems than benefits).
>
> And, I like combination of "no_console_suspend" in bootargs +
> "ti,no_idle_on_suspend" for console UART in DT, because 1) it's debug
> option and 2) until
> smth. will be decided about OMAP OCP Bus it can be used.
>
> It's just my opinion.

No, we need to get rid of ti,no_idle_on_suspend.  It's an ugly,
OMAP-specific hack (and I'm free to insult it because I introduced it.)

Kevin

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Poddar, Sourav April 23, 2013, 4:52 a.m. UTC | #4
Hi Felipe,
On Monday 22 April 2013 08:01 PM, Felipe Balbi wrote:
> Hi,
>
> On Mon, Apr 22, 2013 at 07:13:54PM +0530, Sourav Poddar wrote:
>> The driver manages "no_console_suspend" by preventing runtime PM
>> during the suspend path, which forces the console UART to stay awake.
>>
>> Signed-off-by: Sourav Poddar<sourav.poddar@ti.com>
>> ---
>>   drivers/tty/serial/omap-serial.c |    5 ++++-
>>   1 files changed, 4 insertions(+), 1 deletions(-)
>>
>> diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
>> index 08332f3..640b14e 100644
>> --- a/drivers/tty/serial/omap-serial.c
>> +++ b/drivers/tty/serial/omap-serial.c
>> @@ -1582,7 +1582,7 @@ static int serial_omap_runtime_suspend(struct device *dev)
>>   	struct uart_omap_port *up = dev_get_drvdata(dev);
>>   	struct omap_uart_port_info *pdata = dev->platform_data;
>>
>> -	if (!up)
>> +	if (!up || (!console_suspend_enabled&&  uart_console(&up->port)))
>>   		return -EINVAL;
> -EBUSY would be a better value for uart_console case, so this check
> should be splitted accordingly. Likewise on second hunk.
>
Ok. Will change in the next version.
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Poddar, Sourav April 23, 2013, 5:12 a.m. UTC | #5
Hi Grygorii,
On Monday 22 April 2013 08:18 PM, Grygorii Strashko wrote:
> On 04/22/2013 04:43 PM, Sourav Poddar wrote:
>> The driver manages "no_console_suspend" by preventing runtime PM
>> during the suspend path, which forces the console UART to stay awake.
>>
>> Signed-off-by: Sourav Poddar <sourav.poddar@ti.com>
>> ---
>>   drivers/tty/serial/omap-serial.c |    5 ++++-
>>   1 files changed, 4 insertions(+), 1 deletions(-)
>>
>> diff --git a/drivers/tty/serial/omap-serial.c 
>> b/drivers/tty/serial/omap-serial.c
>> index 08332f3..640b14e 100644
>> --- a/drivers/tty/serial/omap-serial.c
>> +++ b/drivers/tty/serial/omap-serial.c
>> @@ -1582,7 +1582,7 @@ static int serial_omap_runtime_suspend(struct 
>> device *dev)
>>       struct uart_omap_port *up = dev_get_drvdata(dev);
>>       struct omap_uart_port_info *pdata = dev->platform_data;
>>   -    if (!up)
>> +    if (!up || (!console_suspend_enabled && uart_console(&up->port)))
>>           return -EINVAL;
> Hi Sourav,
> No ) You will block Runtime PM for console UART forever, but instead
> it need to be blocked only during suspend - autosuspend should 
> continue working.
> But this will be not easy, again, -
> because System suspend isn't synchronized with Runtime PM (I mean,
> serial_omap_suspend/resume() may be called from one thread and
> serial_omap_runtime_suspend/resume() from another at same time).
> And now, serial_omap_suspend() callback is the only one place where you
> can detect that system is going to sleep.
>
Yes, got this point.
As Kevin has already suggested a way to get around this, I will fix this 
portion
in the next version.
> Personally, i don't believe in such approach (my experiences from K3.4 
> said me
> that there will be more problems than benefits).
>
> And, I like combination of "no_console_suspend" in bootargs +
> "ti,no_idle_on_suspend" for console UART in DT, because 1) it's debug 
> option and 2) until
> smth. will be decided about OMAP OCP Bus it can be used.
>
> It's just my opinion.
>
> Regards,
> -grygorii
>>         if (!pdata)
>> @@ -1614,6 +1614,9 @@ static int serial_omap_runtime_resume(struct 
>> device *dev)
>>         int loss_cnt = serial_omap_get_context_loss_count(up);
>>   +    if (!console_suspend_enabled && uart_console(&up->port))
>> +        return -EINVAL;
>> +
>>       if (loss_cnt < 0) {
>>           dev_err(dev, "serial_omap_get_context_loss_count failed : 
>> %d\n",
>>               loss_cnt);
>

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Poddar, Sourav April 23, 2013, 5:14 a.m. UTC | #6
Hi Kevin,
On Tuesday 23 April 2013 12:06 AM, Kevin Hilman wrote:
> Grygorii Strashko<grygorii.strashko@ti.com>  writes:
>
>> On 04/22/2013 04:43 PM, Sourav Poddar wrote:
>>> The driver manages "no_console_suspend" by preventing runtime PM
>>> during the suspend path, which forces the console UART to stay awake.
>>>
>>> Signed-off-by: Sourav Poddar<sourav.poddar@ti.com>
>>> ---
>>>    drivers/tty/serial/omap-serial.c |    5 ++++-
>>>    1 files changed, 4 insertions(+), 1 deletions(-)
>>>
>>> diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
>>> index 08332f3..640b14e 100644
>>> --- a/drivers/tty/serial/omap-serial.c
>>> +++ b/drivers/tty/serial/omap-serial.c
>>> @@ -1582,7 +1582,7 @@ static int serial_omap_runtime_suspend(struct device *dev)
>>>    	struct uart_omap_port *up = dev_get_drvdata(dev);
>>>    	struct omap_uart_port_info *pdata = dev->platform_data;
>>>    -	if (!up)
>>> +	if (!up || (!console_suspend_enabled&&  uart_console(&up->port)))
>>>    		return -EINVAL;
>> Hi Sourav,
>> No ) You will block Runtime PM for console UART forever, but instead
>> it need to be blocked only during suspend - autosuspend should
>> continue working.
> Correct.
>
> Sourav, as I mentioned when I suggested this approach, it should be done
> *only* during suspend.
>
Yes, got the point.
>> But this will be not easy, again, -
>> because System suspend isn't synchronized with Runtime PM (I mean,
>> serial_omap_suspend/resume() may be called from one thread and
>> serial_omap_runtime_suspend/resume() from another at same time).
>> And now, serial_omap_suspend() callback is the only one place where you
>> can detect that system is going to sleep.
> So set an 'is_suspending' flag in ->suspend (it may need to be in
> ->prepare) and clear it in ->resume (->complete), and check the flag in
> the ->runtime_supend() callback.  It's not uncommon for drivers to have
> such a flag for various reasons.
>
Ok. Will adapt the next version inline with the above suggestions.
>> Personally, i don't believe in such approach (my experiences from K3.4
>> said me that there will be more problems than benefits).
>>
>> And, I like combination of "no_console_suspend" in bootargs +
>> "ti,no_idle_on_suspend" for console UART in DT, because 1) it's debug
>> option and 2) until
>> smth. will be decided about OMAP OCP Bus it can be used.
>>
>> It's just my opinion.
> No, we need to get rid of ti,no_idle_on_suspend.  It's an ugly,
> OMAP-specific hack (and I'm free to insult it because I introduced it.)
>
> Kevin
>

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

Patch

diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
index 08332f3..640b14e 100644
--- a/drivers/tty/serial/omap-serial.c
+++ b/drivers/tty/serial/omap-serial.c
@@ -1582,7 +1582,7 @@  static int serial_omap_runtime_suspend(struct device *dev)
 	struct uart_omap_port *up = dev_get_drvdata(dev);
 	struct omap_uart_port_info *pdata = dev->platform_data;
 
-	if (!up)
+	if (!up || (!console_suspend_enabled && uart_console(&up->port)))
 		return -EINVAL;
 
 	if (!pdata)
@@ -1614,6 +1614,9 @@  static int serial_omap_runtime_resume(struct device *dev)
 
 	int loss_cnt = serial_omap_get_context_loss_count(up);
 
+	if (!console_suspend_enabled && uart_console(&up->port))
+		return -EINVAL;
+
 	if (loss_cnt < 0) {
 		dev_err(dev, "serial_omap_get_context_loss_count failed : %d\n",
 			loss_cnt);