From patchwork Mon Jul 25 16:36:06 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tero Kristo X-Patchwork-Id: 1005532 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter2.kernel.org (8.14.4/8.14.4) with ESMTP id p6PGabsX000371 for ; Mon, 25 Jul 2011 16:36:40 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752499Ab1GYQgi (ORCPT ); Mon, 25 Jul 2011 12:36:38 -0400 Received: from bear.ext.ti.com ([192.94.94.41]:49144 "EHLO bear.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752382Ab1GYQgf convert rfc822-to-8bit (ORCPT ); Mon, 25 Jul 2011 12:36:35 -0400 Received: from dlep33.itg.ti.com ([157.170.170.112]) by bear.ext.ti.com (8.13.7/8.13.7) with ESMTP id p6PGaZvD028185 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 25 Jul 2011 11:36:35 -0500 Received: from dlep26.itg.ti.com (smtp-le.itg.ti.com [157.170.170.27]) by dlep33.itg.ti.com (8.13.7/8.13.8) with ESMTP id p6PGaZwR003629 for ; Mon, 25 Jul 2011 11:36:35 -0500 (CDT) Received: from dnce72.ent.ti.com (localhost [127.0.0.1]) by dlep26.itg.ti.com (8.13.8/8.13.8) with ESMTP id p6PGaYCM009317 for ; Mon, 25 Jul 2011 11:36:34 -0500 (CDT) thread-index: AcxK6QQeiPq24K1CSDmQC27sTINN7w== Content-Class: urn:content-classes:message Importance: normal X-MimeOLE: Produced By Microsoft MimeOLE V6.00.3790.4657 Received: from localhost.localdomain (172.24.88.14) by dnce72.ent.ti.com (137.167.131.87) with Microsoft SMTP Server (TLS) id 8.3.106.1; Mon, 25 Jul 2011 18:36:33 +0200 From: Tero Kristo To: Subject: [PATCHv6 06/11] TEMP: OMAP3: serial: made serial to work properly with PRCM chain handler Date: Mon, 25 Jul 2011 19:36:06 +0300 Message-ID: <1311611771-15093-7-git-send-email-t-kristo@ti.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1311611771-15093-1-git-send-email-t-kristo@ti.com> References: <1311611771-15093-1-git-send-email-t-kristo@ti.com> MIME-Version: 1.0 Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter2.kernel.org [140.211.167.43]); Mon, 25 Jul 2011 16:36:40 +0000 (UTC) This patch is just a temporary hack to allow serial to work properly with the PRCM chain handler. Should be replaced with a proper implementation. Signed-off-by: Tero Kristo --- arch/arm/mach-omap2/serial.c | 28 +++++++++------------------- drivers/tty/serial/omap-serial.c | 8 ++++++++ 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 466fc722..651fb91 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c @@ -39,6 +39,7 @@ #include #include #include +#include #include "prm2xxx_3xxx.h" #include "pm.h" @@ -380,6 +381,7 @@ static void omap_uart_allow_sleep(struct omap_uart_state *uart) omap_uart_smart_idle_enable(uart, 1); uart->can_sleep = 1; del_timer(&uart->timer); + omap_uart_disable_clocks(uart); } static void omap_uart_idle_timer(unsigned long data) @@ -391,35 +393,23 @@ static void omap_uart_idle_timer(unsigned long data) void omap_uart_prepare_idle(int num) { - struct omap_uart_state *uart; - - list_for_each_entry(uart, &uart_list, node) { - if (num == uart->num && uart->can_sleep) { - omap_uart_disable_clocks(uart); - return; - } - } } void omap_uart_resume_idle(int num) { struct omap_uart_state *uart; + u32 wkst; list_for_each_entry(uart, &uart_list, node) { if (num == uart->num && uart->can_sleep) { - omap_uart_enable_clocks(uart); + omap_uart_block_sleep(uart); - /* Check for IO pad wakeup */ - if (cpu_is_omap34xx() && uart->padconf) { - u16 p = omap_ctrl_readw(uart->padconf); - - if (p & OMAP3_PADCONF_WAKEUPEVENT0) - omap_uart_block_sleep(uart); + /* Check for normal UART wakeup (and clear it) */ + if (uart->wk_st && uart->wk_mask) { + wkst = __raw_readl(uart->wk_st) & uart->wk_mask; + if (wkst) + __raw_writel(wkst, uart->wk_st); } - - /* Check for normal UART wakeup */ - if (__raw_readl(uart->wk_st) & uart->wk_mask) - omap_uart_block_sleep(uart); return; } } diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c index 47cadf4..bd6ae02 100644 --- a/drivers/tty/serial/omap-serial.c +++ b/drivers/tty/serial/omap-serial.c @@ -261,6 +261,8 @@ static void serial_omap_start_tx(struct uart_port *port) unsigned int start; int ret = 0; + omap_uart_resume_idle(up->pdev->id); + if (!up->use_dma) { serial_omap_enable_ier_thri(up); return; @@ -354,6 +356,8 @@ static inline irqreturn_t serial_omap_irq(int irq, void *dev_id) unsigned int iir, lsr; unsigned long flags; + omap_uart_resume_idle(up->pdev->id); + iir = serial_in(up, UART_IIR); if (iir & UART_IIR_NO_INT) return IRQ_NONE; @@ -641,6 +645,8 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios, unsigned long flags = 0; unsigned int baud, quot; + omap_uart_resume_idle(up->pdev->id); + switch (termios->c_cflag & CSIZE) { case CS5: cval = UART_LCR_WLEN5; @@ -947,6 +953,8 @@ serial_omap_console_write(struct console *co, const char *s, unsigned int ier; int locked = 1; + omap_uart_resume_idle(up->pdev->id); + local_irq_save(flags); if (up->port.sysrq) locked = 0;