RE: [PATCH] OMAP3: Serial: Improved sleep logic

Tero.Kristo
2010-02-09T15:32:51Z

>-----Original Message-----
>From: ext Tony Lindgren [mailto:tony@atomide.com]
>Sent: 04 February, 2010 18:11
>To: Kristo Tero (Nokia-D/Tampere)
>Cc: linux-omap@vger.kernel.org
>Subject: Re: [PATCH] OMAP3: Serial: Improved sleep logic
>
>* Tero.Kristo@nokia.com <Tero.Kristo@nokia.com> [100203 23:59]:
>>
>>
>> >-----Original Message-----
>> >From: ext Tony Lindgren [mailto:tony@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.kristo@nokia.com> [100202 01:38]:
>> >> From: Tero Kristo <tero.kristo@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.
>
>Yeah cool. Separate issue, but I wonder if we should also clear
>the the first rx character from the fifo to avoid corrupting
>the console. Only when the uart clocks are off and and
>we get a key press. Would be easy to do just do with one
>serial_read_reg(uart->p, UART_RX)..

Yeah, I can try to add this change to the code and see what happens.

>
>Tony
>
>>
>> -Tero
>>
>> >
>> >Regards,
>> >
>> >Tony
>> >
>> >
>> >> Signed-off-by: Tero Kristo <tero.kristo@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 majordomo@vger.kernel.org
>> >> More majordomo info at http://vger.kernel.org/majordomo-info.html
>> >
>