[U-Boot] [PATCH] omap3: mmc: mmc2 support
Minkyu Kang
mk7.kang at samsung.com
Sat Mar 28 06:07:40 CET 2009
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 at 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
More information about the U-Boot
mailing list