ARM: OMAP2+: Add function to read GPMC settings from device-tree
Adds a function to read the various GPMC chip-select settings from device-tree and store them in the gpmc_settings structure. Update the GPMC device-tree binding documentation to describe these options. Signed-off-by: Jon Hunter <jon-hunter@ti.com> Tested-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
This commit is contained in:
parent
3a544354d5
commit
8c8a777127
3 changed files with 65 additions and 0 deletions
|
@ -65,6 +65,29 @@ The following are only applicable to OMAP3+ and AM335x:
|
||||||
- gpmc,wr-access
|
- gpmc,wr-access
|
||||||
- gpmc,wr-data-mux-bus
|
- gpmc,wr-data-mux-bus
|
||||||
|
|
||||||
|
GPMC chip-select settings properties for child nodes. All are optional.
|
||||||
|
|
||||||
|
- gpmc,burst-length Page/burst length. Must be 4, 8 or 16.
|
||||||
|
- gpmc,burst-wrap Enables wrap bursting
|
||||||
|
- gpmc,burst-read Enables read page/burst mode
|
||||||
|
- gpmc,burst-write Enables write page/burst mode
|
||||||
|
- gpmc,device-nand Device is NAND
|
||||||
|
- gpmc,device-width Total width of device(s) connected to a GPMC
|
||||||
|
chip-select in bytes. The GPMC supports 8-bit
|
||||||
|
and 16-bit devices and so this property must be
|
||||||
|
1 or 2.
|
||||||
|
- gpmc,mux-add-data Address and data multiplexing configuration.
|
||||||
|
Valid values are 1 for address-address-data
|
||||||
|
multiplexing mode and 2 for address-data
|
||||||
|
multiplexing mode.
|
||||||
|
- gpmc,sync-read Enables synchronous read. Defaults to asynchronous
|
||||||
|
is this is not set.
|
||||||
|
- gpmc,sync-write Enables synchronous writes. Defaults to asynchronous
|
||||||
|
is this is not set.
|
||||||
|
- gpmc,wait-pin Wait-pin used by client. Must be less than
|
||||||
|
"gpmc,num-waitpins".
|
||||||
|
- gpmc,wait-on-read Enables wait monitoring on reads.
|
||||||
|
- gpmc,wait-on-write Enables wait monitoring on writes.
|
||||||
|
|
||||||
Example for an AM33xx board:
|
Example for an AM33xx board:
|
||||||
|
|
||||||
|
|
|
@ -1187,6 +1187,46 @@ static struct of_device_id gpmc_dt_ids[] = {
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, gpmc_dt_ids);
|
MODULE_DEVICE_TABLE(of, gpmc_dt_ids);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gpmc_read_settings_dt - read gpmc settings from device-tree
|
||||||
|
* @np: pointer to device-tree node for a gpmc child device
|
||||||
|
* @p: pointer to gpmc settings structure
|
||||||
|
*
|
||||||
|
* Reads the GPMC settings for a GPMC child device from device-tree and
|
||||||
|
* stores them in the GPMC settings structure passed. The GPMC settings
|
||||||
|
* structure is initialised to zero by this function and so any
|
||||||
|
* previously stored settings will be cleared.
|
||||||
|
*/
|
||||||
|
void gpmc_read_settings_dt(struct device_node *np, struct gpmc_settings *p)
|
||||||
|
{
|
||||||
|
memset(p, 0, sizeof(struct gpmc_settings));
|
||||||
|
|
||||||
|
p->sync_read = of_property_read_bool(np, "gpmc,sync-read");
|
||||||
|
p->sync_write = of_property_read_bool(np, "gpmc,sync-write");
|
||||||
|
p->device_nand = of_property_read_bool(np, "gpmc,device-nand");
|
||||||
|
of_property_read_u32(np, "gpmc,device-width", &p->device_width);
|
||||||
|
of_property_read_u32(np, "gpmc,mux-add-data", &p->mux_add_data);
|
||||||
|
|
||||||
|
if (!of_property_read_u32(np, "gpmc,burst-length", &p->burst_len)) {
|
||||||
|
p->burst_wrap = of_property_read_bool(np, "gpmc,burst-wrap");
|
||||||
|
p->burst_read = of_property_read_bool(np, "gpmc,burst-read");
|
||||||
|
p->burst_write = of_property_read_bool(np, "gpmc,burst-write");
|
||||||
|
if (!p->burst_read && !p->burst_write)
|
||||||
|
pr_warn("%s: page/burst-length set but not used!\n",
|
||||||
|
__func__);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!of_property_read_u32(np, "gpmc,wait-pin", &p->wait_pin)) {
|
||||||
|
p->wait_on_read = of_property_read_bool(np,
|
||||||
|
"gpmc,wait-on-read");
|
||||||
|
p->wait_on_write = of_property_read_bool(np,
|
||||||
|
"gpmc,wait-on-write");
|
||||||
|
if (!p->wait_on_read && !p->wait_on_write)
|
||||||
|
pr_warn("%s: read/write wait monitoring not enabled!\n",
|
||||||
|
__func__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -225,5 +225,7 @@ extern void gpmc_cs_free(int cs);
|
||||||
extern void omap3_gpmc_save_context(void);
|
extern void omap3_gpmc_save_context(void);
|
||||||
extern void omap3_gpmc_restore_context(void);
|
extern void omap3_gpmc_restore_context(void);
|
||||||
extern int gpmc_configure(int cmd, int wval);
|
extern int gpmc_configure(int cmd, int wval);
|
||||||
|
extern void gpmc_read_settings_dt(struct device_node *np,
|
||||||
|
struct gpmc_settings *p);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue