From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dirk Behme Date: Fri, 27 Mar 2009 00:16:25 +0100 Subject: [U-Boot] [PATCH] omap3: mmc: mmc2 support In-Reply-To: <49CB5D3D.1070506@samsung.com> References: <49CB5D3D.1070506@samsung.com> Message-ID: <49CC0CC9.7060900@googlemail.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Minkyu Kang wrote: > There are 3 MMC/SD/SDIO host controllers inside the device. > This patch will support mmc2 and mmc3. 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? Looking at MMC commands, there is also a option available for mmc commands, e.g. mmc read Not sure if this could help us here. Maybe the MMC experts can advice how to do this the best way? Best regards Dirk > Signed-off-by: Minkyu Kang > --- > 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 */ > _______________________________________________ > U-Boot mailing list > U-Boot at lists.denx.de > http://lists.denx.de/mailman/listinfo/u-boot >