From patchwork Mon Oct 13 09:41:24 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joseph Lo X-Patchwork-Id: 5074781 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 7BA9A9F30B for ; Mon, 13 Oct 2014 09:44:20 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id B507C201EC for ; Mon, 13 Oct 2014 09:44:18 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id C6B6C2013A for ; Mon, 13 Oct 2014 09:44:17 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xdc8o-0002bP-Qq; Mon, 13 Oct 2014 09:42:10 +0000 Received: from hqemgate16.nvidia.com ([216.228.121.65]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xdc8k-0002N4-8m for linux-arm-kernel@lists.infradead.org; Mon, 13 Oct 2014 09:42:07 +0000 Received: from hqnvupgp08.nvidia.com (Not Verified[216.228.121.13]) by hqemgate16.nvidia.com id ; Mon, 13 Oct 2014 02:42:18 -0700 Received: from hqemhub01.nvidia.com ([172.20.12.94]) by hqnvupgp08.nvidia.com (PGP Universal service); Mon, 13 Oct 2014 02:41:26 -0700 X-PGP-Universal: processed; by hqnvupgp08.nvidia.com on Mon, 13 Oct 2014 02:41:26 -0700 Received: from DRBGMAIL104.nvidia.com (10.18.16.23) by hqemhub01.nvidia.com (172.20.150.30) with Microsoft SMTP Server (TLS) id 8.3.342.0; Mon, 13 Oct 2014 02:41:45 -0700 Received: from [10.19.108.115] (10.19.108.115) by DRBGMAIL104.nvidia.com (10.18.16.23) with Microsoft SMTP Server (TLS) id 15.0.847.32; Mon, 13 Oct 2014 09:41:41 +0000 Message-ID: <543B9E44.109@nvidia.com> Date: Mon, 13 Oct 2014 17:41:24 +0800 From: Joseph Lo User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.1.2 MIME-Version: 1.0 To: Jingchang Lu , "gregkh@linuxfoundation.org" Subject: Re: [PATCHv2] serial: of-serial: fix up PM ops on no_console_suspend and port type References: <1413185820-5920-1-git-send-email-jingchang.lu@freescale.com> In-Reply-To: <1413185820-5920-1-git-send-email-jingchang.lu@freescale.com> X-Originating-IP: [10.19.108.115] X-ClientProxiedBy: DRBGMAIL101.nvidia.com (10.18.16.20) To DRBGMAIL104.nvidia.com (10.18.16.23) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20141013_024206_318799_3C86DA58 X-CRM114-Status: GOOD ( 21.07 ) X-Spam-Score: -0.0 (/) Cc: "devicetree@vger.kernel.org" , "peter@hurleysoftware.com" , "arnd@arndb.de" , "linux-kernel@vger.kernel.org" , "linux-serial@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Hi, On 10/13/2014 03:37 PM, Jingchang Lu wrote: > This patch fixes commit 2dea53bf57783f243c892e99c10c6921e956aa7e, > "serial: of-serial: add PM suspend/resume support", which disables > the uart clock on suspend, but also causes a hardware hang on register > access if no_console_suspend command line option is used. > > Also, not every of_serial device is an 8250 port, so the serial8250 > suspend/resume functions should only be applied to a real 8250 port. > > Signed-off-by: Jingchang Lu > --- > changes in v2: > add switch selection on uart type. After apply this, it can't build for me. I still need to apply the fix like something below. } @@ -274,12 +275,12 @@ static int of_serial_resume(struct device *dev) #ifdef CONFIG_SERIAL_8250 case PORT_8250 ... PORT_MAX_8250: { - struct uart_8250_port port8250; + struct uart_8250_port *port8250; port8250 = serial8250_get_port(info->line); if (info->clk && - (!uart_console(port8250) || - (uart_console(port8250) && console_suspend_enabled))) + (!uart_console(&port8250->port) || + (uart_console(&port8250->port) && console_suspend_enabled))) clk_prepare_enable(info->clk); serial8250_resume_port(info->line); -Joseph > > drivers/tty/serial/of_serial.c | 42 ++++++++++++++++++++++++++++++++++++------ > 1 file changed, 36 insertions(+), 6 deletions(-) > > diff --git a/drivers/tty/serial/of_serial.c b/drivers/tty/serial/of_serial.c > index 8bc2563..b525383 100644 > --- a/drivers/tty/serial/of_serial.c > +++ b/drivers/tty/serial/of_serial.c > @@ -245,9 +245,24 @@ static int of_serial_suspend(struct device *dev) > { > struct of_serial_info *info = dev_get_drvdata(dev); > > - serial8250_suspend_port(info->line); > - if (info->clk) > - clk_disable_unprepare(info->clk); > + switch(info->type) { > +#ifdef CONFIG_SERIAL_8250 > + case PORT_8250 ... PORT_MAX_8250: > + { > + struct uart_8250_port port8250; > + port8250 = serial8250_get_port(info->line); > + > + serial8250_suspend_port(info->line); > + if (info->clk && > + (!uart_console(port8250) || > + (uart_console(port8250) && console_suspend_enabled))) > + clk_disable_unprepare(info->clk); > + break; > + } > +#endif > + default: > + break; > + } > > return 0; > } > @@ -256,10 +271,25 @@ static int of_serial_resume(struct device *dev) > { > struct of_serial_info *info = dev_get_drvdata(dev); > > - if (info->clk) > - clk_prepare_enable(info->clk); > + switch(info->type) { > +#ifdef CONFIG_SERIAL_8250 > + case PORT_8250 ... PORT_MAX_8250: > + { > + struct uart_8250_port port8250; > + port8250 = serial8250_get_port(info->line); > + > + if (info->clk && > + (!uart_console(port8250) || > + (uart_console(port8250) && console_suspend_enabled))) > + clk_prepare_enable(info->clk); > > - serial8250_resume_port(info->line); > + serial8250_resume_port(info->line); > + break; > + } > +#endif > + default: > + break; > + } > > return 0; > } > diff --git a/drivers/tty/serial/of_serial.c b/drivers/tty/serial/of_serial.c index e535f9c1563d..14c1ff4e7816 100644 --- a/drivers/tty/serial/of_serial.c +++ b/drivers/tty/serial/of_serial.c @@ -9,6 +9,7 @@ * 2 of the License, or (at your option) any later version. * */ +#include #include #include #include @@ -248,13 +249,13 @@ static int of_serial_suspend(struct device *dev) #ifdef CONFIG_SERIAL_8250 case PORT_8250 ... PORT_MAX_8250: { - struct uart_8250_port port8250; + struct uart_8250_port *port8250; port8250 = serial8250_get_port(info->line); serial8250_suspend_port(info->line); if (info->clk && - (!uart_console(port8250) || - (uart_console(port8250) && console_suspend_enabled))) + (!uart_console(&port8250->port) || + (uart_console(&port8250->port) && console_suspend_enabled))) clk_disable_unprepare(info->clk); break;