From patchwork Fri May 30 16:32:42 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Anderson X-Patchwork-Id: 4272291 Return-Path: X-Original-To: patchwork-linux-samsung-soc@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 311419F30B for ; Fri, 30 May 2014 16:32:56 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 446AC20395 for ; Fri, 30 May 2014 16:32:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 54A5A20397 for ; Fri, 30 May 2014 16:32:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933399AbaE3Qcx (ORCPT ); Fri, 30 May 2014 12:32:53 -0400 Received: from mail-oa0-f73.google.com ([209.85.219.73]:61586 "EHLO mail-oa0-f73.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933148AbaE3Qcx (ORCPT ); Fri, 30 May 2014 12:32:53 -0400 Received: by mail-oa0-f73.google.com with SMTP id g18so418990oah.4 for ; Fri, 30 May 2014 09:32:52 -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:in-reply-to :references; bh=87Ln5vtCz7Jsg0H1+yCViPtE+CHyzGE1QNIPGfmLD9U=; b=HPNpEJBO7zMFDzL7wmqbLP1jv/3TmiRGMR619zTL5jnapK8NvPfiRvwfWWN0C44pCX ymiCVQolF/+xqp1SYx/+hPcp9PufKrngjtg6m3VIxsCCHW4BJZU2+fypJVTkGeRIjn8J Dx8PACQJKFHwOs1c4OgQniFF1bNxQuSAbjNG0SW9XHmlQLbcpUaDTThVTsQ2l8JbrPFI cMOpSeA4aOWV/7Fjjl+kXUkhhRZNrJS4GJ8liQozswOIK4mESgdd4P/ZI56Onpo1Iyj3 q4Fa2vpyIjZkB17/3dqSL2rb5RPk/KjtwhJjRhZHwz16WimOL1uBUCxq9Bb5pjKdRc46 b+Uw== X-Gm-Message-State: ALoCoQk3JK90cgUUbCRnbtMFhia/RKtq64S637nJUx2D+LNjE4Pk+cYSG6bFnKDkS8v4mOIXPi4O X-Received: by 10.182.204.10 with SMTP id ku10mr361015obc.7.1401467572470; Fri, 30 May 2014 09:32:52 -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 i65si311044yhg.2.2014.05.30.09.32.52 for (version=TLSv1.1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 30 May 2014 09:32:52 -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 2D2495A4491; Fri, 30 May 2014 09:32:52 -0700 (PDT) Received: by tictac.mtv.corp.google.com (Postfix, from userid 121310) id C63688080B; Fri, 30 May 2014 09:32:51 -0700 (PDT) From: Doug Anderson To: Tomasz Figa , Mike Turquette , Kukjin Kim Cc: olof@lixom.net, javier.martinez@collabora.co.uk, Doug Anderson , linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v2] clk: exynos5420: Keep aclk66_peric enabled during boot Date: Fri, 30 May 2014 09:32:42 -0700 Message-Id: <1401467562-5585-1-git-send-email-dianders@chromium.org> X-Mailer: git-send-email 1.9.1.423.g4596e3a In-Reply-To: <1401398496-4624-1-git-send-email-dianders@chromium.org> References: <1401398496-4624-1-git-send-email-dianders@chromium.org> Sender: linux-samsung-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham 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 --- Changes in v2: - Use GATE_A and clk_get(). Save the clock for putting later. - Return 0 from exynos5420_clk_late_init(). drivers/clk/samsung/clk-exynos5420.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/drivers/clk/samsung/clk-exynos5420.c b/drivers/clk/samsung/clk-exynos5420.c index 9d7d7ee..70b607a 100644 --- a/drivers/clk/samsung/clk-exynos5420.c +++ b/drivers/clk/samsung/clk-exynos5420.c @@ -890,8 +890,8 @@ static struct samsung_gate_clock exynos5x_gate_clks[] __initdata = { GATE_BUS_TOP, 9, CLK_IGNORE_UNUSED, 0), GATE(0, "aclk66_psgen", "mout_user_aclk66_psgen", GATE_BUS_TOP, 10, CLK_IGNORE_UNUSED, 0), - GATE(CLK_ACLK66_PERIC, "aclk66_peric", "mout_user_aclk66_peric", - GATE_BUS_TOP, 11, CLK_IGNORE_UNUSED, 0), + GATE_A(CLK_ACLK66_PERIC, "aclk66_peric", "mout_user_aclk66_peric", + GATE_BUS_TOP, 11, CLK_IGNORE_UNUSED, 0, "aclk66_peric"), GATE(0, "aclk266_isp", "mout_user_aclk266_isp", GATE_BUS_TOP, 13, 0, 0), GATE(0, "aclk166", "mout_user_aclk166", @@ -1172,11 +1172,22 @@ static struct of_device_id ext_clk_match[] __initdata = { { }, }; +/* Keep these clocks on until late_initcall */ +struct boot_clock { + char *name; + struct clk *clk; +}; + +static struct boot_clock boot_clocks[] __initdata = { + { .name = "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 +1237,11 @@ static void __init exynos5x_clk_init(struct device_node *np, } exynos5420_clk_sleep_init(); + + for (i = 0; i < ARRAY_SIZE(boot_clocks); i++) { + boot_clocks[i].clk = clk_get(NULL, boot_clocks[i].name); + clk_prepare_enable(boot_clocks[i].clk); + } } static void __init exynos5420_clk_init(struct device_node *np) @@ -1239,3 +1255,16 @@ 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++) { + clk_disable_unprepare(boot_clocks[i].clk); + clk_put(boot_clocks[i].clk); + } + + return 0; +} +late_initcall(exynos5420_clk_late_init);