From patchwork Fri Jun 30 12:04:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Romain Perier X-Patchwork-Id: 9819459 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 32FFC6035F for ; Fri, 30 Jun 2017 12:08:20 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 23B2E2862C for ; Fri, 30 Jun 2017 12:08:20 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1879B2863C; Fri, 30 Jun 2017 12:08:20 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id BDBD32862C for ; Fri, 30 Jun 2017 12:08:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=NGODDgyjdR2qBir86X5AoidodfJU0PR8sU5k9duOom4=; b=kHYJz8SwuOfljMSxiYqH1Lf4i0 IyxlYiWtG7eibVyvHU2ryHImr8ZHvkCiIdp8f1s4QB3IK2bKgyt+4+GHpKt2rkbhrIA6GMsGdX3Us VAflyUIQd/fKPfQt4LRg4VJmmsj3IGxsTJyb9vtWbGZ7ssCMtZSNlbq2oI5tuUdpukgmaiOQtVsg6 6LfFUjg40oYkQFyavNuOLABt0qF3aGtJNmiwkrzHbEqNvvQtBzcQcZo+1WIoFMfOgBCF0zeuGDE2j VObFMBbtQfOuHgtKV0RQ6p/iuwvZTAKYZtstrkDbpIZ4lbMTyI5bcEsB+jCYQVtmP/MZajtsCdUqT JoOd9hVw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1dQuif-00024Q-5r; Fri, 30 Jun 2017 12:08:17 +0000 Received: from bhuna.collabora.co.uk ([46.235.227.227]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1dQugD-00083T-GD for linux-arm-kernel@lists.infradead.org; Fri, 30 Jun 2017 12:05:51 +0000 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: rperier) with ESMTPSA id 874EC26BF83 From: Romain Perier To: Greg Kroah-Hartman Subject: [PATCH 7/7] serial: imx: Fix imx_shutdown procedure Date: Fri, 30 Jun 2017 14:04:46 +0200 Message-Id: <20170630120446.13994-8-romain.perier@collabora.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170630120446.13994-1-romain.perier@collabora.com> References: <20170630120446.13994-1-romain.perier@collabora.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170630_050546_120181_1101064B X-CRM114-Status: GOOD ( 11.53 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Romain Perier , Nandor Han , linux-arm-kernel@lists.infradead.org, linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP From: Nandor Han In some cases, It looks that interrupts can happen after the dma was disabled and port was not yet shutdown. This will result in interrupts handled by imx_rxint. This commits updates the shutdown function to ensure that underlying components are disabled in the right order. This disables RX and TX blocks, then it disabled interrupts. In case DMA is enabled, it disables DMA and free corresponding resources. It disables UART port and stop clocks. Signed-off-by: Nandor Han Signed-off-by: Romain Perier --- drivers/tty/serial/imx.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index d5b6e09..7dc6f0c 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -1404,44 +1404,44 @@ static void imx_shutdown(struct uart_port *port) unsigned long temp; unsigned long flags; - if (sport->dma_is_enabled) { - sport->dma_is_rxing = 0; - sport->dma_is_txing = 0; - dmaengine_terminate_sync(sport->dma_chan_tx); - dmaengine_terminate_sync(sport->dma_chan_rx); - + if (!sport->port.suspended) { spin_lock_irqsave(&sport->port.lock, flags); imx_stop_tx(port); imx_stop_rx(port); - imx_disable_dma(sport); spin_unlock_irqrestore(&sport->port.lock, flags); - imx_uart_dma_exit(sport); } - mctrl_gpio_disable_ms(sport->gpios); + if (sport->dma_is_inited) { + if (sport->dma_is_enabled) { + spin_lock_irqsave(&sport->port.lock, flags); + imx_disable_dma(sport); + spin_unlock_irqrestore(&sport->port.lock, flags); + } + imx_uart_dma_exit(sport); + } spin_lock_irqsave(&sport->port.lock, flags); temp = readl(sport->port.membase + UCR2); - temp &= ~(UCR2_TXEN); + temp &= ~(UCR2_TXEN | UCR2_RXEN); writel(temp, sport->port.membase + UCR2); + temp = readl(sport->port.membase + UCR4); + temp &= ~UCR4_OREN; + writel(temp, sport->port.membase + UCR4); spin_unlock_irqrestore(&sport->port.lock, flags); - /* - * Stop our timer. - */ - del_timer_sync(&sport->timer); + mctrl_gpio_disable_ms(sport->gpios); - /* - * Disable all interrupts, port and break condition. - */ + /* Stop our timer. */ + del_timer_sync(&sport->timer); + /* Disable port. */ spin_lock_irqsave(&sport->port.lock, flags); temp = readl(sport->port.membase + UCR1); - temp &= ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN); - + temp &= ~UCR1_UARTEN; writel(temp, sport->port.membase + UCR1); spin_unlock_irqrestore(&sport->port.lock, flags); + /* Disable clocks. */ clk_disable_unprepare(sport->clk_per); clk_disable_unprepare(sport->clk_ipg); }