diff options
| -rw-r--r-- | arch/arm/mach-omap2/gpmc-onenand.c | 10 | ||||
| -rw-r--r-- | arch/arm/plat-omap/include/plat/onenand.h | 2 | ||||
| -rw-r--r-- | drivers/mtd/onenand/omap2.c | 28 |
3 files changed, 12 insertions, 28 deletions
diff --git a/arch/arm/mach-omap2/gpmc-onenand.c b/arch/arm/mach-omap2/gpmc-onenand.c index 3a4307b8f7cf..46786a606e90 100644 --- a/arch/arm/mach-omap2/gpmc-onenand.c +++ b/arch/arm/mach-omap2/gpmc-onenand.c | |||
| @@ -123,7 +123,7 @@ static void set_onenand_cfg(void __iomem *onenand_base, int latency, | |||
| 123 | 123 | ||
| 124 | static int omap2_onenand_set_sync_mode(struct omap_onenand_platform_data *cfg, | 124 | static int omap2_onenand_set_sync_mode(struct omap_onenand_platform_data *cfg, |
| 125 | void __iomem *onenand_base, | 125 | void __iomem *onenand_base, |
| 126 | int freq) | 126 | int *freq_ptr) |
| 127 | { | 127 | { |
| 128 | struct gpmc_timings t; | 128 | struct gpmc_timings t; |
| 129 | const int t_cer = 15; | 129 | const int t_cer = 15; |
| @@ -136,7 +136,7 @@ static int omap2_onenand_set_sync_mode(struct omap_onenand_platform_data *cfg, | |||
| 136 | int tick_ns, div, fclk_offset_ns, fclk_offset, gpmc_clk_ns, latency; | 136 | int tick_ns, div, fclk_offset_ns, fclk_offset, gpmc_clk_ns, latency; |
| 137 | int first_time = 0, hf = 0, vhf = 0, sync_read = 0, sync_write = 0; | 137 | int first_time = 0, hf = 0, vhf = 0, sync_read = 0, sync_write = 0; |
| 138 | int err, ticks_cez; | 138 | int err, ticks_cez; |
| 139 | int cs = cfg->cs; | 139 | int cs = cfg->cs, freq = *freq_ptr; |
| 140 | u32 reg; | 140 | u32 reg; |
| 141 | 141 | ||
| 142 | if (cfg->flags & ONENAND_SYNC_READ) { | 142 | if (cfg->flags & ONENAND_SYNC_READ) { |
| @@ -330,16 +330,18 @@ static int omap2_onenand_set_sync_mode(struct omap_onenand_platform_data *cfg, | |||
| 330 | 330 | ||
| 331 | set_onenand_cfg(onenand_base, latency, sync_read, sync_write, hf, vhf); | 331 | set_onenand_cfg(onenand_base, latency, sync_read, sync_write, hf, vhf); |
| 332 | 332 | ||
| 333 | *freq_ptr = freq; | ||
| 334 | |||
| 333 | return 0; | 335 | return 0; |
| 334 | } | 336 | } |
| 335 | 337 | ||
| 336 | static int gpmc_onenand_setup(void __iomem *onenand_base, int freq) | 338 | static int gpmc_onenand_setup(void __iomem *onenand_base, int *freq_ptr) |
| 337 | { | 339 | { |
| 338 | struct device *dev = &gpmc_onenand_device.dev; | 340 | struct device *dev = &gpmc_onenand_device.dev; |
| 339 | 341 | ||
| 340 | /* Set sync timings in GPMC */ | 342 | /* Set sync timings in GPMC */ |
| 341 | if (omap2_onenand_set_sync_mode(gpmc_onenand_data, onenand_base, | 343 | if (omap2_onenand_set_sync_mode(gpmc_onenand_data, onenand_base, |
| 342 | freq) < 0) { | 344 | freq_ptr) < 0) { |
| 343 | dev_err(dev, "Unable to set synchronous mode\n"); | 345 | dev_err(dev, "Unable to set synchronous mode\n"); |
| 344 | return -EINVAL; | 346 | return -EINVAL; |
| 345 | } | 347 | } |
diff --git a/arch/arm/plat-omap/include/plat/onenand.h b/arch/arm/plat-omap/include/plat/onenand.h index affe87e9ece7..86118dc3f19a 100644 --- a/arch/arm/plat-omap/include/plat/onenand.h +++ b/arch/arm/plat-omap/include/plat/onenand.h | |||
| @@ -20,7 +20,7 @@ struct omap_onenand_platform_data { | |||
| 20 | int gpio_irq; | 20 | int gpio_irq; |
| 21 | struct mtd_partition *parts; | 21 | struct mtd_partition *parts; |
| 22 | int nr_parts; | 22 | int nr_parts; |
| 23 | int (*onenand_setup)(void __iomem *, int freq); | 23 | int (*onenand_setup)(void __iomem *, int *freq_ptr); |
| 24 | int dma_channel; | 24 | int dma_channel; |
| 25 | u8 flags; | 25 | u8 flags; |
| 26 | u8 regulator_can_sleep; | 26 | u8 regulator_can_sleep; |
diff --git a/drivers/mtd/onenand/omap2.c b/drivers/mtd/onenand/omap2.c index ac31f461cc1c..3e1bb9568823 100644 --- a/drivers/mtd/onenand/omap2.c +++ b/drivers/mtd/onenand/omap2.c | |||
| @@ -63,7 +63,7 @@ struct omap2_onenand { | |||
| 63 | struct completion dma_done; | 63 | struct completion dma_done; |
| 64 | int dma_channel; | 64 | int dma_channel; |
| 65 | int freq; | 65 | int freq; |
| 66 | int (*setup)(void __iomem *base, int freq); | 66 | int (*setup)(void __iomem *base, int *freq_ptr); |
| 67 | struct regulator *regulator; | 67 | struct regulator *regulator; |
| 68 | }; | 68 | }; |
| 69 | 69 | ||
| @@ -581,7 +581,7 @@ static int __adjust_timing(struct device *dev, void *data) | |||
| 581 | 581 | ||
| 582 | /* DMA is not in use so this is all that is needed */ | 582 | /* DMA is not in use so this is all that is needed */ |
| 583 | /* Revisit for OMAP3! */ | 583 | /* Revisit for OMAP3! */ |
| 584 | ret = c->setup(c->onenand.base, c->freq); | 584 | ret = c->setup(c->onenand.base, &c->freq); |
| 585 | 585 | ||
| 586 | return ret; | 586 | return ret; |
| 587 | } | 587 | } |
| @@ -673,7 +673,7 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev) | |||
| 673 | } | 673 | } |
| 674 | 674 | ||
| 675 | if (pdata->onenand_setup != NULL) { | 675 | if (pdata->onenand_setup != NULL) { |
| 676 | r = pdata->onenand_setup(c->onenand.base, c->freq); | 676 | r = pdata->onenand_setup(c->onenand.base, &c->freq); |
| 677 | if (r < 0) { | 677 | if (r < 0) { |
| 678 | dev_err(&pdev->dev, "Onenand platform setup failed: " | 678 | dev_err(&pdev->dev, "Onenand platform setup failed: " |
| 679 | "%d\n", r); | 679 | "%d\n", r); |
| @@ -718,8 +718,8 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev) | |||
| 718 | } | 718 | } |
| 719 | 719 | ||
| 720 | dev_info(&pdev->dev, "initializing on CS%d, phys base 0x%08lx, virtual " | 720 | dev_info(&pdev->dev, "initializing on CS%d, phys base 0x%08lx, virtual " |
| 721 | "base %p\n", c->gpmc_cs, c->phys_base, | 721 | "base %p, freq %d MHz\n", c->gpmc_cs, c->phys_base, |
| 722 | c->onenand.base); | 722 | c->onenand.base, c->freq); |
| 723 | 723 | ||
| 724 | c->pdev = pdev; | 724 | c->pdev = pdev; |
| 725 | c->mtd.name = dev_name(&pdev->dev); | 725 | c->mtd.name = dev_name(&pdev->dev); |
| @@ -754,24 +754,6 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev) | |||
| 754 | if ((r = onenand_scan(&c->mtd, 1)) < 0) | 754 | if ((r = onenand_scan(&c->mtd, 1)) < 0) |
| 755 | goto err_release_regulator; | 755 | goto err_release_regulator; |
| 756 | 756 | ||
| 757 | switch ((c->onenand.version_id >> 4) & 0xf) { | ||
| 758 | case 0: | ||
| 759 | c->freq = 40; | ||
| 760 | break; | ||
| 761 | case 1: | ||
| 762 | c->freq = 54; | ||
| 763 | break; | ||
| 764 | case 2: | ||
| 765 | c->freq = 66; | ||
| 766 | break; | ||
| 767 | case 3: | ||
| 768 | c->freq = 83; | ||
| 769 | break; | ||
| 770 | case 4: | ||
| 771 | c->freq = 104; | ||
| 772 | break; | ||
| 773 | } | ||
| 774 | |||
| 775 | #ifdef CONFIG_MTD_PARTITIONS | 757 | #ifdef CONFIG_MTD_PARTITIONS |
| 776 | r = parse_mtd_partitions(&c->mtd, part_probes, &c->parts, 0); | 758 | r = parse_mtd_partitions(&c->mtd, part_probes, &c->parts, 0); |
| 777 | if (r > 0) | 759 | if (r > 0) |
