>-----Original Message-----
>From: ext Tony Lindgren [mailto:t...@atomide.com] 
>Sent: 03 February, 2010 19:50
>To: Kristo Tero (Nokia-D/Tampere)
>Cc: linux-omap@vger.kernel.org
>Subject: Re: [PATCH] OMAP3: Serial: Improved sleep logic
>
>* Tero Kristo <tero.kri...@nokia.com> [100202 01:38]:
>> From: Tero Kristo <tero.kri...@nokia.com>
>> 
>> Only RX interrupt will now kick the sleep prevent timer. In 
>addition, TX
>> fifo status is checked before disabling clocks, this will 
>prevent occasional
>> garbage being printed on serial line. Smartidle is also 
>disabled while
>> entering idle if we have data in the transmit buffer, 
>because having this
>> enabled will prevent wakeups from the TX interrupt, and this causes
>> pauses while sending large blocks of data.
>
>Sounds this is for 2.6.34 merge window and does not contain anything
>that needs to be fixed for 2.6.33. 

Yeah, this only fixes a couple of annoying issues, but nothing fatal. Also 
improves power efficiency in some cases which is a nice to have feature, and 
basically eases the development of PM code as the UART does not block the 
system from sleeping always.

-Tero

>
>Regards,
>
>Tony
>
> 
>> Signed-off-by: Tero Kristo <tero.kri...@nokia.com>
>> ---
>>  arch/arm/mach-omap2/serial.c |   19 +++++++++++++++----
>>  1 files changed, 15 insertions(+), 4 deletions(-)
>> 
>> diff --git a/arch/arm/mach-omap2/serial.c 
>b/arch/arm/mach-omap2/serial.c
>> index 777e802..e11dfe9 100644
>> --- a/arch/arm/mach-omap2/serial.c
>> +++ b/arch/arm/mach-omap2/serial.c
>> @@ -317,7 +317,8 @@ static void omap_uart_allow_sleep(struct 
>omap_uart_state *uart)
>>      if (!uart->clocked)
>>              return;
>>  
>> -    omap_uart_smart_idle_enable(uart, 1);
>> +    if (serial_read_reg(uart->p, UART_LSR) & UART_LSR_TEMT)
>> +            omap_uart_smart_idle_enable(uart, 1);
>>      uart->can_sleep = 1;
>>      del_timer(&uart->timer);
>>  }
>> @@ -335,7 +336,11 @@ void omap_uart_prepare_idle(int num)
>>  
>>      list_for_each_entry(uart, &uart_list, node) {
>>              if (num == uart->num && uart->can_sleep) {
>> -                    omap_uart_disable_clocks(uart);
>> +                    if (serial_read_reg(uart->p, UART_LSR) &
>> +                                    UART_LSR_TEMT)
>> +                            omap_uart_disable_clocks(uart);
>> +                    else
>> +                            omap_uart_smart_idle_enable(uart, 0);
>>                      return;
>>              }
>>      }
>> @@ -407,8 +412,14 @@ int omap_uart_can_sleep(void)
>>  static irqreturn_t omap_uart_interrupt(int irq, void *dev_id)
>>  {
>>      struct omap_uart_state *uart = dev_id;
>> +    u8 lsr;
>>  
>> -    omap_uart_block_sleep(uart);
>> +    lsr = serial_read_reg(uart->p, UART_LSR);
>> +    /* Check for receive interrupt */
>> +    if (lsr & UART_LSR_DR)
>> +            omap_uart_block_sleep(uart);
>> +    if (lsr & UART_LSR_TEMT && uart->can_sleep)
>> +            omap_uart_smart_idle_enable(uart, 1);
>>  
>>      return IRQ_NONE;
>>  }
>> -- 
>> 1.5.4.3
>> 
>> --
>> To unsubscribe from this list: send the line "unsubscribe 
>linux-omap" in
>> the body of a message to majord...@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to