From patchwork Tue Sep 1 14:58:00 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: vikram pandita X-Patchwork-Id: 45080 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n81Ex6MB031325 for ; Tue, 1 Sep 2009 14:59:06 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754641AbZIAO6L (ORCPT ); Tue, 1 Sep 2009 10:58:11 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754492AbZIAO6L (ORCPT ); Tue, 1 Sep 2009 10:58:11 -0400 Received: from bear.ext.ti.com ([192.94.94.41]:60508 "EHLO bear.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754509AbZIAO6J convert rfc822-to-8bit (ORCPT ); Tue, 1 Sep 2009 10:58:09 -0400 Received: from dbdp20.itg.ti.com ([172.24.170.38]) by bear.ext.ti.com (8.13.7/8.13.7) with ESMTP id n81Ew3N1001315; Tue, 1 Sep 2009 09:58:09 -0500 Received: from dbde70.ent.ti.com (localhost [127.0.0.1]) by dbdp20.itg.ti.com (8.13.8/8.13.8) with ESMTP id n81Ew25p028760; Tue, 1 Sep 2009 20:28:02 +0530 (IST) Received: from dbde02.ent.ti.com ([172.24.170.145]) by dbde70.ent.ti.com ([172.24.170.148]) with mapi; Tue, 1 Sep 2009 20:28:02 +0530 From: "Pandita, Vikram" To: Govindraj , HU TAO-TGHK48 CC: vimal singh , "linux-omap@vger.kernel.org" , LKML , "linux-serial@vger.kernel.org" , "Ye Yuan.Bo-A22116" , Chen Xiaolong-A21785 Date: Tue, 1 Sep 2009 20:28:00 +0530 Subject: RE: [RFC][PATCH]: Adding support for omap-serail driver Thread-Topic: [RFC][PATCH]: Adding support for omap-serail driver Thread-Index: Acoq1BeXw52jxpBaQ26uuf5BwmE50AAP+pDg Message-ID: References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US MIME-Version: 1.0 Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org govindraj >-----Original Message----- >From: linux-omap-owner@vger.kernel.org [mailto:linux-omap-owner@vger.kernel.org] On Behalf Of >Govindraj >Sent: Tuesday, September 01, 2009 2:14 AM >To: HU TAO-TGHK48 >Cc: vimal singh; linux-omap@vger.kernel.org; LKML; linux-serial@vger.kernel.org; Ye Yuan.Bo-A22116; >Chen Xiaolong-A21785 >Subject: Re: [RFC][PATCH]: Adding support for omap-serail driver > >On Mon, Aug 31, 2009 at 5:20 PM, HU TAO-TGHK48 wrote: >> >> 1. Shall we cleanup PM related stuff in arch/arm/mach-omap2/serial.c as >> well? >>    Originally serail.c register UART IRQ  to decide if UART idle for a >> while and is able to enter low power mode (e.g. retention). >>    To work with original 8250 driver, it is probably the only way since >> 8250 is not aware of OMAP PM. >> >>    However  it would be more reasonable to merge PM stuff to >> omap-serial.c. since the new driver is already OMAP specific >> >> 2. There is an issue for DMA  with current implementation in serial.c >>    When Rx DMA is active NO Rx IRQ will be generated. >>    So serial.c will easily set uart->can_sleep with "1" even there is >> Rx DMA ongoing >>    +   if ((iir & 0x4) && up->use_dma) { >>    +           up->ier &= ~UART_IER_RDI; >>    +           serial_out(up, UART_IER, up->ier >> >>   In my view, the best way is to do the idle detection in >> omap_serial.c. > >Yes I understand that we cannot adapt 8250 PM model for omap-serial >driver in DMA mode I am currently working on that adaption with dma >mode and will be posting a separate patch for changes on serial.c. > >Wouldn't it be cleaner to inherit and adapt the Serial-PM framework >from serial.c rather than redefining the PM changes in the driver. > >As Serial-PM framework already has support for interrupt mode and we >have to adapt the same for DMA mode. > >Also defining PM changes in omap-serial would need changes in PM framework. >As PM framework calls functions from serail.c file if we are defining >PM framework in our driver then we may need to redefine the functions >as in serial.c or modify the PM-framework for uart-activity check. >I feel adapting the existing serial-PM framework for DMA mode would be >better rather than >doing these changes. You can take reference of how to integrate omap-serial driver PM with mach-omap2/serial.c as follows, for reference --- --- From 69112426bd6009cb11e104b9aafcc65429d662f0 Mon Sep 17 00:00:00 2001 From: Vikram Pandita Date: Fri, 21 Aug 2009 11:15:58 -0500 Subject: [RFC PATCH] OMAP: Serial: Keep uart in no idle mode when DMA ongoing Keep UART in NoIdle mode when DMA is going on. Only once UART transfers are complete, switch to smart idle and allow OsIdle to kick in Signed-off-by: Vikram Pandita --- arch/arm/mach-omap2/serial.c | 12 ++++++++++++ drivers/serial/omap-serial.c | 2 +- 2 files changed, 13 insertions(+), 1 deletions(-) diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index ff9beb7..a6ee6ab 100755 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c @@ -359,9 +359,21 @@ static void omap_uart_allow_sleep(struct omap_uart_state *uart) del_timer(&uart->timer); } +extern int are_driveromap_uarts_active(int *); + static void omap_uart_idle_timer(unsigned long data) { struct omap_uart_state *uart = (struct omap_uart_state *)data; + int dummy; + + if (are_driveromap_uarts_active(&dummy)){ + /* Keep UART on NoIdle when DMA channel is enabled in omap + * serial: do not allow UART to goto Smart-idle till its done + * dma'ing + */ + omap_uart_block_sleep(uart); + return; + } omap_uart_allow_sleep(uart); } diff --git a/drivers/serial/omap-serial.c b/drivers/serial/omap-serial.c index 938f29f..f105e24 100644 --- a/drivers/serial/omap-serial.c +++ b/drivers/serial/omap-serial.c @@ -1641,6 +1641,7 @@ int omap24xx_uart_cts_wakeup(int uart_no, int state) return 0; } EXPORT_SYMBOL(omap24xx_uart_cts_wakeup); +#endif /** * are_driver8250_uarts_active() - Check if any ports managed by this * driver are currently busy. This should be called with interrupts @@ -1709,7 +1710,6 @@ int are_driveromap_uarts_active(int *driver8250_managed) } EXPORT_SYMBOL(are_driveromap_uarts_active); -#endif static void serial_omap_display_reg(struct uart_port *port) {