From patchwork Wed Feb 8 23:14:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Lezcano X-Patchwork-Id: 93653 Delivered-To: patch@linaro.org Received: by 10.140.20.99 with SMTP id 90csp2928856qgi; Wed, 8 Feb 2017 15:25:25 -0800 (PST) X-Received: by 10.99.138.201 with SMTP id y192mr127484pgd.146.1486596325902; Wed, 08 Feb 2017 15:25:25 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g28si8354989pfd.227.2017.02.08.15.25.25; Wed, 08 Feb 2017 15:25:25 -0800 (PST) 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 sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752257AbdBHXZX (ORCPT + 25 others); Wed, 8 Feb 2017 18:25:23 -0500 Received: from mail-wr0-f178.google.com ([209.85.128.178]:35256 "EHLO mail-wr0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750946AbdBHXZV (ORCPT ); Wed, 8 Feb 2017 18:25:21 -0500 Received: by mail-wr0-f178.google.com with SMTP id 89so70789257wrr.2 for ; Wed, 08 Feb 2017 15:23:32 -0800 (PST) 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=OpP0HU+nGFMMtl5y7GMcawhZpMflXalHrFTL9IRZ3Pw=; b=jA4ds6PYkFmKQAK2+baAzmu8dvjeaLHdY8hZJm2rWz+vpK3cotOFIZiwpEOssbW80K GlTPB8cA/DxCGnU/WPr4EQM2qMAZQG5nT2nchvi87gLKVJEVeVMSv6pGRxO8n6Nbbyq1 JGMwZjy2nVXW8h4PhzDXNKGjVKb+cMMbmKVOU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=OpP0HU+nGFMMtl5y7GMcawhZpMflXalHrFTL9IRZ3Pw=; b=HJjCv8nBeMHB0PtNRyoIbgC75/gsHGmsgsfEb3G8coy4EAV1gG0bLy/bmDO1b4UjHv hm5SiKQqNgI3rzuc1nsw5EHh6+HgWIPWCcWX9tyPXxxkaqGGWsP8tSMW2EriO9T9a3Au 00s2w83sLH3cmHBVImCeMiS9sEFprQ7pesaYmzMCWPa3fgV1jNdfU1EQZJw0G0zJxk1X um7Py5SMSPY6ULWnSCX7JlNWTT0LDDWYxjtmmpIAonCI24p6gQd6Q1OhDFlU9rb2qRWF s6qUM0Z57phC+yIGdWSWH0Cgqc77ONpWrmDEGHzVLkKKdRUN39IlZeCnymyTuqULfO+v w5FA== X-Gm-Message-State: AMke39mRk8M2tL+0ecN4SZM969ZyefdYpFnWH4Pgdg8NxvaGpcidkttMo+NI+z5torDS1/jj X-Received: by 10.223.160.14 with SMTP id k14mr26421wrk.69.1486595740203; Wed, 08 Feb 2017 15:15:40 -0800 (PST) Received: from mai.lan ([2001:41d0:fe90:b800:3f16:bcf7:601c:a13b]) by smtp.gmail.com with ESMTPSA id u42sm15422821wrc.1.2017.02.08.15.15.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 08 Feb 2017 15:15:39 -0800 (PST) From: Daniel Lezcano To: tglx@linutronix.de Cc: linux-kernel@vger.kernel.org (open list) Subject: [PATCH 01/10] clockevents: Add a clkevt-of mechanism like clksrc-of Date: Thu, 9 Feb 2017 00:14:35 +0100 Message-Id: <1486595685-10232-1-git-send-email-daniel.lezcano@linaro.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <20170208231208.GB12695@mai> References: <20170208231208.GB12695@mai> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The current code uses the CLOCKSOURCE_OF_DECLARE macro to fill the clksrc table with a t-uple (name, init_function). Unfortunately it ends up to the clockevent and the clocksource being both initialized with this macro. It is not a problem by itself but there is not a clear distinction between a clockevent and a clocksource in the code initialization path. Somebody can argue there are the same IP block and the same DT node. But conceptually from the software side, there are two distincts entities and as is they should be initialized separetely. Some drivers which do not have a clocksource end up by using the CLOCKSOURCE_OF_DECLARE macro to declare a clockevent. Another result is the fuzzy organization in the clocksource directory, where the clockevents are implemented in the same file than the clocksources or file labelled timer-something implementing a clocksource. This patch provides another macro to specifically declare a clockevent in the same way than the clocksource and gives the opportunity to write two separate drivers, one for the clocksource and another for the clockevents. Hopefully, that can help to do some housework in the directory, perhaps split the drivers in to entities, for example: - clksrc-rockchip.c - clkevt-rockchip.c Also, it gives the possibility to declare clocksources separately in the DT and then use a clocksource from IP block while while clockevents are used from another IP block. Signed-off-by: Daniel Lezcano --- drivers/clocksource/Kconfig | 7 +++++ drivers/clocksource/Makefile | 1 + drivers/clocksource/clkevt-probe.c | 56 ++++++++++++++++++++++++++++++++++++++ include/linux/clockchips.h | 9 ++++++ 4 files changed, 73 insertions(+) create mode 100644 drivers/clocksource/clkevt-probe.c -- 2.7.4 diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig index 4866f7a..3dc06f0 100644 --- a/drivers/clocksource/Kconfig +++ b/drivers/clocksource/Kconfig @@ -5,6 +5,10 @@ config CLKSRC_OF bool select CLKSRC_PROBE +config CLKEVT_OF + bool + select CLKEVT_PROBE + config CLKSRC_ACPI bool select CLKSRC_PROBE @@ -12,6 +16,9 @@ config CLKSRC_ACPI config CLKSRC_PROBE bool +config CLKEVT_PROBE + bool + config CLKSRC_I8253 bool diff --git a/drivers/clocksource/Makefile b/drivers/clocksource/Makefile index a14111e..4b7e9a2 100644 --- a/drivers/clocksource/Makefile +++ b/drivers/clocksource/Makefile @@ -1,4 +1,5 @@ obj-$(CONFIG_CLKSRC_PROBE) += clksrc-probe.o +obj-$(CONFIG_CLKEVT_PROBE) += clkevt-probe.o obj-$(CONFIG_ATMEL_PIT) += timer-atmel-pit.o obj-$(CONFIG_ATMEL_ST) += timer-atmel-st.o obj-$(CONFIG_ATMEL_TCB_CLKSRC) += tcb_clksrc.o diff --git a/drivers/clocksource/clkevt-probe.c b/drivers/clocksource/clkevt-probe.c new file mode 100644 index 0000000..8c30fec --- /dev/null +++ b/drivers/clocksource/clkevt-probe.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2016, Linaro Ltd. All rights reserved. + * Daniel Lezcano + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include + +extern struct of_device_id __clkevt_of_table[]; + +static const struct of_device_id __clkevt_of_table_sentinel + __used __section(__clkevt_of_table_end); + +int __init clockevent_probe(void) +{ + struct device_node *np; + const struct of_device_id *match; + of_init_fn_1_ret init_func; + int ret, clockevents = 0; + + for_each_matching_node_and_match(np, __clkevt_of_table, &match) { + if (!of_device_is_available(np)) + continue; + + init_func = match->data; + + ret = init_func(np); + if (ret) { + pr_warn("Failed to initialize '%s' (%d)\n", + np->name, ret); + continue; + } + + clockevents++; + } + + if (!clockevents) { + pr_crit("%s: no matching clockevent found\n", __func__); + return -ENODEV; + } + + return 0; +} diff --git a/include/linux/clockchips.h b/include/linux/clockchips.h index 0d442e3..5d3053c 100644 --- a/include/linux/clockchips.h +++ b/include/linux/clockchips.h @@ -224,4 +224,13 @@ static inline void tick_setup_hrtimer_broadcast(void) { } #endif /* !CONFIG_GENERIC_CLOCKEVENTS */ +#define CLOCKEVENT_OF_DECLARE(name, compat, fn) \ + OF_DECLARE_1_RET(clkevt, name, compat, fn) + +#ifdef CONFIG_CLKEVT_PROBE +extern int clockevent_probe(void); +#els +static inline int clockevent_probe(void) { return 0; } +#endif + #endif /* _LINUX_CLOCKCHIPS_H */