From patchwork Mon Jan 14 18:16:40 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Warren X-Patchwork-Id: 1973221 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) by patchwork1.kernel.org (Postfix) with ESMTP id 959AE3FD86 for ; Mon, 14 Jan 2013 18:19:31 +0000 (UTC) Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.76 #1 (Red Hat Linux)) id 1Tuoaa-0000MO-0z; Mon, 14 Jan 2013 18:16:52 +0000 Received: from avon.wwwdotorg.org ([2001:470:1f0f:bd7::2]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1TuoaW-0000LO-G6 for linux-arm-kernel@lists.infradead.org; Mon, 14 Jan 2013 18:16:48 +0000 Received: from severn.wwwdotorg.org (unknown [192.168.65.5]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by avon.wwwdotorg.org (Postfix) with ESMTPS id 19E396305; Mon, 14 Jan 2013 11:18:18 -0700 (MST) Received: from swarren-lx1.nvidia.com (localhost [127.0.0.1]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by severn.wwwdotorg.org (Postfix) with ESMTPSA id A7434E479F; Mon, 14 Jan 2013 11:16:45 -0700 (MST) From: Stephen Warren To: mturquette@linaro.org Subject: [PATCH] clk: tegra: ensure all provided clock values are valid cookies Date: Mon, 14 Jan 2013 11:16:40 -0700 Message-Id: <1358187400-6824-1-git-send-email-swarren@wwwdotorg.org> X-Mailer: git-send-email 1.7.10.4 X-NVConfidentiality: public X-Virus-Scanned: clamav-milter 0.96.5 at avon.wwwdotorg.org X-Virus-Status: Clean X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20130114_131648_687629_F628AEEB X-CRM114-Status: GOOD ( 12.07 ) X-Spam-Score: -2.6 (--) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-2.6 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 SPF_PASS SPF: sender matches SPF record -0.7 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: linux-tegra@vger.kernel.org, Stephen Warren , Prashant Gaikwad , Laxman Dewangan , linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linux-arm-kernel-bounces@lists.infradead.org Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org From: Stephen Warren Tegra's clock implementation uses pointers as the clock cookies, and hence chooses to make NULL an invalid clock cookie. However, there are gaps in the assigned device tree clock IDs, and hence the array mapping DT clock ID contains entries with NULL values (uninitialized BSS) unless explicit action is taken. This patch enhances the Tegra clock code to detect this case and explicitly initialize those lookup table entries to an error value. This prevents clk_get() from ever returning NULL. Hence, Tegra's clock APIs don't have to check the clock cookie they're passed for NULL. Signed-off-by: Stephen Warren --- Mike, this also will need to go through the Tegra tree; just looking for any review/ack from you. Thanks. drivers/clk/tegra/clk-tegra20.c | 5 ++++- drivers/clk/tegra/clk-tegra30.c | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/clk/tegra/clk-tegra20.c b/drivers/clk/tegra/clk-tegra20.c index 5847b5e..e59ac14 100644 --- a/drivers/clk/tegra/clk-tegra20.c +++ b/drivers/clk/tegra/clk-tegra20.c @@ -1243,12 +1243,15 @@ void __init tegra20_clock_init(struct device_node *np) tegra20_audio_clk_init(); - for (i = 0; i < ARRAY_SIZE(clks); i++) + for (i = 0; i < ARRAY_SIZE(clks); i++) { if (IS_ERR(clks[i])) { pr_err("Tegra20 clk %d: register failed with %ld\n", i, PTR_ERR(clks[i])); BUG(); } + if (!clks[i]) + clks[i] = ERR_PTR(-EINVAL); + } tegra_init_dup_clks(tegra_clk_duplicates, clks, clk_max); diff --git a/drivers/clk/tegra/clk-tegra30.c b/drivers/clk/tegra/clk-tegra30.c index 987312c..9c0b2ee 100644 --- a/drivers/clk/tegra/clk-tegra30.c +++ b/drivers/clk/tegra/clk-tegra30.c @@ -2022,12 +2022,15 @@ void __init tegra30_clock_init(struct device_node *np) tegra30_audio_clk_init(); tegra30_pmc_clk_init(); - for (i = 0; i < ARRAY_SIZE(clks); i++) + for (i = 0; i < ARRAY_SIZE(clks); i++) { if (IS_ERR(clks[i])) { pr_err("Tegra30 clk %d: register failed with %ld\n", i, PTR_ERR(clks[i])); BUG(); } + if (!clks[i]) + clks[i] = ERR_PTR(-EINVAL); + } tegra_init_dup_clks(tegra_clk_duplicates, clks, clk_max);