diff options
Diffstat (limited to 'arch/arm/plat-omap/devices.c')
| -rw-r--r-- | arch/arm/plat-omap/devices.c | 225 | 
1 files changed, 35 insertions, 190 deletions
| diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c index 0cb2b22388e9..ac15c23fd5da 100644 --- a/arch/arm/plat-omap/devices.c +++ b/arch/arm/plat-omap/devices.c @@ -192,202 +192,48 @@ void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config,  /*-------------------------------------------------------------------------*/ -#if	defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \ +#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \  	defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) -#if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) -#define	OMAP_MMC1_BASE		0x4809c000 -#define	OMAP_MMC1_END		(OMAP_MMC1_BASE + 0x1fc) -#define	OMAP_MMC1_INT		INT_24XX_MMC_IRQ +#define OMAP_MMC_NR_RES		2 -#define	OMAP_MMC2_BASE		0x480b4000 -#define	OMAP_MMC2_END		(OMAP_MMC2_BASE + 0x1fc) -#define	OMAP_MMC2_INT		INT_24XX_MMC2_IRQ - -#else - -#define	OMAP_MMC1_BASE		0xfffb7800 -#define	OMAP_MMC1_END		(OMAP_MMC1_BASE + 0x7f) -#define OMAP_MMC1_INT		INT_MMC - -#define	OMAP_MMC2_BASE		0xfffb7c00	/* omap16xx only */ -#define	OMAP_MMC2_END		(OMAP_MMC2_BASE + 0x7f) -#define	OMAP_MMC2_INT		INT_1610_MMC2 - -#endif - -static struct omap_mmc_platform_data mmc1_data; - -static u64 mmc1_dmamask = 0xffffffff; - -static struct resource mmc1_resources[] = { -	{ -		.start		= OMAP_MMC1_BASE, -		.end		= OMAP_MMC1_END, -		.flags		= IORESOURCE_MEM, -	}, -	{ -		.start		= OMAP_MMC1_INT, -		.flags		= IORESOURCE_IRQ, -	}, -}; - -static struct platform_device mmc_omap_device1 = { -	.name		= "mmci-omap", -	.id		= 1, -	.dev = { -		.dma_mask	= &mmc1_dmamask, -		.platform_data	= &mmc1_data, -	}, -	.num_resources	= ARRAY_SIZE(mmc1_resources), -	.resource	= mmc1_resources, -}; - -#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2430) || \ -	defined(CONFIG_ARCH_OMAP34XX) - -static struct omap_mmc_platform_data mmc2_data; - -static u64 mmc2_dmamask = 0xffffffff; - -static struct resource mmc2_resources[] = { -	{ -		.start		= OMAP_MMC2_BASE, -		.end		= OMAP_MMC2_END, -		.flags		= IORESOURCE_MEM, -	}, -	{ -		.start		= OMAP_MMC2_INT, -		.flags		= IORESOURCE_IRQ, -	}, -}; - -static struct platform_device mmc_omap_device2 = { -	.name		= "mmci-omap", -	.id		= 2, -	.dev = { -		.dma_mask	= &mmc2_dmamask, -		.platform_data	= &mmc2_data, -	}, -	.num_resources	= ARRAY_SIZE(mmc2_resources), -	.resource	= mmc2_resources, -}; -#endif - -static inline void omap_init_mmc_conf(const struct omap_mmc_config *mmc_conf) -{ -	if (cpu_is_omap2430() || cpu_is_omap34xx()) -		return; - -	if (mmc_conf->mmc[0].enabled) { -		if (cpu_is_omap24xx()) { -			omap_cfg_reg(H18_24XX_MMC_CMD); -			omap_cfg_reg(H15_24XX_MMC_CLKI); -			omap_cfg_reg(G19_24XX_MMC_CLKO); -			omap_cfg_reg(F20_24XX_MMC_DAT0); -			omap_cfg_reg(F19_24XX_MMC_DAT_DIR0); -			omap_cfg_reg(G18_24XX_MMC_CMD_DIR); -		} else { -			omap_cfg_reg(MMC_CMD); -			omap_cfg_reg(MMC_CLK); -			omap_cfg_reg(MMC_DAT0); -			if (cpu_is_omap1710()) { -				omap_cfg_reg(M15_1710_MMC_CLKI); -				omap_cfg_reg(P19_1710_MMC_CMDDIR); -				omap_cfg_reg(P20_1710_MMC_DATDIR0); -			} -		} -		if (mmc_conf->mmc[0].wire4) { -			if (cpu_is_omap24xx()) { -				omap_cfg_reg(H14_24XX_MMC_DAT1); -				omap_cfg_reg(E19_24XX_MMC_DAT2); -				omap_cfg_reg(D19_24XX_MMC_DAT3); -				omap_cfg_reg(E20_24XX_MMC_DAT_DIR1); -				omap_cfg_reg(F18_24XX_MMC_DAT_DIR2); -				omap_cfg_reg(E18_24XX_MMC_DAT_DIR3); -			} else { -				omap_cfg_reg(MMC_DAT1); -				/* NOTE:  DAT2 can be on W10 (here) or M15 */ -				if (!mmc_conf->mmc[0].nomux) -					omap_cfg_reg(MMC_DAT2); -				omap_cfg_reg(MMC_DAT3); -			} -		} -	} - -#ifdef	CONFIG_ARCH_OMAP16XX -	/* block 2 is on newer chips, and has many pinout options */ -	if (mmc_conf->mmc[1].enabled) { -		if (!mmc_conf->mmc[1].nomux) { -			omap_cfg_reg(Y8_1610_MMC2_CMD); -			omap_cfg_reg(Y10_1610_MMC2_CLK); -			omap_cfg_reg(R18_1610_MMC2_CLKIN); -			omap_cfg_reg(W8_1610_MMC2_DAT0); -			if (mmc_conf->mmc[1].wire4) { -				omap_cfg_reg(V8_1610_MMC2_DAT1); -				omap_cfg_reg(W15_1610_MMC2_DAT2); -				omap_cfg_reg(R10_1610_MMC2_DAT3); -			} - -			/* These are needed for the level shifter */ -			omap_cfg_reg(V9_1610_MMC2_CMDDIR); -			omap_cfg_reg(V5_1610_MMC2_DATDIR0); -			omap_cfg_reg(W19_1610_MMC2_DATDIR1); -		} - -		/* Feedback clock must be set on OMAP-1710 MMC2 */ -		if (cpu_is_omap1710()) -			omap_writel(omap_readl(MOD_CONF_CTRL_1) | (1 << 24), -				     MOD_CONF_CTRL_1); -	} -#endif -} - -static void __init omap_init_mmc(void) +/* + * Register MMC devices. Called from mach-omap1 and mach-omap2 device init. + */ +int __init omap_mmc_add(int id, unsigned long base, unsigned long size, +		unsigned int irq, struct omap_mmc_platform_data *data)  { -	const struct omap_mmc_config	*mmc_conf; - -	/* NOTE:  assumes MMC was never (wrongly) enabled */ -	mmc_conf = omap_get_config(OMAP_TAG_MMC, struct omap_mmc_config); -	if (!mmc_conf) -		return; - -	omap_init_mmc_conf(mmc_conf); - -	if (mmc_conf->mmc[0].enabled) { -		mmc1_data.conf = mmc_conf->mmc[0]; -		(void) platform_device_register(&mmc_omap_device1); -	} - -#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2430) || \ -	defined(CONFIG_ARCH_OMAP34XX) -	if (mmc_conf->mmc[1].enabled) { -		mmc2_data.conf = mmc_conf->mmc[1]; -		(void) platform_device_register(&mmc_omap_device2); -	} -#endif -} +	struct platform_device *pdev; +	struct resource res[OMAP_MMC_NR_RES]; +	int ret; + +	pdev = platform_device_alloc("mmci-omap", id); +	if (!pdev) +		return -ENOMEM; + +	memset(res, 0, OMAP_MMC_NR_RES * sizeof(struct resource)); +	res[0].start = base; +	res[0].end = base + size - 1; +	res[0].flags = IORESOURCE_MEM; +	res[1].start = res[1].end = irq; +	res[1].flags = IORESOURCE_IRQ; + +	ret = platform_device_add_resources(pdev, res, ARRAY_SIZE(res)); +	if (ret == 0) +		ret = platform_device_add_data(pdev, data, sizeof(*data)); +	if (ret) +		goto fail; + +	ret = platform_device_add(pdev); +	if (ret) +		goto fail; +	return 0; -void omap_set_mmc_info(int host, const struct omap_mmc_platform_data *info) -{ -	switch (host) { -	case 1: -		mmc1_data = *info; -		break; -#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2430) || \ -	defined(CONFIG_ARCH_OMAP34XX) -	case 2: -		mmc2_data = *info; -		break; -#endif -	default: -		BUG(); -	} +fail: +	platform_device_put(pdev); +	return ret;  } -#else -static inline void omap_init_mmc(void) {} -void omap_set_mmc_info(int host, const struct omap_mmc_platform_data *info) {}  #endif  /*-------------------------------------------------------------------------*/ @@ -532,7 +378,6 @@ static int __init omap_init_devices(void)  	 */  	omap_init_dsp();  	omap_init_kp(); -	omap_init_mmc();  	omap_init_uwire();  	omap_init_wdt();  	omap_init_rng(); | 
