ARM: OMAP2+: Add device-tree support for 32kHz counter
authorJon Hunter <jon-hunter@ti.com>
Tue, 9 Oct 2012 19:12:26 +0000 (14:12 -0500)
committerJon Hunter <jon-hunter@ti.com>
Fri, 2 Nov 2012 18:16:31 +0000 (13:16 -0500)
For OMAP devices, the 32kHz counter is the default clock-source for the kernel.
However, this is not the only possible clock-source the kernel can use for OMAP
devices.

When booting with device-tree, if the 32kHz counter is the desired clock-source
for the kernel, then parse the device-tree blob to ensure that the counter is
present and if so map memory for the counter using the device-tree of_iomap()
function so we are no longer reliant on the OMAP HWMOD framework to do this for
us.

Signed-off-by: Jon Hunter <jon-hunter@ti.com>
arch/arm/mach-omap2/timer.c

index 92447cd..0758bae 100644 (file)
@@ -159,6 +159,11 @@ static struct of_device_id omap_timer_match[] __initdata = {
        { }
 };
 
+static struct of_device_id omap_counter_match[] __initdata = {
+       { .compatible = "ti,omap-counter32k", },
+       { }
+};
+
 /**
  * omap_get_timer_dt - get a timer using device-tree
  * @match      - device-tree match structure for matching a device type
@@ -377,11 +382,26 @@ static u32 notrace dmtimer_read_sched_clock(void)
 static int __init omap2_sync32k_clocksource_init(void)
 {
        int ret;
+       struct device_node *np = NULL;
        struct omap_hwmod *oh;
        void __iomem *vbase;
        const char *oh_name = "counter_32k";
 
        /*
+        * If device-tree is present, then search the DT blob
+        * to see if the 32kHz counter is supported.
+        */
+       if (of_have_populated_dt()) {
+               np = omap_get_timer_dt(omap_counter_match, NULL);
+               if (!np)
+                       return -ENODEV;
+
+               of_property_read_string_index(np, "ti,hwmods", 0, &oh_name);
+               if (!oh_name)
+                       return -ENODEV;
+       }
+
+       /*
         * First check hwmod data is available for sync32k counter
         */
        oh = omap_hwmod_lookup(oh_name);
@@ -390,7 +410,13 @@ static int __init omap2_sync32k_clocksource_init(void)
 
        omap_hwmod_setup_one(oh_name);
 
-       vbase = omap_hwmod_get_mpu_rt_va(oh);
+       if (np) {
+               vbase = of_iomap(np, 0);
+               of_node_put(np);
+       } else {
+               vbase = omap_hwmod_get_mpu_rt_va(oh);
+       }
+
        if (!vbase) {
                pr_warn("%s: failed to get counter_32k resource\n", __func__);
                return -ENXIO;