From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752710AbbGOQHk (ORCPT ); Wed, 15 Jul 2015 12:07:40 -0400 Received: from mout.kundenserver.de ([212.227.17.24]:53632 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751592AbbGOQHg (ORCPT ); Wed, 15 Jul 2015 12:07:36 -0400 Message-ID: <55A68502.1090609@i2se.com> Date: Wed, 15 Jul 2015 18:06:26 +0200 From: Stefan Wahren User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: Juergen Borleis , linux-kernel@vger.kernel.org CC: Greg Kroah-Hartman , Jiri Slaby , linux-serial@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kernel@pengutronix.de Subject: Re: [PATCH v2] serial: mxs-auart: keep the AUART unit in reset state when not in use References: <1436945777-4332-1-git-send-email-jbe@pengutronix.de> In-Reply-To: <1436945777-4332-1-git-send-email-jbe@pengutronix.de> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K0:QjBYM7LzxTLmg2vvjYY1jhgg4+ZjcF/Wbka70B8C2vjFWihQPPA V5y3LBjdkxRpUjzBC9Uw7HWorDV+84aa/XduKHx0+o2cVc7dDJ5lJxMlCsloZlQDU1tqQ3Y ltwHeq1a4r8rPudri9QaeH/ifHDPXF0MpydPVsB3ODAbOyWFl46swehFXNLmZH5O/9c6XMq Qi15lXtq1cv92HqrdS04A== X-UI-Out-Filterresults: notjunk:1;V01:K0:zOc0FAsFskM=:CVHtbS0cF0lJdu1X6dMiEt U3vLsdr3UkbsXem33hQ31TflZzRRXhg3ZipajP9tYpddGBFLzY31zEaMWhoUHYZC4aM5iWsPb SkDAmsTKCiIDF52TRURQhZolrYgdVgjOGGY4H4Fk+Qse/svU8F5jvHr+O8hKKd/Dg00sE7I/R gmDS9FWve2pURUJrPBxqAeKJeH6YvUOwfQOtywYsgwNQOZyOAqMTtkhGKWO9524wHWR2qg7oH xnCFXzyfxWltJbSTMblDctROEfx8Ot73vQB0LIJ7HsU4sIdI9I06sm09ePyBRblAEUOMcYS2H LWKNi0XP6s0ieOml6iLUm2oAVJ+5ZVuaxkUNMnwy18o9o31J3LYt3GS4ogniu0cVczM/7Ud9n zCxJ/6KeLLpvUceiel3ecUkN8TkW6Wm41coVX4X392HDGdVFRaF5YzfKHkYSFJU8oItKV72Vu UtYJJ1Ha5ejR7l0AHA1oZ3aHZ0mJTWr9ktJbsVhw/DjjbGhT0JfwbPwAD6pH/bvwOtXu70LYd yvhj2TUyFcWvT7TL3RaDLaQqif6aV6tzlIZjC/oXcAEZ3XhfnqJD0vX7GZNHfn+EsPYrg316o H6TnfVceXM6dimGFnoTMRWhf/1TWXWH05PxTOkej8uDrUxbQeLsHcJoxrm2neODtigUcPTqGt nh1Kx3MgDl4JTeAfr5BKdWnvQ4hQYUh1ZSesNQw4/9PS3Ow== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Juergen, Am 15.07.2015 um 09:36 schrieb Juergen Borleis: > Whenever the UART device driver gets closed from userland, the driver > disables the UART unit and then stops its clock to save power. > > The bit which disabled the UART unit is described as: > > "UART Enable. If this bit is set to 1, the UART is enabled. Data > transmission and reception occurs for the UART signals. When the > UART is disabled in the middle of transmission or reception, it > completes the current character before stopping." > > The important part is the "it completes the current character". Whenever > a reception is ongoing when the UART gets disabled (including the clock > off) the statemachine freezes and "remembers" this state on the next > open() and re-enabling of the unit's clock. > > In this case we end up receiving an additional bogus character > immediately. > > The solution in this change is to move the AUART unit into its reset > state on close() and only release it from its reset state on the next > open(). > > Signed-off-by: Juergen Borleis > --- changelog for v2? > drivers/tty/serial/mxs-auart.c | 38 ++++++++++++++++++++++++++++++-------- > 1 file changed, 30 insertions(+), 8 deletions(-) > > diff --git a/drivers/tty/serial/mxs-auart.c b/drivers/tty/serial/mxs-auart.c > index 13cf773..13b3e3c 100644 > --- a/drivers/tty/serial/mxs-auart.c > +++ b/drivers/tty/serial/mxs-auart.c > @@ -858,6 +858,30 @@ static void mxs_auart_reset(struct uart_port *u) > writel(AUART_CTRL0_CLKGATE, u->membase + AUART_CTRL0_CLR); > } > > +static void mxs_auart_keep_reset(struct uart_port *u) > +{ > + int i; > + u32 reg; > + > + reg = readl(u->membase + AUART_CTRL0); > + /* if already in reset state, keep it untouched */ > + if (reg & AUART_CTRL0_SFTRST) > + return; > + > + writel(AUART_CTRL0_CLKGATE, u->membase + AUART_CTRL0_CLR); > + writel(AUART_CTRL0_SFTRST, u->membase + AUART_CTRL0_SET); > + > + for (i = 0; i < 10000; i++) { > + reg = readl(u->membase + AUART_CTRL0); > + /* reset is finished when the clock is gated */ > + if (reg & AUART_CTRL0_CLKGATE) > + return; > + udelay(3); > + } > + > + dev_err(u->dev, "Failed to reset the unit."); Sorry, i missed that in my first review. It looks like that the newline at the end of the error message is missing. Regards Stefan