From patchwork Thu May 29 21:21:36 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Anderson X-Patchwork-Id: 4267391 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 1C55F9F1D6 for ; Thu, 29 May 2014 21:25:59 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 4417F201F2 for ; Thu, 29 May 2014 21:25:58 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7222A2016C for ; Thu, 29 May 2014 21:25:57 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wq7ml-0001oS-FN; Thu, 29 May 2014 21:22:51 +0000 Received: from mail-ie0-f202.google.com ([209.85.223.202]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wq7mj-0001lx-JE for linux-arm-kernel@lists.infradead.org; Thu, 29 May 2014 21:22:50 +0000 Received: by mail-ie0-f202.google.com with SMTP id rd18so204708iec.3 for ; Thu, 29 May 2014 14:22:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=aqw/3ZRgAXLNKR6DQURtbejmHEt7N3agRHr20kHhriw=; b=WChWqBY+49hPETJfarlkk/Lnu5cjdfWCqI4WbMVRxIRRduDQewAHftmrhewlZhbuNI lUgUdBcF7Owm3MbGS4e5ba/1TsCBW/3rvT616cZ6U4v32Ov8atxTLzSqESKslieCobKi R7eEyaC3R1C0M+VkmDX8F2lfNhg9xXaFDX4o+V+XAaBU3akXUpzReQoPsFJ+ePkEC+u6 TrPQFhB/b2gJcN2oSMvZGOkrp0mzaWr29tZwdrMzWq1Rs1kulE950YlqSqnxwmB+3srI 19lkRr2JAlWCcpL7MwIIrfbeK/vkA28Xpvi3yVzQ3ggT19quos6J5Sx+wz1EoEjtpTun CO8Q== X-Gm-Message-State: ALoCoQkXa/+pP+Xx/IFzKByhuhkr632j04w5ZEEDVa4vzghwWi4qaxBGxmlaJUO2bsWF5h/UIHDR X-Received: by 10.182.20.17 with SMTP id j17mr4424311obe.24.1401398547900; Thu, 29 May 2014 14:22:27 -0700 (PDT) Received: from corp2gmr1-2.hot.corp.google.com (corp2gmr1-2.hot.corp.google.com [172.24.189.93]) by gmr-mx.google.com with ESMTPS id h13si139622yhj.0.2014.05.29.14.22.27 for (version=TLSv1.1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 29 May 2014 14:22:27 -0700 (PDT) Received: from tictac.mtv.corp.google.com (tictac.mtv.corp.google.com [172.22.72.141]) by corp2gmr1-2.hot.corp.google.com (Postfix) with ESMTP id BB67B5A43B3; Thu, 29 May 2014 14:22:27 -0700 (PDT) Received: by tictac.mtv.corp.google.com (Postfix, from userid 121310) id 5D635808F7; Thu, 29 May 2014 14:22:27 -0700 (PDT) From: Doug Anderson To: Tomasz Figa , Mike Turquette , Kukjin Kim Subject: [PATCH] clk: exynos5420: Keep aclk66_peric enabled during boot Date: Thu, 29 May 2014 14:21:36 -0700 Message-Id: <1401398496-4624-1-git-send-email-dianders@chromium.org> X-Mailer: git-send-email 1.9.1.423.g4596e3a X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20140529_142249_666051_93F63E9C X-CRM114-Status: GOOD ( 15.20 ) X-Spam-Score: -1.4 (-) Cc: linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Anderson , olof@lixom.net, javier.martinez@collabora.co.uk, linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-2.5 required=5.0 tests=BAYES_00,RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Right now if you've got earlyprintk enabled on exynos5420-peach-pit then you'll get a hang on boot. Here's why: 1. The i2c-s3c2410 driver will probe at subsys_initcall. It will enable its clock and disable it. This is the clock "i2c2". 2. The act of disabling "i2c2" will disable its parents. In this case the parent is "aclk66_peric". There are no other children of "aclk66_peric" officially enabled, so "aclk66_peric" will be turned off (despite being CLK_IGNORE_UNUSED, but that's by design). 3. The next time you try to earlyprintk you'll do so without the UART clock enabled. That's because the UART clocks are also children of "aclk66_peric". You'll hang. There's no good place to put a clock enable for earlyprintk, which is handled by a bunch of assembly code. The best we can do is to handle this in the clock driver. Signed-off-by: Doug Anderson Tested-by: Javier Martinez Canillas --- drivers/clk/samsung/clk-exynos5420.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/drivers/clk/samsung/clk-exynos5420.c b/drivers/clk/samsung/clk-exynos5420.c index 9d7d7ee..1e586be 100644 --- a/drivers/clk/samsung/clk-exynos5420.c +++ b/drivers/clk/samsung/clk-exynos5420.c @@ -1172,11 +1172,17 @@ static struct of_device_id ext_clk_match[] __initdata = { { }, }; +/* Keep these clocks on until late_initcall */ +static const char *boot_clocks[] __initconst = { + "aclk66_peric", +}; + /* register exynos5420 clocks */ static void __init exynos5x_clk_init(struct device_node *np, enum exynos5x_soc soc) { struct samsung_clk_provider *ctx; + int i; if (np) { reg_base = of_iomap(np, 0); @@ -1226,6 +1232,12 @@ static void __init exynos5x_clk_init(struct device_node *np, } exynos5420_clk_sleep_init(); + + for (i = 0; i < ARRAY_SIZE(boot_clocks); i++) { + struct clk *to_enable = __clk_lookup(boot_clocks[i]); + + clk_prepare_enable(to_enable); + } } static void __init exynos5420_clk_init(struct device_node *np) @@ -1239,3 +1251,15 @@ static void __init exynos5800_clk_init(struct device_node *np) exynos5x_clk_init(np, EXYNOS5800); } CLK_OF_DECLARE(exynos5800_clk, "samsung,exynos5800-clock", exynos5800_clk_init); + +static int __init exynos5420_clk_late_init(void) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(boot_clocks); i++) { + struct clk *to_disable = __clk_lookup(boot_clocks[i]); + + clk_disable_unprepare(to_disable); + } +} +late_initcall(exynos5420_clk_late_init);