From patchwork Thu Jun 30 09:31:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aisheng Dong X-Patchwork-Id: 9207143 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 82C306075A for ; Thu, 30 Jun 2016 09:41:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 712DD2845E for ; Thu, 30 Jun 2016 09:41:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 658DB2865F; Thu, 30 Jun 2016 09:41:12 +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=-4.2 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 53DFA285C3 for ; Thu, 30 Jun 2016 09:41:10 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1bIYRf-0001j8-D5; Thu, 30 Jun 2016 09:39:39 +0000 Received: from mail-bn1bon0092.outbound.protection.outlook.com ([157.56.111.92] helo=na01-bn1-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1bIYQu-0001Af-Ct for linux-arm-kernel@lists.infradead.org; Thu, 30 Jun 2016 09:38:53 +0000 Received: from BY2PR03CA075.namprd03.prod.outlook.com (10.141.249.48) by BY2PR03MB1926.namprd03.prod.outlook.com (10.164.114.30) with Microsoft SMTP Server (TLS) id 15.1.447.15; Thu, 30 Jun 2016 09:38:29 +0000 Received: from BN1AFFO11FD036.protection.gbl (2a01:111:f400:7c10::165) by BY2PR03CA075.outlook.office365.com (2a01:111:e400:2c5d::48) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.523.12 via Frontend Transport; Thu, 30 Jun 2016 09:38:29 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none; nxp.com; dmarc=fail action=none header.from=nxp.com; nxp.com; dkim=none (message not signed) header.d=none; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BN1AFFO11FD036.mail.protection.outlook.com (10.58.52.240) with Microsoft SMTP Server (TLS) id 15.1.523.9 via Frontend Transport; Thu, 30 Jun 2016 09:38:28 +0000 Received: from shlinux2.ap.freescale.net (shlinux2.ap.freescale.net [10.192.224.44]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id u5U9cDxI010090; Thu, 30 Jun 2016 02:38:25 -0700 From: Dong Aisheng To: Subject: [PATCH V3 4/8] clk: core: support clocks which requires parents enable (part 2) Date: Thu, 30 Jun 2016 17:31:14 +0800 Message-ID: <1467279078-2330-5-git-send-email-aisheng.dong@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1467279078-2330-1-git-send-email-aisheng.dong@nxp.com> References: <1467279078-2330-1-git-send-email-aisheng.dong@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131117531086491166; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.158.2; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(7916002)(2980300002)(1110001)(1109001)(339900001)(189002)(199003)(77096005)(11100500001)(76176999)(8666005)(50986999)(50466002)(2906002)(48376002)(105606002)(4326007)(104016004)(69596002)(106466001)(19580395003)(81166006)(87936001)(5003940100001)(81156014)(2950100001)(47776003)(8936002)(2351001)(110136002)(86362001)(586003)(33646002)(6806005)(36756003)(68736007)(189998001)(229853001)(19580405001)(97736004)(356003)(92566002)(8676002)(305945005)(85426001)(7846002)(50226002)(7059030); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR03MB1926; H:az84smr01.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD036; 1:HTG/g4T3oLQPduhDKN6s0wjYRXyzYV/ByBEheEI3SDqRAff/6Wexx3r0WpOOruVlJ8EZ7HzqRn06QpVql5RGmufIoxueKE44C+6AuJkoG1AP2t01bXttPxg7dYwtti9vc9griPMaA2ON1vNtB7CI4Ulet8n4vMIWM/bHLNFl0ruwBcTlKOZHUwwzrrGR2RIiEAUVPwsKwUrU1iTgTquhVuf6eC4TIaOp7Iuvkv7wCLoEaDOlQgKnptZr6CEuqr4tfA0Haj7ZGhbhiLyFIKyzPmGhYANz3JBhEZ8KPEcanlt+CZIriW8EZDFN1IWhgHCXg2mo0o+1qp34j3l1XagRGunBpGXSwRLTkzExNQmdqn+N6NS+LA/rRtEY7WVW7qUaLw+Sb5o5nSJTsmrsTcghQv55JR5vQDdvO7eVRSwlCWCO7YmCEuNlnjHKoQ8L6+A/qfL+ZNjU7uUaVI/xFITwsw54qFuhr0D71NZIwwN/HbcuMJyNwY0gsf49UvUDkptE3bHcjwqHoZHI+5eLuJ4j4Cocr6xh0sV4PVRdGb8x5MmSkemABkssPHfsdV2y/EL2gjZ9xYwkwVygZS3JuPIldchPao1hKOxqd9qtQ6tz5I0Kum2NDAEebW1BKRj6EIrgSoall/iY4APEe4wctLFKw1zkDPnbIOy1iy87fVQJaiIEtKad1/gnVWJZ29IiAJFABEiEu7R0IkQq5fMomlNqGv2UJlVepoG0f+LoTduZCGs+N/TY1ky7Z0o25VnT+vSq MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: dc4e2d82-a163-46ec-2cbc-08d3a0ca4ab1 X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB1926; 2:wFwcseXGeV97jOoYjXatEEc6X5y7ldf6A84UChY7pYPgjoglSIQL6MX210Qjph3PWPFdAzWI3wt198lNnHneZpv+jVxzkH2cCAgW98TWb/JfoLeQSpH9KrdMhsoGXK8XEDuZngsF7o7ZbTYWGJkfAXw0DIv83cz9aM6gdzHi7W5EoApmzpfDaroqjSw9CbL3; 3:ynJDotWmhfC1tcOmWXmb2TXckpHV/rQ3sZm3sKbNdCL52puZSq22FAu7koHxB5HqiMXuf+NUvWeyHvpxswR4nSK1mGbfxD3Tf65iDo2oQ4cYbO0PnvTvBtRV2gGPCADLAvvPadtq2SW5Jr8iEKIbPGLTWzQTqNqiG1yPDlRkKKW+U63OCj7Aw43CgyUfRijJ0FttoBKVHoNGd9d8ou2TanWJnGFsNm1JEK6ZCGoxpwE= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR03MB1926; X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB1926; 25:+Jm6Kc23JDUPJBBqg8eb82X1vTQ0WHrRvt8jYacmgQ346A6KG79dc4ZxUKyuORuWo5ewTIB6DjHrAP/bn5FtCwtrPTHnSmje0DBMQ0vT5peY9C7VhHKTThM3+AV6kzCubCZLz6O1iKv9kbdh9OCONQKj3krZcAFHozGn7Mcks+Bj04nGPPVduLc7GVQ8OuaDLL7Q4XbIEqCj0ohQpjHni0ukqjRT1CaCleJy1sniJRfrkA8r9X0Mz6vnGfWRIGDGLnVAllPmFIaZTxoZmnjbOMouY0ZMDS1DEawyImVhMHABAoA+kdpAks3CQ8UZstDUEHY+SjJzq9yvCb/04LpH/ngkPJvi52K0wbSakALW/cr9Hu6JSrj4jybZp6AcCp9l/5n8gU8erAV6RrcjhnNLFb7d+2RJyUgcjBrzMFLjMtZ92SZfe8DQxeSPj/0IEIJER/yxRCb6Z2lAvTaWVbSH0LH/ez7YE3cH9nD6p63XC2ab0NQkZBDYmWwM6ZArsU2/uKpBKvtCGOy15uhsqWqYXohBl/Q/aIxdo5dvLTyFRBv9iJg16MigmNt72Mx8F+qPr3n9bVNZQR4xV7vkm5OrWw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(5005006)(8121501046)(13015025)(13018025)(13017025)(13024025)(13023025)(10201501046)(3002001)(6055026); SRVR:BY2PR03MB1926; BCL:0; PCL:0; RULEID:(400006); SRVR:BY2PR03MB1926; X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB1926; 4:Ljir488DbVm3v40V1WZoLcXPc7Vkws7zCGPaYWqULLIYroJtmodUSUDueI7Ivmr3fK/wSdqZSF8xrgZbFMANjbxpD7/7V1qgAzIrynhIuvdQUoOL3zko3yw7f6z9dNegjp0tgSUXK+7xXUwS5+XDG99FNfj0bi5B4eIyolo96bwavE+D/xXNuxcDKkA1D434jfHe1A2xaTtKJs8oVpKWtIG26VSWn7B0Ak6K09tGcHpEJa11ycUAsVMTZSSKAUrp2VXKYZUQBSIa1tDzJARFP6VrTcYR+aNwVeukqfRJgPVDXGBmb6Ok1pjrvT/Tu9nupn4RTlyDBd2eBHMKgElPbf6JyGsT3w+sjjxup+rlGRR7Sn5LyXnI+n/Rma9hGf3uA4guVGMjdWo7le7I+uirPuCVRbqS6oJYc2aSr8FKjDb6u8HzpVMAnEtdehpuHN9UdxGh3NUhTbdIDCBbfhzry47td+dwb6t2ROdZasAPS6heH94NS1chLn5hrywTgZoYc37Xz4qwQjhKfvkUQ6D3Xw== X-Forefront-PRVS: 0989A7979C X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR03MB1926; 23:i9S8pgA/3PltpbtFTj01c+bZtARkuLgq5eMLm079M?= =?us-ascii?Q?L5PqYYHAPIfrKeuLvYNNcWN7kIEyqxYh9LCU0o14ReoVLLhuIeP1NVG9xPmN?= =?us-ascii?Q?CZHKceEj6nMwDZuTiMT21jlev17hATzniBVaT9YKP7E/jbm8MyrqsTiQwya1?= =?us-ascii?Q?6RSXTEAa7r7aIg4NCOmeY2/cfJ9qFnTlzOcm5KYlSs883dYP/0s3tpqX8QW0?= =?us-ascii?Q?JxeeFw5ArqZ6GlEvbMTymrVLyNooL/JLZ+enpJA41JDE5kVXQ076jOTbPlSg?= =?us-ascii?Q?HtlDsjolUH79fBL+IV25niAyTgF8kSnGVviItjL+zfcbhmy4hN6FdlKtIuOX?= =?us-ascii?Q?lhislZhH54n1QXnioD882n7fHp9BYDfEh9QGmO3ptLHUx3A1vbKiCtRaLLCT?= =?us-ascii?Q?pDedI/6wuQd+g0UPjnjjkL8+iczp8DwvvVFxKVvDHIKPAn+X7Xma4KeXNf2G?= =?us-ascii?Q?lS8C/o1ePwkNiiG9uP93Er2YqCaRhtLdVX615fRY/O+ErBy+E7r1/krnXHtg?= =?us-ascii?Q?8xiMbFh9EgRXUyY0hd2gwpxDdMc4X+3pwAQsdztMryzeAWF5KYUw43EWSXl6?= =?us-ascii?Q?4ohmoGlsWeEFkhwQ7lKNBJh9EFwG86MM2bwDP9+uUcE14zBPS0/bPQ/oCvdJ?= =?us-ascii?Q?Leeqypj/Y91q3tIqDWtpO0I7MmCnGJW+l1hoBfMtvZZKpvHzEA0qKWErS6A2?= =?us-ascii?Q?lFH5vj6IoKqiNDhwhAyRIzsyes6EjKC+2oEJbbiz8W3ITeA+8UB9W4JDz/kY?= =?us-ascii?Q?8XQKtM8tba7/5JZ8b9fpayCm7eM0JR0fzRssv9E2hUhKCyvFcU3egPZoh1pw?= =?us-ascii?Q?0F831S3wcQnT+iaTuWJDSaeDyFMLR9Ly+AwYNsDhtaKXw8Sy5R5TEMlrChn3?= =?us-ascii?Q?wJK2fmcRBgYSuW5arBRsUonckAQTwOK4x3bkG9qpS2f0RQRFI5MUjRGkuGJm?= =?us-ascii?Q?Nkp/YMvAo/M/OXEMvRHB+wFXEtreQhS8Q+dxv3V+6G5vSnZ6drITgep1ewEe?= =?us-ascii?Q?TiK+Fwvy5uWx2pmkeDY/pI7sg2HGyO/EH2mC4au6MeIgDaiTfw71k51LzHwu?= =?us-ascii?Q?i/iEaXxvYznRXwjWpM+0jBxHJYU7afoOtMxqlYk8xtHjDSuwk9M5TJizXCmi?= =?us-ascii?Q?3DxDzSzQBwMNXBrSt1o0W08Uur4TYOv1Hj4d3ooccZlP5Jz5DpP3EMo9Fu2b?= =?us-ascii?Q?rhFujwLgHWuZhaaMurd5e9SVFwfQr+lUYY0?= X-Microsoft-Exchange-Diagnostics: 1; BY2PR03MB1926; 5:JCSdYOOSCmDUmGmDBeTncfObdnx40J5WrE0sV4H5L2iVUO+GHKWvF38f3SirgoJEes9wB0AbscBSvVzJ+V2wfQaBZk2StzLEChHESJevP73/9uPdki+11+gt52DJdAdQxdDWVZE5k4gkVtCinrT6ilV2a1z0lYJ8smo2zHsk4wE=; 24:Ldl/t4qFDwLfOKo6eliPV9eq6W56ISz5PE2yw3NTy9HdMSdv3psXTin0JLu51V4yU3UfGI4s9RJ442oUfxyYMZo1mSeoUcXAlC9mQu4v7hM= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 Jun 2016 09:38:28.3995 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR03MB1926 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160630_023852_760744_773A481D X-CRM114-Status: GOOD ( 14.94 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: aisheng.dong@nxp.com, anson.huang@nxp.com, mturquette@baylibre.com, sboyd@codeaurora.org, linux-kernel@vger.kernel.org, shawnguo@kernel.org, linux-arm-kernel@lists.infradead.org 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 On Freescale i.MX7D platform, all clocks operations, including enable/disable, rate change and re-parent, requires its parent clock on. Current clock core can not support it well. This patch adding flag CLK_OPS_PARENT_ENABLE to handle this special case in clock core that enable its parent clock firstly for each operation and disable it later after operation complete. The patch part 2 fixes set clock rate and set parent while its parent is off. The most special case is for set_parent() operation which requires all parents including both old and new one to be enabled at the same time during the operation. Cc: Michael Turquette Cc: Stephen Boyd Cc: Shawn Guo Signed-off-by: Dong Aisheng --- drivers/clk/clk.c | 48 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index e3bd28c9ef28..9bac36a5fdb3 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -1172,7 +1172,9 @@ static struct clk_core *__clk_set_parent_before(struct clk_core *core, struct clk_core *old_parent = core->parent; /* - * Migrate prepare state between parents and prevent race with + * 1. enable parents for CLK_OPS_PARENT_ENABLE clock + * + * 2. Migrate prepare state between parents and prevent race with * clk_enable(). * * If the clock is not prepared, then a race with @@ -1188,12 +1190,17 @@ static struct clk_core *__clk_set_parent_before(struct clk_core *core, * * See also: Comment for clk_set_parent() below. */ + + /* enable old_parent & parent if CLK_OPS_PARENT_ENABLE is set */ + if (core->flags & CLK_OPS_PARENT_ENABLE) { + clk_core_prepare_enable(old_parent); + clk_core_prepare_enable(parent); + } + + /* migrate prepare count if > 0 */ if (core->prepare_count) { - clk_core_prepare(parent); - flags = clk_enable_lock(); - clk_core_enable(parent); - clk_core_enable(core); - clk_enable_unlock(flags); + clk_core_prepare_enable(parent); + clk_core_enable_lock(core); } /* update the clk tree topology */ @@ -1208,18 +1215,19 @@ static void __clk_set_parent_after(struct clk_core *core, struct clk_core *parent, struct clk_core *old_parent) { - unsigned long flags; - /* * Finish the migration of prepare state and undo the changes done * for preventing a race with clk_enable(). */ if (core->prepare_count) { - flags = clk_enable_lock(); - clk_core_disable(core); - clk_core_disable(old_parent); - clk_enable_unlock(flags); - clk_core_unprepare(old_parent); + clk_core_disable_lock(core); + clk_core_disable_unprepare(old_parent); + } + + /* re-balance ref counting if CLK_OPS_PARENT_ENABLE is set */ + if (core->flags & CLK_OPS_PARENT_ENABLE) { + clk_core_disable_unprepare(parent); + clk_core_disable_unprepare(old_parent); } } @@ -1466,13 +1474,17 @@ static void clk_change_rate(struct clk_core *core) unsigned long best_parent_rate = 0; bool skip_set_rate = false; struct clk_core *old_parent; + struct clk_core *parent = NULL; old_rate = core->rate; - if (core->new_parent) + if (core->new_parent) { + parent = core->new_parent; best_parent_rate = core->new_parent->rate; - else if (core->parent) + } else if (core->parent) { + parent = core->parent; best_parent_rate = core->parent->rate; + } if (core->flags & CLK_SET_RATE_UNGATE) { unsigned long flags; @@ -1502,6 +1514,9 @@ static void clk_change_rate(struct clk_core *core) trace_clk_set_rate(core, core->new_rate); + if (core->flags & CLK_OPS_PARENT_ENABLE) + clk_core_prepare_enable(parent); + if (!skip_set_rate && core->ops->set_rate) core->ops->set_rate(core->hw, core->new_rate, best_parent_rate); @@ -1518,6 +1533,9 @@ static void clk_change_rate(struct clk_core *core) clk_core_unprepare(core); } + if (core->flags & CLK_OPS_PARENT_ENABLE) + clk_core_disable_unprepare(parent); + if (core->notifier_count && old_rate != core->rate) __clk_notify(core, POST_RATE_CHANGE, old_rate, core->rate);