On Tue, Mar 18, 2008 at 06:50:39PM +0530, Syed Mohammed, Khasim wrote:
>
>
> > -----Original Message-----
> > From: [EMAIL PROTECTED] [mailto:linux-omap-
> > [EMAIL PROTECTED] On Behalf Of Tony Lindgren
> > Sent: Tuesday, March 18, 2008 5:23 PM
> > To: Remith Ravi
> > Cc: [email protected]
> > Subject: Re: OMAP MMC multiport support
> >
> > * Remith Ravi <[EMAIL PROTECTED]> [080318 14:47]:
> > > Hi,
> > >
> > > Is there any OMAP MMC driver implementation exist which support multi
> > > port implementation?
> > > I am working on OMAP-2530 EVM and want to have support for both MMC
> > > port 1 and port 2.
> > >
> > > Please let me know if you have any input.
> >
> > Well if 2530 has same controller as 2420, then yes, it should be
> > supported by configuring it in board-*.c files.
> >
>
> 2530 is same as 2430, and the 3430 MMC driver is best fit for that and it
> supports Multi MMC controllers (and not slots). One controller can be
> connected to only one slot on 2530/2430/3530/3430.
The current code needs a little bit of updating to support the second
MMC controller on the 2430. Below is a rough patch with the changes
that get it working for me (on a custom board), but it is not based
off of the git repo so it's not likely to apply directly. Hopefully
it will be helpful as a reference though.
Cheers,
Seth
diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c
--- a/arch/arm/plat-omap/devices.c
+++ b/arch/arm/plat-omap/devices.c
@@ -230,7 +230,17 @@ static inline void omap_init_kp(void) {}
#define OMAP_MMC1_BASE 0xfffb7800
#define OMAP_MMC1_INT INT_MMC
#endif
+
+#if defined(CONFIG_ARCH_OMAP16XX)
#define OMAP_MMC2_BASE 0xfffb7c00 /* omap16xx only */
+#define OMAP_MMC2_INT INT_1610_MMC2
+#elif defined CONFIG_ARCH_OMAP2430
+#define OMAP_MMC2_BASE 0x480b4000
+#define OMAP_MMC2_INT INT_24XX_MMC2_IRQ
+#endif
+
+#define OMAP_MMC2_SUPPORT \
+ (defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2430))
#if defined(CONFIG_ARCH_OMAP2430)
static struct omap_mmc_platform_data mmc1_conf;
@@ -263,9 +273,13 @@ static struct platform_device mmc_omap_d
.resource = mmc1_resources,
};
-#ifdef CONFIG_ARCH_OMAP16XX
-
+#if OMAP_MMC2_SUPPORT
+
+#if defined(CONFIG_ARCH_OMAP2430)
+static struct omap_mmc_platform_data mmc2_conf;
+#else
static struct omap_mmc_conf mmc2_conf;
+#endif
static u64 mmc2_dmamask = 0xffffffff;
@@ -277,7 +291,7 @@ static struct resource mmc2_resources[]
.flags = IORESOURCE_MEM,
},
{
- .start = INT_1610_MMC2,
+ .start = OMAP_MMC2_INT,
.flags = IORESOURCE_IRQ,
},
};
@@ -304,6 +318,9 @@ static void __init omap_init_mmc(void)
if (cpu_is_omap243x()) {
if (mmc1_conf.enabled){
(void) platform_device_register(&mmc_omap_device1);
+ }
+ if (mmc2_conf.enabled){
+ (void) platform_device_register(&mmc_omap_device2);
}
return;
}
@@ -405,7 +422,7 @@ void omap_set_mmc_info(int host, const s
case 1:
mmc1_conf = *info;
break;
-#ifdef CONFIG_ARCH_OMAP16XX
+#ifdef OMAP_MMC2_SUPPORT
case 2:
mmc2_conf = *info;
break;
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
--- a/drivers/mmc/host/omap_hsmmc.c
+++ b/drivers/mmc/host/omap_hsmmc.c
@@ -409,7 +409,10 @@ static int omap_mmc_switch_opcond(struct
OMAP_HSMMC_READ(host->base, HCTL) & SDVSCLR);
reg_val = OMAP_HSMMC_READ(host->base, HCTL);
- if (((1 << vdd) == MMC_VDD_33_34) || ((1 << vdd) == MMC_VDD_33_34)) {
+ /* Only MMC1 supports 3.0V */
+ if (host->id == OMAP_MMC1_DEVID &&
+ (((1 << vdd) == MMC_VDD_33_34) ||
+ ((1 << vdd) == MMC_VDD_33_34))) {
host->initstr = 0;
reg_val |= SDVS30;
}
@@ -713,6 +716,7 @@ static int omap_mmc_probe(struct platfor
struct mmc_omap_host *host = NULL;
struct resource *res;
int ret = 0, irq;
+ u32 hctl, capa;
printk("\n MMC probe entered \n");
if (pdata == NULL) {
@@ -800,11 +804,20 @@ static int omap_mmc_probe(struct platfor
if (pdata->wire4)
mmc->caps |= MMC_CAP_4_BIT_DATA;
+ /* Only MMC1 supports 3.0V */
+ if (host->id == OMAP_MMC1_DEVID) {
+ hctl = SDVS30;
+ capa = VS30 | VS18;
+ } else {
+ hctl = SDVS18;
+ capa = VS18;
+ }
+
OMAP_HSMMC_WRITE(host->base, HCTL,
- OMAP_HSMMC_READ(host->base, HCTL) | SDVS30);
-
- OMAP_HSMMC_WRITE(host->base, CAPA,OMAP_HSMMC_READ(host->base,
- CAPA) | VS30 | VS18);
+ OMAP_HSMMC_READ(host->base, HCTL) | hctl);
+
+ OMAP_HSMMC_WRITE(host->base, CAPA,
+ OMAP_HSMMC_READ(host->base, CAPA) | capa);
/* Set the controller to AUTO IDLE mode */
OMAP_HSMMC_WRITE(host->base, SYSCONFIG,
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html