示例#1
0
void __init omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
			int nr_controllers)
{
	int i;
	char *name;
	for (i = 1; i < nr_controllers; i++) {
		unsigned long base, size;
		unsigned int irq = 0;

		if (!mmc_data[i])
			continue;

		omap2_mmc_mux(mmc_data[i], i);

		switch (i) {
		case 0:
			base = OMAP2_MMC1_BASE;
			irq = INT_24XX_MMC_IRQ;
			break;
		case 1:
			base = OMAP2_MMC2_BASE;
			irq = INT_24XX_MMC2_IRQ;
			break;
		case 2:
			if (!(cpu_is_omap34xx() || cpu_is_omap3630()))
				return;
			base = OMAP3_MMC3_BASE;
			irq = INT_34XX_MMC3_IRQ;
			break;
		default:
			continue;
		}

		if (cpu_is_omap2420()) {
			size = OMAP2420_MMC_SIZE;
			name = "mmci-omap";
		} else {
			size = HSMMC_SIZE;
			if (mmc_data[i]->name)
				name = mmc_data[i]->name;
			else
				name = "mmci-omap-hs";
		}

		omap_mmc_add(name, i, base, size, irq, mmc_data[i]);
//#if 0
		if(1==i)
		{
		  printk(KERN_ERR "SD/MMC devices, enumerating first eMMC.\n");
		  i-=2;
		}
		else if(0==i){
		  printk(KERN_ERR "SD/MMC devices, checking for SD card devices attached.\n");
		  i++;
		}
//#endif
	};
}
示例#2
0
void __init omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
			int nr_controllers)
{

	int i;
	char *name;
        
	for (i = 0; i < nr_controllers; i++) {
		unsigned long base, size;
		unsigned int irq = 0;

		if (!mmc_data[i])
			continue;

		omap2_mmc_mux(mmc_data[i], i);

		switch (i) {
		case 0:
			base = OMAPW3G_MMC1_BASE;
			irq = INT_W3G_MMC_IRQ;
			break;
		case 1:
			base = OMAP2_MMC2_BASE;
			irq = INT_24XX_MMC2_IRQ;
			break;
		case 2:
			if (!cpu_is_omap34xx())
				return;
			base = OMAP3_MMC3_BASE;
			irq = INT_34XX_MMC3_IRQ;
			break;
		default:
			continue;
		}

	if (cpu_is_omapw3g()){		
		size = OMAPW3G_MMC_SIZE;
		name = "mmci-omap-hs";
		}
	else if (cpu_is_omap2420()) {
			size = OMAP2420_MMC_SIZE;
			name = "mmci-omap";
		} else {
			size = HSMMC_SIZE;
			if (mmc_data[i]->name)
				name = mmc_data[i]->name;
			else
				name = "mmci-omap-hs";
		}
	
	omap_mmc_add(name, i, base, size, irq, mmc_data[i]);
	}
}
示例#3
0
void __init omap2_init_mmc(struct omap_mmc_platform_data *mmc_data, int ctrl_nr)
{
	struct omap_hwmod *oh;
	struct omap_device *od;
	struct omap_device_pm_latency *ohl;
	char oh_name[MAX_OMAP_MMC_HWMOD_NAME_LEN];
	char *name;
	int l;
	int ohl_cnt = 0;

	if (cpu_is_omap2420()) {
		name = "mmci-omap";
	} else {
		if (mmc_data->name)
			name = mmc_data->name;
		else
			name = "mmci-omap-hs";
		ohl = omap_hsmmc_latency;
		ohl_cnt = ARRAY_SIZE(omap_hsmmc_latency);
	}

	l = snprintf(oh_name, MAX_OMAP_MMC_HWMOD_NAME_LEN,
		     "mmc%d", ctrl_nr);
	WARN(l >= MAX_OMAP_MMC_HWMOD_NAME_LEN,
	     "String buffer overflow in MMC%d device setup\n", ctrl_nr);
	oh = omap_hwmod_lookup(oh_name);
	if (!oh) {
		pr_err("Could not look up %s\n", oh_name);
		return;
	}

	mmc_data->dev_attr = oh->dev_attr;
#ifdef CONFIG_OMAP_PM
	mmc_data->set_min_bus_tput = omap_pm_set_min_bus_tput;
#endif
	omap2_mmc_mux(mmc_data, ctrl_nr - 1);
	od = omap_device_build(name, ctrl_nr - 1, oh, mmc_data,
			       sizeof(struct omap_mmc_platform_data),
			       ohl, ohl_cnt, false);
	WARN(IS_ERR(od), "Could not build omap_device for %s %s\n",
	     name, oh_name);

	/*
	 * return device handle to board setup code
	 * required to populate for regulator framework structure
	 */
	mmc_data->dev = &od->pdev.dev;
}
void __init omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
			int nr_controllers)
{
	int i;
	char *name;

	for (i = 0; i < nr_controllers; i++) {
		unsigned long base, size;
		unsigned int irq = 0;

		if (!mmc_data[i])
			continue;

		omap2_mmc_mux(mmc_data[i], i);

		switch (i) {
		case 0:
			base = OMAP2_MMC1_BASE;
			irq = INT_24XX_MMC_IRQ;
			break;
		case 1:
			base = OMAP2_MMC2_BASE;
			irq = INT_24XX_MMC2_IRQ;
			break;
		case 2:
			if (!cpu_is_omap44xx() && !cpu_is_omap34xx())
				return;
			base = OMAP3_MMC3_BASE;
			irq = INT_34XX_MMC3_IRQ;
			break;
		case 3:
			if (!cpu_is_omap44xx())
				return;
			base = OMAP4_MMC4_BASE + OMAP4_MMC_REG_OFFSET;
			irq = INT_44XX_MMC4_IRQ;
			break;
		case 4:
			if (!cpu_is_omap44xx())
				return;
			base = OMAP4_MMC5_BASE + OMAP4_MMC_REG_OFFSET;
			irq = INT_44XX_MMC5_IRQ;
			break;
		default:
			continue;
		}

		if (cpu_is_omap2420()) {
			size = OMAP2420_MMC_SIZE;
			name = "mmci-omap";
		} else if (cpu_is_omap44xx()) {
			if (i < 3) {
				base += OMAP4_MMC_REG_OFFSET;
				irq += IRQ_GIC_START;
			}
			size = OMAP4_HSMMC_SIZE;
			name = "mmci-omap-hs";
		} else {
			size = OMAP3_HSMMC_SIZE;
			if (mmc_data[i]->name)
				name = mmc_data[i]->name;
			else
				name = "mmci-omap-hs";
		}

		omap_mmc_add(name, i, base, size, irq, mmc_data[i]);
	};
}