Skip to contentSkip to conversation

MX5: Make the weim structure complete

PATCH Superseded Fabio Estevam 4 participants 8 messages May 18, 2011 – May 19, 2011

Subsystems (2)

v3 of 6 Superseded Latest is v6 →

lore
Share & tools
lore
#0 lore raw

PATCH v3 1/4 MX5: Make the weim structure complete

---
Changes since v2:
- Add CS1_BASE_ADDR for MX51
- Add WEIM Registers

 arch/arm/include/asm/arch-mx5/imx-regs.h |  131 ++++++++++++++++++++++++++++--
 1 files changed, 125 insertions(+), 6 deletions(-)
arch/arm/include/asm/arch-mx5/imx-regs.h +125 -6
index a1849f8..b65b11f 100644
@@ -32,6 +32,7 @@
 #define CSD0_BASE_ADDR          0x90000000
 #define CSD1_BASE_ADDR          0xA0000000
 #define NFC_BASE_ADDR_AXI       0xCFFF0000
+#define CS1_BASE_ADDR           0xB8000000
 #elif defined(CONFIG_MX53)
 #define IPU_CTRL_BASE_ADDR      0x18000000
 #define SPBA0_BASE_ADDR         0x50000000
@@ -41,6 +42,7 @@
 #define CSD1_BASE_ADDR          0xB0000000
 #define NFC_BASE_ADDR_AXI       0xF7FF0000
 #define IRAM_BASE_ADDR          0xF8000000
+#define CS1_BASE_ADDR           0xF4000000
 #else
 #error "CPU_TYPE not defined"
 #endif
@@ -129,6 +131,90 @@
 #define SAHARA_BASE_ADDR	(AIPS2_BASE_ADDR + 0x000F8000)
 
 /*
+ * WEIM CSnGCR1
+ */
+#define CSEN(x)	(x)
+#define SWR(x)		((x) << 1)
+#define SRD(x)		((x) << 2)
+#define MUM(x)		((x) << 3)
+#define WFL(x)		((x) << 4)
+#define RFL(x)		((x) << 5)
+#define CRE(x)		((x) << 6)
+#define CREP(x)	((x) << 7)
+#define BL(x)		(((x) & 0x7) << 8)
+#define WC(x)		((x) << 11)
+#define BCD(x)		(((x) & 0x3) << 12)
+#define BCS(x)		(((x) & 0x3) << 14)
+#define DSZ(x)		(((x) & 0x7) << 16)
+#define SP(x)		((x) << 19)
+#define CSREC(x)	(((x) & 0x7) << 20)
+#define AUS(x)		((x) << 23)
+#define GBC(x)		(((x) & 0x7) << 24)
+#define WP(x)		((x) << 27)
+#define PSZ(x)		(((x) & 0x0f << 28)
+
+/*
+ * WEIM CSnGCR2
+ */
+#define ADH(x)		(((x) & 0x3))
+#define DAPS(x)	(((x) & 0x0f << 4)
+#define DAE(x)		((x) << 8)
+#define DAP(x)		((x) << 9)
+#define MUX16_BYP(x)	((x) << 12)
+
+/*
+ * WEIM CSnRCR1
+ */
+#define RCSN(x)	(((x) & 0x7))
+#define RCSA(x)	(((x) & 0x7) << 4)
+#define OEN(x)		(((x) & 0x7) << 8)
+#define OEA(x)		(((x) & 0x7) << 12)
+#define RADVN(x)	(((x) & 0x7) << 16)
+#define RAL(x)		((x) << 19)
+#define RADVA(x)	(((x) & 0x7) << 20)
+#define RWSC(x)	(((x) & 0x3f) << 24)
+
+/*
+ * WEIM CSnRCR2
+ */
+#define RBEN(x)	(((x) & 0x7))
+#define RBE(x)		((x) << 3)
+#define RBEA(x)	(((x) & 0x7) << 4)
+#define RL(x)		(((x) & 0x3) << 8)
+#define PAT(x)		(((x) & 0x7) << 12)
+#define APR(x)		((x) << 15)
+
+/*
+ * WEIM CSnWCR1
+ */
+#define WCSN(x)	(((x) & 0x7))
+#define WCSA(x)	(((x) & 0x7) << 3)
+#define WEN(x)		(((x) & 0x7) << 6)
+#define WEA(x)		(((x) & 0x7) << 9)
+#define WBEN(x)	(((x) & 0x7) << 12)
+#define WBEA(x)	(((x) & 0x7) << 15)
+#define WADVN(x)	(((x) & 0x7) << 18)
+#define WADVA(x)	(((x) & 0x7) << 21)
+#define WWSC(x)	(((x) & 0x3f) << 24)
+#define WBED1(x)	((x) << 30)
+#define WAL(x)		((x) << 31)
+
+/*
+ * WEIM CSnWCR2
+ */
+#define WBED(x)	(x)
+
+/*
+ * WEIM WCR
+ */
+#define BCM(x)		(x)
+#define GBCD(x)	(((x) & 0x3) << 1)
+#define INTEN(x)	((x) << 4)
+#define INTPOL(x)	((x) << 5)
+#define WDOG_EN(x)	((x) << 8)
+#define WDOG_LIMIT(x)	(((x) & 0x3) << 9)
+
+/*
  * Number of GPIO pins per port
  */
 #define GPIO_NUM_PIN            32
@@ -231,12 +317,45 @@ struct clkctl {
 
 /* WEIM registers */
 struct weim {
-	u32	csgcr1;
-	u32	csgcr2;
-	u32	csrcr1;
-	u32	csrcr2;
-	u32	cswcr1;
-	u32	cswcr2;
+	u32	cs0gcr1;
+	u32	cs0gcr2;
+	u32	cs0rcr1;
+	u32	cs0rcr2;
+	u32	cs0wcr1;
+	u32	cs0wcr2;
+	u32	cs1gcr1;
+	u32	cs1gcr2;
+	u32	cs1rcr1;
+	u32	cs1rcr2;
+	u32	cs1wcr1;
+	u32	cs1wcr2;
+	u32	cs2gcr1;
+	u32	cs2gcr2;
+	u32	cs2rcr1;
+	u32	cs2rcr2;
+	u32	cs2wcr1;
+	u32	cs2wcr2;
+	u32	cs3gcr1;
+	u32	cs3gcr2;
+	u32	cs3rcr1;
+	u32	cs3rcr2;
+	u32	cs3wcr1;
+	u32	cs3wcr2;
+	u32	cs4gcr1;
+	u32	cs4gcr2;
+	u32	cs4rcr1;
+	u32	cs4rcr2;
+	u32	cs4wcr1;
+	u32	cs4wcr2;
+	u32	cs5gcr1;
+	u32	cs5gcr2;
+	u32	cs5rcr1;
+	u32	cs5rcr2;
+	u32	cs5wcr1;
+	u32	cs5wcr2;
+	u32	wcr;
+	u32	wiar;
+	u32	ear;
 };
 
 /* GPIO Registers */
Signature · 1 line
1.6.0.4
#1 lore raw

PATCH v3 2/4 MX5: Add iomux structure

---
Changes since v2:
- Distinguish iomuxc struct between MX51 and MX53

 arch/arm/include/asm/arch-mx5/imx-regs.h |   23 +++++++++++++++++++++++
 1 files changed, 23 insertions(+), 0 deletions(-)
arch/arm/include/asm/arch-mx5/imx-regs.h +23 -0
index b65b11f..3c61c7f 100644
@@ -358,6 +358,29 @@ struct weim {
 	u32	ear;
 };
 
+#if defined(CONFIG_MX51)
+struct iomuxc {
+	u32	gpr0;
+	u32	gpr1;
+	u32	omux0;
+	u32	omux1;
+	u32	omux2;
+	u32	omux3;
+	u32	omux4;
+};
+#elif defined(CONFIG_MX53)
+struct iomuxc {
+	u32	gpr0;
+	u32	gpr1;
+	u32	gpr2;
+	u32	omux0;
+	u32	omux1;
+	u32	omux2;
+	u32	omux3;
+	u32	omux4;
+};
+#endif
+
 /* GPIO Registers */
 struct gpio_regs {
 	u32	gpio_dr;
Signature · 1 line
1.6.0.4
#2 lore raw

PATCH v3 3/4 MX5: Introduce a function for setting the chip select size

---
 arch/arm/cpu/armv7/mx5/soc.c              |   30 +++++++++++++++++++++++++++++
 arch/arm/include/asm/arch-mx5/imx-regs.h  |    5 ++++
 arch/arm/include/asm/arch-mx5/sys_proto.h |    2 +-
 3 files changed, 36 insertions(+), 1 deletions(-)
arch/arm/cpu/armv7/mx5/soc.c +30 -0
index 40b8b56..e599df8 100644
@@ -163,6 +163,36 @@ int cpu_mmc_init(bd_t *bis)
 #endif
 }
 
+void set_chipselect_size(int const cs_size)
+{
+	unsigned int reg;
+	struct iomuxc *iomuxc_regs = (struct weim *)IOMUXC_BASE_ADDR;
+	reg = readl(&iomuxc_regs->gpr1);
+
+	switch (cs_size) {
+	case CS0_128:
+		reg &= ~0x7;	/* CS0=128MB, CS1=0, CS2=0, CS3=0 */
+		reg |= 0x5;
+		break;
+	case CS0_64M_CS1_64M:
+		reg &= ~0x3F;	/* CS0=64MB, CS1=64MB, CS2=0, CS3=0 */
+		reg |= 0x1B;
+		break;
+	case CS0_64M_CS1_32M_CS2_32M:
+		reg &= ~0x1FF;	/* CS0=64MB, CS1=32MB, CS2=32MB, CS3=0 */
+		reg |= 0x4B;
+		break;
+	case CS0_32M_CS1_32M_CS2_32M_CS3_32M:
+		reg &= ~0xFFF;  /* CS0=32MB, CS1=32MB, CS2=32MB, CS3=32MB */
+		reg |= 0x249;
+		break;
+	default:
+		printf("Unknown chip select size\n");
+		break;
+	}
+
+	writel(reg, &iomuxc_regs->gpr1);
+}
 
 void reset_cpu(ulong addr)
 {
arch/arm/include/asm/arch-mx5/imx-regs.h +5 -0
index 9d2046a..5163614 100644
@@ -214,6 +214,11 @@
 #define WDOG_EN(x)	((x) << 8)
 #define WDOG_LIMIT(x)	(((x) & 0x3) << 9)
 
+#define CS0_128					0
+#define CS0_64M_CS1_64M				1
+#define CS0_64M_CS1_32M_CS2_32M			2
+#define CS0_32M_CS1_32M_CS2_32M_CS3_32M		3
+
 /*
  * Number of GPIO pins per port
  */
arch/arm/include/asm/arch-mx5/sys_proto.h +1 -1
index f687503..ce63675 100644
@@ -27,5 +27,5 @@
 u32 get_cpu_rev(void);
 #define is_soc_rev(rev)	((get_cpu_rev() & 0xFF) - rev)
 void sdelay(unsigned long);
-
+void set_chipselect_size(int const);
 #endif
Signature · 1 line
1.6.0.4
#3 lore raw

PATCH v3 4/4 MX53: Add initial support for MX53ARD

---
Changes since v2:
- Use macros for setting up weim register
- Use set_chipselect_size function
- Rename the file to imximage_dd3.cfg to make explicit the DDR type.

 MAINTAINERS                              |    1 +
 board/freescale/mx53ard/Makefile         |   48 +++++
 board/freescale/mx53ard/imximage_dd3.cfg |   96 +++++++++
 board/freescale/mx53ard/mx53ard.c        |  308 ++++++++++++++++++++++++++++++
 boards.cfg                               |    1 +
 include/configs/mx53ard.h                |  198 +++++++++++++++++++
 6 files changed, 652 insertions(+), 0 deletions(-)
 create mode 100644 board/freescale/mx53ard/Makefile
 create mode 100644 board/freescale/mx53ard/imximage_dd3.cfg
 create mode 100644 board/freescale/mx53ard/mx53ard.c
 create mode 100644 include/configs/mx53ard.h
MAINTAINERS +1 -0
index 07237e3..b63f53f 100644
@@ -639,6 +639,7 @@ Kristoffer Ericson <[email protected]>
 Fabio Estevam <[email protected]>
 
 	mx31pdk		i.MX31
+	mx53ard		i.MX53
 	mx53smd		i.MX53
 
 Peter Figuli <[email protected]>
board/freescale/mx53ard/Makefile new file +48 -0

48 lines not on this page · raw message

board/freescale/mx53ard/imximage_dd3.cfg new file +96 -0

96 lines not on this page · raw message

board/freescale/mx53ard/mx53ard.c new file +308 -0

308 lines not on this page · raw message

boards.cfg +1 -0
index 9339981..a616f29 100644
@@ -124,6 +124,7 @@ dkb			     arm         arm926ejs   -                   Marvell        pantheon
 ca9x4_ct_vxp                 arm         armv7       vexpress            armltd
 efikamx                      arm         armv7       efikamx             -              mx5
 mx51evk                      arm         armv7       mx51evk             freescale      mx5		mx51evk:IMX_CONFIG=board/freescale/mx51evk/imximage.cfg
+mx53ard                      arm         armv7       mx53ard             freescale      mx5		mx53ard:IMX_CONFIG=board/freescale/mx53ard/imximage_dd3.cfg
 mx53evk                      arm         armv7       mx53evk             freescale      mx5		mx53evk:IMX_CONFIG=board/freescale/mx53evk/imximage.cfg
 mx53loco                     arm         armv7       mx53loco            freescale      mx5		mx53loco:IMX_CONFIG=board/freescale/mx53loco/imximage.cfg
 mx53smd                      arm         armv7       mx53smd             freescale      mx5		mx53smd:IMX_CONFIG=board/freescale/mx53smd/imximage.cfg
include/configs/mx53ard.h new file +198 -0

198 lines not on this page · raw message

Signature · 1 line
1.6.0.4
#4 lore raw

PATCH v3 3/4 MX5: Introduce a function for setting the chip select size

In reply to Fabio Estevam
Quoted 2 lines · Fabio Estevam

---

Hi Fabio,

Quoted 20 lines
arch/arm/cpu/armv7/mx5/soc.c +20 -0
+void set_chipselect_size(int const cs_size)
+{
+	unsigned int reg;
+	struct iomuxc *iomuxc_regs = (struct weim *)IOMUXC_BASE_ADDR;
+	reg = readl(&iomuxc_regs->gpr1);
+
+	switch (cs_size) {
+	case CS0_128:
+		reg &= ~0x7;	/* CS0=128MB, CS1=0, CS2=0, CS3=0 */
+		reg |= 0x5;
+		break;
+	case CS0_64M_CS1_64M:
+		reg &= ~0x3F;	/* CS0=64MB, CS1=64MB, CS2=0, CS3=0 */
+		reg |= 0x1B;
+		break;
+	case CS0_64M_CS1_32M_CS2_32M:
+		reg &= ~0x1FF;	/* CS0=64MB, CS1=32MB, CS2=32MB, CS3=0 */
+		reg |= 0x4B;
+		break;
+	case CS0_32M_CS1_32M_CS2_32M_CS3_32M:

arch/arm/cpu/armv7/mx5/soc.c int cpu_mmc_init(bd_t *bis) · line 195

Quoted 10 lines
arch/arm/cpu/armv7/mx5/soc.c +10 -0
+		reg &= ~0xFFF;  /* CS0=32MB, CS1=32MB, CS2=32MB, CS3=32MB */
+		reg |= 0x249;
+		break;
+	default:
+		printf("Unknown chip select size\n");
+		break;
+	}
+
+	writel(reg, &iomuxc_regs->gpr1);
+}

mmmhhh...it seems to me not complete, because not all combinations are covered. And setting fixed values in the switch constraints us to have very long defines, as CS0_32M_CS1_32M_CS2_32M_CS3_32M.

What about to do in another way ? In the register, there are four bits for each chip select, and the value to be set can then easy shifted to the right place. You could define an enum with

CS_SIZE_32M = 0,
CS_SIZE_64M,
CS_SIZE_128

and use it as size. The function could take the chipselect as parameter, and you could set the register with something like (size | ACT_CS) << (CS_SHIFT * chipselect), with CS_SHIFT=3. Then all cases are covered.

Best regards,
Stefano Babic

Signature · 5 lines
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80  Email: [email protected]
=====================================================================
reviewer
#5 lore raw

PATCH v3 3/4 MX5: Introduce a function for setting the chip select size

Hi Stefano,

Quoted 31 lines · Stefano Babic
Quoted 2 lines · Fabio Estevam

---

Hi Fabio,

Quoted 25 lines
(quoted diff) +25 -0
+void set_chipselect_size(int const cs_size)
+{
+ ? ? unsigned int reg;
+ ? ? struct iomuxc *iomuxc_regs = (struct weim *)IOMUXC_BASE_ADDR;
+ ? ? reg = readl(&iomuxc_regs->gpr1);
+
+ ? ? switch (cs_size) {
+ ? ? case CS0_128:
+ ? ? ? ? ? ? reg &= ~0x7; ? ?/* CS0=128MB, CS1=0, CS2=0, CS3=0 */
+ ? ? ? ? ? ? reg |= 0x5;
+ ? ? ? ? ? ? break;
+ ? ? case CS0_64M_CS1_64M:
+ ? ? ? ? ? ? reg &= ~0x3F; ? /* CS0=64MB, CS1=64MB, CS2=0, CS3=0 */
+ ? ? ? ? ? ? reg |= 0x1B;
+ ? ? ? ? ? ? break;
+ ? ? case CS0_64M_CS1_32M_CS2_32M:
+ ? ? ? ? ? ? reg &= ~0x1FF; ?/* CS0=64MB, CS1=32MB, CS2=32MB, CS3=0 */
+ ? ? ? ? ? ? reg |= 0x4B;
+ ? ? ? ? ? ? break;
+ ? ? case CS0_32M_CS1_32M_CS2_32M_CS3_32M:
+ ? ? ? ? ? ? reg &= ~0xFFF; ?/* CS0=32MB, CS1=32MB, CS2=32MB, CS3=32MB */
+ ? ? ? ? ? ? reg |= 0x249;
+ ? ? ? ? ? ? break;
+ ? ? default:
+ ? ? ? ? ? ? printf("Unknown chip select size\n");
Quoted 8 lines

arch/arm/cpu/armv7/mx5/soc.c int cpu_mmc_init(bd_t *bis) · line 192

Quoted 5 lines

+ ? ? ? ? ? ? break;
+ ? ? }

arch/arm/cpu/armv7/mx5/soc.c +3 -0
+
+ ? ? writel(reg, &iomuxc_regs->gpr1);
+}

mmmhhh...it seems to me not complete, because not all combinations are covered.

Yes, it is complete. Only these four combinations are allowed as per the MX53 Reference Manual.

Quoted 2 lines

And setting fixed values in the switch constraints us to have very long defines, as CS0_32M_CS1_32M_CS2_32M_CS3_32M.

I can change the very long defines if you want.

I thought initially on doing the generic function as you described, but then we would need to check for only the 4 valid combinations. Then I came with this implementation that only handle the 4 possible cases.

Let me know what you think.

Regards,

Fabio Estevam

#6 lore raw

PATCH v3 3/4 MX5: Introduce a function for setting the chip select size

Quoted 2 lines · Fabio Estevam

Hi Stefano,

Hi Fabio,

Quoted 10 lines
Quoted 3 lines

mmmhhh...it seems to me not complete, because not all combinations are covered.

Yes, it is complete. Only these four combinations are allowed as per the MX53 Reference Manual.

Quoted 2 lines

And setting fixed values in the switch constraints us to have very long defines, as CS0_32M_CS1_32M_CS2_32M_CS3_32M.

Quoted 6 lines

I can change the very long defines if you want.

I thought initially on doing the generic function as you described, but then we would need to check for only the 4 valid combinations. Then I came with this implementation that only handle the 4 possible cases.

I made the same mistake and I was convinced that all combinations are possible. I understand why you changed in this way and I agree with this implementation, thanks for clarification.

Best regards,
Stefano Babic

Signature · 5 lines
=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80  Email: office at denx.de
=====================================================================
#7 lore raw

PATCH v3 3/4 MX5: Introduce a function for setting the chip select size

In reply to Fabio Estevam

Dear Fabio Estevam,

Quoted 30 lines · In message <[email protected]> you…
---
 arch/arm/cpu/armv7/mx5/soc.c              |   30 +++++++++++++++++++++++++++++
 arch/arm/include/asm/arch-mx5/imx-regs.h  |    5 ++++
 arch/arm/include/asm/arch-mx5/sys_proto.h |    2 +-
 3 files changed, 36 insertions(+), 1 deletions(-)
arch/arm/cpu/armv7/mx5/soc.c +15 -0
index 40b8b56..e599df8 100644
@@ -163,6 +163,36 @@ int cpu_mmc_init(bd_t *bis)
 #endif
 }
 
+void set_chipselect_size(int const cs_size)
+{
+	unsigned int reg;
+	struct iomuxc *iomuxc_regs = (struct weim *)IOMUXC_BASE_ADDR;
+	reg = readl(&iomuxc_regs->gpr1);
+
+	switch (cs_size) {
+	case CS0_128:
+		reg &= ~0x7;	/* CS0=128MB, CS1=0, CS2=0, CS3=0 */
+		reg |= 0x5;
+		break;
+	case CS0_64M_CS1_64M:
+		reg &= ~0x3F;	/* CS0=64MB, CS1=64MB, CS2=0, CS3=0 */
+		reg |= 0x1B;
+		break;

arch/arm/cpu/armv7/mx5/soc.c int cpu_mmc_init(bd_t *bis) · line 190

Quoted 10 lines
arch/arm/cpu/armv7/mx5/soc.c +10 -0
+	case CS0_64M_CS1_32M_CS2_32M:
+		reg &= ~0x1FF;	/* CS0=64MB, CS1=32MB, CS2=32MB, CS3=0 */
+		reg |= 0x4B;
+		break;
+	case CS0_32M_CS1_32M_CS2_32M_CS3_32M:
+		reg &= ~0xFFF;  /* CS0=32MB, CS1=32MB, CS2=32MB, CS3=32MB */
+		reg |= 0x249;
+		break;
+	default:
+		printf("Unknown chip select size\n");

In cases like this, please _always_ print _what_ the unknown chip size was. Please fix.

Best regards,

Wolfgang Denk

Signature · 4 lines
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
Hacking's just another word for nothing left to kludge.