diff options
Diffstat (limited to 'arch/arm/mach-at91/at91rm9200_devices.c')
| -rw-r--r-- | arch/arm/mach-at91/at91rm9200_devices.c | 88 | 
1 files changed, 52 insertions, 36 deletions
diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index e6b7d0533dd..f6c09b8f5fc 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c @@ -294,9 +294,9 @@ void __init at91_add_device_cf(struct at91_cf_data *data) {}   *  MMC / SD   * -------------------------------------------------------------------- */ -#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE) +#if IS_ENABLED(CONFIG_MMC_ATMELMCI)  static u64 mmc_dmamask = DMA_BIT_MASK(32); -static struct at91_mmc_data mmc_data; +static struct mci_platform_data mmc_data;  static struct resource mmc_resources[] = {  	[0] = { @@ -312,7 +312,7 @@ static struct resource mmc_resources[] = {  };  static struct platform_device at91rm9200_mmc_device = { -	.name		= "at91_mci", +	.name		= "atmel_mci",  	.id		= -1,  	.dev		= {  				.dma_mask		= &mmc_dmamask, @@ -323,53 +323,69 @@ static struct platform_device at91rm9200_mmc_device = {  	.num_resources	= ARRAY_SIZE(mmc_resources),  }; -void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) +void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data)  { +	unsigned int i; +	unsigned int slot_count = 0; +  	if (!data)  		return; -	/* input/irq */ -	if (gpio_is_valid(data->det_pin)) { -		at91_set_gpio_input(data->det_pin, 1); -		at91_set_deglitch(data->det_pin, 1); -	} -	if (gpio_is_valid(data->wp_pin)) -		at91_set_gpio_input(data->wp_pin, 1); -	if (gpio_is_valid(data->vcc_pin)) -		at91_set_gpio_output(data->vcc_pin, 0); +	for (i = 0; i < ATMCI_MAX_NR_SLOTS; i++) { -	/* CLK */ -	at91_set_A_periph(AT91_PIN_PA27, 0); +		if (!data->slot[i].bus_width) +			continue; -	if (data->slot_b) { -		/* CMD */ -		at91_set_B_periph(AT91_PIN_PA8, 1); +		/* input/irq */ +		if (gpio_is_valid(data->slot[i].detect_pin)) { +			at91_set_gpio_input(data->slot[i].detect_pin, 1); +			at91_set_deglitch(data->slot[i].detect_pin, 1); +		} +		if (gpio_is_valid(data->slot[i].wp_pin)) +			at91_set_gpio_input(data->slot[i].wp_pin, 1); -		/* DAT0, maybe DAT1..DAT3 */ -		at91_set_B_periph(AT91_PIN_PA9, 1); -		if (data->wire4) { -			at91_set_B_periph(AT91_PIN_PA10, 1); -			at91_set_B_periph(AT91_PIN_PA11, 1); -			at91_set_B_periph(AT91_PIN_PA12, 1); +		switch (i) { +		case 0:					/* slot A */ +			/* CMD */ +			at91_set_A_periph(AT91_PIN_PA28, 1); +			/* DAT0, maybe DAT1..DAT3 */ +			at91_set_A_periph(AT91_PIN_PA29, 1); +			if (data->slot[i].bus_width == 4) { +				at91_set_B_periph(AT91_PIN_PB3, 1); +				at91_set_B_periph(AT91_PIN_PB4, 1); +				at91_set_B_periph(AT91_PIN_PB5, 1); +			} +			slot_count++; +			break; +		case 1:					/* slot B */ +			/* CMD */ +			at91_set_B_periph(AT91_PIN_PA8, 1); +			/* DAT0, maybe DAT1..DAT3 */ +			at91_set_B_periph(AT91_PIN_PA9, 1); +			if (data->slot[i].bus_width == 4) { +				at91_set_B_periph(AT91_PIN_PA10, 1); +				at91_set_B_periph(AT91_PIN_PA11, 1); +				at91_set_B_periph(AT91_PIN_PA12, 1); +			} +			slot_count++; +			break; +		default: +			printk(KERN_ERR +			       "AT91: SD/MMC slot %d not available\n", i); +			break;  		} -	} else { -		/* CMD */ -		at91_set_A_periph(AT91_PIN_PA28, 1); +		if (slot_count) { +			/* CLK */ +			at91_set_A_periph(AT91_PIN_PA27, 0); -		/* DAT0, maybe DAT1..DAT3 */ -		at91_set_A_periph(AT91_PIN_PA29, 1); -		if (data->wire4) { -			at91_set_B_periph(AT91_PIN_PB3, 1); -			at91_set_B_periph(AT91_PIN_PB4, 1); -			at91_set_B_periph(AT91_PIN_PB5, 1); +			mmc_data = *data; +			platform_device_register(&at91rm9200_mmc_device);  		}  	} -	mmc_data = *data; -	platform_device_register(&at91rm9200_mmc_device);  }  #else -void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} +void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) {}  #endif  |