Signed-off-by: Stanislaw Gruszka <stf_xl@xxxxx> --- arch/arm/mach-at91/at91sam9263_devices.c | 106 ++++++++++++++++++++++++++++++ 1 files changed, 106 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index b753cb8..7c950f1 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c @@ -15,6 +15,7 @@ #include <linux/dma-mapping.h> #include <linux/platform_device.h> #include <linux/i2c-gpio.h> +#include <linux/delay.h> #include <linux/fb.h> #include <video/atmel_lcdc.h> @@ -347,6 +348,111 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} #endif +/* -------------------------------------------------------------------- + * Compact Flash (PCMCIA or IDE) + * -------------------------------------------------------------------- */ + +#if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) || \ + defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE) + +static struct resource cf_resources[] = { + [0] = { + .start = 0, + .end = 0, + .flags = IORESOURCE_MEM, + }, +}; + +static struct at91_cf_data cf_data; + +static struct platform_device at91_cf_device = { + .id = -1, + .dev = { + .platform_data = &cf_data, + }, + .resource = cf_resources, + .num_resources = ARRAY_SIZE(cf_resources), +}; + +void __init at91_add_device_cf(struct at91_cf_data *data) +{ + unsigned long ebi0_csa, addr_space; + + if (!data) + return; + + /* + * assign CS4 or CS5 to SMC with Compact Flash logic support, + * we assume SMC timings are configured by board code, + * except True IDE where timings are controlled by driver + */ + ebi0_csa = at91_sys_read(AT91_MATRIX_EBI0CSA); + switch (data->chipselect) { + case 4: + at91_set_A_periph(AT91_PIN_PD6, 0); /* EBI0_NCS4/CFCS0 */ + ebi0_csa |= AT91_MATRIX_EBI0_CS4A_SMC_CF1; + addr_space = AT91_CHIPSELECT_4; + break; + case 5: + at91_set_A_periph(AT91_PIN_PD7, 0); /* EBI0_NCS5/CFCS1 */ + ebi0_csa |= AT91_MATRIX_EBI0_CS5A_SMC_CF2; + addr_space = AT91_CHIPSELECT_5; + break; + default: + printk(KERN_ERR "AT91: CF bad chip-select requested (%u)\n", + data->chipselect); + return; + } + at91_sys_write(AT91_MATRIX_EBI0CSA, ebi0_csa); + + cf_resources[0].start = addr_space; + cf_resources[0].end = addr_space + SZ_256M - 1; + + if (data->det_pin) { + /* check if device is present */ + at91_set_gpio_input(data->det_pin, 1); + at91_set_deglitch(data->det_pin, 1); + if (at91_get_gpio_value(data->det_pin) != 0) { + printk(KERN_ERR "AT91: no CF card detected\n"); + return; + } + } + + if (data->rst_pin) { + /* reset the card */ + int reset = (data->flags & AT91_CF_TRUE_IDE) ? 0 : 1; + + at91_set_gpio_output(data->rst_pin, reset); + udelay(25); /* taken from ATA docs, CFA not specify it ? */ + at91_set_gpio_output(data->rst_pin, !reset); + } + + if (data->irq_pin) { + at91_set_gpio_input(data->irq_pin, 1); + at91_set_deglitch(data->irq_pin, 1); + } + + if (data->vcc_pin) + /* initially off */ + at91_set_gpio_output(data->vcc_pin, 0); + + /* enable EBI controlled pins */ + at91_set_A_periph(AT91_PIN_PD5, 1); /* NWAIT */ + at91_set_A_periph(AT91_PIN_PD8, 0); /* CFCE1 */ + at91_set_A_periph(AT91_PIN_PD9, 0); /* CFCE2 */ + at91_set_A_periph(AT91_PIN_PD14, 0); /* CFNRW */ + + if (data->flags & AT91_CF_TRUE_IDE) + at91_cf_device.name = "at91_ide"; + else + at91_cf_device.name = "at91_cf"; + + cf_data = *data; + platform_device_register(&at91_cf_device); +} +#else +void __init at91_add_device_cf(struct at91_ide_data *data) {} +#endif /* -------------------------------------------------------------------- * NAND / SmartMedia -- 1.5.2.5 -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html