Commit d36b4cd4 authored by Jon Hunter's avatar Jon Hunter

ARM: OMAP2+: Add additional GPMC timing parameters

Some of the GPMC timings parameters are currently missing from the GPMC
device-tree binding. Add these parameters to the binding documentation
as well as code to read them. Also add either "-ps" or "-ns" suffix to
the GPMC timing properties to indicate whether the timing is in
picoseconds or nanoseconds.

The existing code in gpmc_read_timings_dt() is checking the value of
of_property_read_u32() and only is successful storing the value read
in the gpmc_timings structure. Checking the return value in this case
is not necessary and we can simply read the value, if present, and
store directly in the gpmc_timings structure. Therefore, simplify the
code by removing these checks.

The comment in the gpmc_read_timings_dt() function, "only for OMAP3430"
is also incorrect as it is applicable to all OMAP3+ devices. So correct
this too.
Signed-off-by: default avatarJon Hunter <jon-hunter@ti.com>
Tested-by: default avatarEzequiel Garcia <ezequiel.garcia@free-electrons.com>
parent 8c8a7771
...@@ -35,35 +35,59 @@ Required properties: ...@@ -35,35 +35,59 @@ Required properties:
Timing properties for child nodes. All are optional and default to 0. Timing properties for child nodes. All are optional and default to 0.
- gpmc,sync-clk: Minimum clock period for synchronous mode, in picoseconds - gpmc,sync-clk-ps: Minimum clock period for synchronous mode, in picoseconds
Chip-select signal timings corresponding to GPMC_CONFIG2: Chip-select signal timings (in nanoseconds) corresponding to GPMC_CONFIG2:
- gpmc,cs-on: Assertion time - gpmc,cs-on-ns: Assertion time
- gpmc,cs-rd-off: Read deassertion time - gpmc,cs-rd-off-ns: Read deassertion time
- gpmc,cs-wr-off: Write deassertion time - gpmc,cs-wr-off-ns: Write deassertion time
ADV signal timings corresponding to GPMC_CONFIG3: ADV signal timings (in nanoseconds) corresponding to GPMC_CONFIG3:
- gpmc,adv-on: Assertion time - gpmc,adv-on-ns: Assertion time
- gpmc,adv-rd-off: Read deassertion time - gpmc,adv-rd-off-ns: Read deassertion time
- gpmc,adv-wr-off: Write deassertion time - gpmc,adv-wr-off-ns: Write deassertion time
WE signals timings corresponding to GPMC_CONFIG4: WE signals timings (in nanoseconds) corresponding to GPMC_CONFIG4:
- gpmc,we-on: Assertion time - gpmc,we-on-ns Assertion time
- gpmc,we-off: Deassertion time - gpmc,we-off-ns: Deassertion time
OE signals timings corresponding to GPMC_CONFIG4: OE signals timings (in nanoseconds) corresponding to GPMC_CONFIG4:
- gpmc,oe-on: Assertion time - gpmc,oe-on-ns: Assertion time
- gpmc,oe-off: Deassertion time - gpmc,oe-off-ns: Deassertion time
Access time and cycle time timings corresponding to GPMC_CONFIG5: Access time and cycle time timings (in nanoseconds) corresponding to
- gpmc,page-burst-access: Multiple access word delay GPMC_CONFIG5:
- gpmc,access: Start-cycle to first data valid delay - gpmc,page-burst-access-ns: Multiple access word delay
- gpmc,rd-cycle: Total read cycle time - gpmc,access-ns: Start-cycle to first data valid delay
- gpmc,wr-cycle: Total write cycle time - gpmc,rd-cycle-ns: Total read cycle time
- gpmc,wr-cycle-ns: Total write cycle time
- gpmc,bus-turnaround-ns: Turn-around time between successive accesses
- gpmc,cycle2cycle-delay-ns: Delay between chip-select pulses
- gpmc,clk-activation-ns: GPMC clock activation time
- gpmc,wait-monitoring-ns: Start of wait monitoring with regard to valid
data
Boolean timing parameters. If property is present parameter enabled and
disabled if omitted:
- gpmc,adv-extra-delay: ADV signal is delayed by half GPMC clock
- gpmc,cs-extra-delay: CS signal is delayed by half GPMC clock
- gpmc,cycle2cycle-diffcsen: Add "cycle2cycle-delay" between successive
accesses to a different CS
- gpmc,cycle2cycle-samecsen: Add "cycle2cycle-delay" between successive
accesses to the same CS
- gpmc,oe-extra-delay: OE signal is delayed by half GPMC clock
- gpmc,we-extra-delay: WE signal is delayed by half GPMC clock
- gpmc,time-para-granularity: Multiply all access times by 2
The following are only applicable to OMAP3+ and AM335x: The following are only applicable to OMAP3+ and AM335x:
- gpmc,wr-access - gpmc,wr-access-ns: In synchronous write mode, for single or
- gpmc,wr-data-mux-bus burst accesses, defines the number of
GPMC_FCLK cycles from start access time
to the GPMC_CLK rising edge used by the
memory device for the first data capture.
- gpmc,wr-data-mux-bus-ns: In address-data multiplex mode, specifies
the time when the first data is driven on
the address-data bus.
GPMC chip-select settings properties for child nodes. All are optional. GPMC chip-select settings properties for child nodes. All are optional.
......
...@@ -1230,67 +1230,67 @@ void gpmc_read_settings_dt(struct device_node *np, struct gpmc_settings *p) ...@@ -1230,67 +1230,67 @@ void gpmc_read_settings_dt(struct device_node *np, struct gpmc_settings *p)
static void __maybe_unused gpmc_read_timings_dt(struct device_node *np, static void __maybe_unused gpmc_read_timings_dt(struct device_node *np,
struct gpmc_timings *gpmc_t) struct gpmc_timings *gpmc_t)
{ {
u32 val; struct gpmc_bool_timings *p;
if (!np || !gpmc_t)
return;
memset(gpmc_t, 0, sizeof(*gpmc_t)); memset(gpmc_t, 0, sizeof(*gpmc_t));
/* minimum clock period for syncronous mode */ /* minimum clock period for syncronous mode */
if (!of_property_read_u32(np, "gpmc,sync-clk", &val)) of_property_read_u32(np, "gpmc,sync-clk-ps", &gpmc_t->sync_clk);
gpmc_t->sync_clk = val;
/* chip select timtings */ /* chip select timtings */
if (!of_property_read_u32(np, "gpmc,cs-on", &val)) of_property_read_u32(np, "gpmc,cs-on-ns", &gpmc_t->cs_on);
gpmc_t->cs_on = val; of_property_read_u32(np, "gpmc,cs-rd-off-ns", &gpmc_t->cs_rd_off);
of_property_read_u32(np, "gpmc,cs-wr-off-ns", &gpmc_t->cs_wr_off);
if (!of_property_read_u32(np, "gpmc,cs-rd-off", &val))
gpmc_t->cs_rd_off = val;
if (!of_property_read_u32(np, "gpmc,cs-wr-off", &val))
gpmc_t->cs_wr_off = val;
/* ADV signal timings */ /* ADV signal timings */
if (!of_property_read_u32(np, "gpmc,adv-on", &val)) of_property_read_u32(np, "gpmc,adv-on-ns", &gpmc_t->adv_on);
gpmc_t->adv_on = val; of_property_read_u32(np, "gpmc,adv-rd-off-ns", &gpmc_t->adv_rd_off);
of_property_read_u32(np, "gpmc,adv-wr-off-ns", &gpmc_t->adv_wr_off);
if (!of_property_read_u32(np, "gpmc,adv-rd-off", &val))
gpmc_t->adv_rd_off = val;
if (!of_property_read_u32(np, "gpmc,adv-wr-off", &val))
gpmc_t->adv_wr_off = val;
/* WE signal timings */ /* WE signal timings */
if (!of_property_read_u32(np, "gpmc,we-on", &val)) of_property_read_u32(np, "gpmc,we-on-ns", &gpmc_t->we_on);
gpmc_t->we_on = val; of_property_read_u32(np, "gpmc,we-off-ns", &gpmc_t->we_off);
if (!of_property_read_u32(np, "gpmc,we-off", &val))
gpmc_t->we_off = val;
/* OE signal timings */ /* OE signal timings */
if (!of_property_read_u32(np, "gpmc,oe-on", &val)) of_property_read_u32(np, "gpmc,oe-on-ns", &gpmc_t->oe_on);
gpmc_t->oe_on = val; of_property_read_u32(np, "gpmc,oe-off-ns", &gpmc_t->oe_off);
if (!of_property_read_u32(np, "gpmc,oe-off", &val))
gpmc_t->oe_off = val;
/* access and cycle timings */ /* access and cycle timings */
if (!of_property_read_u32(np, "gpmc,page-burst-access", &val)) of_property_read_u32(np, "gpmc,page-burst-access-ns",
gpmc_t->page_burst_access = val; &gpmc_t->page_burst_access);
of_property_read_u32(np, "gpmc,access-ns", &gpmc_t->access);
if (!of_property_read_u32(np, "gpmc,access", &val)) of_property_read_u32(np, "gpmc,rd-cycle-ns", &gpmc_t->rd_cycle);
gpmc_t->access = val; of_property_read_u32(np, "gpmc,wr-cycle-ns", &gpmc_t->wr_cycle);
of_property_read_u32(np, "gpmc,bus-turnaround-ns",
if (!of_property_read_u32(np, "gpmc,rd-cycle", &val)) &gpmc_t->bus_turnaround);
gpmc_t->rd_cycle = val; of_property_read_u32(np, "gpmc,cycle2cycle-delay-ns",
&gpmc_t->cycle2cycle_delay);
if (!of_property_read_u32(np, "gpmc,wr-cycle", &val)) of_property_read_u32(np, "gpmc,wait-monitoring-ns",
gpmc_t->wr_cycle = val; &gpmc_t->wait_monitoring);
of_property_read_u32(np, "gpmc,clk-activation-ns",
/* only for OMAP3430 */ &gpmc_t->clk_activation);
if (!of_property_read_u32(np, "gpmc,wr-access", &val))
gpmc_t->wr_access = val; /* only applicable to OMAP3+ */
of_property_read_u32(np, "gpmc,wr-access-ns", &gpmc_t->wr_access);
if (!of_property_read_u32(np, "gpmc,wr-data-mux-bus", &val)) of_property_read_u32(np, "gpmc,wr-data-mux-bus-ns",
gpmc_t->wr_data_mux_bus = val; &gpmc_t->wr_data_mux_bus);
/* bool timing parameters */
p = &gpmc_t->bool_timings;
p->cycle2cyclediffcsen =
of_property_read_bool(np, "gpmc,cycle2cycle-diffcsen");
p->cycle2cyclesamecsen =
of_property_read_bool(np, "gpmc,cycle2cycle-samecsen");
p->we_extra_delay = of_property_read_bool(np, "gpmc,we-extra-delay");
p->oe_extra_delay = of_property_read_bool(np, "gpmc,oe-extra-delay");
p->adv_extra_delay = of_property_read_bool(np, "gpmc,adv-extra-delay");
p->cs_extra_delay = of_property_read_bool(np, "gpmc,cs-extra-delay");
p->time_para_granularity =
of_property_read_bool(np, "gpmc,time-para-granularity");
} }
#ifdef CONFIG_MTD_NAND #ifdef CONFIG_MTD_NAND
......
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