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: Adrian Hunter <adrian.hunter@nokia.com> Signed-off-by: Tony Lindgren <tony@atomide.com>
This commit is contained in:
committed by
Tony Lindgren
parent
1435ca0fc1
commit
3ad2d86136
@@ -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,
|
|||||||
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,
|
|||||||
|
|
||||||
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 {
|
|||||||
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 {
|
|||||||
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)
|
|||||||
|
|
||||||
/* 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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
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)
|
||||||
|
Reference in New Issue
Block a user