diff options
author | Robert ABEL <rabel@cit-ec.uni-bielefeld.de> | 2015-02-27 10:56:52 -0500 |
---|---|---|
committer | Roger Quadros <rogerq@ti.com> | 2015-03-06 05:35:45 -0500 |
commit | f585070b91950a0269eb20f497cceeee0aeefe0e (patch) | |
tree | f22d10e02b3c01ce86d1ad8961d1bcf184a1760c | |
parent | 563dbb260d74dbd49d66f9a07e0311563c62c8ff (diff) |
ARM OMAP2+ GPMC: always program GPMCFCLKDIVIDER
The WAITMONITORINGTIME is expressed as a number of GPMC_CLK clock cycles,
even though the access is defined as asynchronous, and no GPMC_CLK clock
is provided to the external device. Still, GPMCFCLKDIVIDER is used as a divider
for the GPMC clock, so it must be programmed to define the
correct WAITMONITORINGTIME delay.
Signed-off-by: Robert ABEL <rabel@cit-ec.uni-bielefeld.de>
Acked-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Roger Quadros <rogerq@ti.com>
-rw-r--r-- | drivers/memory/omap-gpmc.c | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/drivers/memory/omap-gpmc.c b/drivers/memory/omap-gpmc.c index 6a35971cb724..5c36ff397b73 100644 --- a/drivers/memory/omap-gpmc.c +++ b/drivers/memory/omap-gpmc.c | |||
@@ -508,7 +508,7 @@ static int set_gpmc_timing_reg(int cs, int reg, int st_bit, int end_bit, | |||
508 | 508 | ||
509 | l = gpmc_cs_read_reg(cs, reg); | 509 | l = gpmc_cs_read_reg(cs, reg); |
510 | #ifdef DEBUG | 510 | #ifdef DEBUG |
511 | printk(KERN_INFO | 511 | pr_info( |
512 | "GPMC CS%d: %-17s: %3d ticks, %3lu ns (was %3i ticks) %3d ns\n", | 512 | "GPMC CS%d: %-17s: %3d ticks, %3lu ns (was %3i ticks) %3d ns\n", |
513 | cs, name, ticks, gpmc_get_fclk_period() * ticks / 1000, | 513 | cs, name, ticks, gpmc_get_fclk_period() * ticks / 1000, |
514 | (l >> st_bit) & mask, time); | 514 | (l >> st_bit) & mask, time); |
@@ -580,19 +580,14 @@ int gpmc_cs_set_timings(int cs, const struct gpmc_timings *t) | |||
580 | if (gpmc_capability & GPMC_HAS_WR_ACCESS) | 580 | if (gpmc_capability & GPMC_HAS_WR_ACCESS) |
581 | GPMC_SET_ONE(GPMC_CS_CONFIG6, 24, 28, wr_access); | 581 | GPMC_SET_ONE(GPMC_CS_CONFIG6, 24, 28, wr_access); |
582 | 582 | ||
583 | /* caller is expected to have initialized CONFIG1 to cover | ||
584 | * at least sync vs async | ||
585 | */ | ||
586 | l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); | 583 | l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); |
587 | if (l & (GPMC_CONFIG1_READTYPE_SYNC | GPMC_CONFIG1_WRITETYPE_SYNC)) { | ||
588 | #ifdef DEBUG | 584 | #ifdef DEBUG |
589 | printk(KERN_INFO "GPMC CS%d CLK period is %lu ns (div %d)\n", | 585 | pr_info("GPMC CS%d CLK period is %lu ns (div %d)\n", |
590 | cs, (div * gpmc_get_fclk_period()) / 1000, div); | 586 | cs, (div * gpmc_get_fclk_period()) / 1000, div); |
591 | #endif | 587 | #endif |
592 | l &= ~0x03; | 588 | l &= ~0x03; |
593 | l |= (div - 1); | 589 | l |= (div - 1); |
594 | gpmc_cs_write_reg(cs, GPMC_CS_CONFIG1, l); | 590 | gpmc_cs_write_reg(cs, GPMC_CS_CONFIG1, l); |
595 | } | ||
596 | 591 | ||
597 | gpmc_cs_bool_timings(cs, &t->bool_timings); | 592 | gpmc_cs_bool_timings(cs, &t->bool_timings); |
598 | gpmc_cs_show_timings(cs, "after gpmc_cs_set_timings"); | 593 | gpmc_cs_show_timings(cs, "after gpmc_cs_set_timings"); |