Skip to contentSkip to conversation

dt: device tree support for TI EMIF driver for 3.6

PATCH Superseded Santosh Shilimkar 4 participants 19 messages Jun 14, 2012 – Jun 30, 2012

Subsystems (3)

v3 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

v3 cover dt: device tree support for TI EMIF driver for 3.6

Tony,

Here is the EMIF driver DT support which was kept on hold for the driver to get merged. The series has been already reviewed on the list.

This series adds device tree support for TI EMIF SDRAM controller driver. For this, a binding has been added for representing AC timing parameters and other details of LPDDR2 memories.

v3:
Rebased against the 3.5-rc2. The series is aslo available at:
git://github.com/SantoshShilimkar/linux.git for_3.6/emif_dt

Aneesh V (4):
dt: device tree bindings for LPDDR2 memories
dt: emif: device tree bindings for TI's EMIF sdram controller
arm: dts: EMIF and LPDDR2 device tree data for OMAP4 boards
memory: emif: add device tree support to emif driver

 .../devicetree/bindings/lpddr2/lpddr2-timings.txt  |   52 ++++
 .../devicetree/bindings/lpddr2/lpddr2.txt          |  102 +++++++
 .../bindings/memory-controllers/ti/emif.txt        |   55 ++++
 arch/arm/boot/dts/elpida_ecb240abacn.dtsi          |   67 +++++
 arch/arm/boot/dts/omap4-panda.dts                  |   13 +
 arch/arm/boot/dts/omap4-sdp.dts                    |   13 +
 arch/arm/boot/dts/omap4.dtsi                       |   18 ++
 drivers/memory/emif.c                              |  285 +++++++++++++++++++-
 8 files changed, 604 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/devicetree/bindings/lpddr2/lpddr2-timings.txt
 create mode 100644 Documentation/devicetree/bindings/lpddr2/lpddr2.txt
 create mode 100644 Documentation/devicetree/bindings/memory-controllers/ti/emif.txt
 create mode 100644 arch/arm/boot/dts/elpida_ecb240abacn.dtsi
Signature · 1 line
1.7.9.5
#1 lore raw

PATCH v3 1/4 dt: device tree bindings for LPDDR2 memories

From: Aneesh V <[email protected]>

device tree bindings for LPDDR2 SDRAM memories compliant to JESD209-2 standard.

The 'lpddr2' binding in-turn uses another binding 'lpddr2-timings' for specifying the AC timing parameters of the memory device at different speed-bins.

[santosh.shilimkar at ti.com: Rebased against 3.5-rc]
---
 .../devicetree/bindings/lpddr2/lpddr2-timings.txt  |   52 ++++++++++
 .../devicetree/bindings/lpddr2/lpddr2.txt          |  102 ++++++++++++++++++++
 2 files changed, 154 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/lpddr2/lpddr2-timings.txt
 create mode 100644 Documentation/devicetree/bindings/lpddr2/lpddr2.txt
Documentation/devicetree/bindings/lpddr2/lpddr2-timings.txt new file +52 -0
new file mode 100644
index 0000000..9ceb19e
@@ -0,0 +1,52 @@
+* AC timing parameters of LPDDR2(JESD209-2) memories for a given speed-bin
+
+Required properties:
+- compatible : Should be "jedec,lpddr2-timings"
+- min-freq : minimum DDR clock frequency for the speed-bin. Type is <u32>
+- max-freq : maximum DDR clock frequency for the speed-bin. Type is <u32>
+
+Optional properties:
+
+The following properties represent AC timing parameters from the memory
+data-sheet of the device for a given speed-bin. All these properties are
+of type <u32> and the default unit is ps (pico seconds). Parameters with
+a different unit have a suffix indicating the unit such as 'tRAS-max-ns'
+- tRCD
+- tWR
+- tRAS-min
+- tRRD
+- tWTR
+- tXP
+- tRTP
+- tDQSCK-max
+- tFAW
+- tZQCS
+- tZQinit
+- tRPab
+- tZQCL
+- tCKESR
+- tRAS-max-ns
+- tDQSCK-max-derated
+
+Example:
+
+timings_elpida_ECB240ABACN_400mhz: lpddr2-timings at 0 {
+	compatible	= "jedec,lpddr2-timings";
+	min-freq	= <10000000>;
+	max-freq	= <400000000>;
+	tRPab		= <21000>;
+	tRCD		= <18000>;
+	tWR		= <15000>;
+	tRAS-min	= <42000>;
+	tRRD		= <10000>;
+	tWTR		= <7500>;
+	tXP		= <7500>;
+	tRTP		= <7500>;
+	tCKESR		= <15000>;
+	tDQSCK-max	= <5500>;
+	tFAW		= <50000>;
+	tZQCS		= <90000>;
+	tZQCL		= <360000>;
+	tZQinit		= <1000000>;
+	tRAS-max-ns	= <70000>;
+};
Documentation/devicetree/bindings/lpddr2/lpddr2.txt new file +102 -0

102 lines not on this page · raw message

Signature · 1 line
1.7.9.5
#2 lore raw

PATCH v3 2/4 dt: emif: device tree bindings for TI's EMIF sdram controller

In reply to Santosh Shilimkar

From: Aneesh V <[email protected]>

EMIF - External Memory Interface - is an SDRAM controller used in TI SoCs. EMIF supports, based on the IP revision, one or more of DDR2/DDR3/LPDDR2 protocols. This binding describes a given instance of the EMIF IP and memory parts attached to it.

[santosh.shilimkar at ti.com: Rebased against 3.5-rc]
---
 .../bindings/memory-controllers/ti/emif.txt        |   55 ++++++++++++++++++++
 1 file changed, 55 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/memory-controllers/ti/emif.txt
Documentation/devicetree/bindings/memory-controllers/ti/emif.txt new file +55 -0
new file mode 100644
index 0000000..938f8e1
@@ -0,0 +1,55 @@
+* EMIF family of TI SDRAM controllers
+
+EMIF - External Memory Interface - is an SDRAM controller used in
+TI SoCs. EMIF supports, based on the IP revision, one or more of
+DDR2/DDR3/LPDDR2 protocols. This binding describes a given instance
+of the EMIF IP and memory parts attached to it.
+
+Required properties:
+- compatible	: Should be of the form "ti,emif-<ip-rev>" where <ip-rev>
+  is the IP revision of the specific EMIF instance.
+
+- phy-type	: <u32> indicating the DDR phy type. Following are the
+  allowed values
+  <1>	: Attila PHY
+  <2>	: Intelli PHY
+
+- device-handle	: phandle to a "lpddr2" node representing the memory part
+
+- ti,hwmods	: For TI hwmods processing and omap device creation
+  the value shall be "emif<n>" where <n> is the number of the EMIF
+  instance with base 1.
+
+Optional properties:
+- cs1-used		: Have this property if CS1 of this EMIF
+  instance has a memory part attached to it. If there is a memory
+  part attached to CS1, it should be the same type as the one on CS0,
+  so there is no need to give the details of this memory part.
+
+- cal-resistor-per-cs	: Have this property if the board has one
+  calibration resistor per chip-select.
+
+- hw-caps-read-idle-ctrl: Have this property if the controller
+  supports read idle window programming
+
+- hw-caps-dll-calib-ctrl: Have this property if the controller
+  supports dll calibration control
+
+- hw-caps-ll-interface	: Have this property if the controller
+  has a low latency interface and corresponding interrupt events
+
+- hw-caps-temp-alert	: Have this property if the controller
+  has capability for generating SDRAM temperature alerts
+
+Example:
+
+emif1: emif at 0x4c000000 {
+	compatible	= "ti,emif-4d";
+	ti,hwmods	= "emif2";
+	phy-type	= <1>;
+	device-handle	= <&elpida_ECB240ABACN>;
+	cs1-used;
+	hw-caps-read-idle-ctrl;
+	hw-caps-ll-interface;
+	hw-caps-temp-alert;
+};
Signature · 1 line
1.7.9.5
#3 lore raw

PATCH v3 3/4 arm: dts: EMIF and LPDDR2 device tree data for OMAP4 boards

In reply to Santosh Shilimkar

From: Aneesh V <[email protected]>

Device tree data for the EMIF sdram controllers in OMAP4 and LPDDR2 memory devices attached to OMAP4 boards.

[santosh.shilimkar at ti.com: Rebased against 3.5-rc]
---
 arch/arm/boot/dts/elpida_ecb240abacn.dtsi |   67 +++++++++++++++++++++++++++++
 arch/arm/boot/dts/omap4-panda.dts         |   13 ++++++
 arch/arm/boot/dts/omap4-sdp.dts           |   13 ++++++
 arch/arm/boot/dts/omap4.dtsi              |   18 ++++++++
 4 files changed, 111 insertions(+)
 create mode 100644 arch/arm/boot/dts/elpida_ecb240abacn.dtsi
arch/arm/boot/dts/elpida_ecb240abacn.dtsi new file +67 -0
new file mode 100644
index 0000000..f97f70f
@@ -0,0 +1,67 @@
+/*
+ * Common devices used in different OMAP boards
+ */
+
+/ {
+	elpida_ECB240ABACN: lpddr2 {
+		compatible	= "Elpida,ECB240ABACN","jedec,lpddr2-s4";
+		density		= <2048>;
+		io-width	= <32>;
+
+		tRPab-min-tck	= <3>;
+		tRCD-min-tck	= <3>;
+		tWR-min-tck	= <3>;
+		tRASmin-min-tck	= <3>;
+		tRRD-min-tck	= <2>;
+		tWTR-min-tck	= <2>;
+		tXP-min-tck	= <2>;
+		tRTP-min-tck	= <2>;
+		tCKE-min-tck	= <3>;
+		tCKESR-min-tck	= <3>;
+		tFAW-min-tck	= <8>;
+
+		timings_elpida_ECB240ABACN_400mhz: lpddr2-timings at 0 {
+			compatible	= "jedec,lpddr2-timings";
+			min-freq	= <10000000>;
+			max-freq	= <400000000>;
+			tRPab		= <21000>;
+			tRCD		= <18000>;
+			tWR		= <15000>;
+			tRAS-min	= <42000>;
+			tRRD		= <10000>;
+			tWTR		= <7500>;
+			tXP		= <7500>;
+			tRTP		= <7500>;
+			tCKESR		= <15000>;
+			tDQSCK-max	= <5500>;
+			tFAW		= <50000>;
+			tZQCS		= <90000>;
+			tZQCL		= <360000>;
+			tZQinit		= <1000000>;
+			tRAS-max-ns	= <70000>;
+			tDQSCK-max-derated = <6000>;
+		};
+
+		timings_elpida_ECB240ABACN_200mhz: lpddr2-timings at 1 {
+			compatible	= "jedec,lpddr2-timings";
+			min-freq	= <10000000>;
+			max-freq	= <200000000>;
+			tRPab		= <21000>;
+			tRCD		= <18000>;
+			tWR		= <15000>;
+			tRAS-min	= <42000>;
+			tRRD		= <10000>;
+			tWTR		= <10000>;
+			tXP		= <7500>;
+			tRTP		= <7500>;
+			tCKESR		= <15000>;
+			tDQSCK-max	= <5500>;
+			tFAW		= <50000>;
+			tZQCS		= <90000>;
+			tZQCL		= <360000>;
+			tZQinit		= <1000000>;
+			tRAS-max-ns	= <70000>;
+			tDQSCK-max-derated = <6000>;
+		};
+	};
+};
arch/arm/boot/dts/omap4-panda.dts +13 -0
index 1efe0c5..08a0b21 100644
@@ -8,6 +8,7 @@
 /dts-v1/;
 
 /include/ "omap4.dtsi"
+/include/ "elpida_ecb240abacn.dtsi"
 
 / {
 	model = "TI OMAP4 PandaBoard";
@@ -32,6 +33,18 @@
 			linux,default-trigger = "mmc0";
 		};
 	};
+
+	ocp {
+		emif1: emif at 0x4c000000 {
+			cs1-used;
+			device-handle = <&elpida_ECB240ABACN>;
+		};
+
+		emif2: emif at 0x4d000000 {
+			cs1-used;
+			device-handle = <&elpida_ECB240ABACN>;
+		};
+	};
 };
 
 &i2c1 {
arch/arm/boot/dts/omap4-sdp.dts +13 -0
index d08c4d1..562f03e 100644
@@ -8,6 +8,7 @@
 /dts-v1/;
 
 /include/ "omap4.dtsi"
+/include/ "elpida_ecb240abacn.dtsi"
 
 / {
 	model = "TI OMAP4 SDP board";
@@ -70,6 +71,18 @@
 			gpios = <&gpio5 11 0>; /* 139 */
 		};
 	};
+
+	ocp {
+		emif1: emif at 0x4c000000 {
+			cs1-used;
+			device-handle = <&elpida_ECB240ABACN>;
+		};
+
+		emif2: emif at 0x4d000000 {
+			cs1-used;
+			device-handle = <&elpida_ECB240ABACN>;
+		};
+	};
 };
 
 &i2c1 {
arch/arm/boot/dts/omap4.dtsi +18 -0
index 359c497..08813c4 100644
@@ -272,5 +272,23 @@
 			ti,hwmods = "mmc5";
 			ti,needs-special-reset;
 		};
+
+		emif1: emif at 0x4c000000 {
+			compatible	= "ti,emif-4d";
+			ti,hwmods	= "emif1";
+			phy-type	= <1>;
+			hw-caps-read-idle-ctrl;
+			hw-caps-ll-interface;
+			hw-caps-temp-alert;
+		};
+
+		emif2: emif at 0x4d000000 {
+			compatible	= "ti,emif-4d";
+			ti,hwmods	= "emif2";
+			phy-type	= <1>;
+			hw-caps-read-idle-ctrl;
+			hw-caps-ll-interface;
+			hw-caps-temp-alert;
+		};
 	};
 };
Signature · 1 line
1.7.9.5
#4 lore raw

PATCH v3 4/4 memory: emif: add device tree support to emif driver

In reply to Santosh Shilimkar

From: Aneesh V <[email protected]>

Device tree support for the EMIF driver.

[santosh.shilimkar at ti.com: Rebased against 3.5-rc]
Cc Greg Kroah-Hartman <[email protected]>
---
 drivers/memory/emif.c |  285 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 284 insertions(+), 1 deletion(-)
drivers/memory/emif.c +284 -1
index 33a4396..10a2955 100644
@@ -18,6 +18,7 @@
 #include <linux/platform_device.h>
 #include <linux/interrupt.h>
 #include <linux/slab.h>
+#include <linux/of.h>
 #include <linux/debugfs.h>
 #include <linux/seq_file.h>
 #include <linux/module.h>
@@ -49,6 +50,7 @@
  *				frequency in effect at the moment)
  * @plat_data:			Pointer to saved platform data.
  * @debugfs_root:		dentry to the root folder for EMIF in debugfs
+ * @np_ddr:			Pointer to ddr device tree node
  */
 struct emif_data {
 	u8				duplicate;
@@ -63,6 +65,7 @@ struct emif_data {
 	struct emif_regs		*curr_regs;
 	struct emif_platform_data	*plat_data;
 	struct dentry			*debugfs_root;
+	struct device_node		*np_ddr;
 };
 
 static struct emif_data *emif1;
@@ -1148,6 +1151,270 @@ static int is_custom_config_valid(struct emif_custom_configs *cust_cfgs,
 	return valid;
 }
 
+#if defined(CONFIG_OF)
+static void __init_or_module of_get_custom_configs(struct device_node *np_emif,
+		struct emif_data *emif)
+{
+	struct emif_custom_configs	*cust_cfgs = NULL;
+	int				len;
+	const int			*lpmode, *poll_intvl;
+
+	lpmode = of_get_property(np_emif, "low-power-mode", &len);
+	poll_intvl = of_get_property(np_emif, "temp-alert-poll-interval", &len);
+
+	if (lpmode || poll_intvl)
+		cust_cfgs = devm_kzalloc(emif->dev, sizeof(*cust_cfgs),
+			GFP_KERNEL);
+
+	if (!cust_cfgs)
+		return;
+
+	if (lpmode) {
+		cust_cfgs->mask |= EMIF_CUSTOM_CONFIG_LPMODE;
+		cust_cfgs->lpmode = *lpmode;
+		of_property_read_u32(np_emif,
+				"low-power-mode-timeout-performance",
+				&cust_cfgs->lpmode_timeout_performance);
+		of_property_read_u32(np_emif,
+				"low-power-mode-timeout-power",
+				&cust_cfgs->lpmode_timeout_power);
+		of_property_read_u32(np_emif,
+				"low-power-mode-freq-threshold",
+				&cust_cfgs->lpmode_freq_threshold);
+	}
+
+	if (poll_intvl) {
+		cust_cfgs->mask |=
+				EMIF_CUSTOM_CONFIG_TEMP_ALERT_POLL_INTERVAL;
+		cust_cfgs->temp_alert_poll_interval_ms = *poll_intvl;
+	}
+
+	if (!is_custom_config_valid(cust_cfgs, emif->dev)) {
+		devm_kfree(emif->dev, cust_cfgs);
+		return;
+	}
+
+	emif->plat_data->custom_configs = cust_cfgs;
+}
+
+static void __init_or_module of_get_min_tck(struct device_node *np,
+		struct emif_data *emif)
+{
+	int			ret = 0;
+	struct lpddr2_min_tck	*min;
+
+	min = devm_kzalloc(emif->dev, sizeof(*min), GFP_KERNEL);
+	if (!min)
+		goto default_min_tck;
+
+	ret |= of_property_read_u32(np, "tRPab-min-tck", &min->tRPab);
+	ret |= of_property_read_u32(np, "tRCD-min-tck", &min->tRCD);
+	ret |= of_property_read_u32(np, "tWR-min-tck", &min->tWR);
+	ret |= of_property_read_u32(np, "tRASmin-min-tck", &min->tRASmin);
+	ret |= of_property_read_u32(np, "tRRD-min-tck", &min->tRRD);
+	ret |= of_property_read_u32(np, "tWTR-min-tck", &min->tWTR);
+	ret |= of_property_read_u32(np, "tXP-min-tck", &min->tXP);
+	ret |= of_property_read_u32(np, "tRTP-min-tck", &min->tRTP);
+	ret |= of_property_read_u32(np, "tCKE-min-tck", &min->tCKE);
+	ret |= of_property_read_u32(np, "tCKESR-min-tck", &min->tCKESR);
+	ret |= of_property_read_u32(np, "tFAW-min-tck", &min->tFAW);
+
+	if (ret) {
+		devm_kfree(emif->dev, min);
+		goto default_min_tck;
+	}
+
+	emif->plat_data->min_tck = min;
+	return;
+
+default_min_tck:
+	dev_warn(emif->dev, "%s: using default min-tck values\n", __func__);
+	emif->plat_data->min_tck = &lpddr2_jedec_min_tck;
+}
+
+static int __init_or_module of_do_get_timings(struct device_node *np,
+		struct lpddr2_timings *tim)
+{
+	int ret;
+
+	ret = of_property_read_u32(np, "max-freq", &tim->max_freq);
+	ret |= of_property_read_u32(np, "min-freq", &tim->min_freq);
+	ret |= of_property_read_u32(np, "tRPab", &tim->tRPab);
+	ret |= of_property_read_u32(np, "tRCD", &tim->tRCD);
+	ret |= of_property_read_u32(np, "tWR", &tim->tWR);
+	ret |= of_property_read_u32(np, "tRAS-min", &tim->tRAS_min);
+	ret |= of_property_read_u32(np, "tRRD", &tim->tRRD);
+	ret |= of_property_read_u32(np, "tWTR", &tim->tWTR);
+	ret |= of_property_read_u32(np, "tXP", &tim->tXP);
+	ret |= of_property_read_u32(np, "tRTP", &tim->tRTP);
+	ret |= of_property_read_u32(np, "tCKESR", &tim->tCKESR);
+	ret |= of_property_read_u32(np, "tDQSCK-max", &tim->tDQSCK_max);
+	ret |= of_property_read_u32(np, "tFAW", &tim->tFAW);
+	ret |= of_property_read_u32(np, "tZQCS", &tim->tZQCS);
+	ret |= of_property_read_u32(np, "tZQCL", &tim->tZQCL);
+	ret |= of_property_read_u32(np, "tZQinit", &tim->tZQinit);
+	ret |= of_property_read_u32(np, "tRAS-max-ns", &tim->tRAS_max_ns);
+	ret |= of_property_read_u32(np, "tDQSCK-max-derated",
+		&tim->tDQSCK_max_derated);
+
+	return ret;
+}
+
+static void __init_or_module of_get_ddr_timings(struct device_node *np_ddr,
+		struct emif_data *emif)
+{
+	struct lpddr2_timings	*timings = NULL;
+	u32			arr_sz = 0, i = 0;
+	struct device_node	*np_tim;
+	char			*tim_compat;
+
+	switch (emif->plat_data->device_info->type) {
+	case DDR_TYPE_LPDDR2_S2:
+	case DDR_TYPE_LPDDR2_S4:
+		tim_compat = "jedec,lpddr2-timings";
+		break;
+	default:
+		dev_warn(emif->dev, "%s: un-supported memory type\n", __func__);
+	}
+
+	for_each_child_of_node(np_ddr, np_tim)
+		if (of_device_is_compatible(np_tim, tim_compat))
+			arr_sz++;
+
+	if (arr_sz)
+		timings = devm_kzalloc(emif->dev, sizeof(*timings) * arr_sz,
+			GFP_KERNEL);
+
+	if (!timings)
+		goto default_timings;
+
+	for_each_child_of_node(np_ddr, np_tim) {
+		if (of_device_is_compatible(np_tim, tim_compat)) {
+			if (of_do_get_timings(np_tim, &timings[i])) {
+				devm_kfree(emif->dev, timings);
+				goto default_timings;
+			}
+			i++;
+		}
+	}
+
+	emif->plat_data->timings = timings;
+	emif->plat_data->timings_arr_size = arr_sz;
+
+	return;
+
+default_timings:
+	get_default_timings(emif);
+
+	return;
+}
+
+static void __init_or_module of_get_ddr_info(struct device_node *np_emif,
+		struct device_node *np_ddr,
+		struct ddr_device_info *dev_info)
+{
+	u32 density = 0, io_width = 0;
+	int len;
+
+	if (of_find_property(np_emif, "cs1-used", &len))
+		dev_info->cs1_used = true;
+
+	if (of_find_property(np_emif, "cal-resistor-per-cs", &len))
+		dev_info->cal_resistors_per_cs = true;
+
+	if (of_device_is_compatible(np_ddr , "jedec,lpddr2-s4"))
+		dev_info->type = DDR_TYPE_LPDDR2_S4;
+	else if (of_device_is_compatible(np_ddr , "jedec,lpddr2-s2"))
+		dev_info->type = DDR_TYPE_LPDDR2_S2;
+
+	of_property_read_u32(np_ddr, "density", &density);
+	of_property_read_u32(np_ddr, "io-width", &io_width);
+
+	/* Convert from density in Mb to the density encoding in jedc_ddr.h */
+	if (density & (density - 1))
+		dev_info->density = 0;
+	else
+		dev_info->density = __fls(density) - 5;
+
+	/* Convert from io_width in bits to io_width encoding in jedc_ddr.h */
+	if (io_width & (io_width - 1))
+		dev_info->io_width = 0;
+	else
+		dev_info->io_width = __fls(io_width) - 1;
+}
+
+static struct emif_data * __init_or_module of_get_device_details(
+		struct device_node *np_emif, struct device *dev)
+{
+	struct emif_data		*emif = NULL;
+	struct ddr_device_info		*dev_info = NULL;
+	struct emif_platform_data	*pd = NULL;
+	struct device_node		*np_ddr;
+	int				len;
+
+	np_ddr = of_parse_phandle(np_emif, "device-handle", 0);
+	if (!np_ddr)
+		goto error;
+	emif	= devm_kzalloc(dev, sizeof(struct emif_data), GFP_KERNEL);
+	pd	= devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
+	dev_info = devm_kzalloc(dev, sizeof(*dev_info), GFP_KERNEL);
+
+	if (!emif || !pd || !dev_info) {
+		dev_err(dev, "%s: of_get_device_details() failure!!\n",
+			__func__);
+		goto error;
+	}
+
+	emif->plat_data		= pd;
+	pd->device_info		= dev_info;
+	emif->dev		= dev;
+	emif->np_ddr		= np_ddr;
+	emif->temperature_level	= SDRAM_TEMP_NOMINAL;
+
+	if (of_device_is_compatible(np_emif, "ti,emif-4d"))
+		emif->plat_data->ip_rev = EMIF_4D;
+	else if (of_device_is_compatible(np_emif, "ti,emif-4d5"))
+		emif->plat_data->ip_rev = EMIF_4D5;
+
+	of_property_read_u32(np_emif, "phy-type", &pd->phy_type);
+
+	if (of_find_property(np_emif, "hw-caps-ll-interface", &len))
+		pd->hw_caps |= EMIF_HW_CAPS_LL_INTERFACE;
+
+	of_get_ddr_info(np_emif, np_ddr, dev_info);
+	if (!is_dev_data_valid(pd->device_info->type, pd->device_info->density,
+			pd->device_info->io_width, pd->phy_type, pd->ip_rev,
+			emif->dev)) {
+		dev_err(dev, "%s: invalid device data!!\n", __func__);
+		goto error;
+	}
+	/*
+	 * For EMIF instances other than EMIF1 see if the devices connected
+	 * are exactly same as on EMIF1(which is typically the case). If so,
+	 * mark it as a duplicate of EMIF1. This will save some memory and
+	 * computation.
+	 */
+	if (emif1 && emif1->np_ddr == np_ddr) {
+		emif->duplicate = true;
+		goto out;
+	} else if (emif1) {
+		dev_warn(emif->dev, "%s: Non-symmetric DDR geometry\n",
+			__func__);
+	}
+
+
+	of_get_custom_configs(np_emif, emif);
+	of_get_ddr_timings(np_ddr, emif);
+	of_get_min_tck(np_ddr, emif);
+	goto out;
+
+error:
+	return NULL;
+out:
+	return emif;
+}
+#endif
+
 static struct emif_data *__init_or_module get_device_details(
 		struct platform_device *pdev)
 {
@@ -1267,7 +1534,13 @@ static int __init_or_module emif_probe(struct platform_device *pdev)
 	struct resource		*res;
 	int			irq;
 
-	emif = get_device_details(pdev);
+#if defined(CONFIG_OF)
+	if (pdev->dev.of_node)
+		emif = of_get_device_details(pdev->dev.of_node, &pdev->dev);
+	else
+#endif
+		emif = get_device_details(pdev);
+
 	if (!emif) {
 		pr_err("%s: error getting device data\n", __func__);
 		goto error;
@@ -1644,11 +1917,21 @@ static void __attribute__((unused)) freq_post_notify_handling(void)
 	spin_unlock_irqrestore(&emif_lock, irq_state);
 }
 
+#if defined(CONFIG_OF)
+static const struct of_device_id emif_of_match[] = {
+		{ .compatible = "ti,emif-4d" },
+		{ .compatible = "ti,emif-4d5" },
+		{},
+};
+MODULE_DEVICE_TABLE(of, emif_of_match);
+#endif
+
 static struct platform_driver emif_driver = {
 	.remove		= __exit_p(emif_remove),
 	.shutdown	= emif_shutdown,
 	.driver = {
 		.name = "emif",
+		.of_match_table = of_match_ptr(emif_of_match),
 	},
 };
 
Signature · 1 line
1.7.9.5
#5 lore raw

PATCH v3 4/4 memory: emif: add device tree support to emif driver

Quoted 11 lines · Santosh Shilimkar

From: Aneesh V <[email protected]>

Device tree support for the EMIF driver.

[santosh.shilimkar at ti.com: Rebased against 3.5-rc]
Cc Greg Kroah-Hartman <[email protected]>

Am I the memory maintainer now taking these patches?

drivers/memory/emif.c static int __init_or_module emif_probe(struct platform_device *pdev) · line 1543

Quoted 12 lines
drivers/memory/emif.c +7 -1
@@ -1267,7 +1534,13 @@ static int __init_or_module emif_probe(struct platform_device *pdev)
 	struct resource		*res;
 	int			irq;
 
-	emif = get_device_details(pdev);
+#if defined(CONFIG_OF)
+	if (pdev->dev.of_node)
+		emif = of_get_device_details(pdev->dev.of_node, &pdev->dev);
+	else
+#endif
+		emif = get_device_details(pdev);
+

Can't you do this without the #ifdef?

thanks,

greg k-h

#6 lore raw

PATCH v3 4/4 memory: emif: add device tree support to emif driver

Quoted 14 lines · Greg Kroah-Hartman
Quoted 11 lines · Santosh Shilimkar

From: Aneesh V <[email protected]>

Device tree support for the EMIF driver.

[santosh.shilimkar at ti.com: Rebased against 3.5-rc]
Cc Greg Kroah-Hartman <[email protected]>
Quoted 2 lines

Am I the memory maintainer now taking these patches?

I assumed that.
With your ack, $subject patch should go along with other 3 OMAP platform patches because of dependency.

Quoted 5 lines
Quoted 5 lines
(quoted diff) +0 -0
@@ -1267,7 +1534,13 @@ static int __init_or_module emif_probe(struct
 platform_device *pdev)
 ? ? ? struct resource ? ? ? ? *res;
 ? ? ? int ? ? ? ? ? ? ? ? ? ? irq;
 
Quoted 12 lines

Review static int __init_or_module emif_probe(struct · line 1545

Quoted 9 lines
(quoted diff) +7 -1
- ? ? emif = get_device_details(pdev);
+#if defined(CONFIG_OF)
+ ? ? if (pdev->dev.of_node)
+ ? ? ? ? ? ? emif = of_get_device_details(pdev->dev.of_node,
 &pdev->dev);
+ ? ? else
+#endif
+ ? ? ? ? ? ? emif = get_device_details(pdev);
+

Can't you do this without the #ifdef?

Can be done. Just need to have empty of_get_device_details() for the !CONFIG_OF build to avoid build break.

Will fix that.

Regards
santosh

#7 lore raw

PATCH v3 4/4 memory: emif: add device tree support to emif driver

Quoted 4 lines · Santosh
Quoted 2 lines · Greg Kroah-Hartman

On Thu, Jun 14, 2012 at 03:59:24PM +0530, Santosh Shilimkar wrote:

[..]

Quoted 17 lines
Quoted 5 lines
Quoted 5 lines
(quoted diff) +0 -0
@@ -1267,7 +1534,13 @@ static int __init_or_module emif_probe(struct
 platform_device *pdev)
 ? ? ? struct resource ? ? ? ? *res;
 ? ? ? int ? ? ? ? ? ? ? ? ? ? irq;
 
Quoted 12 lines

Review static int __init_or_module emif_probe(struct · line 1545

Quoted 9 lines
(quoted diff) +7 -1
- ? ? emif = get_device_details(pdev);
+#if defined(CONFIG_OF)
+ ? ? if (pdev->dev.of_node)
+ ? ? ? ? ? ? emif = of_get_device_details(pdev->dev.of_node,
 &pdev->dev);
+ ? ? else
+#endif
+ ? ? ? ? ? ? emif = get_device_details(pdev);
+

Can't you do this without the #ifdef?

Quoted 5 lines

Can be done. Just need to have empty of_get_device_details() for the !CONFIG_OF build to avoid build break.

Will fix that.

Updated patch below with the fix.

Regards
Santosh

Quoted 1 line

From 85d38108fbf1f9f9be76a6086ca3b3ba8f53995a Mon Sep 17 00:00:00 2001

From: Aneesh V <[email protected]>
Date: Mon, 30 Jan 2012 20:06:30 +0530
Subject: [PATCH v3 4/4] memory: emif: add device tree support to emif driver

Device tree support for the EMIF driver.

[santosh.shilimkar at ti.com: Rebased against 3.5-rc]
---
 drivers/memory/emif.c |  293 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 292 insertions(+), 1 deletions(-)
drivers/memory/emif.c +3 -0
index 33a4396..4c168df 100644
@@ -18,6 +18,7 @@
 #include <linux/platform_device.h>
 #include <linux/interrupt.h>
 #include <linux/slab.h>
+#include <linux/of.h>
 #include <linux/debugfs.h>
 #include <linux/seq_file.h>
 #include <linux/module.h>
@@ -49,6 +50,7 @@
  *				frequency in effect at the moment)
  * @plat_data:			Pointer to saved platform data.
  * @debugfs_root:		dentry to the root folder for EMIF in debugfs
+ * @np_ddr:			Pointer to ddr device tree node
  */
 struct emif_data {
 	u8				duplicate;
@@ -63,6 +65,7 @@ struct emif_data {
 	struct emif_regs		*curr_regs;
 	struct emif_platform_data	*plat_data;
 	struct dentry			*debugfs_root;
+	struct device_node		*np_ddr;
 };
 
 static struct emif_data *emif1;
@@ -1148,6 +1151,278 @@ static int is_custom_config_valid(struct

emif_custom_configs *cust_cfgs,
return valid;
}

+#if defined(CONFIG_OF)
+static void __init_or_module of_get_custom_configs(struct device_node *np_emif,
+ struct emif_data *emif)
+{
+ struct emif_custom_configs *cust_cfgs = NULL;
+ int len;
+ const int *lpmode, *poll_intvl;
+
+ lpmode = of_get_property(np_emif, "low-power-mode", &len);
+ poll_intvl = of_get_property(np_emif, "temp-alert-poll-interval", &len);
+
+ if (lpmode || poll_intvl)
+ cust_cfgs = devm_kzalloc(emif->dev, sizeof(*cust_cfgs),
+ GFP_KERNEL);
+
+ if (!cust_cfgs)
+ return;
+
+ if (lpmode) {
+ cust_cfgs->mask |= EMIF_CUSTOM_CONFIG_LPMODE;
+ cust_cfgs->lpmode = *lpmode;
+ of_property_read_u32(np_emif,
+ "low-power-mode-timeout-performance",
+ &cust_cfgs->lpmode_timeout_performance);
+ of_property_read_u32(np_emif,
+ "low-power-mode-timeout-power",
+ &cust_cfgs->lpmode_timeout_power);
+ of_property_read_u32(np_emif,
+ "low-power-mode-freq-threshold",
+ &cust_cfgs->lpmode_freq_threshold);
+ }
+
+ if (poll_intvl) {
+ cust_cfgs->mask |=
+ EMIF_CUSTOM_CONFIG_TEMP_ALERT_POLL_INTERVAL;
+ cust_cfgs->temp_alert_poll_interval_ms = *poll_intvl;
+ }
+
+ if (!is_custom_config_valid(cust_cfgs, emif->dev)) {
+ devm_kfree(emif->dev, cust_cfgs);
+ return;
+ }
+
+ emif->plat_data->custom_configs = cust_cfgs;
+}
+
+static void __init_or_module of_get_min_tck(struct device_node *np,
+ struct emif_data *emif)
+{
+ int ret = 0;
+ struct lpddr2_min_tck *min;
+
+ min = devm_kzalloc(emif->dev, sizeof(*min), GFP_KERNEL);
+ if (!min)
+ goto default_min_tck;
+

+	ret |= of_property_read_u32(np, "tRPab-min-tck", &min->tRPab);
+	ret |= of_property_read_u32(np, "tRCD-min-tck", &min->tRCD);
+	ret |= of_property_read_u32(np, "tWR-min-tck", &min->tWR);
+	ret |= of_property_read_u32(np, "tRASmin-min-tck", &min->tRASmin);
+	ret |= of_property_read_u32(np, "tRRD-min-tck", &min->tRRD);
+	ret |= of_property_read_u32(np, "tWTR-min-tck", &min->tWTR);
+	ret |= of_property_read_u32(np, "tXP-min-tck", &min->tXP);
+	ret |= of_property_read_u32(np, "tRTP-min-tck", &min->tRTP);
+	ret |= of_property_read_u32(np, "tCKE-min-tck", &min->tCKE);
+	ret |= of_property_read_u32(np, "tCKESR-min-tck", &min->tCKESR);
+	ret |= of_property_read_u32(np, "tFAW-min-tck", &min->tFAW);

+
+ if (ret) {
+ devm_kfree(emif->dev, min);
+ goto default_min_tck;
+ }
+
+ emif->plat_data->min_tck = min;
+ return;
+
+default_min_tck:
+ dev_warn(emif->dev, "%s: using default min-tck values\n", __func__);
+ emif->plat_data->min_tck = &lpddr2_jedec_min_tck;
+}
+
+static int __init_or_module of_do_get_timings(struct device_node *np,
+ struct lpddr2_timings *tim)
+{
+ int ret;
+
+ ret = of_property_read_u32(np, "max-freq", &tim->max_freq);

+	ret |= of_property_read_u32(np, "min-freq", &tim->min_freq);
+	ret |= of_property_read_u32(np, "tRPab", &tim->tRPab);
+	ret |= of_property_read_u32(np, "tRCD", &tim->tRCD);
+	ret |= of_property_read_u32(np, "tWR", &tim->tWR);
+	ret |= of_property_read_u32(np, "tRAS-min", &tim->tRAS_min);
+	ret |= of_property_read_u32(np, "tRRD", &tim->tRRD);
+	ret |= of_property_read_u32(np, "tWTR", &tim->tWTR);
+	ret |= of_property_read_u32(np, "tXP", &tim->tXP);
+	ret |= of_property_read_u32(np, "tRTP", &tim->tRTP);
+	ret |= of_property_read_u32(np, "tCKESR", &tim->tCKESR);
+	ret |= of_property_read_u32(np, "tDQSCK-max", &tim->tDQSCK_max);
+	ret |= of_property_read_u32(np, "tFAW", &tim->tFAW);
+	ret |= of_property_read_u32(np, "tZQCS", &tim->tZQCS);
+	ret |= of_property_read_u32(np, "tZQCL", &tim->tZQCL);
+	ret |= of_property_read_u32(np, "tZQinit", &tim->tZQinit);
+	ret |= of_property_read_u32(np, "tRAS-max-ns", &tim->tRAS_max_ns);
+	ret |= of_property_read_u32(np, "tDQSCK-max-derated",

+ &tim->tDQSCK_max_derated);
+
+ return ret;
+}
+
+static void __init_or_module of_get_ddr_timings(struct device_node *np_ddr,
+ struct emif_data *emif)
+{
+ struct lpddr2_timings *timings = NULL;
+ u32 arr_sz = 0, i = 0;
+ struct device_node *np_tim;
+ char *tim_compat;
+
+ switch (emif->plat_data->device_info->type) {
+ case DDR_TYPE_LPDDR2_S2:
+ case DDR_TYPE_LPDDR2_S4:
+ tim_compat = "jedec,lpddr2-timings";
+ break;
+ default:
+ dev_warn(emif->dev, "%s: un-supported memory type\n", __func__);
+ }
+
+ for_each_child_of_node(np_ddr, np_tim)
+ if (of_device_is_compatible(np_tim, tim_compat))
+ arr_sz++;
+
+ if (arr_sz)
+ timings = devm_kzalloc(emif->dev, sizeof(*timings) * arr_sz,
+ GFP_KERNEL);
+
+ if (!timings)
+ goto default_timings;
+
+ for_each_child_of_node(np_ddr, np_tim) {
+ if (of_device_is_compatible(np_tim, tim_compat)) {
+ if (of_do_get_timings(np_tim, &timings[i])) {
+ devm_kfree(emif->dev, timings);
+ goto default_timings;
+ }
+ i++;
+ }
+ }
+
+ emif->plat_data->timings = timings;
+ emif->plat_data->timings_arr_size = arr_sz;
+
+ return;
+
+default_timings:
+ get_default_timings(emif);
+
+ return;
+}
+
+static void __init_or_module of_get_ddr_info(struct device_node *np_emif,
+ struct device_node *np_ddr,
+ struct ddr_device_info *dev_info)
+{
+ u32 density = 0, io_width = 0;
+ int len;
+
+ if (of_find_property(np_emif, "cs1-used", &len))
+ dev_info->cs1_used = true;
+
+ if (of_find_property(np_emif, "cal-resistor-per-cs", &len))
+ dev_info->cal_resistors_per_cs = true;
+
+ if (of_device_is_compatible(np_ddr , "jedec,lpddr2-s4"))
+ dev_info->type = DDR_TYPE_LPDDR2_S4;
+ else if (of_device_is_compatible(np_ddr , "jedec,lpddr2-s2"))
+ dev_info->type = DDR_TYPE_LPDDR2_S2;
+
+ of_property_read_u32(np_ddr, "density", &density);
+ of_property_read_u32(np_ddr, "io-width", &io_width);
+
+ /* Convert from density in Mb to the density encoding in jedc_ddr.h */
+ if (density & (density - 1))
+ dev_info->density = 0;
+ else
+ dev_info->density = __fls(density) - 5;
+
+ /* Convert from io_width in bits to io_width encoding in jedc_ddr.h */
+ if (io_width & (io_width - 1))
+ dev_info->io_width = 0;
+ else
+ dev_info->io_width = __fls(io_width) - 1;
+}
+
+static struct emif_data * __init_or_module of_get_device_details(
+ struct device_node *np_emif, struct device *dev)
+{
+ struct emif_data *emif = NULL;
+ struct ddr_device_info *dev_info = NULL;
+ struct emif_platform_data *pd = NULL;
+ struct device_node *np_ddr;
+ int len;
+
+ np_ddr = of_parse_phandle(np_emif, "device-handle", 0);
+ if (!np_ddr)
+ goto error;
+ emif = devm_kzalloc(dev, sizeof(struct emif_data), GFP_KERNEL);
+ pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL);
+ dev_info = devm_kzalloc(dev, sizeof(*dev_info), GFP_KERNEL);
+
+ if (!emif || !pd || !dev_info) {
+ dev_err(dev, "%s: of_get_device_details() failure!!\n",
+ __func__);
+ goto error;
+ }
+
+ emif->plat_data = pd;
+ pd->device_info = dev_info;
+ emif->dev = dev;
+ emif->np_ddr = np_ddr;
+ emif->temperature_level = SDRAM_TEMP_NOMINAL;
+
+ if (of_device_is_compatible(np_emif, "ti,emif-4d"))
+ emif->plat_data->ip_rev = EMIF_4D;
+ else if (of_device_is_compatible(np_emif, "ti,emif-4d5"))
+ emif->plat_data->ip_rev = EMIF_4D5;
+
+ of_property_read_u32(np_emif, "phy-type", &pd->phy_type);
+
+ if (of_find_property(np_emif, "hw-caps-ll-interface", &len))
+ pd->hw_caps |= EMIF_HW_CAPS_LL_INTERFACE;
+
+ of_get_ddr_info(np_emif, np_ddr, dev_info);
+ if (!is_dev_data_valid(pd->device_info->type, pd->device_info->density,
+ pd->device_info->io_width, pd->phy_type, pd->ip_rev,
+ emif->dev)) {
+ dev_err(dev, "%s: invalid device data!!\n", __func__);
+ goto error;
+ }
+ /*
+ * For EMIF instances other than EMIF1 see if the devices connected
+ * are exactly same as on EMIF1(which is typically the case). If so,
+ * mark it as a duplicate of EMIF1. This will save some memory and
+ * computation.
+ */
+ if (emif1 && emif1->np_ddr == np_ddr) {
+ emif->duplicate = true;
+ goto out;
+ } else if (emif1) {
+ dev_warn(emif->dev, "%s: Non-symmetric DDR geometry\n",
+ __func__);
+ }
+
+
+ of_get_custom_configs(np_emif, emif);
+ of_get_ddr_timings(np_ddr, emif);
+ of_get_min_tck(np_ddr, emif);
+ goto out;
+
+error:
+ return NULL;
+out:
+ return emif;
+}
+
+#else
+
+static struct emif_data * __init_or_module of_get_device_details(
+ struct device_node *np_emif, struct device *dev)
+{
+ return NULL;
+}
+#endif
+
static struct emif_data *__init_or_module get_device_details(
struct platform_device *pdev)
{
@@ -1267,7 +1542,11 @@ static int __init_or_module emif_probe(struct platform_device *pdev)
struct resource *res;
int irq;

- emif = get_device_details(pdev);
+ if (pdev->dev.of_node)
+ emif = of_get_device_details(pdev->dev.of_node, &pdev->dev);
+ else
+ emif = get_device_details(pdev);
+
if (!emif) {
pr_err("%s: error getting device data\n", __func__); goto error;
@@ -1644,11 +1923,23 @@ static void __attribute__((unused)) freq_post_notify_handling(void)
spin_unlock_irqrestore(&emif_lock, irq_state);
}

+#if defined(CONFIG_OF)
+static const struct of_device_id emif_of_match[] = {
+ { .compatible = "ti,emif-4d" },
+ { .compatible = "ti,emif-4d5" },
+ {},
+};
+MODULE_DEVICE_TABLE(of, emif_of_match); +#endif
+
static struct platform_driver emif_driver = {
.remove = __exit_p(emif_remove),
.shutdown = emif_shutdown,
.driver = {
.name = "emif",
+#if defined(CONFIG_OF)
+ .of_match_table = of_match_ptr(emif_of_match),
+#endif
},
};

Signature · 1 line
1.7.5.4
#8 lore raw

PATCH v3 4/4 memory: emif: add device tree support to emif driver

Quoted 12 lines · Santosh
(quoted diff) +7 -0
@@ -1644,11 +1923,23 @@ static void __attribute__((unused))
 freq_post_notify_handling(void)
 	spin_unlock_irqrestore(&emif_lock, irq_state);
 }
 
+#if defined(CONFIG_OF)
+static const struct of_device_id emif_of_match[] = {
+		{ .compatible = "ti,emif-4d" },
+		{ .compatible = "ti,emif-4d5" },
+		{},
+};
+MODULE_DEVICE_TABLE(of, emif_of_match);

Review static void __attribute__((unused)) · line 1943

Quoted 10 lines
(quoted diff) +5 -0
+#endif
+
 static struct platform_driver emif_driver = {
 	.remove		= __exit_p(emif_remove),
 	.shutdown	= emif_shutdown,
 	.driver = {
 		.name = "emif",
+#if defined(CONFIG_OF)
+		.of_match_table = of_match_ptr(emif_of_match),
+#endif

Are these two still #if defined needed?

Also, what about the IS_DEFINED macro?

And, if you resend, please resend the whole series, I don't have the old ones around anymore.

thanks,

greg k-h

#9 lore raw

PATCH v3 4/4 memory: emif: add device tree support to emif driver

Quoted 27 lines · Greg Kroah-Hartman
Quoted 12 lines · Santosh
(quoted diff) +7 -0
@@ -1644,11 +1923,23 @@ static void __attribute__((unused))
 freq_post_notify_handling(void)
 ? ? ? spin_unlock_irqrestore(&emif_lock, irq_state);
 ?}
 
+#if defined(CONFIG_OF)
+static const struct of_device_id emif_of_match[] = {
+ ? ? ? ? ? ? { .compatible = "ti,emif-4d" },
+ ? ? ? ? ? ? { .compatible = "ti,emif-4d5" },
+ ? ? ? ? ? ? {},
+};
+MODULE_DEVICE_TABLE(of, emif_of_match);

Review static void __attribute__((unused)) · line 1943

Quoted 10 lines
(quoted diff) +5 -0
+#endif
+
 ?static struct platform_driver emif_driver = {
 ? ? ? .remove ? ? ? ? = __exit_p(emif_remove),
 ? ? ? .shutdown ? ? ? = emif_shutdown,
 ? ? ? .driver = {
 ? ? ? ? ? ? ? .name = "emif",
+#if defined(CONFIG_OF)
+ ? ? ? ? ? ? .of_match_table = of_match_ptr(emif_of_match),
+#endif

Are these two still #if defined needed?

Quoted 2 lines

Also, what about the IS_DEFINED macro?

Yes. To avoid the build break in !DT build.

Quoted 3 lines

And, if you resend, please resend the whole series, I don't have the old ones around anymore.

Ok. Will repost the entire series.
As mentioned earlier, the series needs to go via OMAP tree beasue the other three
patches are touching the platform files. I will need your ack on the $subject patch
to queue that via Tony's linux-omap tree.

Regards
Santosh

#10 lore raw

PATCH v3 4/4 memory: emif: add device tree support to emif driver

Quoted 18 lines · Santosh
Quoted 18 lines
Quoted 18 lines

+#if defined(CONFIG_OF)

Quoted 16 lines
Quoted 16 lines

+static const struct of_device_id emif_of_match[] = {

 +             { .compatible = "ti,emif-4d" },
 +             { .compatible = "ti,emif-4d5" },
 +             {},

+};
+MODULE_DEVICE_TABLE(of, emif_of_match);
+#endif
+
static struct platform_driver emif_driver = {
.remove = __exit_p(emif_remove),
.shutdown = emif_shutdown,
.driver = {
.name = "emif",
+#if defined(CONFIG_OF)
+ .of_match_table = of_match_ptr(emif_of_match),
+#endif

Quoted 6 lines
Quoted 4 lines
Quoted 4 lines

Are these two still #if defined needed?

Also, what about the IS_DEFINED macro?

Yes. To avoid the build break in !DT build.

No, infact of_match_ptr is there just so you can avoid a #ifdef around and not break !CONFIG_OF.

#11 lore raw

PATCH v3 4/4 memory: emif: add device tree support to emif driver

Quoted 23 lines · Rajendra Nayak
Quoted 22 lines · Santosh
Quoted 22 lines
Quoted 22 lines

+#if defined(CONFIG_OF)

Quoted 8 lines

?> ?+static const struct of_device_id emif_of_match[] = { ?> ?+ ? ? ? ? ? ? { .compatible = "ti,emif-4d" }, ?> ?+ ? ? ? ? ? ? { .compatible = "ti,emif-4d5" }, ?> ?+ ? ? ? ? ? ? {},
?> ?+};
?> ?+MODULE_DEVICE_TABLE(of, emif_of_match);
?> ?+#endif
?> ?+

Quoted 8 lines

?> ? ?static struct platform_driver emif_driver = {
?> ? ? ? ? .remove ? ? ? ? = __exit_p(emif_remove),
?> ? ? ? ? .shutdown ? ? ? = emif_shutdown,
?> ? ? ? ? .driver = {
?> ? ? ? ? ? ? ? ? .name = "emif",
?> ?+#if defined(CONFIG_OF)
?> ?+ ? ? ? ? ? ? .of_match_table = of_match_ptr(emif_of_match), ?> ?+#endif

?Are these two still #if defined needed?

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines
Quoted 2 lines

?Also, what about the IS_DEFINED macro?

Yes. To avoid the build break in !DT build.

No, infact of_match_ptr is there just so you can avoid a #ifdef around and not break !CONFIG_OF.

Need to recheck but the build was throwing error becasue of "emif_of_match" mostly.

Regards
Santosh

#12 lore raw

PATCH v3 4/4 memory: emif: add device tree support to emif driver

Quoted 27 lines · Santosh
Quoted 26 lines · Rajendra Nayak
Quoted 25 lines · Santosh
Quoted 24 lines
Quoted 24 lines

+#if defined(CONFIG_OF)

Quoted 8 lines
Quoted 8 lines
   +static const struct of_device_id emif_of_match[] = {
   +             { .compatible = "ti,emif-4d" },
   +             { .compatible = "ti,emif-4d5" },
   +             {},
   +};
   +MODULE_DEVICE_TABLE(of, emif_of_match);
   +#endif
   +
Quoted 8 lines
Quoted 8 lines
     static struct platform_driver emif_driver = {
          .remove         = __exit_p(emif_remove),
          .shutdown       = emif_shutdown,
          .driver = {
                  .name = "emif",

+#if defined(CONFIG_OF)
+ .of_match_table = of_match_ptr(emif_of_match),
+#endif

Are these two still #if defined needed?

Also, what about the IS_DEFINED macro?

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines

Yes. To avoid the build break in !DT build.

No, infact of_match_ptr is there just so you can avoid a #ifdef around and not break !CONFIG_OF.

Need to recheck but the build was throwing error becasue of "emif_of_match" mostly.

You still need the first one. I meant the second one around 'of_match_ptr' should be removed.

With !CONFIG_OF, of_match_ptr(_ptr) is just defined as NULL.

Quoted 2 lines

Regards
Santosh

#13 lore raw

PATCH v3 4/4 memory: emif: add device tree support to emif driver

Quoted 45 lines · Rajendra Nayak
Quoted 35 lines · Santosh
Quoted 33 lines · On Tue, Jun 26, 2012 at 10:49 AM, Rajendra Nayak<[email protected]> ?wrote:
Quoted 30 lines · Santosh
Quoted 23 lines
Quoted 23 lines

+#if defined(CONFIG_OF)

Quoted 17 lines

?> ? ?+static const struct of_device_id emif_of_match[] = { ?> ? ?+ ? ? ? ? ? ? { .compatible = "ti,emif-4d" },
?> ? ?+ ? ? ? ? ? ? { .compatible = "ti,emif-4d5" },
?> ? ?+ ? ? ? ? ? ? {},
?> ? ?+};
?> ? ?+MODULE_DEVICE_TABLE(of, emif_of_match);
?> ? ?+#endif
?> ? ?+
?> ? ? ?static struct platform_driver emif_driver = { ?> ? ? ? ? ? .remove ? ? ? ? = __exit_p(emif_remove), ?> ? ? ? ? ? .shutdown ? ? ? = emif_shutdown,
?> ? ? ? ? ? .driver = {
?> ? ? ? ? ? ? ? ? ? .name = "emif",
?> ? ?+#if defined(CONFIG_OF)
?> ? ?+ ? ? ? ? ? ? .of_match_table = of_match_ptr(emif_of_match), ?> ? ?+#endif

Quoted 4 lines
Quoted 4 lines

?Are these two still #if defined needed?

?Also, what about the IS_DEFINED macro?

Yes. To avoid the build break in !DT build.

Quoted 7 lines
Quoted 2 lines

No, infact of_match_ptr is there just so you can avoid a #ifdef around and not break !CONFIG_OF.

Need to recheck but the build was throwing error becasue of "emif_of_match"
mostly.

Quoted 5 lines

You still need the first one. I meant the second one around 'of_match_ptr' should be removed.

With !CONFIG_OF, of_match_ptr(_ptr) is just defined as NULL.

Yep. That make sense too.
Will drop the second check.

regards
Santosh

#14 lore raw

PATCH v3 4/4 memory: emif: add device tree support to emif driver

Greg,

Quoted 47 lines · Santosh
Quoted 45 lines · Rajendra Nayak
Quoted 42 lines · Santosh
Quoted 27 lines · On Tue, Jun 26, 2012 at 10:49 AM, Rajendra Nayak<[email protected]> ?wrote:
Quoted 25 lines · Santosh
Quoted 25 lines
Quoted 25 lines

+#if defined(CONFIG_OF)

Quoted 17 lines

?> ? ?+static const struct of_device_id emif_of_match[] = { ?> ? ?+ ? ? ? ? ? ? { .compatible = "ti,emif-4d" },
?> ? ?+ ? ? ? ? ? ? { .compatible = "ti,emif-4d5" },
?> ? ?+ ? ? ? ? ? ? {},
?> ? ?+};
?> ? ?+MODULE_DEVICE_TABLE(of, emif_of_match);
?> ? ?+#endif
?> ? ?+
?> ? ? ?static struct platform_driver emif_driver = { ?> ? ? ? ? ? .remove ? ? ? ? = __exit_p(emif_remove), ?> ? ? ? ? ? .shutdown ? ? ? = emif_shutdown,
?> ? ? ? ? ? .driver = {
?> ? ? ? ? ? ? ? ? ? .name = "emif",
?> ? ?+#if defined(CONFIG_OF)
?> ? ?+ ? ? ? ? ? ? .of_match_table = of_match_ptr(emif_of_match), ?> ? ?+#endif

?Are these two still #if defined needed?

Quoted 8 lines
Quoted 5 lines
Quoted 2 lines
Quoted 2 lines

?Also, what about the IS_DEFINED macro?

Yes. To avoid the build break in !DT build.

No, infact of_match_ptr is there just so you can avoid a #ifdef around and not break !CONFIG_OF.

Need to recheck but the build was throwing error becasue of "emif_of_match"
mostly.

Quoted 8 lines
Quoted 5 lines

You still need the first one. I meant the second one around 'of_match_ptr' should be removed.

With !CONFIG_OF, of_match_ptr(_ptr) is just defined as NULL.

Yep. That make sense too.
Will drop the second check.

Posted the entire series again with updated $subject patch. With your ack, I will ask Tony to pull this series for 3.6.

regards
Santosh

#15 lore raw

PATCH v3 4/4 memory: emif: add device tree support to emif driver

Quoted 54 lines · Santosh

Greg,

Quoted 50 lines · Santosh
Quoted 48 lines · Rajendra Nayak
Quoted 35 lines · Santosh
Quoted 33 lines · On Tue, Jun 26, 2012 at 10:49 AM, Rajendra Nayak<[email protected]> ?wrote:
Quoted 30 lines · Santosh
Quoted 23 lines
Quoted 23 lines

+#if defined(CONFIG_OF)

Quoted 17 lines

?> ? ?+static const struct of_device_id emif_of_match[] = { ?> ? ?+ ? ? ? ? ? ? { .compatible = "ti,emif-4d" },
?> ? ?+ ? ? ? ? ? ? { .compatible = "ti,emif-4d5" },
?> ? ?+ ? ? ? ? ? ? {},
?> ? ?+};
?> ? ?+MODULE_DEVICE_TABLE(of, emif_of_match);
?> ? ?+#endif
?> ? ?+
?> ? ? ?static struct platform_driver emif_driver = { ?> ? ? ? ? ? .remove ? ? ? ? = __exit_p(emif_remove), ?> ? ? ? ? ? .shutdown ? ? ? = emif_shutdown,
?> ? ? ? ? ? .driver = {
?> ? ? ? ? ? ? ? ? ? .name = "emif",
?> ? ?+#if defined(CONFIG_OF)
?> ? ?+ ? ? ? ? ? ? .of_match_table = of_match_ptr(emif_of_match), ?> ? ?+#endif

Quoted 4 lines
Quoted 4 lines

?Are these two still #if defined needed?

?Also, what about the IS_DEFINED macro?

Yes. To avoid the build break in !DT build.

Quoted 7 lines
Quoted 2 lines

No, infact of_match_ptr is there just so you can avoid a #ifdef around and not break !CONFIG_OF.

Need to recheck but the build was throwing error becasue of "emif_of_match"
mostly.

You still need the first one. I meant the second one around 'of_match_ptr' should be removed.

Quoted 7 lines
Quoted 5 lines
Quoted 2 lines

With !CONFIG_OF, of_match_ptr(_ptr) is just defined as NULL.

Yep. That make sense too.
Will drop the second check.

Posted the entire series again with updated $subject patch. With your ack, I will ask Tony to pull this series for 3.6.

Sent them where? I didn't see a copy here :(

#16 lore raw

PATCH v3 4/4 memory: emif: add device tree support to emif driver

Quoted 57 lines · Greg Kroah-Hartman
Quoted 56 lines · Santosh

Greg,

Quoted 52 lines · Santosh
Quoted 50 lines · Rajendra Nayak
Quoted 35 lines · Santosh
Quoted 33 lines · Rajendra Nayak
Quoted 30 lines · Santosh
Quoted 23 lines
Quoted 23 lines

+#if defined(CONFIG_OF)

Quoted 17 lines
Quoted 17 lines
   +static const struct of_device_id emif_of_match[] = {
   +             { .compatible = "ti,emif-4d" },
   +             { .compatible = "ti,emif-4d5" },
   +             {},
   +};
   +MODULE_DEVICE_TABLE(of, emif_of_match);
   +#endif
   +
     static struct platform_driver emif_driver = {
          .remove         = __exit_p(emif_remove),
          .shutdown       = emif_shutdown,
          .driver = {
                  .name = "emif",
   +#if defined(CONFIG_OF)
   +             .of_match_table = of_match_ptr(emif_of_match),
   +#endif
Quoted 4 lines
Quoted 4 lines

Are these two still #if defined needed?

Also, what about the IS_DEFINED macro?

Yes. To avoid the build break in !DT build.

Quoted 7 lines
Quoted 2 lines

No, infact of_match_ptr is there just so you can avoid a #ifdef around and not break !CONFIG_OF.

Need to recheck but the build was throwing error becasue of "emif_of_match"
mostly.

You still need the first one. I meant the second one around 'of_match_ptr' should be removed.

With !CONFIG_OF, of_match_ptr(_ptr) is just defined as NULL.

Quoted 7 lines
Quoted 5 lines
Quoted 3 lines

Yep. That make sense too.
Will drop the second check.

Posted the entire series again with updated $subject patch. With your ack, I will ask Tony to pull this series for 3.6.

Sent them where? I didn't see a copy here :(

Hi Greg, should have hit both linux-omap and linux-arm. See:

http://marc.info/?l=linux-omap&m=134097764625471&w=2

Cheers
Jon

#17 lore raw

PATCH v3 4/4 memory: emif: add device tree support to emif driver

Quoted 62 lines · Jon Hunter
Quoted 60 lines · Greg Kroah-Hartman
Quoted 59 lines · Santosh

Greg,

Quoted 55 lines · Santosh
Quoted 45 lines · Rajendra Nayak
Quoted 35 lines · Santosh
Quoted 33 lines · Rajendra Nayak
Quoted 30 lines · Santosh
Quoted 23 lines
Quoted 23 lines

+#if defined(CONFIG_OF)

Quoted 17 lines
Quoted 17 lines
   +static const struct of_device_id emif_of_match[] = {
   +             { .compatible = "ti,emif-4d" },
   +             { .compatible = "ti,emif-4d5" },
   +             {},
   +};
   +MODULE_DEVICE_TABLE(of, emif_of_match);
   +#endif
   +
     static struct platform_driver emif_driver = {
          .remove         = __exit_p(emif_remove),
          .shutdown       = emif_shutdown,
          .driver = {
                  .name = "emif",
   +#if defined(CONFIG_OF)
   +             .of_match_table = of_match_ptr(emif_of_match),
   +#endif
Quoted 4 lines
Quoted 4 lines

Are these two still #if defined needed?

Also, what about the IS_DEFINED macro?

Yes. To avoid the build break in !DT build.

Quoted 7 lines
Quoted 2 lines

No, infact of_match_ptr is there just so you can avoid a #ifdef around and not break !CONFIG_OF.

Need to recheck but the build was throwing error becasue of "emif_of_match"
mostly.

Quoted 5 lines

You still need the first one. I meant the second one around 'of_match_ptr' should be removed.

With !CONFIG_OF, of_match_ptr(_ptr) is just defined as NULL.

Yep. That make sense too.
Will drop the second check.

Quoted 8 lines
Quoted 4 lines
Quoted 2 lines

Posted the entire series again with updated $subject patch. With your ack, I will ask Tony to pull this series for 3.6.

Sent them where? I didn't see a copy here :(

Hi Greg, should have hit both linux-omap and linux-arm. See:

http://marc.info/?l=linux-omap&m=134097764625471&w=2

Ah, two lists I am not on, so how would I know to be able to ack them? Please always cc: people you wish to review patches, otherwise it could get lost, or as in this case, the people might not even be on the lists you send the patches to.

greg k-h

#18 lore raw

PATCH v3 4/4 memory: emif: add device tree support to emif driver

Quoted 60 lines · Greg Kroah-Hartman
Quoted 59 lines · Jon Hunter
Quoted 57 lines · Greg Kroah-Hartman
Quoted 56 lines · Santosh

Greg,

Quoted 52 lines · Santosh
Quoted 50 lines · Rajendra Nayak
Quoted 35 lines · Santosh
Quoted 33 lines · On Tue, Jun 26, 2012 at 10:49 AM, Rajendra Nayak<[email protected]> ?wrote:
Quoted 30 lines · Santosh
Quoted 23 lines
Quoted 23 lines

+#if defined(CONFIG_OF)

Quoted 17 lines

?> ? ?+static const struct of_device_id emif_of_match[] = { ?> ? ?+ ? ? ? ? ? ? { .compatible = "ti,emif-4d" },
?> ? ?+ ? ? ? ? ? ? { .compatible = "ti,emif-4d5" },
?> ? ?+ ? ? ? ? ? ? {},
?> ? ?+};
?> ? ?+MODULE_DEVICE_TABLE(of, emif_of_match);
?> ? ?+#endif
?> ? ?+
?> ? ? ?static struct platform_driver emif_driver = { ?> ? ? ? ? ? .remove ? ? ? ? = __exit_p(emif_remove), ?> ? ? ? ? ? .shutdown ? ? ? = emif_shutdown,
?> ? ? ? ? ? .driver = {
?> ? ? ? ? ? ? ? ? ? .name = "emif",
?> ? ?+#if defined(CONFIG_OF)
?> ? ?+ ? ? ? ? ? ? .of_match_table = of_match_ptr(emif_of_match), ?> ? ?+#endif

Quoted 4 lines
Quoted 4 lines

?Are these two still #if defined needed?

?Also, what about the IS_DEFINED macro?

Yes. To avoid the build break in !DT build.

Quoted 7 lines
Quoted 2 lines

No, infact of_match_ptr is there just so you can avoid a #ifdef around and not break !CONFIG_OF.

Need to recheck but the build was throwing error becasue of "emif_of_match"
mostly.

You still need the first one. I meant the second one around 'of_match_ptr' should be removed.

With !CONFIG_OF, of_match_ptr(_ptr) is just defined as NULL.

Quoted 8 lines
Quoted 8 lines
Quoted 7 lines
Quoted 5 lines
Quoted 3 lines

Yep. That make sense too.
Will drop the second check.

Posted the entire series again with updated $subject patch. With your ack, I will ask Tony to pull this series for 3.6.

Sent them where? ?I didn't see a copy here :(

My bad. Accidentally in reworked patch, CC line got dropped.

Quoted 9 lines
Quoted 3 lines

Hi Greg, should have hit both linux-omap and linux-arm. See:

http://marc.info/?l=linux-omap&m=134097764625471&w=2

Ah, two lists I am not on, so how would I know to be able to ack them? Please always cc: people you wish to review patches, otherwise it could get lost, or as in this case, the people might not even be on the lists you send the patches to.

I just bounced the $subject patch looping you.

Regards
Santosh