From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753544AbcGSIBC (ORCPT ); Tue, 19 Jul 2016 04:01:02 -0400 Received: from mail-db5eur01on0119.outbound.protection.outlook.com ([104.47.2.119]:61153 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753170AbcGSIA4 (ORCPT ); Tue, 19 Jul 2016 04:00:56 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=bhuvanchandra.dv@toradex.com; From: Bhuvanchandra DV To: CC: , , , , , , , , , , "Bhuvanchandra DV" Subject: [PATCH RESEND v2 7/8] tty: serial: fsl_lpuart: Update suspend/resume for DMA mode Date: Tue, 19 Jul 2016 13:13:09 +0530 Message-ID: <20160719074310.16872-8-bhuvanchandra.dv@toradex.com> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20160719074310.16872-1-bhuvanchandra.dv@toradex.com> References: <20160719074310.16872-1-bhuvanchandra.dv@toradex.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [115.115.243.34] X-ClientProxiedBy: MA1PR01CA0045.INDPRD01.PROD.OUTLOOK.COM (10.164.116.145) To DB6PR0501MB2087.eurprd05.prod.outlook.com (10.168.9.139) X-MS-Office365-Filtering-Correlation-Id: cb181b40-d304-40da-4252-08d3afa89448 X-Microsoft-Exchange-Diagnostics: 1;DB6PR0501MB2087;2:RC+IrPm6GT8im8QADChUC6PBgvpy033Bm9gMIHXiRLOsMwHIetCfeGG5Y+RiYsRCEgl+8/J5o1ZHPCAiEbWDjw7WDnQNwA/As6LIMlj11Q4QTZn4AMECxeEpNd/IemTtlc8KyO85ducqCrWQuQOOkZrPVmH2cvA6s5ZWU/YjSWRD0NbQVvRCgFbC57cVCQmQ;3:vCuW7iZnINJ3G6k7JZ5WoPKE2k5LZTJa/6+3NCqCo2iaFrlS6OfKeg2mMMA9Z83SnWizR1On49Aj2lfpB5c/C9Cl4h2I6xg/I21pAbzchuOAdCXkIrpvubXeC6fjs3Aw X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0501MB2087; X-Microsoft-Exchange-Diagnostics: 1;DB6PR0501MB2087;25:j/AbbMwGb7pvgWcQHx177CHZqiyb66OX4JFY+ZIE2Oif9bl6fHDEAZv5HSnu0SWfF7LlabLW642Y/7Sj5CoGEWSmeKKz5dBt6rCLs2SplMC0OFgWuTO6ATFFOQWf7LzUMhcg13GOpfogXGVmUTsRxInp0+3PCr3t3BvSEm52j8IoYqsmEhOGFLAheBo4i/X6WwP5nnrH/6MdDic4svPOQ138oM4Qhkr/DhxZD/kdFvEWjbA4Rind/1LZaHAjV5HaIRBQ+fho55km57Pn7i0eR8ZOl1m9puHubIb1By8Xu9wj/f9ovS3HSg0giMUzkFzsUByeYDmoH0yTaXwFse1OHRZZ2fnK2Lb3aV8yCfy4n87k5bedxyY2Dv0ZgCtePGNLMWMsUW1wc0RxwTlsawYLXm56IbR/lFP6CQNN3U1Jc/i/YjK+6TEvLOYogUXbrVEZOavuhS4zNZyaUM8MlijnR5pnsFEjR6+5BkenjJPPkIoU+1dDluoLh69hnoIsR9dt5TN1IoasVgzQqxZrBIgcw0ZxuOqBNoUaMKX1NX9Qy9eZCfpHqPM/4n/Wvb5epxbA8QGzFr+4RW5DLokDbhPz/9dzmoH6Ns0YvHj3IbRDK8LlewyzuVIamLpDlLerq5q0AvOTvU8BFdwKDpgmf+ohp6gnht3Kpi5G0VC6IBjgP3SvGO8oSJ5PnS2NiIMy30ogxhF/LeAJJgMdj7pS/Jy8MI4tLRhCdLbGjmNOn9aeXHybVXj6Yo7BBCFCzK60kwFE X-Microsoft-Exchange-Diagnostics: 1;DB6PR0501MB2087;31:68Lb0j+EkhnLUa7xnGvdrL278MvJp/BpF5XYchR57gw6KMlT2xpdOSFbEe10vV1uyW7wqVtfA4RXIidaqbZuRt0Gn8zGFV1+CkQONBdQUjcVPBqWIpXSC4PcSZNbwqjNnpIe2HD1a4g7AKZCLEIhMe8kZjRbNQHWLlui5FSaDC3+umE51OqCYBCNOcwM2uVuI4LB2Zjawg1pkaMZDjcUYg==;20:dkehsBBBnmxnJ9yABl/xO/lUWJwUcYUepAxw0ENofO8Z5HHJTngcZ3nOhUSzCqt2quq7A+0+3JTsGgCZMOgzcWiMragDeQWSJcMUSJXvIzV1Hmil4iNT8t5Zh98MMQSN0NFD1R9AhuZHbwRuBl76WOxj3o5buF9pHp/G7id6RnpMuex9A76ndRst+L9PldwYcEFiFo/8KfHXiwOuxoAYI6tr94x1BzkbQQ0UFUiiLdk5+Mv7bnG9Zcdli9pKEhR9FlIrXMSudHGCbxZDNWMJC/NDz7/IEhmdiSom2AOk/fwSVEVVps9LqsnqZcXQe9WXXyQJaMEORuzPMlhG45hwKg==;4:Xq4VdUGp53OWVJ+EMa06AA7qpqTD7EDCdY7DE9O3mbxtn+haP/Tw3iYlhC97RbrCYsFVdRf7Q51Ri1ZLVdsY+Zh2gZx0C5obYknmjV4sEbuOuavpldPCYTwZtv7R3UnralwkqCvbpLoxzF1Qh4hmZgl9CU99GLNWyXLTXgjTVnqLaxfLiKSoA5ZS7xT533dNpzk3xYnl+fuWQdT+5+PMhXvZz2D8FKljrkZ3s/3zGKITM33Q8nSU9ZfOlgHvTf37vk0eSZjWFp9KOvs/dOQbR2GS7DoodvtWoUntyGyHKPEXrNvBveq1fHrLC/oe6OUVbx2E9SC/I023Wxf9AF7pjtoBv45+dPSVHoqJDrKIqY2+VESYZnWy9W/U5Y64ILFn X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046);SRVR:DB6PR0501MB2087;BCL:0;PCL:0;RULEID:;SRVR:DB6PR0501MB2087; X-Forefront-PRVS: 000800954F X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(199003)(189002)(77096005)(36756003)(42186005)(69596002)(4001430100002)(19580395003)(86362001)(7736002)(19580405001)(47776003)(5003940100001)(2950100001)(92566002)(50466002)(66066001)(76176999)(50986999)(50226002)(4326007)(48376002)(6116002)(3846002)(1076002)(586003)(97736004)(305945005)(68736007)(189998001)(105586002)(8676002)(110136002)(15650500001)(107886002)(53416004)(101416001)(2906002)(2351001)(81156014)(81166006)(229853001)(106356001)(7846002)(33646002)(217873001);DIR:OUT;SFP:1102;SCL:1;SRVR:DB6PR0501MB2087;H:tdx-in-nb-0014.toradex.ext;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB6PR0501MB2087;23:KK8QRZVk/WCTSqTdPA66bFjH0O2psmOSjlDyp5T?= =?us-ascii?Q?PYmXRH5P4OahugSrWaoKiXlBrqVHbWEA7mdWLNjSFLE/7kWl0D21ySqsFlu2?= =?us-ascii?Q?t/PrU/q0mFxgOyED0nvBxdhZZuVAOn9IO9mafc4zh6yCSiDRvIzcQdUHOEPk?= =?us-ascii?Q?gfdHMUd5ibs2LKxVdu65n1PJDHVY2Angf3goK87WLIun7E4Z8BFSzy1nOiZY?= =?us-ascii?Q?yuAp4sH/4pJTtoSrHNQDcABJmPlJAeQ3nQN19IXdGFm3vElooWxoMQCCJFEj?= =?us-ascii?Q?ZHFc2yM/zrfXcQ61tdgDZNtLNa+G/lKstoh/tZU7bb9elFnCqzLZUWXwJ1nw?= =?us-ascii?Q?g4IRXV7+Y0XoryCdVJ9tZSAHPq4OocR1keJ7l0tcjPehVR3HUqaA2cInIQaf?= =?us-ascii?Q?6KNs5UJ79F0XrPrOB6oG6sYcNgiq91vkHXEJVYpOpVMrsKE0g96Sj5JA36St?= =?us-ascii?Q?4G3uEnIRu/+cur/uHnJmnIUmCf4CTQq7uBKb+w1vZOFxHK1wHU67PK//24a4?= =?us-ascii?Q?K8XWjdacMefydxWjmyQffiskYm4mI36dV+ET+VJ0MQTqQcj+ri785YhJ2jZS?= =?us-ascii?Q?Dn3h66CqFCD+RU5dmNKwZCvGavnmmxUN0ZxPfpMAPRGxpi3MOfxwWOLwUzax?= =?us-ascii?Q?7WBlhDZ2FyLitCYIwwVKRLA+leWnm8EKyECpJhT414Hv8QK8UtxA4G27kQ6U?= =?us-ascii?Q?0/3mw28AKmwoIbhj8uIHhgT4BCD3sj1jNPWzPJv52OPltWTfXYomsRlxkTL1?= =?us-ascii?Q?ff8QhAOlxj1Zg9OZk/NuQKx7WovX/VwrUHFEFOFggV7YHmwLVnIOwnf0d79p?= =?us-ascii?Q?v9G0ch0hHC/6drbc2vzo/w1QSl8uDhI5ocI6oe4R5n4eoIc9Z/HzckVjtiED?= =?us-ascii?Q?3bktNia21ci80Y3qrMPu+b6AuG4t6jm7vq4xJTNO7k4WeOD77amVeW28pS5c?= =?us-ascii?Q?9JVjttC7SnOViwOpJdGqIabGvN6xrBvv+JRlWm6MqPVa6oFrz9iy38oLvlAe?= =?us-ascii?Q?hM1AN9ZFlN9ejY/9hm43XcRCvt5P2oCgm4+RrNynpVzDpwSsgj1RfF7lzUPB?= =?us-ascii?Q?PaJZtf1huXDFPefnrf97jMGlCDTpU+MJyiJoizz+bnfQ0tCqO4C4pwfAhzIl?= =?us-ascii?Q?1ukG0Nv2hFrualZAvs8drtEMhYuin/hJD8kEENI4BtCDg+jWH6DzdjEXTBes?= =?us-ascii?Q?vzDhfv7XBps0px991gmjrChL+wQcnUzKc1t/93n2ehdpMLlKyXcAcInGEYw?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1;DB6PR0501MB2087;6:7l4OwVIaRtBP+2OxCY3E0UsQbYKu48jNGAAjz1OBZkAiR4kAd/zKf1txr1aFer8EwnqDlQ8P9jJLVw+FLYprwBCFmDLMSW+5XxQpEfluG16A42v2GMzpPL/VK7fNPFbIty86WLtuXJHKBTpE7oB4matlur+bMfttNRPYUhRAbfSjGxi7VMG3uB0tsxvnx6bMvCEH+57IEjSl/biWVhiATAoNNoXMYG8iOn7OyJaJMF9LgnYrf1AnpkqPakZW/H9P2HkognUk3FPjEY7DlhKIPAkYFO9AWFmNxkG08AJxOrk=;5:qO/z7hdpfcQLeAAJt4isuq6Xx/9qccPuIuoOn1ceHuPru6xvLcqLOpR/j+Zio6sLeQ/Bv3OhDK/zFzRFITu6lOjZHfPGDp3JVTq6s/xpJ4LcsqT/N45fgzFatR80PP+yZSLHybPimHKpluN2uKmqHg==;24:pQvtQ5KIkcYqR6Sif63Z7ezKc/q+3z6FwVShZu2DgOoMQoRYStq4TM+R6FMYa9I1bsrLoa2z7cR7X3aSAgmWuSbQMitqsexlR2mxS093nUM=;7:XYv68+Yk5eWm4bIf4rDT+7EiHfDI6s9vne8vvi4XbN+DWWagg/gkE6zUJrzLuRNJQPfiyF/cKBFN3owp01Bn9d6r6nacm7DUwWb/ddiXWa3Q8PxEGYujmcVDu33lRNvz1H2UF0lir3dbGT45qhsHwFH5+rT/zI9zkGkJ5Fh9Ck8RSZABUtQaFomMJOG7bLHw6fV4dW8lWqgYl+AnryAV9DQNEbOlqjEK10ofqRP3FC8HLifO0FBUtVgg7o5CLRfB SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: toradex.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jul 2016 07:44:54.4293 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0501MB2087 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When DMA mode is enabled one need to make sure the DMA channels are idle before entering suspend mode especially when UART ports which are set as wakeup source and console port with no_console_suspend is set. This patch takes care of gracefully releasing DMA channels for the above two cases and start the DMA at resume. Signed-off-by: Bhuvanchandra DV --- drivers/tty/serial/fsl_lpuart.c | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c index 27687d5..134090a 100644 --- a/drivers/tty/serial/fsl_lpuart.c +++ b/drivers/tty/serial/fsl_lpuart.c @@ -1943,6 +1943,30 @@ static int lpuart_suspend(struct device *dev) } uart_suspend_port(&lpuart_reg, &sport->port); + + if (sport->lpuart_dma_rx_use) { + /* + * EDMA driver during suspend will forcefully release any + * non-idle DMA channels. If port wakeup is enabled or if port + * is console port or 'no_console_suspend' is set the Rx DMA + * cannot resume as as expected, hence gracefully release the + * Rx DMA path before suspend and start Rx DMA path on resume. + */ + if (sport->port.irq_wake) { + del_timer_sync(&sport->lpuart_timer); + lpuart_dma_rx_free(&sport->port); + } + + /* Disable Rx DMA to use UART port as wakeup source */ + writeb(readb(sport->port.membase + UARTCR5) & ~UARTCR5_RDMAS, + sport->port.membase + UARTCR5); + } + + if (sport->lpuart_dma_tx_use) { + sport->dma_tx_in_progress = false; + dmaengine_terminate_all(sport->dma_tx_chan); + } + if (sport->port.suspended && !sport->port.irq_wake) clk_disable_unprepare(sport->clk); @@ -1970,6 +1994,26 @@ static int lpuart_resume(struct device *dev) writeb(temp, sport->port.membase + UARTCR2); } + if (sport->lpuart_dma_rx_use) { + if (sport->port.irq_wake) { + if (!lpuart_start_rx_dma(sport)) { + sport->lpuart_dma_rx_use = true; + rx_dma_timer_init(sport); + } else { + sport->lpuart_dma_rx_use = false; + } + } + } + + if (sport->dma_tx_chan && !lpuart_dma_tx_request(&sport->port)) { + init_waitqueue_head(&sport->dma_wait); + sport->lpuart_dma_tx_use = true; + writeb(readb(sport->port.membase + UARTCR5) | + UARTCR5_TDMAS, sport->port.membase + UARTCR5); + } else { + sport->lpuart_dma_tx_use = false; + } + uart_resume_port(&lpuart_reg, &sport->port); return 0; -- 2.9.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bhuvanchandra DV Subject: [PATCH RESEND v2 7/8] tty: serial: fsl_lpuart: Update suspend/resume for DMA mode Date: Tue, 19 Jul 2016 13:13:09 +0530 Message-ID: <20160719074310.16872-8-bhuvanchandra.dv@toradex.com> References: <20160719074310.16872-1-bhuvanchandra.dv@toradex.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <20160719074310.16872-1-bhuvanchandra.dv@toradex.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: gregkh@linuxfoundation.org Cc: linux-serial@vger.kernel.org, mturquette@baylibre.com, sboyd@codeaurora.org, linux-kernel@vger.kernel.org, stefan@agner.ch, kernel@pengutronix.de, jslaby@suse.com, shawnguo@kernel.org, linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Bhuvanchandra DV List-Id: linux-serial@vger.kernel.org When DMA mode is enabled one need to make sure the DMA channels are idle before entering suspend mode especially when UART ports which are set as wakeup source and console port with no_console_suspend is set. This patch takes care of gracefully releasing DMA channels for the above two cases and start the DMA at resume. Signed-off-by: Bhuvanchandra DV --- drivers/tty/serial/fsl_lpuart.c | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c index 27687d5..134090a 100644 --- a/drivers/tty/serial/fsl_lpuart.c +++ b/drivers/tty/serial/fsl_lpuart.c @@ -1943,6 +1943,30 @@ static int lpuart_suspend(struct device *dev) } uart_suspend_port(&lpuart_reg, &sport->port); + + if (sport->lpuart_dma_rx_use) { + /* + * EDMA driver during suspend will forcefully release any + * non-idle DMA channels. If port wakeup is enabled or if port + * is console port or 'no_console_suspend' is set the Rx DMA + * cannot resume as as expected, hence gracefully release the + * Rx DMA path before suspend and start Rx DMA path on resume. + */ + if (sport->port.irq_wake) { + del_timer_sync(&sport->lpuart_timer); + lpuart_dma_rx_free(&sport->port); + } + + /* Disable Rx DMA to use UART port as wakeup source */ + writeb(readb(sport->port.membase + UARTCR5) & ~UARTCR5_RDMAS, + sport->port.membase + UARTCR5); + } + + if (sport->lpuart_dma_tx_use) { + sport->dma_tx_in_progress = false; + dmaengine_terminate_all(sport->dma_tx_chan); + } + if (sport->port.suspended && !sport->port.irq_wake) clk_disable_unprepare(sport->clk); @@ -1970,6 +1994,26 @@ static int lpuart_resume(struct device *dev) writeb(temp, sport->port.membase + UARTCR2); } + if (sport->lpuart_dma_rx_use) { + if (sport->port.irq_wake) { + if (!lpuart_start_rx_dma(sport)) { + sport->lpuart_dma_rx_use = true; + rx_dma_timer_init(sport); + } else { + sport->lpuart_dma_rx_use = false; + } + } + } + + if (sport->dma_tx_chan && !lpuart_dma_tx_request(&sport->port)) { + init_waitqueue_head(&sport->dma_wait); + sport->lpuart_dma_tx_use = true; + writeb(readb(sport->port.membase + UARTCR5) | + UARTCR5_TDMAS, sport->port.membase + UARTCR5); + } else { + sport->lpuart_dma_tx_use = false; + } + uart_resume_port(&lpuart_reg, &sport->port); return 0; -- 2.9.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: bhuvanchandra.dv@toradex.com (Bhuvanchandra DV) Date: Tue, 19 Jul 2016 13:13:09 +0530 Subject: [PATCH RESEND v2 7/8] tty: serial: fsl_lpuart: Update suspend/resume for DMA mode In-Reply-To: <20160719074310.16872-1-bhuvanchandra.dv@toradex.com> References: <20160719074310.16872-1-bhuvanchandra.dv@toradex.com> Message-ID: <20160719074310.16872-8-bhuvanchandra.dv@toradex.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org When DMA mode is enabled one need to make sure the DMA channels are idle before entering suspend mode especially when UART ports which are set as wakeup source and console port with no_console_suspend is set. This patch takes care of gracefully releasing DMA channels for the above two cases and start the DMA at resume. Signed-off-by: Bhuvanchandra DV --- drivers/tty/serial/fsl_lpuart.c | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c index 27687d5..134090a 100644 --- a/drivers/tty/serial/fsl_lpuart.c +++ b/drivers/tty/serial/fsl_lpuart.c @@ -1943,6 +1943,30 @@ static int lpuart_suspend(struct device *dev) } uart_suspend_port(&lpuart_reg, &sport->port); + + if (sport->lpuart_dma_rx_use) { + /* + * EDMA driver during suspend will forcefully release any + * non-idle DMA channels. If port wakeup is enabled or if port + * is console port or 'no_console_suspend' is set the Rx DMA + * cannot resume as as expected, hence gracefully release the + * Rx DMA path before suspend and start Rx DMA path on resume. + */ + if (sport->port.irq_wake) { + del_timer_sync(&sport->lpuart_timer); + lpuart_dma_rx_free(&sport->port); + } + + /* Disable Rx DMA to use UART port as wakeup source */ + writeb(readb(sport->port.membase + UARTCR5) & ~UARTCR5_RDMAS, + sport->port.membase + UARTCR5); + } + + if (sport->lpuart_dma_tx_use) { + sport->dma_tx_in_progress = false; + dmaengine_terminate_all(sport->dma_tx_chan); + } + if (sport->port.suspended && !sport->port.irq_wake) clk_disable_unprepare(sport->clk); @@ -1970,6 +1994,26 @@ static int lpuart_resume(struct device *dev) writeb(temp, sport->port.membase + UARTCR2); } + if (sport->lpuart_dma_rx_use) { + if (sport->port.irq_wake) { + if (!lpuart_start_rx_dma(sport)) { + sport->lpuart_dma_rx_use = true; + rx_dma_timer_init(sport); + } else { + sport->lpuart_dma_rx_use = false; + } + } + } + + if (sport->dma_tx_chan && !lpuart_dma_tx_request(&sport->port)) { + init_waitqueue_head(&sport->dma_wait); + sport->lpuart_dma_tx_use = true; + writeb(readb(sport->port.membase + UARTCR5) | + UARTCR5_TDMAS, sport->port.membase + UARTCR5); + } else { + sport->lpuart_dma_tx_use = false; + } + uart_resume_port(&lpuart_reg, &sport->port); return 0; -- 2.9.0