OMAP: OneNAND: determine frequency in one place
authorAdrian Hunter <adrian.hunter@nokia.com>
Mon, 7 Feb 2011 08:46:59 +0000 (10:46 +0200)
committerTony Lindgren <tony@atomide.com>
Thu, 17 Feb 2011 23:44:45 +0000 (15:44 -0800)
OneNAND frequency is determined when calculating
GPMC timings.  Return that value instead of determining it
again in the OMAP OneNAND driver.

Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-omap2/gpmc-onenand.c
arch/arm/plat-omap/include/plat/onenand.h
drivers/mtd/onenand/omap2.c

index 3a4307b8f7cfa0d45c10a9d367c25274f8345d04..46786a606e90a11ae3e7b325eb6d37050f103024 100644 (file)
@@ -123,7 +123,7 @@ static void set_onenand_cfg(void __iomem *onenand_base, int latency,
 
 static int omap2_onenand_set_sync_mode(struct omap_onenand_platform_data *cfg,
                                        void __iomem *onenand_base,
-                                       int freq)
+                                       int *freq_ptr)
 {
        struct gpmc_timings t;
        const int t_cer  = 15;
@@ -136,7 +136,7 @@ static int omap2_onenand_set_sync_mode(struct omap_onenand_platform_data *cfg,
        int tick_ns, div, fclk_offset_ns, fclk_offset, gpmc_clk_ns, latency;
        int first_time = 0, hf = 0, vhf = 0, sync_read = 0, sync_write = 0;
        int err, ticks_cez;
-       int cs = cfg->cs;
+       int cs = cfg->cs, freq = *freq_ptr;
        u32 reg;
 
        if (cfg->flags & ONENAND_SYNC_READ) {
@@ -330,16 +330,18 @@ static int omap2_onenand_set_sync_mode(struct omap_onenand_platform_data *cfg,
 
        set_onenand_cfg(onenand_base, latency, sync_read, sync_write, hf, vhf);
 
+       *freq_ptr = freq;
+
        return 0;
 }
 
-static int gpmc_onenand_setup(void __iomem *onenand_base, int freq)
+static int gpmc_onenand_setup(void __iomem *onenand_base, int *freq_ptr)
 {
        struct device *dev = &gpmc_onenand_device.dev;
 
        /* Set sync timings in GPMC */
        if (omap2_onenand_set_sync_mode(gpmc_onenand_data, onenand_base,
-                       freq) < 0) {
+                       freq_ptr) < 0) {
                dev_err(dev, "Unable to set synchronous mode\n");
                return -EINVAL;
        }
index affe87e9ece70ee6263f784a598b71f68a13eed9..86118dc3f19aedd557f3dc2b154b79f210c4450e 100644 (file)
@@ -20,7 +20,7 @@ struct omap_onenand_platform_data {
        int                     gpio_irq;
        struct mtd_partition    *parts;
        int                     nr_parts;
-       int                     (*onenand_setup)(void __iomem *, int freq);
+       int                     (*onenand_setup)(void __iomem *, int *freq_ptr);
        int                     dma_channel;
        u8                      flags;
        u8                      regulator_can_sleep;
index ac31f461cc1c11cef486a5c2b6d7f37f47813e90..3e1bb956882386e817c9e6cd4dcd97fe5ec87bd7 100644 (file)
@@ -63,7 +63,7 @@ struct omap2_onenand {
        struct completion dma_done;
        int dma_channel;
        int freq;
-       int (*setup)(void __iomem *base, int freq);
+       int (*setup)(void __iomem *base, int *freq_ptr);
        struct regulator *regulator;
 };
 
@@ -581,7 +581,7 @@ static int __adjust_timing(struct device *dev, void *data)
 
        /* DMA is not in use so this is all that is needed */
        /* Revisit for OMAP3! */
-       ret = c->setup(c->onenand.base, c->freq);
+       ret = c->setup(c->onenand.base, &c->freq);
 
        return ret;
 }
@@ -673,7 +673,7 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev)
        }
 
        if (pdata->onenand_setup != NULL) {
-               r = pdata->onenand_setup(c->onenand.base, c->freq);
+               r = pdata->onenand_setup(c->onenand.base, &c->freq);
                if (r < 0) {
                        dev_err(&pdev->dev, "Onenand platform setup failed: "
                                "%d\n", r);
@@ -718,8 +718,8 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev)
        }
 
        dev_info(&pdev->dev, "initializing on CS%d, phys base 0x%08lx, virtual "
-                "base %p\n", c->gpmc_cs, c->phys_base,
-                c->onenand.base);
+                "base %p, freq %d MHz\n", c->gpmc_cs, c->phys_base,
+                c->onenand.base, c->freq);
 
        c->pdev = pdev;
        c->mtd.name = dev_name(&pdev->dev);
@@ -754,24 +754,6 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev)
        if ((r = onenand_scan(&c->mtd, 1)) < 0)
                goto err_release_regulator;
 
-       switch ((c->onenand.version_id >> 4) & 0xf) {
-       case 0:
-               c->freq = 40;
-               break;
-       case 1:
-               c->freq = 54;
-               break;
-       case 2:
-               c->freq = 66;
-               break;
-       case 3:
-               c->freq = 83;
-               break;
-       case 4:
-               c->freq = 104;
-               break;
-       }
-
 #ifdef CONFIG_MTD_PARTITIONS
        r = parse_mtd_partitions(&c->mtd, part_probes, &c->parts, 0);
        if (r > 0)