ARM: OMAP2+: Add function to read GPMC settings from device-tree
authorJon Hunter <jon-hunter@ti.com>
Wed, 20 Feb 2013 21:53:12 +0000 (15:53 -0600)
committerJon Hunter <jon-hunter@ti.com>
Mon, 1 Apr 2013 19:53:45 +0000 (14:53 -0500)
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>
Documentation/devicetree/bindings/bus/ti-gpmc.txt
arch/arm/mach-omap2/gpmc.c
arch/arm/mach-omap2/gpmc.h

index 5ddb2e9efaaacf020a75b1d6b5c6b05908b6cd2a..6fde1cfe51f816a25fb06e236eefc5fa0ece062b 100644 (file)
@@ -65,6 +65,29 @@ The following are only applicable to OMAP3+ and AM335x:
  - gpmc,wr-access
  - 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:
 
index b22771b4d9f22de0fa00d3ef6451e48107bdb7b5..85231b3a217e650ba4ee156ab887f1d395a0081e 100644 (file)
@@ -1187,6 +1187,46 @@ static struct of_device_id 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,
                                                struct gpmc_timings *gpmc_t)
 {
index 87d2a226a3ba9baedc52076d677ecacb20e3f189..707f6d58edd53d300a1b266cc229b3f9c1edd8f3 100644 (file)
@@ -225,5 +225,7 @@ extern void gpmc_cs_free(int cs);
 extern void omap3_gpmc_save_context(void);
 extern void omap3_gpmc_restore_context(void);
 extern int gpmc_configure(int cmd, int wval);
+extern void gpmc_read_settings_dt(struct device_node *np,
+                                 struct gpmc_settings *p);
 
 #endif