|
@@ -210,3 +210,192 @@ void __init at91_add_device_eth(struct macb_platform_data *data) {}
|
|
|
|
|
|
#if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE)
|
|
#if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE)
|
|
static struct at91_cf_data cf_data;
|
|
static struct at91_cf_data cf_data;
|
|
|
|
+
|
|
|
|
+#define CF_BASE AT91_CHIPSELECT_4
|
|
|
|
+
|
|
|
|
+static struct resource cf_resources[] = {
|
|
|
|
+ [0] = {
|
|
|
|
+ .start = CF_BASE,
|
|
|
|
+ /* ties up CS4, CS5 and CS6 */
|
|
|
|
+ .end = CF_BASE + (0x30000000 - 1),
|
|
|
|
+ .flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct platform_device at91rm9200_cf_device = {
|
|
|
|
+ .name = "at91_cf",
|
|
|
|
+ .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 int csa;
|
|
|
|
+
|
|
|
|
+ if (!data)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ data->chipselect = 4; /* can only use EBI ChipSelect 4 */
|
|
|
|
+
|
|
|
|
+ /* CF takes over CS4, CS5, CS6 */
|
|
|
|
+ csa = at91_ramc_read(0, AT91_EBI_CSA);
|
|
|
|
+ at91_ramc_write(0, AT91_EBI_CSA, csa | AT91_EBI_CS4A_SMC_COMPACTFLASH);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Static memory controller timing adjustments.
|
|
|
|
+ * REVISIT: these timings are in terms of MCK cycles, so
|
|
|
|
+ * when MCK changes (cpufreq etc) so must these values...
|
|
|
|
+ */
|
|
|
|
+ at91_ramc_write(0, AT91_SMC_CSR(4),
|
|
|
|
+ AT91_SMC_ACSS_STD
|
|
|
|
+ | AT91_SMC_DBW_16
|
|
|
|
+ | AT91_SMC_BAT
|
|
|
|
+ | AT91_SMC_WSEN
|
|
|
|
+ | AT91_SMC_NWS_(32) /* wait states */
|
|
|
|
+ | AT91_SMC_RWSETUP_(6) /* setup time */
|
|
|
|
+ | AT91_SMC_RWHOLD_(4) /* hold time */
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ /* input/irq */
|
|
|
|
+ if (gpio_is_valid(data->irq_pin)) {
|
|
|
|
+ at91_set_gpio_input(data->irq_pin, 1);
|
|
|
|
+ at91_set_deglitch(data->irq_pin, 1);
|
|
|
|
+ }
|
|
|
|
+ at91_set_gpio_input(data->det_pin, 1);
|
|
|
|
+ at91_set_deglitch(data->det_pin, 1);
|
|
|
|
+
|
|
|
|
+ /* outputs, initially off */
|
|
|
|
+ if (gpio_is_valid(data->vcc_pin))
|
|
|
|
+ at91_set_gpio_output(data->vcc_pin, 0);
|
|
|
|
+ at91_set_gpio_output(data->rst_pin, 0);
|
|
|
|
+
|
|
|
|
+ /* force poweron defaults for these pins ... */
|
|
|
|
+ at91_set_A_periph(AT91_PIN_PC9, 0); /* A25/CFRNW */
|
|
|
|
+ at91_set_A_periph(AT91_PIN_PC10, 0); /* NCS4/CFCS */
|
|
|
|
+ at91_set_A_periph(AT91_PIN_PC11, 0); /* NCS5/CFCE1 */
|
|
|
|
+ at91_set_A_periph(AT91_PIN_PC12, 0); /* NCS6/CFCE2 */
|
|
|
|
+
|
|
|
|
+ /* nWAIT is _not_ a default setting */
|
|
|
|
+ at91_set_A_periph(AT91_PIN_PC6, 1); /* nWAIT */
|
|
|
|
+
|
|
|
|
+ cf_data = *data;
|
|
|
|
+ platform_device_register(&at91rm9200_cf_device);
|
|
|
|
+}
|
|
|
|
+#else
|
|
|
|
+void __init at91_add_device_cf(struct at91_cf_data *data) {}
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* --------------------------------------------------------------------
|
|
|
|
+ * MMC / SD
|
|
|
|
+ * -------------------------------------------------------------------- */
|
|
|
|
+
|
|
|
|
+#if IS_ENABLED(CONFIG_MMC_ATMELMCI)
|
|
|
|
+static u64 mmc_dmamask = DMA_BIT_MASK(32);
|
|
|
|
+static struct mci_platform_data mmc_data;
|
|
|
|
+
|
|
|
|
+static struct resource mmc_resources[] = {
|
|
|
|
+ [0] = {
|
|
|
|
+ .start = AT91RM9200_BASE_MCI,
|
|
|
|
+ .end = AT91RM9200_BASE_MCI + SZ_16K - 1,
|
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
|
+ },
|
|
|
|
+ [1] = {
|
|
|
|
+ .start = NR_IRQS_LEGACY + AT91RM9200_ID_MCI,
|
|
|
|
+ .end = NR_IRQS_LEGACY + AT91RM9200_ID_MCI,
|
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct platform_device at91rm9200_mmc_device = {
|
|
|
|
+ .name = "atmel_mci",
|
|
|
|
+ .id = -1,
|
|
|
|
+ .dev = {
|
|
|
|
+ .dma_mask = &mmc_dmamask,
|
|
|
|
+ .coherent_dma_mask = DMA_BIT_MASK(32),
|
|
|
|
+ .platform_data = &mmc_data,
|
|
|
|
+ },
|
|
|
|
+ .resource = mmc_resources,
|
|
|
|
+ .num_resources = ARRAY_SIZE(mmc_resources),
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+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;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < ATMCI_MAX_NR_SLOTS; i++) {
|
|
|
|
+
|
|
|
|
+ if (!data->slot[i].bus_width)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ /* 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);
|
|
|
|
+
|
|
|
|
+ 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;
|
|
|
|
+ }
|
|
|
|
+ if (slot_count) {
|
|
|
|
+ /* CLK */
|
|
|
|
+ at91_set_A_periph(AT91_PIN_PA27, 0);
|
|
|
|
+
|
|
|
|
+ mmc_data = *data;
|
|
|
|
+ platform_device_register(&at91rm9200_mmc_device);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+#else
|
|
|
|
+void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) {}
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* --------------------------------------------------------------------
|
|
|
|
+ * NAND / SmartMedia
|
|
|
|
+ * -------------------------------------------------------------------- */
|
|
|
|
+
|
|
|
|
+#if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE)
|
|
|
|
+static struct atmel_nand_data nand_data;
|
|
|
|
+
|
|
|
|
+#define NAND_BASE AT91_CHIPSELECT_3
|
|
|
|
+
|
|
|
|
+static struct resource nand_resources[] = {
|