From patchwork Wed Jun 1 08:34:45 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Lezcano X-Patchwork-Id: 69000 Delivered-To: patch@linaro.org Received: by 10.140.92.199 with SMTP id b65csp2410934qge; Wed, 1 Jun 2016 02:01:17 -0700 (PDT) X-Received: by 10.98.97.71 with SMTP id v68mr6452558pfb.127.1464771677328; Wed, 01 Jun 2016 02:01:17 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id bm3si57704052pad.35.2016.06.01.02.01.16; Wed, 01 Jun 2016 02:01:17 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757885AbcFAJBN (ORCPT + 30 others); Wed, 1 Jun 2016 05:01:13 -0400 Received: from mail-wm0-f50.google.com ([74.125.82.50]:35611 "EHLO mail-wm0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757299AbcFAIff (ORCPT ); Wed, 1 Jun 2016 04:35:35 -0400 Received: by mail-wm0-f50.google.com with SMTP id a136so169895386wme.0 for ; Wed, 01 Jun 2016 01:35:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=JEsI53RXynVAZklRfeW/7dNY+Ocym5NpE44z1j2zgf8=; b=LE2wlgzr0gNr4PYjtcctKed7tJDW/QVlNBGnXkAwWnbam86uKPO+ZlqsrBcumYfswz noCUcQrn6D7N+DLEPfn9P3mtaswMUVg0F3cAEc5dqXEy0bp6En4CArSzsiBclIz8VuwD edxFrpKAN74yTKgLnD9Vd25YDSoncS4BtNw+A= 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=JEsI53RXynVAZklRfeW/7dNY+Ocym5NpE44z1j2zgf8=; b=CjhKNXW2XmdSWB3MZ6Xo5Mdzyk9e2REPlfxgPWzyAwGJMGxmM2L0MeOSAYQbXV5Acq DPpG5cku3hRFFv2GvWL3bxvo3E82kTABhEfOGDuI5LjNYpHhz9txYI6nqGRm8GROF7M2 P5xtjYbyZmD2sv+tZFeLZR+OL5q+plaEjLCDmDMr+ibsnXc2Qlbv5rEnbHcpq8Q4ZuTg r/Aa4XkhsjDzRbZmNvM6NlgFkRYn/1jgzw8WaqpxYP2/J07w8fpTe2teZAJpmeJ2kIcJ SZxPfBFYagTIJOngj5Bo8SEj4Jl6Hha2RTpMjA1mx/r9PABPDepSJyDPmj5mwGY28sBm pHeg== X-Gm-Message-State: ALyK8tIeSZRiSq2Y0bXYjkhe3/Zl4vU5Edl2mbeY2CAOHo/Ezxwttg3LhKxEptxrQAdDlHFU X-Received: by 10.28.132.144 with SMTP id g138mr15830822wmd.47.1464770133970; Wed, 01 Jun 2016 01:35:33 -0700 (PDT) Received: from localhost.localdomain (sju31-1-78-210-255-2.fbx.proxad.net. [78.210.255.2]) by smtp.gmail.com with ESMTPSA id t3sm33542865wmf.20.2016.06.01.01.35.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 01 Jun 2016 01:35:33 -0700 (PDT) From: Daniel Lezcano To: daniel.lezcano@linaro.org, tglx@linutronix.de Cc: linux-kernel@vger.kernel.org, Arnd Bergmann , John Stultz , linux-arch@vger.kernel.org (open list:GENERIC INCLUDE/A...) Subject: [PATCH 2/9] clocksource/drivers/clksrc-probe: Introduce init functions with return code Date: Wed, 1 Jun 2016 10:34:45 +0200 Message-Id: <1464770093-12667-3-git-send-email-daniel.lezcano@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1464770093-12667-1-git-send-email-daniel.lezcano@linaro.org> References: <1464770093-12667-1-git-send-email-daniel.lezcano@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently, the clksrc-probe is not able to handle any error from the init functions. There are different issues with the current code: - the code is duplicated in the init functions by writing error - every driver tends to panic in its own init function - counting the number of clocksources is not reliable This patch adds another table to store the functions returning an error. The table is temporary while we convert all the drivers to return an error and will disappear. Signed-off-by: Daniel Lezcano --- drivers/clocksource/clksrc-probe.c | 22 ++++++++++++++++++++++ include/asm-generic/vmlinux.lds.h | 2 ++ include/linux/clocksource.h | 3 +++ 3 files changed, 27 insertions(+) -- 1.9.1 diff --git a/drivers/clocksource/clksrc-probe.c b/drivers/clocksource/clksrc-probe.c index 7cb6c92..5fa6a55 100644 --- a/drivers/clocksource/clksrc-probe.c +++ b/drivers/clocksource/clksrc-probe.c @@ -20,16 +20,22 @@ #include extern struct of_device_id __clksrc_of_table[]; +extern struct of_device_id __clksrc_ret_of_table[]; static const struct of_device_id __clksrc_of_table_sentinel __used __section(__clksrc_of_table_end); +static const struct of_device_id __clksrc_ret_of_table_sentinel + __used __section(__clksrc_ret_of_table_end); + void __init clocksource_probe(void) { struct device_node *np; const struct of_device_id *match; of_init_fn_1 init_func; + of_init_fn_1_ret init_func_ret; unsigned clocksources = 0; + int ret; for_each_matching_node_and_match(np, __clksrc_of_table, &match) { if (!of_device_is_available(np)) @@ -40,6 +46,22 @@ void __init clocksource_probe(void) clocksources++; } + for_each_matching_node_and_match(np, __clksrc_ret_of_table, &match) { + if (!of_device_is_available(np)) + continue; + + init_func_ret = match->data; + + ret = init_func_ret(np); + if (ret) { + pr_err("Failed to initialize '%s': %d", + of_node_full_name(np), ret); + continue; + } + + clocksources++; + } + clocksources += acpi_probe_device_table(clksrc); if (!clocksources) diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 339125b..1c655c4 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -173,6 +173,7 @@ *(__##name##_of_table_end) #define CLKSRC_OF_TABLES() OF_TABLE(CONFIG_CLKSRC_OF, clksrc) +#define CLKSRC_RET_OF_TABLES() OF_TABLE(CONFIG_CLKSRC_OF, clksrc_ret) #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip) #define CLK_OF_TABLES() OF_TABLE(CONFIG_COMMON_CLK, clk) #define IOMMU_OF_TABLES() OF_TABLE(CONFIG_OF_IOMMU, iommu) @@ -529,6 +530,7 @@ CLK_OF_TABLES() \ RESERVEDMEM_OF_TABLES() \ CLKSRC_OF_TABLES() \ + CLKSRC_RET_OF_TABLES() \ IOMMU_OF_TABLES() \ CPU_METHOD_OF_TABLES() \ CPUIDLE_METHOD_OF_TABLES() \ diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index 44a1aff..15c3839 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -246,6 +246,9 @@ extern int clocksource_i8253_init(void); #define CLOCKSOURCE_OF_DECLARE(name, compat, fn) \ OF_DECLARE_1(clksrc, name, compat, fn) +#define CLOCKSOURCE_OF_DECLARE_RET(name, compat, fn) \ + OF_DECLARE_1_RET(clksrc_ret, name, compat, fn) + #ifdef CONFIG_CLKSRC_PROBE extern void clocksource_probe(void); #else