Commit 3ad2d861 authored by Adrian Hunter's avatar Adrian Hunter Committed by Tony Lindgren

OMAP: OneNAND: determine frequency in one place

OneNAND frequency is determined when calculating
GPMC timings.  Return that value instead of determining it
again in the OMAP OneNAND driver.
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@nokia.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 1435ca0f
...@@ -123,7 +123,7 @@ static void set_onenand_cfg(void __iomem *onenand_base, int latency, ...@@ -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, static int omap2_onenand_set_sync_mode(struct omap_onenand_platform_data *cfg,
void __iomem *onenand_base, void __iomem *onenand_base,
int freq) int *freq_ptr)
{ {
struct gpmc_timings t; struct gpmc_timings t;
const int t_cer = 15; const int t_cer = 15;
...@@ -136,7 +136,7 @@ static int omap2_onenand_set_sync_mode(struct omap_onenand_platform_data *cfg, ...@@ -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 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 first_time = 0, hf = 0, vhf = 0, sync_read = 0, sync_write = 0;
int err, ticks_cez; int err, ticks_cez;
int cs = cfg->cs; int cs = cfg->cs, freq = *freq_ptr;
u32 reg; u32 reg;
if (cfg->flags & ONENAND_SYNC_READ) { if (cfg->flags & ONENAND_SYNC_READ) {
...@@ -330,16 +330,18 @@ static int omap2_onenand_set_sync_mode(struct omap_onenand_platform_data *cfg, ...@@ -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); set_onenand_cfg(onenand_base, latency, sync_read, sync_write, hf, vhf);
*freq_ptr = freq;
return 0; 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; struct device *dev = &gpmc_onenand_device.dev;
/* Set sync timings in GPMC */ /* Set sync timings in GPMC */
if (omap2_onenand_set_sync_mode(gpmc_onenand_data, onenand_base, 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"); dev_err(dev, "Unable to set synchronous mode\n");
return -EINVAL; return -EINVAL;
} }
......
...@@ -20,7 +20,7 @@ struct omap_onenand_platform_data { ...@@ -20,7 +20,7 @@ struct omap_onenand_platform_data {
int gpio_irq; int gpio_irq;
struct mtd_partition *parts; struct mtd_partition *parts;
int nr_parts; int nr_parts;
int (*onenand_setup)(void __iomem *, int freq); int (*onenand_setup)(void __iomem *, int *freq_ptr);
int dma_channel; int dma_channel;
u8 flags; u8 flags;
u8 regulator_can_sleep; u8 regulator_can_sleep;
......
...@@ -63,7 +63,7 @@ struct omap2_onenand { ...@@ -63,7 +63,7 @@ struct omap2_onenand {
struct completion dma_done; struct completion dma_done;
int dma_channel; int dma_channel;
int freq; int freq;
int (*setup)(void __iomem *base, int freq); int (*setup)(void __iomem *base, int *freq_ptr);
struct regulator *regulator; struct regulator *regulator;
}; };
...@@ -581,7 +581,7 @@ static int __adjust_timing(struct device *dev, void *data) ...@@ -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 */ /* DMA is not in use so this is all that is needed */
/* Revisit for OMAP3! */ /* Revisit for OMAP3! */
ret = c->setup(c->onenand.base, c->freq); ret = c->setup(c->onenand.base, &c->freq);
return ret; return ret;
} }
...@@ -673,7 +673,7 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev) ...@@ -673,7 +673,7 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev)
} }
if (pdata->onenand_setup != NULL) { 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) { if (r < 0) {
dev_err(&pdev->dev, "Onenand platform setup failed: " dev_err(&pdev->dev, "Onenand platform setup failed: "
"%d\n", r); "%d\n", r);
...@@ -718,8 +718,8 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev) ...@@ -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 " dev_info(&pdev->dev, "initializing on CS%d, phys base 0x%08lx, virtual "
"base %p\n", c->gpmc_cs, c->phys_base, "base %p, freq %d MHz\n", c->gpmc_cs, c->phys_base,
c->onenand.base); c->onenand.base, c->freq);
c->pdev = pdev; c->pdev = pdev;
c->mtd.name = dev_name(&pdev->dev); c->mtd.name = dev_name(&pdev->dev);
...@@ -754,24 +754,6 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev) ...@@ -754,24 +754,6 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev)
if ((r = onenand_scan(&c->mtd, 1)) < 0) if ((r = onenand_scan(&c->mtd, 1)) < 0)
goto err_release_regulator; 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 #ifdef CONFIG_MTD_PARTITIONS
r = parse_mtd_partitions(&c->mtd, part_probes, &c->parts, 0); r = parse_mtd_partitions(&c->mtd, part_probes, &c->parts, 0);
if (r > 0) if (r > 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment