|
@@ -76,3 +76,139 @@ static struct resource dm9000_resource[] = {
|
|
|
.end = AT91_CHIPSELECT_2 + 0xFF,
|
|
|
.flags = IORESOURCE_MEM
|
|
|
},
|
|
|
+ [2] = {
|
|
|
+ .flags = IORESOURCE_IRQ
|
|
|
+ | IORESOURCE_IRQ_LOWEDGE | IORESOURCE_IRQ_HIGHEDGE,
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+static struct dm9000_plat_data dm9000_platdata = {
|
|
|
+ .flags = DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device dm9000_device = {
|
|
|
+ .name = "dm9000",
|
|
|
+ .id = 0,
|
|
|
+ .num_resources = ARRAY_SIZE(dm9000_resource),
|
|
|
+ .resource = dm9000_resource,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &dm9000_platdata,
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * SMC timings for the DM9000.
|
|
|
+ * Note: These timings were calculated for MASTER_CLOCK = 100000000 according to the DM9000 timings.
|
|
|
+ */
|
|
|
+static struct sam9_smc_config __initdata dm9000_smc_config = {
|
|
|
+ .ncs_read_setup = 0,
|
|
|
+ .nrd_setup = 2,
|
|
|
+ .ncs_write_setup = 0,
|
|
|
+ .nwe_setup = 2,
|
|
|
+
|
|
|
+ .ncs_read_pulse = 8,
|
|
|
+ .nrd_pulse = 4,
|
|
|
+ .ncs_write_pulse = 8,
|
|
|
+ .nwe_pulse = 4,
|
|
|
+
|
|
|
+ .read_cycle = 16,
|
|
|
+ .write_cycle = 16,
|
|
|
+
|
|
|
+ .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_WRITE | AT91_SMC_DBW_16,
|
|
|
+ .tdf_cycles = 1,
|
|
|
+};
|
|
|
+
|
|
|
+static void __init ek_add_device_dm9000(void)
|
|
|
+{
|
|
|
+ struct resource *r = &dm9000_resource[2];
|
|
|
+
|
|
|
+ /* Configure chip-select 2 (DM9000) */
|
|
|
+ sam9_smc_configure(0, 2, &dm9000_smc_config);
|
|
|
+
|
|
|
+ /* Configure Reset signal as output */
|
|
|
+ at91_set_gpio_output(AT91_PIN_PC10, 0);
|
|
|
+
|
|
|
+ /* Configure Interrupt pin as input, no pull-up */
|
|
|
+ at91_set_gpio_input(AT91_PIN_PC11, 0);
|
|
|
+
|
|
|
+ r->start = r->end = gpio_to_irq(AT91_PIN_PC11);
|
|
|
+ platform_device_register(&dm9000_device);
|
|
|
+}
|
|
|
+#else
|
|
|
+static void __init ek_add_device_dm9000(void) {}
|
|
|
+#endif /* CONFIG_DM9000 */
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * USB Host Port
|
|
|
+ */
|
|
|
+static struct at91_usbh_data __initdata ek_usbh_data = {
|
|
|
+ .ports = 2,
|
|
|
+ .vbus_pin = {-EINVAL, -EINVAL},
|
|
|
+ .overcurrent_pin= {-EINVAL, -EINVAL},
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * USB Device Port
|
|
|
+ */
|
|
|
+static struct at91_udc_data __initdata ek_udc_data = {
|
|
|
+ .vbus_pin = AT91_PIN_PB29,
|
|
|
+ .pullup_pin = -EINVAL, /* pull-up driven by UDC */
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * NAND flash
|
|
|
+ */
|
|
|
+static struct mtd_partition __initdata ek_nand_partition[] = {
|
|
|
+ {
|
|
|
+ .name = "Partition 1",
|
|
|
+ .offset = 0,
|
|
|
+ .size = SZ_256K,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .name = "Partition 2",
|
|
|
+ .offset = MTDPART_OFS_NXTBLK,
|
|
|
+ .size = MTDPART_SIZ_FULL,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct atmel_nand_data __initdata ek_nand_data = {
|
|
|
+ .ale = 22,
|
|
|
+ .cle = 21,
|
|
|
+ .det_pin = -EINVAL,
|
|
|
+ .rdy_pin = AT91_PIN_PC15,
|
|
|
+ .enable_pin = AT91_PIN_PC14,
|
|
|
+ .ecc_mode = NAND_ECC_SOFT,
|
|
|
+ .on_flash_bbt = 1,
|
|
|
+ .parts = ek_nand_partition,
|
|
|
+ .num_parts = ARRAY_SIZE(ek_nand_partition),
|
|
|
+};
|
|
|
+
|
|
|
+static struct sam9_smc_config __initdata ek_nand_smc_config = {
|
|
|
+ .ncs_read_setup = 0,
|
|
|
+ .nrd_setup = 1,
|
|
|
+ .ncs_write_setup = 0,
|
|
|
+ .nwe_setup = 1,
|
|
|
+
|
|
|
+ .ncs_read_pulse = 3,
|
|
|
+ .nrd_pulse = 3,
|
|
|
+ .ncs_write_pulse = 3,
|
|
|
+ .nwe_pulse = 3,
|
|
|
+
|
|
|
+ .read_cycle = 5,
|
|
|
+ .write_cycle = 5,
|
|
|
+
|
|
|
+ .mode = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE,
|
|
|
+ .tdf_cycles = 2,
|
|
|
+};
|
|
|
+
|
|
|
+static void __init ek_add_device_nand(void)
|
|
|
+{
|
|
|
+ ek_nand_data.bus_width_16 = board_have_nand_16bit();
|
|
|
+ /* setup bus-width (8 or 16) */
|
|
|
+ if (ek_nand_data.bus_width_16)
|
|
|
+ ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
|
|
|
+ else
|
|
|
+ ek_nand_smc_config.mode |= AT91_SMC_DBW_8;
|