Skip to contentSkip to conversation

add gpmi-nand dt support for mx6q and mx28

PATCH Superseded Huang Shijie 5 participants 14 messages Apr 25, 2012 – May 2, 2012

Subsystems (6)

v2 of 3 Superseded Latest is v3 →

lore
Share & tools
lore
#0 lore raw

v2 cover add gpmi-nand dt support for mx6q and mx28

The mx6q-arm2 and imx28evk have already support the device tree now. So i decide to add the gpmi-nand dt support to them.

The mx23 does not support the device tree now. I will add the gpmi dt support when it is ready.

Test this patch set on both MX6Q(arm2) and mx28(evk).

v1 --> v2
[1] merge the gpmi/bch device node into one node.
[2] add partitions support.
[3] misc

Huang Shijie (3):
mtd: gpmi: add device tree support for mx6q and mx28
ARM: mx28: add gpmi-nand dt support
ARM: mx6q: add gpmi-nand dt support

 .../devicetree/bindings/mtd/gpmi-nand.txt          |   34 +++++
 arch/arm/boot/dts/imx28-evk.dts                    |    4 +
 arch/arm/boot/dts/imx28.dtsi                       |   18 ++--
 arch/arm/boot/dts/imx6q-arm2.dts                   |    4 +
 arch/arm/boot/dts/imx6q.dtsi                       |   12 ++
 arch/arm/mach-imx/clock-imx6q.c                    |    5 +-
 arch/arm/mach-mxs/clock-mx28.c                     |    2 +-
 drivers/mtd/nand/Kconfig                           |    2 +-
 drivers/mtd/nand/gpmi-nand/bch-regs.h              |   42 +++++--
 drivers/mtd/nand/gpmi-nand/gpmi-lib.c              |   18 ++--
 drivers/mtd/nand/gpmi-nand/gpmi-nand.c             |  131 ++++++++++----------
 drivers/mtd/nand/gpmi-nand/gpmi-nand.h             |    6 +-
 include/linux/mtd/gpmi-nand.h                      |    8 +-
 13 files changed, 185 insertions(+), 101 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/mtd/gpmi-nand.txt
#1 lore raw

PATCH v2 1/3 mtd: gpmi: add device tree support for mx6q and mx28

add gpmi support for mx6q.
add DT support to mx6q and mx28.

---
 .../devicetree/bindings/mtd/gpmi-nand.txt          |   34 +++++
 drivers/mtd/nand/Kconfig                           |    2 +-
 drivers/mtd/nand/gpmi-nand/bch-regs.h              |   42 +++++--
 drivers/mtd/nand/gpmi-nand/gpmi-lib.c              |   18 ++--
 drivers/mtd/nand/gpmi-nand/gpmi-nand.c             |  131 ++++++++++----------
 drivers/mtd/nand/gpmi-nand/gpmi-nand.h             |    6 +-
 include/linux/mtd/gpmi-nand.h                      |    8 +-
 7 files changed, 152 insertions(+), 89 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/mtd/gpmi-nand.txt
Documentation/devicetree/bindings/mtd/gpmi-nand.txt new file +34 -0
new file mode 100644
index 0000000..13fbb35
@@ -0,0 +1,34 @@
+* Freescale General-Purpose Media Interface (GPMI)
+
+The GPMI nand controller provides an interface to control the
+NAND flash chips. We support only one NAND chip now.
+
+Required properties:
+  - compatible : should be "fsl,<chip>-gpmi-nand"
+  - reg : should contain registers location and length for gpmi and bch.
+  - reg-names: Should contain the reg names "gpmi-nand" and "bch"
+  - interrupts : The first is the DMA interrupt number for GPMI.
+                 The second is the BCH interrupt number.
+  - interrupt-names : The interrupt names "gpmi-dma", "bch";
+  - fsl,gpmi-dma-channel : Should contain the dma channel it uses.
+
+Optional properties:
+  - partition : contain sub-nodes describing partitions of the
+                address space. See partition.txt for more detail.
+
+Examples:
+
+gpmi-nand at 8000c000 {
+	compatible = "fsl,imx28-gpmi-nand";
+	#address-cells = <1>;
+	#size-cells = <1>;
+	reg = <0x8000c000 2000>, <0x8000a000 2000>;
+	reg-names = "gpmi-nand", "bch";
+	interrupts = <88>, <41>;
+	interrupt-names = "gpmi-dma", "bch";
+	fsl,gpmi-dma-channel = <4>;
+
+	partition at 0 {
+	...
+	};
+};
drivers/mtd/nand/Kconfig +1 -1
index 7d17cec..bf0a28d 100644
@@ -440,7 +440,7 @@ config MTD_NAND_NANDSIM
 
 config MTD_NAND_GPMI_NAND
         bool "GPMI NAND Flash Controller driver"
-        depends on MTD_NAND && (SOC_IMX23 || SOC_IMX28)
+        depends on MTD_NAND && (SOC_IMX23 || SOC_IMX28 || SOC_IMX6Q)
         help
 	 Enables NAND Flash support for IMX23 or IMX28.
 	 The GPMI controller is very powerful, with the help of BCH
drivers/mtd/nand/gpmi-nand/bch-regs.h +32 -10

60 lines not on this page · raw message

drivers/mtd/nand/gpmi-nand/gpmi-lib.c +10 -8
index fa5200b..a1f4332 100644
@@ -224,13 +224,13 @@ int bch_set_geometry(struct gpmi_nand_data *this)
 	/* Configure layout 0. */
 	writel(BF_BCH_FLASH0LAYOUT0_NBLOCKS(block_count)
 			| BF_BCH_FLASH0LAYOUT0_META_SIZE(metadata_size)
-			| BF_BCH_FLASH0LAYOUT0_ECC0(ecc_strength)
-			| BF_BCH_FLASH0LAYOUT0_DATA0_SIZE(block_size),
+			| BF_BCH_FLASH0LAYOUT0_ECC0(ecc_strength, this)
+			| BF_BCH_FLASH0LAYOUT0_DATA0_SIZE(block_size, this),
 			r->bch_regs + HW_BCH_FLASH0LAYOUT0);
 
 	writel(BF_BCH_FLASH0LAYOUT1_PAGE_SIZE(page_size)
-			| BF_BCH_FLASH0LAYOUT1_ECCN(ecc_strength)
-			| BF_BCH_FLASH0LAYOUT1_DATAN_SIZE(block_size),
+			| BF_BCH_FLASH0LAYOUT1_ECCN(ecc_strength, this)
+			| BF_BCH_FLASH0LAYOUT1_DATAN_SIZE(block_size, this),
 			r->bch_regs + HW_BCH_FLASH0LAYOUT1);
 
 	/* Set *all* chip selects to use layout 0. */
@@ -256,11 +256,12 @@ static unsigned int ns_to_cycles(unsigned int time,
 	return max(k, min);
 }
 
+#define DEF_MIN_PROP_DELAY	5
+#define DEF_MAX_PROP_DELAY	9
 /* Apply timing to current hardware conditions. */
 static int gpmi_nfc_compute_hardware_timing(struct gpmi_nand_data *this,
 					struct gpmi_nfc_hardware_timing *hw)
 {
-	struct gpmi_nand_platform_data *pdata = this->pdata;
 	struct timing_threshod *nfc = &timing_default_threshold;
 	struct nand_chip *nand = &this->nand;
 	struct nand_timing target = this->timing;
@@ -277,8 +278,8 @@ static int gpmi_nfc_compute_hardware_timing(struct gpmi_nand_data *this,
 	int ideal_sample_delay_in_ns;
 	unsigned int sample_delay_factor;
 	int tEYE;
-	unsigned int min_prop_delay_in_ns = pdata->min_prop_delay_in_ns;
-	unsigned int max_prop_delay_in_ns = pdata->max_prop_delay_in_ns;
+	unsigned int min_prop_delay_in_ns = DEF_MIN_PROP_DELAY;
+	unsigned int max_prop_delay_in_ns = DEF_MAX_PROP_DELAY;
 
 	/*
 	 * If there are multiple chips, we need to relax the timings to allow
@@ -804,7 +805,8 @@ int gpmi_is_ready(struct gpmi_nand_data *this, unsigned chip)
 	if (GPMI_IS_MX23(this)) {
 		mask = MX23_BM_GPMI_DEBUG_READY0 << chip;
 		reg = readl(r->gpmi_regs + HW_GPMI_DEBUG);
-	} else if (GPMI_IS_MX28(this)) {
+	} else if (GPMI_IS_MX28(this) || GPMI_IS_MX6Q(this)) {
+		/* MX28 shares the same R/B register as MX6Q. */
 		mask = MX28_BF_GPMI_STAT_READY_BUSY(1 << chip);
 		reg = readl(r->gpmi_regs + HW_GPMI_STAT);
 	} else
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +67 -64

218 lines not on this page · raw message

drivers/mtd/nand/gpmi-nand/gpmi-nand.h +4 -2
index ec6180d..ce5daa1 100644
@@ -266,8 +266,10 @@ extern int gpmi_read_page(struct gpmi_nand_data *,
 #define STATUS_UNCORRECTABLE	0xfe
 
 /* Use the platform_id to distinguish different Archs. */
-#define IS_MX23			0x1
-#define IS_MX28			0x2
+#define IS_MX23			0x0
+#define IS_MX28			0x1
+#define IS_MX6Q			0x2
 #define GPMI_IS_MX23(x)		((x)->pdev->id_entry->driver_data == IS_MX23)
 #define GPMI_IS_MX28(x)		((x)->pdev->id_entry->driver_data == IS_MX28)
+#define GPMI_IS_MX6Q(x)		((x)->pdev->id_entry->driver_data == IS_MX6Q)
 #endif
include/linux/mtd/gpmi-nand.h +4 -4
index 69b6dbf..ed3c4e0 100644
@@ -23,12 +23,12 @@
 #define GPMI_NAND_RES_SIZE	6
 
 /* Resource names for the GPMI NAND driver. */
-#define GPMI_NAND_GPMI_REGS_ADDR_RES_NAME  "GPMI NAND GPMI Registers"
+#define GPMI_NAND_GPMI_REGS_ADDR_RES_NAME  "gpmi-nand"
 #define GPMI_NAND_GPMI_INTERRUPT_RES_NAME  "GPMI NAND GPMI Interrupt"
-#define GPMI_NAND_BCH_REGS_ADDR_RES_NAME   "GPMI NAND BCH Registers"
-#define GPMI_NAND_BCH_INTERRUPT_RES_NAME   "GPMI NAND BCH Interrupt"
+#define GPMI_NAND_BCH_REGS_ADDR_RES_NAME   "bch"
+#define GPMI_NAND_BCH_INTERRUPT_RES_NAME   "bch"
 #define GPMI_NAND_DMA_CHANNELS_RES_NAME    "GPMI NAND DMA Channels"
-#define GPMI_NAND_DMA_INTERRUPT_RES_NAME   "GPMI NAND DMA Interrupt"
+#define GPMI_NAND_DMA_INTERRUPT_RES_NAME   "gpmi-dma"
 
 /**
  * struct gpmi_nand_platform_data - GPMI NAND driver platform data.
Signature · 1 line
1.7.0.4
#2 lore raw

PATCH v2 1/3 mtd: gpmi: add device tree support for mx6q and mx28

Quoted 28 lines · Huang Shijie

add gpmi support for mx6q.
add DT support to mx6q and mx28.

---
 .../devicetree/bindings/mtd/gpmi-nand.txt          |   34 +++++
 drivers/mtd/nand/Kconfig                           |    2 +-
 drivers/mtd/nand/gpmi-nand/bch-regs.h              |   42 +++++--
 drivers/mtd/nand/gpmi-nand/gpmi-lib.c              |   18 ++--
 drivers/mtd/nand/gpmi-nand/gpmi-nand.c             |  131 ++++++++++----------
 drivers/mtd/nand/gpmi-nand/gpmi-nand.h             |    6 +-
 include/linux/mtd/gpmi-nand.h                      |    8 +-
 7 files changed, 152 insertions(+), 89 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/mtd/gpmi-nand.txt
Documentation/devicetree/bindings/mtd/gpmi-nand.txt new file +7 -0
new file mode 100644
index 0000000..13fbb35
@@ -0,0 +1,34 @@
+* Freescale General-Purpose Media Interface (GPMI)
+
+The GPMI nand controller provides an interface to control the
+NAND flash chips. We support only one NAND chip now.
+
+Required properties:
+  - compatible : should be "fsl,<chip>-gpmi-nand"

Documentation/devicetree/bindings/mtd/gpmi-nand.txt line 17

Quoted 10 lines
Documentation/devicetree/bindings/mtd/gpmi-nand.txt new file +10 -0
+  - reg : should contain registers location and length for gpmi and bch.
+  - reg-names: Should contain the reg names "gpmi-nand" and "bch"
+  - interrupts : The first is the DMA interrupt number for GPMI.
+                 The second is the BCH interrupt number.
+  - interrupt-names : The interrupt names "gpmi-dma", "bch";
+  - fsl,gpmi-dma-channel : Should contain the dma channel it uses.
+
+Optional properties:
+  - partition : contain sub-nodes describing partitions of the
+                address space. See partition.txt for more detail.

The partition here is not a property but a sub-node, so you should not document it as a property, but simply put a reference to partition.txt probably like what Documentation/devicetree/bindings/mtd/atmel-dataflash.txt does.

Quoted 158 lines
Documentation/devicetree/bindings/mtd/gpmi-nand.txt new file +17 -0
+
+Examples:
+
+gpmi-nand at 8000c000 {
+	compatible = "fsl,imx28-gpmi-nand";
+	#address-cells = <1>;
+	#size-cells = <1>;
+	reg = <0x8000c000 2000>, <0x8000a000 2000>;
+	reg-names = "gpmi-nand", "bch";
+	interrupts = <88>, <41>;
+	interrupt-names = "gpmi-dma", "bch";
+	fsl,gpmi-dma-channel = <4>;
+
+	partition at 0 {
+	...
+	};
+};
drivers/mtd/nand/Kconfig +1 -1
index 7d17cec..bf0a28d 100644
@@ -440,7 +440,7 @@ config MTD_NAND_NANDSIM
 
 config MTD_NAND_GPMI_NAND
         bool "GPMI NAND Flash Controller driver"
-        depends on MTD_NAND && (SOC_IMX23 || SOC_IMX28)
+        depends on MTD_NAND && (SOC_IMX23 || SOC_IMX28 || SOC_IMX6Q)
         help
 	 Enables NAND Flash support for IMX23 or IMX28.
 	 The GPMI controller is very powerful, with the help of BCH
drivers/mtd/nand/gpmi-nand/bch-regs.h +32 -10
index 4effb8c..a092451 100644
@@ -51,15 +51,26 @@
 
 #define BP_BCH_FLASH0LAYOUT0_ECC0		12
 #define BM_BCH_FLASH0LAYOUT0_ECC0	(0xf << BP_BCH_FLASH0LAYOUT0_ECC0)
-#define BF_BCH_FLASH0LAYOUT0_ECC0(v)		\
-	(((v) << BP_BCH_FLASH0LAYOUT0_ECC0) & BM_BCH_FLASH0LAYOUT0_ECC0)
+#define MX6Q_BP_BCH_FLASH0LAYOUT0_ECC0		11
+#define MX6Q_BM_BCH_FLASH0LAYOUT0_ECC0	(0x1f << MX6Q_BP_BCH_FLASH0LAYOUT0_ECC0)
+#define BF_BCH_FLASH0LAYOUT0_ECC0(v, x)				\
+	(GPMI_IS_MX6Q(x)					\
+		? (((v) << MX6Q_BP_BCH_FLASH0LAYOUT0_ECC0)	\
+			& MX6Q_BM_BCH_FLASH0LAYOUT0_ECC0)	\
+		: (((v) << BP_BCH_FLASH0LAYOUT0_ECC0)		\
+			& BM_BCH_FLASH0LAYOUT0_ECC0)		\
+	)
 
 #define BP_BCH_FLASH0LAYOUT0_DATA0_SIZE		0
 #define BM_BCH_FLASH0LAYOUT0_DATA0_SIZE		\
 			(0xfff << BP_BCH_FLASH0LAYOUT0_DATA0_SIZE)
-#define BF_BCH_FLASH0LAYOUT0_DATA0_SIZE(v)	\
-	(((v) << BP_BCH_FLASH0LAYOUT0_DATA0_SIZE)\
-					 & BM_BCH_FLASH0LAYOUT0_DATA0_SIZE)
+#define MX6Q_BM_BCH_FLASH0LAYOUT0_DATA0_SIZE	\
+			(0x3ff << BP_BCH_FLASH0LAYOUT0_DATA0_SIZE)
+#define BF_BCH_FLASH0LAYOUT0_DATA0_SIZE(v, x)				\
+	(GPMI_IS_MX6Q(x)						\
+		? (((v) >> 2) & MX6Q_BM_BCH_FLASH0LAYOUT0_DATA0_SIZE)	\
+		: ((v) & BM_BCH_FLASH0LAYOUT0_DATA0_SIZE)		\
+	)
 
 #define HW_BCH_FLASH0LAYOUT1			0x00000090
 
@@ -72,13 +83,24 @@
 
 #define BP_BCH_FLASH0LAYOUT1_ECCN		12
 #define BM_BCH_FLASH0LAYOUT1_ECCN	(0xf << BP_BCH_FLASH0LAYOUT1_ECCN)
-#define BF_BCH_FLASH0LAYOUT1_ECCN(v)		\
-	(((v) << BP_BCH_FLASH0LAYOUT1_ECCN) & BM_BCH_FLASH0LAYOUT1_ECCN)
+#define MX6Q_BP_BCH_FLASH0LAYOUT1_ECCN		11
+#define MX6Q_BM_BCH_FLASH0LAYOUT1_ECCN	(0x1f << MX6Q_BP_BCH_FLASH0LAYOUT1_ECCN)
+#define BF_BCH_FLASH0LAYOUT1_ECCN(v, x)				\
+	(GPMI_IS_MX6Q(x)					\
+		? (((v) << MX6Q_BP_BCH_FLASH0LAYOUT1_ECCN)	\
+			& MX6Q_BM_BCH_FLASH0LAYOUT1_ECCN)	\
+		: (((v) << BP_BCH_FLASH0LAYOUT1_ECCN)		\
+			& BM_BCH_FLASH0LAYOUT1_ECCN)		\
+	)
 
 #define BP_BCH_FLASH0LAYOUT1_DATAN_SIZE		0
 #define BM_BCH_FLASH0LAYOUT1_DATAN_SIZE		\
 			(0xfff << BP_BCH_FLASH0LAYOUT1_DATAN_SIZE)
-#define BF_BCH_FLASH0LAYOUT1_DATAN_SIZE(v)	\
-	(((v) << BP_BCH_FLASH0LAYOUT1_DATAN_SIZE) \
-					 & BM_BCH_FLASH0LAYOUT1_DATAN_SIZE)
+#define MX6Q_BM_BCH_FLASH0LAYOUT1_DATAN_SIZE	\
+			(0x3ff << BP_BCH_FLASH0LAYOUT1_DATAN_SIZE)
+#define BF_BCH_FLASH0LAYOUT1_DATAN_SIZE(v, x)				\
+	(GPMI_IS_MX6Q(x)						\
+		? (((v) >> 2) & MX6Q_BM_BCH_FLASH0LAYOUT1_DATAN_SIZE)	\
+		: ((v) & BM_BCH_FLASH0LAYOUT1_DATAN_SIZE)		\
+	)
 #endif
drivers/mtd/nand/gpmi-nand/gpmi-lib.c +10 -8
index fa5200b..a1f4332 100644
@@ -224,13 +224,13 @@ int bch_set_geometry(struct gpmi_nand_data *this)
 	/* Configure layout 0. */
 	writel(BF_BCH_FLASH0LAYOUT0_NBLOCKS(block_count)
 			| BF_BCH_FLASH0LAYOUT0_META_SIZE(metadata_size)
-			| BF_BCH_FLASH0LAYOUT0_ECC0(ecc_strength)
-			| BF_BCH_FLASH0LAYOUT0_DATA0_SIZE(block_size),
+			| BF_BCH_FLASH0LAYOUT0_ECC0(ecc_strength, this)
+			| BF_BCH_FLASH0LAYOUT0_DATA0_SIZE(block_size, this),
 			r->bch_regs + HW_BCH_FLASH0LAYOUT0);
 
 	writel(BF_BCH_FLASH0LAYOUT1_PAGE_SIZE(page_size)
-			| BF_BCH_FLASH0LAYOUT1_ECCN(ecc_strength)
-			| BF_BCH_FLASH0LAYOUT1_DATAN_SIZE(block_size),
+			| BF_BCH_FLASH0LAYOUT1_ECCN(ecc_strength, this)
+			| BF_BCH_FLASH0LAYOUT1_DATAN_SIZE(block_size, this),
 			r->bch_regs + HW_BCH_FLASH0LAYOUT1);
 
 	/* Set *all* chip selects to use layout 0. */
@@ -256,11 +256,12 @@ static unsigned int ns_to_cycles(unsigned int time,
 	return max(k, min);
 }
 
+#define DEF_MIN_PROP_DELAY	5
+#define DEF_MAX_PROP_DELAY	9
 /* Apply timing to current hardware conditions. */
 static int gpmi_nfc_compute_hardware_timing(struct gpmi_nand_data *this,
 					struct gpmi_nfc_hardware_timing *hw)
 {
-	struct gpmi_nand_platform_data *pdata = this->pdata;
 	struct timing_threshod *nfc = &timing_default_threshold;
 	struct nand_chip *nand = &this->nand;
 	struct nand_timing target = this->timing;
@@ -277,8 +278,8 @@ static int gpmi_nfc_compute_hardware_timing(struct gpmi_nand_data *this,
 	int ideal_sample_delay_in_ns;
 	unsigned int sample_delay_factor;
 	int tEYE;
-	unsigned int min_prop_delay_in_ns = pdata->min_prop_delay_in_ns;
-	unsigned int max_prop_delay_in_ns = pdata->max_prop_delay_in_ns;
+	unsigned int min_prop_delay_in_ns = DEF_MIN_PROP_DELAY;
+	unsigned int max_prop_delay_in_ns = DEF_MAX_PROP_DELAY;
 
 	/*
 	 * If there are multiple chips, we need to relax the timings to allow
@@ -804,7 +805,8 @@ int gpmi_is_ready(struct gpmi_nand_data *this, unsigned chip)
 	if (GPMI_IS_MX23(this)) {
 		mask = MX23_BM_GPMI_DEBUG_READY0 << chip;
 		reg = readl(r->gpmi_regs + HW_GPMI_DEBUG);
-	} else if (GPMI_IS_MX28(this)) {
+	} else if (GPMI_IS_MX28(this) || GPMI_IS_MX6Q(this)) {
+		/* MX28 shares the same R/B register as MX6Q. */
 		mask = MX28_BF_GPMI_STAT_READY_BUSY(1 << chip);
 		reg = readl(r->gpmi_regs + HW_GPMI_STAT);
 	} else
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +0 -0
index 75b1dde..e0ea598 100644

drivers/mtd/nand/gpmi-nand/gpmi-nand.c line 27

Quoted 4 lines
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +1 -0
@@ -24,6 +24,9 @@
 #include <linux/module.h>
 #include <linux/mtd/gpmi-nand.h>
 #include <linux/mtd/partitions.h>
+#include <linux/of_address.h>

This line is probably not needed?

drivers/mtd/nand/gpmi-nand/gpmi-nand.c line 29

Quoted 2 lines
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +2 -0
+#include <linux/of_device.h>
+#include <linux/of_irq.h>

Ditto?

Quoted 37 lines
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +10 -6
 #include "gpmi-nand.h"
 
 /* add our owner bbt descriptor */
@@ -385,7 +388,7 @@ static void release_bch_irq(struct gpmi_nand_data *this)
 static bool gpmi_dma_filter(struct dma_chan *chan, void *param)
 {
 	struct gpmi_nand_data *this = param;
-	struct resource *r = this->private;
+	int dma_channel = (int)this->private;
 
 	if (!mxs_dma_is_apbh(chan))
 		return false;
@@ -397,7 +400,7 @@ static bool gpmi_dma_filter(struct dma_chan *chan, void *param)
 	 *	for mx28 :	MX28_DMA_GPMI0 ~ MX28_DMA_GPMI7
 	 *		(These eight channels share the same IRQ!)
 	 */
-	if (r->start <= chan->chan_id && chan->chan_id <= r->end) {
+	if (dma_channel == chan->chan_id) {
 		chan->private = &this->dma_data;
 		return true;
 	}
@@ -417,57 +420,45 @@ static void release_dma_channels(struct gpmi_nand_data *this)
 static int __devinit acquire_dma_channels(struct gpmi_nand_data *this)
 {
 	struct platform_device *pdev = this->pdev;
-	struct gpmi_nand_platform_data *pdata = this->pdata;
-	struct resources *res = &this->resources;
-	struct resource *r, *r_dma;
-	unsigned int i;
+	struct resource *r_dma;
+	struct device_node *dn;
+	int dma_channel;
+	unsigned int ret;
+	struct dma_chan *dma_chan;
+	dma_cap_mask_t mask;
+
+	/* dma channel, we only use the first one. */

drivers/mtd/nand/gpmi-nand/gpmi-nand.c static void release_dma_channels(struct gpmi_nand_data *this) · line 426

Quoted 10 lines
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +7 -2
+	dn = pdev->dev.of_node;
+	ret = of_property_read_u32(dn, "fsl,gpmi-dma-channel", &dma_channel);
+	if (ret) {
+		pr_err("unable to get DMA channel from dt.\n");
+		goto acquire_err;
+	}
+	this->private = (void *)dma_channel;
 
-	r = platform_get_resource_byname(pdev, IORESOURCE_DMA,
-					GPMI_NAND_DMA_CHANNELS_RES_NAME);

You are adding device tree support into a driver that is working fine for non-DT probe. So before all the users of this driver are converted to DT, you have to ensure the driver works for both non-DT and DT users in a single image when you add DT support for it.

So above code should be something like:

	if (dn) {
		/* get channel number from device tree */
		......
	} else {
		/* otherwise it works as before */
	}
Quoted 71 lines
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +13 -34
+	/* gpmi dma interrupt */
 	r_dma = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
 					GPMI_NAND_DMA_INTERRUPT_RES_NAME);
-	if (!r || !r_dma) {
+	if (!r_dma) {
 		pr_err("Can't get resource for DMA\n");
-		return -ENXIO;
+		goto acquire_err;
 	}
+	this->dma_data.chan_irq = r_dma->start;
 
-	/* used in gpmi_dma_filter() */
-	this->private = r;
-
-	for (i = r->start; i <= r->end; i++) {
-		struct dma_chan *dma_chan;
-		dma_cap_mask_t mask;
-
-		if (i - r->start >= pdata->max_chip_count)
-			break;
+	/* request dma channel */
+	dma_cap_zero(mask);
+	dma_cap_set(DMA_SLAVE, mask);
 
-		dma_cap_zero(mask);
-		dma_cap_set(DMA_SLAVE, mask);
-
-		/* get the DMA interrupt */
-		if (r_dma->start == r_dma->end) {
-			/* only register the first. */
-			if (i == r->start)
-				this->dma_data.chan_irq = r_dma->start;
-			else
-				this->dma_data.chan_irq = NO_IRQ;
-		} else
-			this->dma_data.chan_irq = r_dma->start + (i - r->start);
-
-		dma_chan = dma_request_channel(mask, gpmi_dma_filter, this);
-		if (!dma_chan)
-			goto acquire_err;
-
-		/* fill the first empty item */
-		this->dma_chans[i - r->start] = dma_chan;
+	dma_chan = dma_request_channel(mask, gpmi_dma_filter, this);
+	if (!dma_chan) {
+		pr_err("dma_request_channel failed.\n");
+		goto acquire_err;
 	}
 
-	res->dma_low_channel = r->start;
-	res->dma_high_channel = i;
+	this->dma_chans[0] = dma_chan;
 	return 0;
 
 acquire_err:
-	pr_err("Can't acquire DMA channel %u\n", i);
 	release_dma_channels(this);
 	return -EINVAL;
 }
@@ -1461,9 +1452,9 @@ void gpmi_nfc_exit(struct gpmi_nand_data *this)
 
 static int __devinit gpmi_nfc_init(struct gpmi_nand_data *this)
 {
-	struct gpmi_nand_platform_data *pdata = this->pdata;
 	struct mtd_info  *mtd = &this->mtd;
 	struct nand_chip *chip = &this->nand;
+	struct mtd_part_parser_data ppdata = {};
 	int ret;
 
 	/* init current chip */

drivers/mtd/nand/gpmi-nand/gpmi-nand.c static int __devinit gpmi_nfc_init(struct gpmi_nand_data *this) · line 1495

Quoted 5 lines
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +1 -1
@@ -1501,14 +1492,14 @@ static int __devinit gpmi_nfc_init(struct gpmi_nand_data *this)
 	if (ret)
 		goto err_out;
 
-	ret = nand_scan(mtd, pdata->max_chip_count);
+	ret = nand_scan(mtd, 1);

Ditto, you should not break non-DT users.

Quoted 42 lines
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +24 -3
 	if (ret) {
 		pr_err("Chip scan failed\n");
 		goto err_out;
 	}
 
-	ret = mtd_device_parse_register(mtd, NULL, NULL,
-			pdata->partitions, pdata->partition_count);
+	ppdata.of_node = this->pdev->dev.of_node;
+	ret = mtd_device_parse_register(mtd, NULL, &ppdata, NULL, 0);
 	if (ret)
 		goto err_out;
 	return 0;
@@ -1518,12 +1509,41 @@ err_out:
 	return ret;
 }
 
+static const struct platform_device_id gpmi_ids[] = {
+	{ .name = "imx23-gpmi-nand", .driver_data = IS_MX23, },
+	{ .name = "imx28-gpmi-nand", .driver_data = IS_MX28, },
+	{ .name = "imx6q-gpmi-nand", .driver_data = IS_MX6Q, },
+	{},
+};
+
+static const struct of_device_id gpmi_nand_id_table[] = {
+	{
+		.compatible = "fsl,imx23-gpmi-nand",
+		.data = (void *)&gpmi_ids[IS_MX23]
+	}, {
+		.compatible = "fsl,imx28-gpmi-nand",
+		.data = (void *)&gpmi_ids[IS_MX28]
+	}, {
+		.compatible = "fsl,imx6q-gpmi-nand",
+		.data = (void *)&gpmi_ids[IS_MX6Q]
+	}, {}
+};
+MODULE_DEVICE_TABLE(of, gpmi_nand_id_table);
+
 static int __devinit gpmi_nand_probe(struct platform_device *pdev)
 {
-	struct gpmi_nand_platform_data *pdata = pdev->dev.platform_data;
 	struct gpmi_nand_data *this;
+	const struct of_device_id *of_id;

drivers/mtd/nand/gpmi-nand/gpmi-nand.c err_out: · line 1546

Quoted 10 lines
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +8 -0
 	int ret;
 
+	of_id = of_match_device(gpmi_nand_id_table, &pdev->dev);
+	if (of_id)
+		pdev->id_entry = of_id->data;
+	else {
+		pr_err("Failed to find the right device id.\n");
+		return -ENOMEM;
+	}
+

Ditto, it should still work for non-DT users.

BTW, it seems Documentation/CodingStyle suggest put brace like the following.

	if (condition) {
		do_this();
	} else {
		otherwise_do_this();
		otherwise_do_that();
	}

Regards,
Shawn

Quoted 88 lines
drivers/mtd/nand/gpmi-nand/gpmi-nand.c +1 -18
 	this = kzalloc(sizeof(*this), GFP_KERNEL);
 	if (!this) {
 		pr_err("Failed to allocate per-device memory\n");
@@ -1533,13 +1553,6 @@ static int __devinit gpmi_nand_probe(struct platform_device *pdev)
 	platform_set_drvdata(pdev, this);
 	this->pdev  = pdev;
 	this->dev   = &pdev->dev;
-	this->pdata = pdata;
-
-	if (pdata->platform_init) {
-		ret = pdata->platform_init();
-		if (ret)
-			goto platform_init_error;
-	}
 
 	ret = acquire_resources(this);
 	if (ret)
@@ -1557,7 +1570,6 @@ static int __devinit gpmi_nand_probe(struct platform_device *pdev)
 
 exit_nfc_init:
 	release_resources(this);
-platform_init_error:
 exit_acquire_resources:
 	platform_set_drvdata(pdev, NULL);
 	kfree(this);
@@ -1575,19 +1587,10 @@ static int __exit gpmi_nand_remove(struct platform_device *pdev)
 	return 0;
 }
 
-static const struct platform_device_id gpmi_ids[] = {
-	{
-		.name = "imx23-gpmi-nand",
-		.driver_data = IS_MX23,
-	}, {
-		.name = "imx28-gpmi-nand",
-		.driver_data = IS_MX28,
-	}, {},
-};
-
 static struct platform_driver gpmi_nand_driver = {
 	.driver = {
 		.name = "gpmi-nand",
+		.of_match_table = gpmi_nand_id_table,
 	},
 	.probe   = gpmi_nand_probe,
 	.remove  = __exit_p(gpmi_nand_remove),
drivers/mtd/nand/gpmi-nand/gpmi-nand.h +4 -2
index ec6180d..ce5daa1 100644
@@ -266,8 +266,10 @@ extern int gpmi_read_page(struct gpmi_nand_data *,
 #define STATUS_UNCORRECTABLE	0xfe
 
 /* Use the platform_id to distinguish different Archs. */
-#define IS_MX23			0x1
-#define IS_MX28			0x2
+#define IS_MX23			0x0
+#define IS_MX28			0x1
+#define IS_MX6Q			0x2
 #define GPMI_IS_MX23(x)		((x)->pdev->id_entry->driver_data == IS_MX23)
 #define GPMI_IS_MX28(x)		((x)->pdev->id_entry->driver_data == IS_MX28)
+#define GPMI_IS_MX6Q(x)		((x)->pdev->id_entry->driver_data == IS_MX6Q)
 #endif
include/linux/mtd/gpmi-nand.h +4 -4
index 69b6dbf..ed3c4e0 100644
@@ -23,12 +23,12 @@
 #define GPMI_NAND_RES_SIZE	6
 
 /* Resource names for the GPMI NAND driver. */
-#define GPMI_NAND_GPMI_REGS_ADDR_RES_NAME  "GPMI NAND GPMI Registers"
+#define GPMI_NAND_GPMI_REGS_ADDR_RES_NAME  "gpmi-nand"
 #define GPMI_NAND_GPMI_INTERRUPT_RES_NAME  "GPMI NAND GPMI Interrupt"
-#define GPMI_NAND_BCH_REGS_ADDR_RES_NAME   "GPMI NAND BCH Registers"
-#define GPMI_NAND_BCH_INTERRUPT_RES_NAME   "GPMI NAND BCH Interrupt"
+#define GPMI_NAND_BCH_REGS_ADDR_RES_NAME   "bch"
+#define GPMI_NAND_BCH_INTERRUPT_RES_NAME   "bch"
 #define GPMI_NAND_DMA_CHANNELS_RES_NAME    "GPMI NAND DMA Channels"
-#define GPMI_NAND_DMA_INTERRUPT_RES_NAME   "GPMI NAND DMA Interrupt"
+#define GPMI_NAND_DMA_INTERRUPT_RES_NAME   "gpmi-dma"
 
 /**
  * struct gpmi_nand_platform_data - GPMI NAND driver platform data.
Signature · 1 line
1.7.0.4
#3 lore raw

PATCH v2 1/3 mtd: gpmi: add device tree support for mx6q and mx28

Hi Shawn:

thanks a lot for your review.

Quoted 4 lines

You are adding device tree support into a driver that is working fine for non-DT probe. So before all the users of this driver are converted to DT, you have to ensure the driver works for both non-DT and DT users in a single image when you add DT support for it.

The current gpmi-nand driver can not work in the non-DT, as you known, there are
several patches which are not accepted to you.

So, does it make sense to still maintain the support for non-DT?

So i prefer to convert the gpmi-nand to a pure DT driver. make the code clear and simple.

Quoted 144 lines

So above code should be something like:

	if (dn) {
		/* get channel number from device tree */
		......
	} else {
		/* otherwise it works as before */
	}
Quoted 69 lines
Quoted 69 lines

+ /* gpmi dma interrupt */
r_dma = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
GPMI_NAND_DMA_INTERRUPT_RES_NAME);
- if (!r || !r_dma) {

 +	if (!r_dma) {
   		pr_err("Can't get resource for DMA\n");
 -		return -ENXIO;
 +		goto acquire_err;
   	}

+ this->dma_data.chan_irq = r_dma->start;

- /* used in gpmi_dma_filter() */
- this->private = r;
-
- for (i = r->start; i<= r->end; i++) {
- struct dma_chan *dma_chan;
- dma_cap_mask_t mask;
-
- if (i - r->start>= pdata->max_chip_count)
- break;
+ /* request dma channel */
+ dma_cap_zero(mask);
+ dma_cap_set(DMA_SLAVE, mask);

- dma_cap_zero(mask);
- dma_cap_set(DMA_SLAVE, mask);
-
- /* get the DMA interrupt */
- if (r_dma->start == r_dma->end) {
- /* only register the first. */
- if (i == r->start)
- this->dma_data.chan_irq = r_dma->start;
- else
- this->dma_data.chan_irq = NO_IRQ;
- } else
- this->dma_data.chan_irq = r_dma->start + (i - r->start);
-
- dma_chan = dma_request_channel(mask, gpmi_dma_filter, this);
- if (!dma_chan)
- goto acquire_err;
-
- /* fill the first empty item */
- this->dma_chans[i - r->start] = dma_chan;
+ dma_chan = dma_request_channel(mask, gpmi_dma_filter, this);
+ if (!dma_chan) {
+ pr_err("dma_request_channel failed.\n");

 +		goto acquire_err;
   	}

- res->dma_low_channel = r->start;
- res->dma_high_channel = i;

 +	this->dma_chans[0] = dma_chan;
   	return 0;
 
   acquire_err:
 -	pr_err("Can't acquire DMA channel %u\n", i);
   	release_dma_channels(this);
   	return -EINVAL;
   }

@@ -1461,9 +1452,9 @@ void gpmi_nfc_exit(struct gpmi_nand_data *this)

static int __devinit gpmi_nfc_init(struct gpmi_nand_data *this) {

 -	struct gpmi_nand_platform_data *pdata = this->pdata;
   	struct mtd_info  *mtd =&this->mtd;
   	struct nand_chip *chip =&this->nand;
 +	struct mtd_part_parser_data ppdata = {};
   	int ret;
Quoted 7 lines
Quoted 7 lines
   	/* init current chip */

@@ -1501,14 +1492,14 @@ static int __devinit gpmi_nfc_init(struct gpmi_nand_data *this)
if (ret)
goto err_out;

- ret = nand_scan(mtd, pdata->max_chip_count);
+ ret = nand_scan(mtd, 1);

Ditto, you should not break non-DT users.

Quoted 44 lines
Quoted 44 lines
   	if (ret) {
   		pr_err("Chip scan failed\n");
   		goto err_out;
   	}

- ret = mtd_device_parse_register(mtd, NULL, NULL,
- pdata->partitions, pdata->partition_count);
+ ppdata.of_node = this->pdev->dev.of_node;

 +	ret = mtd_device_parse_register(mtd, NULL,&ppdata, NULL, 0);
   	if (ret)
   		goto err_out;
   	return 0;
 @@ -1518,12 +1509,41 @@ err_out:
   	return ret;
   }

+static const struct platform_device_id gpmi_ids[] = {
+ { .name = "imx23-gpmi-nand", .driver_data = IS_MX23, },
+ { .name = "imx28-gpmi-nand", .driver_data = IS_MX28, },
+ { .name = "imx6q-gpmi-nand", .driver_data = IS_MX6Q, },
+ {},
+};
+
+static const struct of_device_id gpmi_nand_id_table[] = {
+ {
+ .compatible = "fsl,imx23-gpmi-nand",
+ .data = (void *)&gpmi_ids[IS_MX23]
+ }, {
+ .compatible = "fsl,imx28-gpmi-nand",
+ .data = (void *)&gpmi_ids[IS_MX28]
+ }, {
+ .compatible = "fsl,imx6q-gpmi-nand",
+ .data = (void *)&gpmi_ids[IS_MX6Q]
+ }, {}
+};
+MODULE_DEVICE_TABLE(of, gpmi_nand_id_table);
+
static int __devinit gpmi_nand_probe(struct platform_device *pdev) {

 -	struct gpmi_nand_platform_data *pdata = pdev->dev.platform_data;
   	struct gpmi_nand_data *this;
 +	const struct of_device_id *of_id;
   	int ret;
Quoted 8 lines
Quoted 8 lines

+ of_id = of_match_device(gpmi_nand_id_table,&pdev->dev);
+ if (of_id)
+ pdev->id_entry = of_id->data;
+ else {
+ pr_err("Failed to find the right device id.\n");
+ return -ENOMEM;
+ }
+

Ditto, it should still work for non-DT users.

BTW, it seems Documentation/CodingStyle suggest put brace like the following.

Quoted 6 lines
	if (condition) {
		do_this();
	} else {
		otherwise_do_this();
		otherwise_do_that();
	}

thanks.
But the Documention/CodingStyle tells us "Do not unnecessarily use braces where a single statement will do."

Best Regards
Huang Shijie

#4 lore raw

PATCH v2 1/3 mtd: gpmi: add device tree support for mx6q and mx28

Quoted 7 lines · Huang Shijie

Hi Shawn:

thanks a lot for your review.

Quoted 4 lines

You are adding device tree support into a driver that is working fine for non-DT probe. So before all the users of this driver are converted to DT, you have to ensure the driver works for both non-DT and DT users in a single image when you add DT support for it.

Quoted 9 lines

The current gpmi-nand driver can not work in the non-DT, as you known, there are
several patches which are not accepted to you.

So, does it make sense to still maintain the support for non-DT?

So i prefer to convert the gpmi-nand to a pure DT driver. make the code clear and simple.

Yeah, I'm fine with that.

Signature · 2 lines
Regards,
Shawn
#5 lore raw

PATCH v2 1/3 mtd: gpmi: add device tree support for mx6q and mx28

In reply to Shawn Guo

? 2012?05?01? 15:49, Shawn Guo ??:

Quoted 9 lines

BTW, it seems Documentation/CodingStyle suggest put brace like the following.

	if (condition) {
		do_this();
	} else {
		otherwise_do_this();
		otherwise_do_that();
	}

sorry. you are right.

Best Regards
Huang Shijie

#6 lore raw

PATCH v2 2/3 ARM: mx28: add gpmi-nand dt support

In reply to Huang Shijie

add gpmi-nand device tree support, and add proper clock for it. Also enable the gpmi support for mx28-evk board.

---
 arch/arm/boot/dts/imx28-evk.dts |    4 ++++
 arch/arm/boot/dts/imx28.dtsi    |   18 +++++++++---------
 arch/arm/mach-mxs/clock-mx28.c  |    2 +-
 3 files changed, 14 insertions(+), 10 deletions(-)
arch/arm/boot/dts/imx28-evk.dts +4 -0
index 157ecac..66a4b3b 100644
@@ -22,6 +22,10 @@
 
         apb at 80000000 {
                 apbh at 80000000 {
+			gpmi-nand at 8000c000 {
+				status = "okay";
+			};
+
 			mmc1: ssp at 80010000 {
 				slot-8bit;
 				status = "okay";
arch/arm/boot/dts/imx28.dtsi +9 -9
index dd209a3..c1e783e 100644
@@ -62,15 +62,15 @@
 				status = "disabled";
 			};
 
-			bch at 8000a000 {
-				reg = <0x8000a000 2000>;
-				interrupts = <41>;
-				status = "disabled";
-			};
-
-			gpmi at 8000c000 {
-				reg = <0x8000c000 2000>;
-				interrupts = <42 88>;
+			gpmi-nand at 8000c000 {
+				compatible = "fsl,imx28-gpmi-nand";
+				#address-cells = <1>;
+				#size-cells = <1>;
+				reg = <0x8000c000 2000>, <0x8000a000 2000>;
+				reg-names = "gpmi-nand", "bch";
+				interrupts = <88>, <41>;
+				interrupt-names = "gpmi-dma", "bch";
+				fsl,gpmi-dma-channel = <4>;
 				status = "disabled";
 			};
 
arch/arm/mach-mxs/clock-mx28.c +1 -1
index 8401854..6fe6737 100644
@@ -617,7 +617,6 @@ static struct clk_lookup lookups[] = {
 	_REGISTER_CLOCK("duart", NULL, uart_clk)
 	_REGISTER_CLOCK("imx28-fec.0", NULL, fec_clk)
 	_REGISTER_CLOCK("imx28-fec.1", NULL, fec_clk)
-	_REGISTER_CLOCK("imx28-gpmi-nand", NULL, gpmi_clk)
 	_REGISTER_CLOCK("mxs-auart.0", NULL, uart_clk)
 	_REGISTER_CLOCK("mxs-auart.1", NULL, uart_clk)
 	_REGISTER_CLOCK("mxs-auart.2", NULL, uart_clk)
@@ -649,6 +648,7 @@ static struct clk_lookup lookups[] = {
 	_REGISTER_CLOCK("mxs-saif.0", NULL, saif0_clk)
 	_REGISTER_CLOCK("mxs-saif.1", NULL, saif1_clk)
 	/* for DT */
+	_REGISTER_CLOCK("8000c000.gpmi-nand", NULL, gpmi_clk)
 	_REGISTER_CLOCK("80074000.serial", NULL, uart_clk)
 	_REGISTER_CLOCK("800f0000.ethernet", NULL, fec_clk)
 	_REGISTER_CLOCK("800f4000.ethernet", NULL, fec_clk)
Signature · 1 line
1.7.0.4
#7 lore raw

PATCH v2 3/3 ARM: mx6q: add gpmi-nand dt support

In reply to Huang Shijie

add gpmi-nand dt support, and add the proper clock for gpmi-nand. Also enable the gpmi for mx6q-arm2 board.

---
 arch/arm/boot/dts/imx6q-arm2.dts |    4 ++++
 arch/arm/boot/dts/imx6q.dtsi     |   12 ++++++++++++
 arch/arm/mach-imx/clock-imx6q.c  |    5 +++--
 3 files changed, 19 insertions(+), 2 deletions(-)
arch/arm/boot/dts/imx6q-arm2.dts +4 -0
index ce1c823..34d09da 100644
@@ -26,6 +26,10 @@
 	};
 
 	soc {
+		gpmi-nand at 00112000 {
+			status = "okay";
+		};
+
 		aips-bus at 02100000 { /* AIPS2 */
 			enet at 02188000 {
 				phy-mode = "rgmii";
arch/arm/boot/dts/imx6q.dtsi +12 -0
index 4905f51..0a0ebf0 100644
@@ -87,6 +87,18 @@
 		interrupt-parent = <&intc>;
 		ranges;
 
+		gpmi-nand at 00112000 {
+			compatible = "fsl,imx6q-gpmi-nand";
+			#address-cells = <1>;
+			#size-cells = <1>;
+			reg = <0x00112000 0x2000>, <0x00114000 0x2000>;
+			reg-names = "gpmi-nand", "bch";
+			interrupts = <0 13 0x04>, <0 15 0x04>;
+			interrupt-names = "gpmi-dma", "bch";
+			fsl,gpmi-dma-channel = <0>;
+			status = "disabled";
+		};
+
 		timer at 00a00600 {
 			compatible = "arm,cortex-a9-twd-timer";
 			reg = <0x00a00600 0x20>;
arch/arm/mach-imx/clock-imx6q.c +3 -2
index 111c328..e3dc1b3 100644
@@ -1859,7 +1859,8 @@ DEF_CLK(pwm1_clk,	  CCGR4, CG8,  &ipg_perclk,	  NULL);
 DEF_CLK(pwm2_clk,	  CCGR4, CG9,  &ipg_perclk,	  NULL);
 DEF_CLK(pwm3_clk,	  CCGR4, CG10, &ipg_perclk,	  NULL);
 DEF_CLK(pwm4_clk,	  CCGR4, CG11, &ipg_perclk,	  NULL);
-DEF_CLK(gpmi_bch_apb_clk, CCGR4, CG12, &usdhc3_clk,	  NULL);
+DEF_CLK(per1_bch_clk,     CCGR4, CG6,  &usdhc3_clk,	  NULL);
+DEF_CLK(gpmi_bch_apb_clk, CCGR4, CG12, &usdhc3_clk,	  &per1_bch_clk);
 DEF_CLK(gpmi_bch_clk,	  CCGR4, CG13, &usdhc4_clk,	  &gpmi_bch_apb_clk);
 DEF_CLK(gpmi_apb_clk,	  CCGR4, CG15, &usdhc3_clk,	  &gpmi_bch_clk);
 DEF_CLK(gpmi_io_clk,	  CCGR4, CG14, &enfc_clk,	  &gpmi_apb_clk);
@@ -1988,7 +1989,7 @@ static struct clk_lookup lookups[] = {
 	_REGISTER_CLOCK(NULL, "pwm2_clk", pwm2_clk),
 	_REGISTER_CLOCK(NULL, "pwm3_clk", pwm3_clk),
 	_REGISTER_CLOCK(NULL, "pwm4_clk", pwm4_clk),
-	_REGISTER_CLOCK(NULL, "gpmi_io_clk", gpmi_io_clk),
+	_REGISTER_CLOCK("112000.gpmi-nand", NULL, gpmi_io_clk),
 	_REGISTER_CLOCK(NULL, "usboh3_clk", usboh3_clk),
 	_REGISTER_CLOCK(NULL, "sata_clk", sata_clk),
 	_REGISTER_CLOCK(NULL, "cko1_clk", cko1_clk),
Signature · 1 line
1.7.0.4
#8 lore raw

v2 cover add gpmi-nand dt support for mx6q and mx28

In reply to Huang Shijie

Hi Huang Shijie,

Quoted 13 lines · Huang Shijie

The mx6q-arm2 and imx28evk have already support the device tree now. So i decide to add the gpmi-nand dt support to them.

The mx23 does not support the device tree now. I will add the gpmi dt support when it is ready.

Test this patch set on both MX6Q(arm2) and mx28(evk).

v1 --> v2
[1] merge the gpmi/bch device node into one node.
[2] add partitions support.
[3] misc

Quoted 4 lines

Huang Shijie (3):
mtd: gpmi: add device tree support for mx6q and mx28
ARM: mx28: add gpmi-nand dt support
ARM: mx6q: add gpmi-nand dt support

For which kernel are these 3 patches? I tried to apply them on top of 3.4-rc4 and got a lot of rejects.

Best regards

Dirk

#9 lore raw

v2 cover add gpmi-nand dt support for mx6q and mx28

? 2012?04?25? 14:41, Dirk Behme ??:

Quoted 17 lines

Hi Huang Shijie,

Quoted 14 lines · Huang Shijie

The mx6q-arm2 and imx28evk have already support the device tree now. So i decide to add the gpmi-nand dt support to them.

The mx23 does not support the device tree now. I will add the gpmi dt support
when it is ready.

Test this patch set on both MX6Q(arm2) and mx28(evk).

v1 --> v2
[1] merge the gpmi/bch device node into one node.
[2] add partitions support.
[3] misc

Quoted 8 lines
Quoted 4 lines

Huang Shijie (3):
mtd: gpmi: add device tree support for mx6q and mx28
ARM: mx28: add gpmi-nand dt support
ARM: mx6q: add gpmi-nand dt support

For which kernel are these 3 patches? I tried to apply them on top of 3.4-rc4 and got a lot of rejects.

They are based on 3.4-rc4. but I also applied some mxs-dma patches.

Which one cause the rejects?
I think the first patch "mtd:gpmi .." will not meet any rejects. The other two small patches may meet rejects, but you can fix it by hand.

BR
Huang Shijie

#10 lore raw

v2 cover add gpmi-nand dt support for mx6q and mx28

Quoted 22 lines · Huang Shijie

? 2012?04?25? 14:41, Dirk Behme ??:

Quoted 21 lines

Hi Huang Shijie,

Quoted 18 lines · Huang Shijie

The mx6q-arm2 and imx28evk have already support the device tree now. So i decide to add the gpmi-nand dt support to them.

The mx23 does not support the device tree now. I will add the gpmi dt support
when it is ready.

Test this patch set on both MX6Q(arm2) and mx28(evk).

v1 --> v2
[1] merge the gpmi/bch device node into one node.
[2] add partitions support.
[3] misc

Huang Shijie (3):
mtd: gpmi: add device tree support for mx6q and mx28
ARM: mx28: add gpmi-nand dt support
ARM: mx6q: add gpmi-nand dt support

Quoted 6 lines
Quoted 3 lines

For which kernel are these 3 patches? I tried to apply them on top of 3.4-rc4 and got a lot of rejects.

They are based on 3.4-rc4. but I also applied some mxs-dma patches.

Which one cause the rejects?

Could you kindly try to apply "mtd: gpmi: add device tree support for mx6q and mx28" on a clean 3.4-rc4?

Many thanks

Dirk

#11 lore raw

v2 cover add gpmi-nand dt support for mx6q and mx28

? 2012?04?25? 15:10, Dirk Behme ??:

Quoted 26 lines · Huang Shijie
Quoted 25 lines

? 2012?04?25? 14:41, Dirk Behme ??:

Quoted 24 lines

Hi Huang Shijie,

Quoted 14 lines · Huang Shijie

The mx6q-arm2 and imx28evk have already support the device tree now. So i decide to add the gpmi-nand dt support to them.

The mx23 does not support the device tree now. I will add the gpmi dt support
when it is ready.

Test this patch set on both MX6Q(arm2) and mx28(evk).

v1 --> v2
[1] merge the gpmi/bch device node into one node.
[2] add partitions support.
[3] misc

Quoted 4 lines

Huang Shijie (3):
mtd: gpmi: add device tree support for mx6q and mx28
ARM: mx28: add gpmi-nand dt support
ARM: mx6q: add gpmi-nand dt support

For which kernel are these 3 patches? I tried to apply them on top of 3.4-rc4 and got a lot of rejects.

Quoted 7 lines
Quoted 3 lines

They are based on 3.4-rc4. but I also applied some mxs-dma patches.

Which one cause the rejects?

Could you kindly try to apply "mtd: gpmi: add device tree support for mx6q and mx28" on a clean 3.4-rc4?

I tried just now, it works fine.

Huang Shijie

Quoted 4 lines

Many thanks

Dirk

#12 lore raw

v2 cover add gpmi-nand dt support for mx6q and mx28

In reply to Huang Shijie
Quoted 5 lines · Huang Shijie

The mx6q-arm2 and imx28evk have already support the device tree now. So i decide to add the gpmi-nand dt support to them.

The mx23 does not support the device tree now. I will add the gpmi dt support when it is ready.

I cannot apply these patches to l2-mtd.git:

Applying: ARM: mx28: add gpmi-nand dt support
error: arch/arm/boot/dts/imx28-evk.dts: does not exist in index
error: arch/arm/boot/dts/imx28.dtsi: does not exist in index

Signature · 9 lines
Best Regards,
Artem Bityutskiy
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20120428/6f581371/attachment-0001.sig>
#13 lore raw

v2 cover add gpmi-nand dt support for mx6q and mx28

Hi Artem:

Quoted 8 lines · Artem Bityutskiy
Quoted 5 lines · Huang Shijie

The mx6q-arm2 and imx28evk have already support the device tree now. So i decide to add the gpmi-nand dt support to them.

The mx23 does not support the device tree now. I will add the gpmi dt support when it is ready.

I cannot apply these patches to l2-mtd.git:

Could you only apply the gpmi-nand patch? The other two patches are for DT, and should be appled in Shawn's tree.

Best Regards
Huang Shijie

Quoted 14 lines

Applying: ARM: mx28: add gpmi-nand dt support
error: arch/arm/boot/dts/imx28-evk.dts: does not exist in index
error: arch/arm/boot/dts/imx28.dtsi: does not exist in index

--
Best Regards,
Artem Bityutskiy

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel