ARM: OMAP2+: Populate DMTIMER errata when using device-tree
authorJon Hunter <jon-hunter@ti.com>
Tue, 19 Mar 2013 17:38:19 +0000 (12:38 -0500)
committerBenoit Cousson <benoit.cousson@linaro.org>
Mon, 8 Apr 2013 22:21:32 +0000 (00:21 +0200)
Currently the DMTIMER errata flags are not being populated when using
device-tree. Add static platform data to populate errata flags when
using device-tree.

Please note that DMTIMER erratum i767 is applicable to OMAP3-5 devices
as well as AM335x devices.

Signed-off-by: Jon Hunter <jon-hunter@ti.com>
Acked-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Benoit Cousson <benoit.cousson@linaro.org>
arch/arm/plat-omap/dmtimer.c

index b50d478dfee3b5b81cd62898e875fc67bdc1f957..5d0af13adb9b1c5da01ed33a8b19862b266f49d0 100644 (file)
@@ -783,6 +783,8 @@ int omap_dm_timers_active(void)
 }
 EXPORT_SYMBOL_GPL(omap_dm_timers_active);
 
+static const struct of_device_id omap_timer_match[];
+
 /**
  * omap_dm_timer_probe - probe function called for every registered device
  * @pdev:      pointer to current timer platform device
@@ -796,7 +798,11 @@ static int omap_dm_timer_probe(struct platform_device *pdev)
        struct omap_dm_timer *timer;
        struct resource *mem, *irq;
        struct device *dev = &pdev->dev;
-       struct dmtimer_platform_data *pdata = pdev->dev.platform_data;
+       const struct of_device_id *match;
+       const struct dmtimer_platform_data *pdata;
+
+       match = of_match_device(of_match_ptr(omap_timer_match), dev);
+       pdata = match ? match->data : dev->platform_data;
 
        if (!pdata && !dev->of_node) {
                dev_err(dev, "%s: no platform data.\n", __func__);
@@ -836,12 +842,14 @@ static int omap_dm_timer_probe(struct platform_device *pdev)
                        timer->capability |= OMAP_TIMER_SECURE;
        } else {
                timer->id = pdev->id;
-               timer->errata = pdata->timer_errata;
                timer->capability = pdata->timer_capability;
                timer->reserved = omap_dm_timer_reserved_systimer(timer->id);
                timer->get_context_loss_count = pdata->get_context_loss_count;
        }
 
+       if (pdata)
+               timer->errata = pdata->timer_errata;
+
        timer->irq = irq->start;
        timer->pdev = pdev;
 
@@ -894,13 +902,34 @@ static int omap_dm_timer_remove(struct platform_device *pdev)
        return ret;
 }
 
+static const struct dmtimer_platform_data omap3plus_pdata = {
+       .timer_errata = OMAP_TIMER_ERRATA_I103_I767,
+};
+
 static const struct of_device_id omap_timer_match[] = {
-       { .compatible = "ti,omap2420-timer", },
-       { .compatible = "ti,omap3430-timer", },
-       { .compatible = "ti,omap4430-timer", },
-       { .compatible = "ti,omap5430-timer", },
-       { .compatible = "ti,am335x-timer", },
-       { .compatible = "ti,am335x-timer-1ms", },
+       {
+               .compatible = "ti,omap2420-timer",
+       },
+       {
+               .compatible = "ti,omap3430-timer",
+               .data = &omap3plus_pdata,
+       },
+       {
+               .compatible = "ti,omap4430-timer",
+               .data = &omap3plus_pdata,
+       },
+       {
+               .compatible = "ti,omap5430-timer",
+               .data = &omap3plus_pdata,
+       },
+       {
+               .compatible = "ti,am335x-timer",
+               .data = &omap3plus_pdata,
+       },
+       {
+               .compatible = "ti,am335x-timer-1ms",
+               .data = &omap3plus_pdata,
+       },
        {},
 };
 MODULE_DEVICE_TABLE(of, omap_timer_match);