linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Maxime Ripard <maxime.ripard@free-electrons.com>
To: linux@maxim.org.za, Nicolas Ferre <nicolas.ferre@atmel.com>,
	Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>,
	Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: Boris Brezillon <boris@free-electrons.com>,
	Alexandre Belloni <alexandre.belloni@free-electrons.com>,
	Thomas Petazzoni <thomas@free-electrons.com>,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org,
	Maxime Ripard <maxime.ripard@free-electrons.com>
Subject: [PATCH 04/13] AT91: PIT: Rework probe functions
Date: Wed, 25 Jun 2014 15:06:36 +0200	[thread overview]
Message-ID: <1403701605-26678-5-git-send-email-maxime.ripard@free-electrons.com> (raw)
In-Reply-To: <1403701605-26678-1-git-send-email-maxime.ripard@free-electrons.com>

The PIT timer driver until now had a single probe function, disregarding wether
it was probed through DT or in the old-style way. This code later on was
calling some DT function to retrieve the proper values for its base address,
interrupts and clocks.

While this was working, it was preventing the usage of CLOCKSOURCE_OF_DECLARE,
and the two different probe path were not as clearly separated as they could
be.

Rework the probe path to take this into account, and switch to
CLOCKSOURCE_OF_DECLARE.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
---
 arch/arm/mach-at91/Kconfig            |   1 +
 arch/arm/mach-at91/at91sam926x_time.c | 108 +++++++++++++++-------------------
 arch/arm/mach-at91/board-dt-sam9.c    |   3 +-
 arch/arm/mach-at91/board-dt-sama5.c   |   3 +-
 4 files changed, 51 insertions(+), 64 deletions(-)

diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 45b55e0f0db6..a64412a020d3 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -37,6 +37,7 @@ config AT91_SAM9G45_RESET
 	default !ARCH_AT91X40
 
 config AT91_SAM9_TIME
+	select CLKSRC_OF if OF
 	bool
 
 config HAVE_AT91_SMD
diff --git a/arch/arm/mach-at91/at91sam926x_time.c b/arch/arm/mach-at91/at91sam926x_time.c
index 38490645efea..e953197e5a5c 100644
--- a/arch/arm/mach-at91/at91sam926x_time.c
+++ b/arch/arm/mach-at91/at91sam926x_time.c
@@ -19,7 +19,6 @@
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 
-#include <asm/mach/time.h>
 #include <mach/hardware.h>
 
 #define AT91_PIT_MR		0x00			/* Mode Register */
@@ -176,81 +175,21 @@ static struct irqaction at91sam926x_pit_irq = {
 	.name		= "at91_tick",
 	.flags		= IRQF_SHARED | IRQF_TIMER | IRQF_IRQPOLL,
 	.handler	= at91sam926x_pit_interrupt,
-	.irq		= NR_IRQS_LEGACY + AT91_ID_SYS,
 };
 
-#ifdef CONFIG_OF
-static struct of_device_id pit_timer_ids[] = {
-	{ .compatible = "atmel,at91sam9260-pit" },
-	{ /* sentinel */ }
-};
-
-static int __init of_at91sam926x_pit_init(void)
-{
-	struct device_node	*np;
-	int			ret;
-
-	np = of_find_matching_node(NULL, pit_timer_ids);
-	if (!np)
-		goto err;
-
-	pit_base_addr = of_iomap(np, 0);
-	if (!pit_base_addr)
-		goto node_err;
-
-	mck = of_clk_get(np, 0);
-
-	/* Get the interrupts property */
-	ret = irq_of_parse_and_map(np, 0);
-	if (!ret) {
-		pr_crit("AT91: PIT: Unable to get IRQ from DT\n");
-		if (!IS_ERR(mck))
-			clk_put(mck);
-		goto ioremap_err;
-	}
-	at91sam926x_pit_irq.irq = ret;
-
-	of_node_put(np);
-
-	return 0;
-
-ioremap_err:
-	iounmap(pit_base_addr);
-node_err:
-	of_node_put(np);
-err:
-	return -EINVAL;
-}
-#else
-static int __init of_at91sam926x_pit_init(void)
-{
-	return -EINVAL;
-}
-#endif
-
 /*
  * Set up both clocksource and clockevent support.
  */
-void __init at91sam926x_pit_init(void)
+static void __init at91sam926x_pit_common_init(void)
 {
 	unsigned long	pit_rate;
 	unsigned	bits;
 	int		ret;
 
-	mck = ERR_PTR(-ENOENT);
-
-	/* For device tree enabled device: initialize here */
-	of_at91sam926x_pit_init();
-
 	/*
 	 * Use our actual MCK to figure out how many MCK/16 ticks per
 	 * 1/HZ period (instead of a compile-time constant LATCH).
 	 */
-	if (IS_ERR(mck))
-		mck = clk_get(NULL, "mck");
-
-	if (IS_ERR(mck))
-		panic("AT91: PIT: Unable to get mck clk\n");
 	pit_rate = clk_get_rate(mck) / 16;
 	pit_cycle = (pit_rate + HZ/2) / HZ;
 	WARN_ON(((pit_cycle - 1) & ~AT91_PIT_PIV) != 0);
@@ -277,6 +216,51 @@ void __init at91sam926x_pit_init(void)
 	clockevents_register_device(&pit_clkevt);
 }
 
+static void __init at91sam926x_pit_dt_init(struct device_node *node)
+{
+	unsigned int irq;
+
+	pit_base_addr = of_iomap(node, 0);
+	if (!pit_base_addr)
+		return;
+
+	mck = of_clk_get(node, 0);
+	if (IS_ERR(mck))
+		/* Fallback on clkdev for !CCF-based boards */
+		mck = clk_get(NULL, "mck");
+
+	if (IS_ERR(mck))
+		panic("AT91: PIT: Unable to get mck clk\n");
+
+	/* Get the interrupts property */
+	irq = irq_of_parse_and_map(node, 0);
+	if (!irq) {
+		pr_crit("AT91: PIT: Unable to get IRQ from DT\n");
+		goto clk_err;
+	}
+
+	at91sam926x_pit_irq.irq = irq;
+
+	at91sam926x_pit_common_init();
+
+clk_err:
+	clk_put(mck);
+	iounmap(pit_base_addr);
+}
+CLOCKSOURCE_OF_DECLARE(at91sam926x_pit, "atmel,at91sam9260-pit",
+		       at91sam926x_pit_dt_init);
+
+void __init at91sam926x_pit_init(void)
+{
+	mck = clk_get(NULL, "mck");
+	if (IS_ERR(mck))
+		panic("AT91: PIT: Unable to get mck clk\n");
+
+	at91sam926x_pit_irq.irq = NR_IRQS_LEGACY + AT91_ID_SYS,
+
+	at91sam926x_pit_common_init();
+}
+
 void __init at91sam926x_ioremap_pit(u32 addr)
 {
 	if (of_have_populated_dt())
diff --git a/arch/arm/mach-at91/board-dt-sam9.c b/arch/arm/mach-at91/board-dt-sam9.c
index 575b0be66ca8..a9fcdadfd929 100644
--- a/arch/arm/mach-at91/board-dt-sam9.c
+++ b/arch/arm/mach-at91/board-dt-sam9.c
@@ -14,6 +14,7 @@
 #include <linux/of.h>
 #include <linux/of_irq.h>
 #include <linux/clk-provider.h>
+#include <linux/clocksource.h>
 
 #include <asm/setup.h>
 #include <asm/irq.h>
@@ -31,7 +32,7 @@ static void __init sam9_dt_timer_init(void)
 #if defined(CONFIG_COMMON_CLK)
 	of_clk_init(NULL);
 #endif
-	at91sam926x_pit_init();
+	clocksource_of_init();
 }
 
 static const struct of_device_id irq_of_match[] __initconst = {
diff --git a/arch/arm/mach-at91/board-dt-sama5.c b/arch/arm/mach-at91/board-dt-sama5.c
index 075ec0576ada..c07dd2395f36 100644
--- a/arch/arm/mach-at91/board-dt-sama5.c
+++ b/arch/arm/mach-at91/board-dt-sama5.c
@@ -17,6 +17,7 @@
 #include <linux/of_platform.h>
 #include <linux/phy.h>
 #include <linux/clk-provider.h>
+#include <linux/clocksource.h>
 
 #include <asm/setup.h>
 #include <asm/irq.h>
@@ -32,7 +33,7 @@ static void __init sama5_dt_timer_init(void)
 #if defined(CONFIG_COMMON_CLK)
 	of_clk_init(NULL);
 #endif
-	at91sam926x_pit_init();
+	clocksource_of_init();
 }
 
 static const struct of_device_id irq_of_match[] __initconst = {
-- 
2.0.0


  parent reply	other threads:[~2014-06-25 13:10 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-25 13:06 [PATCH 00/13] AT91: PIT: Cleanups and move to drivers/clocksource Maxime Ripard
2014-06-25 13:06 ` [PATCH 01/13] AT91: PIT: Follow the general coding rules Maxime Ripard
2014-06-25 13:06 ` [PATCH 02/13] AT91: generic.h: Add include safe guards Maxime Ripard
2014-06-25 13:06 ` [PATCH 03/13] AT91: PIT: Use of_have_populated_dt instead of CONFIG_OF Maxime Ripard
2014-06-25 13:06 ` Maxime Ripard [this message]
2014-06-25 13:06 ` [PATCH 05/13] AT91: dt: Remove init_time definitions Maxime Ripard
2014-06-25 13:06 ` [PATCH 06/13] AT91: PIT: Use consistent exit path in probe Maxime Ripard
2014-06-25 13:06 ` [PATCH 07/13] AT91: PIT: Use pr_fmt Maxime Ripard
2014-06-25 13:06 ` [PATCH 08/13] AT91: PIT: use request_irq instead of setup_irq Maxime Ripard
2014-06-25 13:06 ` [PATCH 09/13] AT91: PIT: (Almost) remove the global variables Maxime Ripard
2014-06-26  5:12   ` Boris BREZILLON
2014-06-26  9:28     ` Maxime Ripard
2014-06-25 13:06 ` [PATCH 10/13] AT91: soc: Add init_time callback Maxime Ripard
2014-06-25 13:06 ` [PATCH 11/13] AT91: Convert the boards to the " Maxime Ripard
2014-06-25 13:06 ` [PATCH 12/13] AT91: PIT: Convert to an early_platform_device Maxime Ripard
2014-06-25 13:06 ` [PATCH 13/13] AT91: PIT: Move the driver to drivers/clocksource Maxime Ripard
2014-06-26  5:26   ` Boris BREZILLON
2014-06-26  9:30     ` Maxime Ripard
2014-06-26 11:48       ` Boris BREZILLON
2014-06-26 12:54         ` Maxime Ripard
2014-06-26  5:30 ` [PATCH 00/13] AT91: PIT: Cleanups and move " Boris BREZILLON

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1403701605-26678-5-git-send-email-maxime.ripard@free-electrons.com \
    --to=maxime.ripard@free-electrons.com \
    --cc=alexandre.belloni@free-electrons.com \
    --cc=boris@free-electrons.com \
    --cc=daniel.lezcano@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@maxim.org.za \
    --cc=nicolas.ferre@atmel.com \
    --cc=plagnioj@jcrosoft.com \
    --cc=thomas@free-electrons.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).