public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] omap3: mmc: mmc2 support
@ 2009-03-28  5:07 Minkyu Kang
  2009-04-01  9:27 ` Jean-Christophe PLAGNIOL-VILLARD
  0 siblings, 1 reply; 7+ messages in thread
From: Minkyu Kang @ 2009-03-28  5:07 UTC (permalink / raw)
  To: u-boot

There are 3 MMC/SD/SDIO host controllers inside the device.
This patch will support mmc2 and mmc3(mmc3 have not tested)

Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
---
 drivers/mmc/omap3_mmc.c                   |   74 ++++++++++++++++++++++++-----
 include/asm-arm/arch-omap3/mmc_host_def.h |   10 +++-
 include/asm-arm/arch-omap3/omap3.h        |    3 +
 3 files changed, 73 insertions(+), 14 deletions(-)

diff --git a/drivers/mmc/omap3_mmc.c b/drivers/mmc/omap3_mmc.c
index e90db7e..934caff 100644
--- a/drivers/mmc/omap3_mmc.c
+++ b/drivers/mmc/omap3_mmc.c
@@ -51,7 +51,8 @@ const unsigned short mmc_transspeed_val[15][4] = {
 
 mmc_card_data cur_card_data;
 static block_dev_desc_t mmc_blk_dev;
-static hsmmc_t *mmc_base = (hsmmc_t *)OMAP_HSMMC_BASE;
+static hsmmc_t *mmc_base;
+static int curr_device = -1;
 
 block_dev_desc_t *mmc_get_dev(int dev)
 {
@@ -62,10 +63,21 @@ void twl4030_mmc_config(void)
 {
 	unsigned char data;
 
-	data = DEV_GRP_P1;
-	i2c_write(PWRMGT_ADDR_ID4, VMMC1_DEV_GRP, 1, &data, 1);
-	data = VMMC1_VSEL_30;
-	i2c_write(PWRMGT_ADDR_ID4, VMMC1_DEDICATED, 1, &data, 1);
+	switch (curr_device) {
+	case 1:
+		data = DEV_GRP_P1;
+		i2c_write(PWRMGT_ADDR_ID4, VMMC1_DEV_GRP, 1, &data, 1);
+		data = VMMC1_VSEL_30;
+		i2c_write(PWRMGT_ADDR_ID4, VMMC1_DEDICATED, 1, &data, 1);
+		break;
+	case 2:
+	case 3:
+		data = DEV_GRP_P1;
+		i2c_write(PWRMGT_ADDR_ID4, VMMC2_DEV_GRP, 1, &data, 1);
+		data = VMMC2_VSEL_185;
+		i2c_write(PWRMGT_ADDR_ID4, VMMC2_DEDICATED, 1, &data, 1);
+		break;
+	}
 }
 
 unsigned char mmc_board_init(void)
@@ -74,12 +86,21 @@ unsigned char mmc_board_init(void)
 
 	twl4030_mmc_config();
 
-	writel(readl(&t2_base->pbias_lite) | PBIASLITEPWRDNZ1 |
-		PBIASSPEEDCTRL0 | PBIASLITEPWRDNZ0,
-		&t2_base->pbias_lite);
+	switch (curr_device) {
+	case 1:
+		writel(readl(&t2_base->pbias_lite) | PBIASLITEPWRDNZ1 |
+			PBIASSPEEDCTRL0 | PBIASLITEPWRDNZ0,
+			&t2_base->pbias_lite);
 
-	writel(readl(&t2_base->devconf0) | MMCSDIO1ADPCLKISEL,
-		&t2_base->devconf0);
+		writel(readl(&t2_base->devconf0) | MMCSDIO1ADPCLKISEL,
+			&t2_base->devconf0);
+		break;
+	case 2:
+	case 3:
+		writel(readl(&t2_base->devconf1) | MMCSDIO2ADPCLKISEL,
+			&t2_base->devconf1);
+		break;
+	}
 
 	return 1;
 }
@@ -525,8 +546,37 @@ unsigned long mmc_bread(int dev_num, unsigned long blknr, lbaint_t blkcnt,
 	return 1;
 }
 
-int mmc_legacy_init(int verbose)
+int mmc_set_dev(int dev)
+{
+	if (dev < 0) {
+		printf("unknwon device\n");
+		return 1;
+	} else {
+		switch (dev) {
+		case 1:
+			mmc_base = (hsmmc_t *)OMAP_HSMMC_BASE_MMC1;
+			break;
+		case 2:
+			mmc_base = (hsmmc_t *)OMAP_HSMMC_BASE_MMC2;
+			break;
+		case 3:
+			mmc_base = (hsmmc_t *)OMAP_HSMMC_BASE_MMC3;
+			break;
+		default:
+			printf("unknwon device\n");
+			return 1;
+		}
+		curr_device = dev;
+	}
+
+	return 0;
+}
+
+int mmc_legacy_init(int dev)
 {
+	if (mmc_set_dev(dev) != 0)
+		return 1;
+
 	if (configure_mmc(&cur_card_data) != 1)
 		return 1;
 
@@ -538,7 +588,7 @@ int mmc_legacy_init(int verbose)
 
 	/* FIXME fill in the correct size (is set to 32MByte) */
 	mmc_blk_dev.blksz = MMCSD_SECTOR_SIZE;
-	mmc_blk_dev.lba = 0x10000;
+	mmc_blk_dev.lba = cur_card_data.size;
 	mmc_blk_dev.removable = 0;
 	mmc_blk_dev.block_read = mmc_bread;
 
diff --git a/include/asm-arm/arch-omap3/mmc_host_def.h b/include/asm-arm/arch-omap3/mmc_host_def.h
index aa751c9..8b234ef 100644
--- a/include/asm-arm/arch-omap3/mmc_host_def.h
+++ b/include/asm-arm/arch-omap3/mmc_host_def.h
@@ -31,7 +31,9 @@
 typedef struct t2 {
 	unsigned char res1[0x274];
 	unsigned int devconf0;		/* 0x274 */
-	unsigned char res2[0x2A8];
+	unsigned char res2[0x60];
+	unsigned int devconf1;		/* 0x2D8 */
+	unsigned char res3[0x244];
 	unsigned int pbias_lite;	/* 0x520 */
 } t2_t;
 
@@ -41,10 +43,14 @@ typedef struct t2 {
 #define PBIASSPEEDCTRL0			(1 << 2)
 #define PBIASLITEPWRDNZ1		(1 << 9)
 
+#define MMCSDIO2ADPCLKISEL		(1 << 6)
+
 /*
  * OMAP HSMMC register definitions
  */
-#define OMAP_HSMMC_BASE		0x4809C000
+#define OMAP_HSMMC_BASE_MMC1	0x4809C000
+#define OMAP_HSMMC_BASE_MMC2	0x480B4000
+#define OMAP_HSMMC_BASE_MMC3	0x480AD000
 
 typedef struct hsmmc {
 	unsigned char res1[0x10];
diff --git a/include/asm-arm/arch-omap3/omap3.h b/include/asm-arm/arch-omap3/omap3.h
index 8c9656f..b5b5def 100644
--- a/include/asm-arm/arch-omap3/omap3.h
+++ b/include/asm-arm/arch-omap3/omap3.h
@@ -206,6 +206,8 @@ typedef struct gpio {
 #define VAUX3_DEDICATED		0x7D
 #define VMMC1_DEV_GRP		0x82
 #define VMMC1_DEDICATED		0x85
+#define VMMC2_DEV_GRP		0x86
+#define VMMC2_DEDICATED		0x89
 #define VPLL2_DEV_GRP		0x8E
 #define VPLL2_DEDICATED		0x91
 #define VDAC_DEV_GRP		0x96
@@ -219,5 +221,6 @@ typedef struct gpio {
 #define VPLL2_VSEL_18		0x05
 #define VDAC_VSEL_18		0x03
 #define VMMC1_VSEL_30		0x02
+#define VMMC2_VSEL_185		0x06
 
 #endif

^ permalink raw reply related	[flat|nested] 7+ messages in thread
* [U-Boot] [PATCH] omap3: mmc: mmc2 support
@ 2009-03-27 15:17 Minkyu Kang
  0 siblings, 0 replies; 7+ messages in thread
From: Minkyu Kang @ 2009-03-27 15:17 UTC (permalink / raw)
  To: u-boot

> By this patch, the MMC controller actually used is configured by
> CONFIG_MMC_INDEX at compile time? I.e. setting CONFIG_MMC_INDEX to 1
> will use mmc1, 2 will switch to mmc2 and CONFIG_MMC_INDEX 3 will
> switch to mmc3?
>
> If I got this right, do you think we can do this at runtime? E.g.
> implementing a custom command
>
> select_mmc <# of mmc controller to be used>
>
> ?
>
> With this, we could switch to mmc2 by doing something like
>
> select_mmc 2
>
> and afterwards all mmc read/write access will go to mmc2.
>
> What do you think?

Surely possible.
As you known, there is no interface for selecting device.
Can I add new command for that? (E.g. mmcselect <device num>)

And I want to change the mmcinit command too.
I.e. getting dev num by argument.
like this

mmcinit <device num>

If that is not in, we must select mmc device before mmcinit.
How about this? There exist any side effects?

Thanks :)
Minkyu Kang

-- 
from. prom.
promsoft.net

^ permalink raw reply	[flat|nested] 7+ messages in thread
* [U-Boot] [PATCH] omap3: mmc: mmc2 support
@ 2009-03-26 10:47 Minkyu Kang
  2009-03-26 23:16 ` Dirk Behme
  0 siblings, 1 reply; 7+ messages in thread
From: Minkyu Kang @ 2009-03-26 10:47 UTC (permalink / raw)
  To: u-boot

There are 3 MMC/SD/SDIO host controllers inside the device.
This patch will support mmc2 and mmc3.

Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
---
 drivers/mmc/omap3_mmc.c                   |   38 ++++++++++++++++++++++-------
 include/asm-arm/arch-omap3/mmc_host_def.h |   18 ++++++++++++-
 include/asm-arm/arch-omap3/omap3.h        |    3 ++
 include/configs/omap3_beagle.h            |    1 +
 include/configs/omap3_evm.h               |    1 +
 include/configs/omap3_overo.h             |    1 +
 include/configs/omap3_pandora.h           |    1 +
 include/configs/omap3_zoom1.h             |    1 +
 8 files changed, 53 insertions(+), 11 deletions(-)

diff --git a/drivers/mmc/omap3_mmc.c b/drivers/mmc/omap3_mmc.c
index e90db7e..edc56fa 100644
--- a/drivers/mmc/omap3_mmc.c
+++ b/drivers/mmc/omap3_mmc.c
@@ -62,10 +62,21 @@ void twl4030_mmc_config(void)
 {
 	unsigned char data;
 
-	data = DEV_GRP_P1;
-	i2c_write(PWRMGT_ADDR_ID4, VMMC1_DEV_GRP, 1, &data, 1);
-	data = VMMC1_VSEL_30;
-	i2c_write(PWRMGT_ADDR_ID4, VMMC1_DEDICATED, 1, &data, 1);
+	switch (CONFIG_MMC_INDEX) {
+	case 1:
+		data = DEV_GRP_P1;
+		i2c_write(PWRMGT_ADDR_ID4, VMMC1_DEV_GRP, 1, &data, 1);
+		data = VMMC1_VSEL_30;
+		i2c_write(PWRMGT_ADDR_ID4, VMMC1_DEDICATED, 1, &data, 1);
+		break;
+	case 2:
+	case 3:
+		data = DEV_GRP_P1;
+		i2c_write(PWRMGT_ADDR_ID4, VMMC2_DEV_GRP, 1, &data, 1);
+		data = VMMC2_VSEL_185;
+		i2c_write(PWRMGT_ADDR_ID4, VMMC2_DEDICATED, 1, &data, 1);
+		break;
+	}
 }
 
 unsigned char mmc_board_init(void)
@@ -74,12 +85,21 @@ unsigned char mmc_board_init(void)
 
 	twl4030_mmc_config();
 
-	writel(readl(&t2_base->pbias_lite) | PBIASLITEPWRDNZ1 |
-		PBIASSPEEDCTRL0 | PBIASLITEPWRDNZ0,
-		&t2_base->pbias_lite);
+	switch (CONFIG_MMC_INDEX) {
+	case 1:
+		writel(readl(&t2_base->pbias_lite) | PBIASLITEPWRDNZ1 |
+			PBIASSPEEDCTRL0 | PBIASLITEPWRDNZ0,
+			&t2_base->pbias_lite);
 
-	writel(readl(&t2_base->devconf0) | MMCSDIO1ADPCLKISEL,
-		&t2_base->devconf0);
+		writel(readl(&t2_base->devconf0) | MMCSDIO1ADPCLKISEL,
+			&t2_base->devconf0);
+		break;
+	case 2:
+	case 3:
+		writel(readl(&t2_base->devconf1) | MMCSDIO2ADPCLKISEL,
+			&t2_base->devconf1);
+		break;
+	}
 
 	return 1;
 }
diff --git a/include/asm-arm/arch-omap3/mmc_host_def.h b/include/asm-arm/arch-omap3/mmc_host_def.h
index aa751c9..01884f9 100644
--- a/include/asm-arm/arch-omap3/mmc_host_def.h
+++ b/include/asm-arm/arch-omap3/mmc_host_def.h
@@ -31,7 +31,9 @@
 typedef struct t2 {
 	unsigned char res1[0x274];
 	unsigned int devconf0;		/* 0x274 */
-	unsigned char res2[0x2A8];
+	unsigned char res2[0x60];
+	unsigned int devconf1;		/* 0x2D8 */
+	unsigned char res3[0x244];
 	unsigned int pbias_lite;	/* 0x520 */
 } t2_t;
 
@@ -41,10 +43,22 @@ typedef struct t2 {
 #define PBIASSPEEDCTRL0			(1 << 2)
 #define PBIASLITEPWRDNZ1		(1 << 9)
 
+#define MMCSDIO2ADPCLKISEL		(1 << 6)
+
 /*
  * OMAP HSMMC register definitions
  */
-#define OMAP_HSMMC_BASE		0x4809C000
+#define OMAP_HSMMC_BASE_MMC1	0x4809C000
+#define OMAP_HSMMC_BASE_MMC2	0x480B4000
+#define OMAP_HSMMC_BASE_MMC3	0x480AD000
+
+#if CONFIG_MMC_INDEX == 1
+#define OMAP_HSMMC_BASE			OMAP_HSMMC_BASE_MMC1
+#elif CONFIG_MMC_INDEX == 2
+#define OMAP_HSMMC_BASE			OMAP_HSMMC_BASE_MMC2
+#elif CONFIG_MMC_INDEX == 3
+#define OMAP_HSMMC_BASE			OMAP_HSMMC_BASE_MMC3
+#endif
 
 typedef struct hsmmc {
 	unsigned char res1[0x10];
diff --git a/include/asm-arm/arch-omap3/omap3.h b/include/asm-arm/arch-omap3/omap3.h
index 8c9656f..b5b5def 100644
--- a/include/asm-arm/arch-omap3/omap3.h
+++ b/include/asm-arm/arch-omap3/omap3.h
@@ -206,6 +206,8 @@ typedef struct gpio {
 #define VAUX3_DEDICATED		0x7D
 #define VMMC1_DEV_GRP		0x82
 #define VMMC1_DEDICATED		0x85
+#define VMMC2_DEV_GRP		0x86
+#define VMMC2_DEDICATED		0x89
 #define VPLL2_DEV_GRP		0x8E
 #define VPLL2_DEDICATED		0x91
 #define VDAC_DEV_GRP		0x96
@@ -219,5 +221,6 @@ typedef struct gpio {
 #define VPLL2_VSEL_18		0x05
 #define VDAC_VSEL_18		0x03
 #define VMMC1_VSEL_30		0x02
+#define VMMC2_VSEL_185		0x06
 
 #endif
diff --git a/include/configs/omap3_beagle.h b/include/configs/omap3_beagle.h
index 0f9344b..3609a0d 100644
--- a/include/configs/omap3_beagle.h
+++ b/include/configs/omap3_beagle.h
@@ -90,6 +90,7 @@
 					115200}
 #define CONFIG_MMC			1
 #define CONFIG_OMAP3_MMC		1
+#define CONFIG_MMC_INDEX		1
 #define CONFIG_DOS_PARTITION		1
 
 /* commands to include */
diff --git a/include/configs/omap3_evm.h b/include/configs/omap3_evm.h
index f4498a9..6417eba 100644
--- a/include/configs/omap3_evm.h
+++ b/include/configs/omap3_evm.h
@@ -95,6 +95,7 @@
 					115200}
 #define CONFIG_MMC			1
 #define CONFIG_OMAP3_MMC		1
+#define CONFIG_MMC_INDEX		1
 #define CONFIG_DOS_PARTITION		1
 
 /* commands to include */
diff --git a/include/configs/omap3_overo.h b/include/configs/omap3_overo.h
index dee0417..af23abd 100644
--- a/include/configs/omap3_overo.h
+++ b/include/configs/omap3_overo.h
@@ -82,6 +82,7 @@
 					115200}
 #define CONFIG_MMC			1
 #define CONFIG_OMAP3_MMC		1
+#define CONFIG_MMC_INDEX		1
 #define CONFIG_DOS_PARTITION		1
 
 /* commands to include */
diff --git a/include/configs/omap3_pandora.h b/include/configs/omap3_pandora.h
index 00c0374..4e09a9a 100644
--- a/include/configs/omap3_pandora.h
+++ b/include/configs/omap3_pandora.h
@@ -85,6 +85,7 @@
 					115200}
 #define CONFIG_MMC			1
 #define CONFIG_OMAP3_MMC		1
+#define CONFIG_MMC_INDEX		1
 #define CONFIG_DOS_PARTITION		1
 
 /* commands to include */
diff --git a/include/configs/omap3_zoom1.h b/include/configs/omap3_zoom1.h
index f8ae163..2af5b07 100644
--- a/include/configs/omap3_zoom1.h
+++ b/include/configs/omap3_zoom1.h
@@ -91,6 +91,7 @@
 					115200}
 #define CONFIG_MMC			1
 #define CONFIG_OMAP3_MMC		1
+#define CONFIG_MMC_INDEX		1
 #define CONFIG_DOS_PARTITION		1
 
 /* commands to include */

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2009-04-02 10:19 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-03-28  5:07 [U-Boot] [PATCH] omap3: mmc: mmc2 support Minkyu Kang
2009-04-01  9:27 ` Jean-Christophe PLAGNIOL-VILLARD
2009-04-02 10:19   ` Minkyu Kang
  -- strict thread matches above, loose matches on Subject: below --
2009-03-27 15:17 Minkyu Kang
2009-03-26 10:47 Minkyu Kang
2009-03-26 23:16 ` Dirk Behme
2009-03-27 19:01   ` Wolfgang Denk

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox