From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932627AbcFIP1A (ORCPT ); Thu, 9 Jun 2016 11:27:00 -0400 Received: from mail-am1on0136.outbound.protection.outlook.com ([157.56.112.136]:27424 "EHLO emea01-am1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932073AbcFIP06 (ORCPT ); Thu, 9 Jun 2016 11:26:58 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=bhuvanchandra.dv@toradex.com; From: Bhuvanchandra DV To: CC: , , , , , , , , , Subject: [PATCH 2/8] tty: serial: fsl_lpuart: support suspend/resume Date: Thu, 9 Jun 2016 20:40:33 +0530 Message-ID: <20160609151039.20817-3-bhuvanchandra.dv@toradex.com> X-Mailer: git-send-email 2.8.3 In-Reply-To: <20160609151039.20817-1-bhuvanchandra.dv@toradex.com> References: <20160609151039.20817-1-bhuvanchandra.dv@toradex.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [115.115.243.34] X-ClientProxiedBy: SIXPR04CA0050.apcprd04.prod.outlook.com (10.162.171.40) To DB4PR05MB270.eurprd05.prod.outlook.com (10.242.158.24) X-MS-Office365-Filtering-Correlation-Id: 2aae4f53-8820-4019-30bf-08d390784f46 X-Microsoft-Exchange-Diagnostics: 1;DB4PR05MB270;2:EjOgfJuxSDUStGFyCVhUuix9jdM7Acm0XVsdsyVWUCFNcDv82z8enPeJDk4mOC+Z3Y/zHSc4ZKSiHg0LD+vVdRdcuGUKZtFHJRoGcz0rxviUvRe5l0IZzHfNljuuKp93TUGvK1G4pgyYsDFFlhX31fkLcsEruPtlwqW+xZGt2rPKQoWpaP9ThHYIM12LHMuT;3:73U/Lw1M3EhV0XTVrbNG5t7AS1Ajz9Q5dxWY8RtIAa3jh8/i+NCNyj1nD2Rd9egubl6zXYBOOVUBtCYiek/sVaN10ZtFYUXFafBh3HXDxDI48QZ9Qb4m9Xt13VWWqQyu X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DB4PR05MB270; X-Microsoft-Exchange-Diagnostics: 1;DB4PR05MB270;25:5LmGJAOscgqsaR6P3i6ORshyasWz/9GpjjOS3JpeC2M4oHa1w9bJvJpLJA0DD6tGIKFRGC2rPL2ORJrHeq93M1BmnGpyml2dlKQ4x4gO9hr/fAJHcIysAWcsAq3HqLFpDf55vmhjBi8MeEDg8Xvd/o6knOc9fg0RAxbpurxPQNqlEtMQCyZygAwv6wLkwOl82evJhcKMteT/mgPnTJPB5CfgGGltdNCnev+ZTHuSgJcE64E2HHbuKPIN6PEA4lGXYmUmbUrnO0OgHaO78AW9PPU0fNTDFIOCQiwsP9yqMVN8TjDudB9IhZeJ2GAZUlcnmubQu8BQSgIK8ZCIkAv700PYqm0EyTk7X6OWitkBPfI8od0AJDixQwaAE4Rhy7KGhdKwGdA71a1cOelhKrA2ixIlHwj0YVJpI3FVFdiD4qK+RzM4lbs9P6tDlMy8tKkIL4zOh3T9sInGA1ydVtFNX2IgpZGd3GZVkXzEJjAj8GDRVcjOs7DTwtBKuTvkkWAP6Hwr5wz7sQL/AS0kqvYEu9lHalnbnPs5AA3AU3tl17U6rYjnsRcV2cCuQl08Vp6zW5ptywGEbYFqI6M4jQzwmNPW+iSvUD/2FPBW1l9Xft8tE4BDwUsEqyM2E3rrZ245ZDcQtYY++GGJ7sup3G/RJOE2nrKt78PX+sP/QlQFf1+XEifmpTyDpKcGl3klfHe37Zx6kKUU45Yai9lcL3U2mYT+tvPEkhlOTo467J6cGbmlVcVVSWyHAK5Ba1tT48jd X-Microsoft-Exchange-Diagnostics: 1;DB4PR05MB270;20:hUtGBWFL+BJbpsS00OwmlbC7adH4C4zKP5CjLHeomTbSmZ1N0OnxYlWKQAs8d7naRY412WK8uZw07EN7CgQJJIo5dZntLg+U6NGK3a1k6nM0DGofCaiICzsjhPrMKDYgcDkTCMnXdf6HReXTLF6FGq8gx7LSv0N1DmxeQlEoUG09kGkG4MfSgkujc8M/iHf/I2Gz8BeIs+PLqeqeg5RO1zlGeZJrA7dSPi6Wm75j/5dvkWHlyVmTp63xA8KHi2KdqIjQqPyuQ/RHy8fwc2Ht+bPfstzAbUjF6YaY+F2p/SFwBAkF6WrQkSZQsnkLcnlZIuXobGFTkKI4A8pLhcJaQA==;4:B+Fkp/mWMrr8q0MgPD+5Y8iXzhSyEzqy2gegaOTIrnpWVd17N9bIyu9WKt3l5NK05Xjhun12A9mqKi2t4oelAFIQEdTUn7VUz1U9jdIXqX0fdjrhwaCweAxRlm1ofWFjHYPSV+8DbSoW5AcKoNJ48w92XzYNDs00tpt0AkwUT5lMTseZ1pye6G0d7LW7OXbcnwM3znp9waolxTh57NsJKNW2/D1bxU+tBN96X8SJnp5VLMwN3Q7CuwHcLsYY3Dhu9YajJaBD1LeQKRzq2pWE/jULxvEaps79qVU5GHN4o8DIYTRJEcSsZb2y6e+GddVndjKbICogsjCqA1yukSi0hL8qNwqs1KV+LPuKZrP3E05qUqwVBxWZD0WsPlFeeitw 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:DB4PR05MB270;BCL:0;PCL:0;RULEID:;SRVR:DB4PR05MB270; X-Forefront-PRVS: 0968D37274 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(189002)(199003)(36756003)(50466002)(42186005)(1076002)(86362001)(19580395003)(69596002)(48376002)(5008740100001)(81156014)(19580405001)(97736004)(4326007)(2906002)(77096005)(101416001)(81166006)(50226002)(2950100001)(33646002)(6116002)(68736007)(2351001)(3846002)(5003940100001)(105586002)(110136002)(106356001)(53416004)(229853001)(50986999)(8676002)(189998001)(92566002)(5004730100002)(15650500001)(66066001)(586003)(76176999)(47776003);DIR:OUT;SFP:1102;SCL:1;SRVR:DB4PR05MB270;H:tdx-in-nb-0014.toradex.ext;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;DB4PR05MB270;23:JEK0TFY1yQj3/3pLuGS8FOwOnFhiyt+B5byJ2HYDzj?= =?us-ascii?Q?+2FfCMsyZjDJDIrc/NdLeIqzOV/057qFvTsDtOCsOMLOCyy/0NjJCcsLB39L?= =?us-ascii?Q?cyvnR3XZkctaGlT0QFj4b9m8qCx434KFngiMRYjKYrKazb3mmwSMi6S7qrsZ?= =?us-ascii?Q?4hSBPGuY0ghTq4beaS1d5hwcRSmJfjWVLmax8zAdezHj/c45HZj7tqPhnVnB?= =?us-ascii?Q?7C38SsDxP9v9e5tOJ4xBlzAHdJk1jnqBSdyqlgyubstNxOq+KEYI3U94zlAx?= =?us-ascii?Q?IFf0EruDCnoe12gpfM1ausMMPNdK0UAjlWtF78PxTXV+7vN9U/yuUTCdHdBR?= =?us-ascii?Q?sWzT3k0CubIRTarS5tFCSYTsLCDWnxTwtbqCPbuLLMB8VIbZnzYTAbDh10Ki?= =?us-ascii?Q?l4fpLJSXXWoGfx2zFho7D534zpEuwZ3hxoZmf5j4noOqF9sFeTE2KE84fXPR?= =?us-ascii?Q?VRcHxpP5UE5AKrFUyFz0DG9Scvh8sSWGhzL4mX5jaCcLlARoZenU82S2Ubt1?= =?us-ascii?Q?kxqv/QWSiSj1Oy5n1VAUTM1VFhUhBlGIWJsB9UjOxhriB/dZURLfmz3mB4iy?= =?us-ascii?Q?19OG1tCrSxqfM+BNoWelU6jP0FPnnlvyT7OQIXQj/jtPzq9wuESW01Kc0Gyi?= =?us-ascii?Q?fG2s+788TvcenafYp/Zlf4Rh9q6VcTt2hupU+7vRz/vfEiJLhROKvdf+9+nK?= =?us-ascii?Q?Jim0C6MDBrAgj+WwQD0RqQr+duFxBxWRC3FlPHo8imNiym38Q34L/jBR70y6?= =?us-ascii?Q?oz9nRkkrBhnUD8oAsZLLR88BvBBH4XQJsh89TUwrpm0JTaM0zxWJp7wnnN3h?= =?us-ascii?Q?MNsId7MXBZ+8SOAVF51NWaxGIbYGZ+5NDhZfSGpbTCIzoy/u4HGmUlisFhAM?= =?us-ascii?Q?vfONiuTpQPlZo6PTbCZRyGZpXX2VMWgl6Go7grrUvAg4fvKg/NMeO9VNDx/d?= =?us-ascii?Q?vVRyS5IFWoouX5fI4NkPMNCMj3qpTCHYzksTgF61Y8g5+fuIyuwgQ7N+zZAc?= =?us-ascii?Q?thBRP+b6F4WuUdb+NzqJ+Fu3GYm101FKOfGQj82ZPo/oCm80zRFKq5ijKCaN?= =?us-ascii?Q?V8UQRN64/wKzEIwDJ1yOgTwRb45ELJbNMpdNuAEnTiJSw66xWlSeeniDhpiq?= =?us-ascii?Q?Cz8G/BjNy/9ypv22W3neT+eJPe8CQu?= X-Microsoft-Exchange-Diagnostics: 1;DB4PR05MB270;5:AIAM6+i8+8+zd5gmgYMEchMUs79moGeAuzkjGwYj9OCzATJx0KFv40F+3mNq42uiInZsVS6nFJDUzG4WCLI3nQ5AO9e+2fighy3TGmJZS8baNsgOhrFtS24OGdw5IeVB6d/1fXgQJD+D5DnvBVQ6tw==;24:DVsVqYV1/v40xr2JXIYav+ToezQpLZLE5zwrpqWibMb9kWEhKSQiKT91L+1FmdD1eseCvSNZz516o7/eU0ywBtrG7f+6OhudDxe/AWvFV/8=;7:a2hwY5fJ5tJnY9Z6O5o5ycCNIY/w3YrdSSlY/rB1TR34gNcwQt0SW0oajsrbwvv98lb0mm197Re+33fQmuyVY2uctmaylTAmxq0y4+noG/Ua0ZP/qrFkCTB4lB6faZmK/0tEE4qR9V/qHWvTBSR5Ei/Xcq7simLMN5X3rWZfiUPi3Nx73XKIrINGi+qIESjJ7rSmxBlN56n1sNhPMZ+LkA== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: toradex.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Jun 2016 15:11:14.4377 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB4PR05MB270 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Stefan Agner In order to allow wake support in STOP sleep mode, clocks are needed. Use imx_clk_gate2_cgr to disable automatic clock gating in low power mode STOP. This allows to enable wake by UART using: echo enabled > /sys/class/tty/ttyLP0/power/wakeup However, if wake is not enabled, the driver should disable the clocks explicitly to save power. Signed-off-by: Stefan Agner --- drivers/clk/imx/clk-vf610.c | 12 ++++++------ drivers/tty/serial/fsl_lpuart.c | 16 ++++++++++++++-- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/drivers/clk/imx/clk-vf610.c b/drivers/clk/imx/clk-vf610.c index 3a1f244..0476353 100644 --- a/drivers/clk/imx/clk-vf610.c +++ b/drivers/clk/imx/clk-vf610.c @@ -315,12 +315,12 @@ static void __init vf610_clocks_init(struct device_node *ccm_node) clk[VF610_CLK_PIT] = imx_clk_gate2("pit", "ipg_bus", CCM_CCGR1, CCM_CCGRx_CGn(7)); - clk[VF610_CLK_UART0] = imx_clk_gate2("uart0", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(7)); - clk[VF610_CLK_UART1] = imx_clk_gate2("uart1", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(8)); - clk[VF610_CLK_UART2] = imx_clk_gate2("uart2", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(9)); - clk[VF610_CLK_UART3] = imx_clk_gate2("uart3", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(10)); - clk[VF610_CLK_UART4] = imx_clk_gate2("uart4", "ipg_bus", CCM_CCGR6, CCM_CCGRx_CGn(9)); - clk[VF610_CLK_UART5] = imx_clk_gate2("uart5", "ipg_bus", CCM_CCGR6, CCM_CCGRx_CGn(10)); + clk[VF610_CLK_UART0] = imx_clk_gate2_cgr("uart0", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(7), 0x2); + clk[VF610_CLK_UART1] = imx_clk_gate2_cgr("uart1", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(8), 0x2); + clk[VF610_CLK_UART2] = imx_clk_gate2_cgr("uart2", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(9), 0x2); + clk[VF610_CLK_UART3] = imx_clk_gate2_cgr("uart3", "ipg_bus", CCM_CCGR0, CCM_CCGRx_CGn(10), 0x2); + clk[VF610_CLK_UART4] = imx_clk_gate2_cgr("uart4", "ipg_bus", CCM_CCGR6, CCM_CCGRx_CGn(9), 0x2); + clk[VF610_CLK_UART5] = imx_clk_gate2_cgr("uart5", "ipg_bus", CCM_CCGR6, CCM_CCGRx_CGn(10), 0x2); clk[VF610_CLK_I2C0] = imx_clk_gate2("i2c0", "ipg_bus", CCM_CCGR4, CCM_CCGRx_CGn(6)); clk[VF610_CLK_I2C1] = imx_clk_gate2("i2c1", "ipg_bus", CCM_CCGR4, CCM_CCGRx_CGn(7)); diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c index fabfa7e..75a2098 100644 --- a/drivers/tty/serial/fsl_lpuart.c +++ b/drivers/tty/serial/fsl_lpuart.c @@ -483,9 +483,8 @@ static void lpuart_dma_rx_complete(void *arg) spin_unlock_irqrestore(&sport->port.lock, flags); } -static void lpuart_timer_func(unsigned long data) +static void lpuart_dma_rx_terminate(struct lpuart_port *sport) { - struct lpuart_port *sport = (struct lpuart_port *)data; struct tty_port *port = &sport->port.state->port; struct dma_tx_state state; unsigned long flags; @@ -510,6 +509,11 @@ static void lpuart_timer_func(unsigned long data) spin_unlock_irqrestore(&sport->port.lock, flags); } +static void lpuart_timer_func(unsigned long data) +{ + lpuart_dma_rx_terminate((struct lpuart_port *)data); +} + static inline void lpuart_prepare_rx(struct lpuart_port *sport) { unsigned long flags; @@ -1925,7 +1929,12 @@ static int lpuart_suspend(struct device *dev) writeb(temp, sport->port.membase + UARTCR2); } + if (sport->dma_rx_in_progress) + lpuart_dma_rx_terminate(sport); + uart_suspend_port(&lpuart_reg, &sport->port); + if (sport->port.suspended && !sport->port.irq_wake) + clk_disable_unprepare(sport->clk); return 0; } @@ -1935,6 +1944,9 @@ static int lpuart_resume(struct device *dev) struct lpuart_port *sport = dev_get_drvdata(dev); unsigned long temp; + if (sport->port.suspended && !sport->port.irq_wake) + clk_prepare_enable(sport->clk); + if (sport->lpuart32) { lpuart32_setup_watermark(sport); temp = lpuart32_read(sport->port.membase + UARTCTRL); -- 2.8.3