📄 2.6.18-rc4-at91.patch.gz
字号:
+ at91_set_B_periph(AT91_PIN_PB17, 0); /* ERXDV */+ at91_set_B_periph(AT91_PIN_PB16, 0); /* ERX3 */+ at91_set_B_periph(AT91_PIN_PB15, 0); /* ERX2 */+ at91_set_B_periph(AT91_PIN_PB14, 0); /* ETXER */+ at91_set_B_periph(AT91_PIN_PB13, 0); /* ETX3 */+ at91_set_B_periph(AT91_PIN_PB12, 0); /* ETX2 */+ }++ eth_data = *data;+ platform_device_register(&at91rm9200_eth_device);+}+#else+void __init at91_add_device_eth(struct at91_eth_data *data) {}+#endif+++/* --------------------------------------------------------------------+ * Compact Flash / PCMCIA+ * -------------------------------------------------------------------- */++#if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE)+static struct at91_cf_data cf_data;++#define AT91_CF_BASE AT91_CHIPSELECT_4++static struct resource at91_cf_resources[] = {+ [0] = {+ .start = AT91_CF_BASE,+ /* ties up CS4, CS5 and CS6 */+ .end = AT91_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 = at91_cf_resources,+ .num_resources = ARRAY_SIZE(at91_cf_resources),+};++void __init at91_add_device_cf(struct at91_cf_data *data)+{+ if (!data)+ return;++ /* input/irq */+ if (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 (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 */++ 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 defined(CONFIG_MMC_AT91RM9200) || defined(CONFIG_MMC_AT91RM9200_MODULE)+static u64 mmc_dmamask = 0xffffffffUL;+static struct at91_mmc_data mmc_data;++static struct resource at91_mmc_resources[] = {+ [0] = {+ .start = AT91RM9200_BASE_MCI,+ .end = AT91RM9200_BASE_MCI + SZ_16K - 1,+ .flags = IORESOURCE_MEM,+ },+ [1] = {+ .start = AT91RM9200_ID_MCI,+ .end = AT91RM9200_ID_MCI,+ .flags = IORESOURCE_IRQ,+ },+};++static struct platform_device at91rm9200_mmc_device = {+ .name = "at91_mci",+ .id = -1,+ .dev = {+ .dma_mask = &mmc_dmamask,+ .coherent_dma_mask = 0xffffffff,+ .platform_data = &mmc_data,+ },+ .resource = at91_mmc_resources,+ .num_resources = ARRAY_SIZE(at91_mmc_resources),+};++void __init at91_add_device_mmc(struct at91_mmc_data *data)+{+ if (!data)+ return;++ /* input/irq */+ if (data->det_pin) {+ at91_set_gpio_input(data->det_pin, 1);+ at91_set_deglitch(data->det_pin, 1);+ }+ if (data->wp_pin)+ at91_set_gpio_input(data->wp_pin, 1);++ /* CLK */+ at91_set_A_periph(AT91_PIN_PA27, 0);++ if (data->is_b) {+ /* CMD */+ at91_set_B_periph(AT91_PIN_PA8, 0);++ /* DAT0, maybe DAT1..DAT3 */+ at91_set_B_periph(AT91_PIN_PA9, 0);+ if (data->wire4) {+ at91_set_B_periph(AT91_PIN_PA10, 0);+ at91_set_B_periph(AT91_PIN_PA11, 0);+ at91_set_B_periph(AT91_PIN_PA12, 0);+ }+ } else {+ /* CMD */+ at91_set_A_periph(AT91_PIN_PA28, 0);++ /* DAT0, maybe DAT1..DAT3 */+ at91_set_A_periph(AT91_PIN_PA29, 0);+ if (data->wire4) {+ at91_set_B_periph(AT91_PIN_PB3, 0);+ at91_set_B_periph(AT91_PIN_PB4, 0);+ at91_set_B_periph(AT91_PIN_PB5, 0);+ }+ }++ mmc_data = *data;+ platform_device_register(&at91rm9200_mmc_device);+}+#else+void __init at91_add_device_mmc(struct at91_mmc_data *data) {}+#endif+++/* --------------------------------------------------------------------+ * NAND / SmartMedia+ * -------------------------------------------------------------------- */++#if defined(CONFIG_MTD_NAND_AT91) || defined(CONFIG_MTD_NAND_AT91_MODULE)+static struct at91_nand_data nand_data;++#define AT91_SMARTMEDIA_BASE AT91_CHIPSELECT_3++static struct resource at91_nand_resources[] = {+ {+ .start = AT91_SMARTMEDIA_BASE,+ .end = AT91_SMARTMEDIA_BASE + SZ_8M - 1,+ .flags = IORESOURCE_MEM,+ }+};++static struct platform_device at91_nand_device = {+ .name = "at91_nand",+ .id = -1,+ .dev = {+ .platform_data = &nand_data,+ },+ .resource = at91_nand_resources,+ .num_resources = ARRAY_SIZE(at91_nand_resources),+};++void __init at91_add_device_nand(struct at91_nand_data *data)+{+ if (!data)+ return;++ /* enable pin */+ if (data->enable_pin)+ at91_set_gpio_output(data->enable_pin, 1);++ /* ready/busy pin */+ if (data->rdy_pin)+ at91_set_gpio_input(data->rdy_pin, 1);++ /* card detect pin */+ if (data->det_pin)+ at91_set_gpio_input(data->det_pin, 1);++ at91_set_A_periph(AT91_PIN_PC1, 0); /* SMOE */+ at91_set_A_periph(AT91_PIN_PC3, 0); /* SMWE */++ nand_data = *data;+ platform_device_register(&at91_nand_device);+}+#else+void __init at91_add_device_nand(struct at91_nand_data *data) {}+#endif+++/* --------------------------------------------------------------------+ * TWI (i2c)+ * -------------------------------------------------------------------- */++#if defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)++static struct resource at91_twi_resources[] = {+ [0] = {+ .start = AT91RM9200_BASE_TWI,+ .end = AT91RM9200_BASE_TWI + SZ_16K - 1,+ .flags = IORESOURCE_MEM,+ },+ [1] = {+ .start = AT91RM9200_ID_TWI,+ .end = AT91RM9200_ID_TWI,+ .flags = IORESOURCE_IRQ,+ },+};++static struct platform_device at91rm9200_twi_device = {+ .name = "at91_i2c",+ .id = -1,+ .resource = at91_twi_resources,+ .num_resources = ARRAY_SIZE(at91_twi_resources),+};++void __init at91_add_device_i2c(void)+{+ /* pins used for TWI interface */+ at91_set_A_periph(AT91_PIN_PA25, 0); /* TWD */+ at91_set_multi_drive(AT91_PIN_PA25, 1);++ at91_set_A_periph(AT91_PIN_PA26, 0); /* TWCK */+ at91_set_multi_drive(AT91_PIN_PA26, 1);++ platform_device_register(&at91rm9200_twi_device);+}+#else+void __init at91_add_device_i2c(void) {}+#endif+++/* --------------------------------------------------------------------+ * SPI+ * -------------------------------------------------------------------- */++#if defined(CONFIG_SPI_AT91) || defined(CONFIG_SPI_AT91_MODULE) || defined(CONFIG_AT91_SPI) || defined(CONFIG_AT91_SPI_MODULE)+static u64 spi_dmamask = 0xffffffffUL;++static struct resource at91_spi_resources[] = {+ [0] = {+ .start = AT91RM9200_BASE_SPI,+ .end = AT91RM9200_BASE_SPI + SZ_16K - 1,+ .flags = IORESOURCE_MEM,+ },+ [1] = {+ .start = AT91RM9200_ID_SPI,+ .end = AT91RM9200_ID_SPI,+ .flags = IORESOURCE_IRQ,+ },+};++static struct platform_device at91rm9200_spi_device = {+ .name = "at91_spi",+ .id = 0,+ .dev = {+ .dma_mask = &spi_dmamask,+ .coherent_dma_mask = 0xffffffff,+ },+ .resource = at91_spi_resources,+ .num_resources = ARRAY_SIZE(at91_spi_resources),+};++static const unsigned at91_spi_standard_cs[4] = { AT91_PIN_PA3, AT91_PIN_PA4, AT91_PIN_PA5, AT91_PIN_PA6 };++void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)+{+ int i;+ unsigned long cs_pin;++ at91_set_A_periph(AT91_PIN_PA0, 0); /* MISO */+ at91_set_A_periph(AT91_PIN_PA1, 0); /* MOSI */+ at91_set_A_periph(AT91_PIN_PA2, 0); /* SPCK */++ /* Enable SPI chip-selects */+ for (i = 0; i < nr_devices; i++) {+ if (devices[i].controller_data)+ cs_pin = (unsigned long) devices[i].controller_data;+ else+ cs_pin = at91_spi_standard_cs[devices[i].chip_select];++#ifdef CONFIG_SPI_AT91_MANUAL_CS+ at91_set_gpio_output(cs_pin, 1);+#else+ at91_set_A_periph(cs_pin, 0);+#endif++ /* pass chip-select pin to driver */+ devices[i].controller_data = (void *) cs_pin;+ }++ spi_register_board_info(devices, nr_devices);+ at91_clock_associate("spi_clk", &at91rm9200_spi_device.dev, "spi");+ platform_device_register(&at91rm9200_spi_device);+}+#else+void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) {}+#endif+++/* --------------------------------------------------------------------+ * RTC+ * -------------------------------------------------------------------- */++#if defined(CONFIG_RTC_DRV_AT91) || defined(CONFIG_RTC_DRV_AT91_MODULE)+static struct platform_device at91rm9200_rtc_device = {+ .name = "at91_rtc",+ .id = -1,+ .num_resources = 0,+};++static void __init at91_add_device_rtc(void)+{+ platform_device_register(&at91rm9200_rtc_device);+}+#else+static void __init at91_add_device_rtc(void) {}+#endif+++/* --------------------------------------------------------------------+ * Watchdog+ * -------------------------------------------------------------------- */++#if defined(CONFIG_AT91_WATCHDOG) || defined(CONFIG_AT91_WATCHDOG_MODULE)+static struct platform_device at91rm9200_wdt_device = {+ .name = "at91_wdt",+ .id = -1,+ .num_resources = 0,+};++static void __init at91_add_device_watchdog(void)+{+ platform_device_register(&at91rm9200_wdt_device);+}+#else+static void __init at91_add_device_watchdog(void) {}+#endif+++/* --------------------------------------------------------------------+ * LEDs+ * -------------------------------------------------------------------- */++#if defined(CONFIG_LEDS)+u8 at91_leds_cpu;+u8 at91_leds_timer;++void __init at91_init_leds(u8 cpu_led, u8 timer_led)+{+ at91_leds_cpu = cpu_led;+ at91_leds_timer = timer_led;+}+#else+void __init at91_init_leds(u8 cpu_led, u8 timer_led) {}+#endif+++/* --------------------------------------------------------------------+ * UART+ * -------------------------------------------------------------------- */++#if defined(CONFIG_SERIAL_AT91)+static struct resource dbgu_resources[] = {+ [0] = {+ .start = AT91_VA_BASE_SYS + AT91_DBGU,+ .end = AT91_VA_BASE_SYS + AT91_DBGU + SZ_512 - 1,+ .flags = IORESOURCE_MEM,+ },+ [1] = {+ .start = AT91RM9200_ID_SYS,+ .end = AT91RM9200_ID_SYS,+ .flags = IORESOURCE_IRQ,+ },+};++static struct at91_uart_data dbgu_data = {+ .use_dma_tx = 0,+ .use_dma_rx = 0, /* DBGU not capable of receive DMA */+};++static struct platform_device at91rm9200_dbgu_device = {+ .name = "at91_usart",+ .id = 0,+ .dev = {+ .platform_data = &dbgu_data,+ .coherent_dma_mask = 0xffffffff,+ },+ .resource = dbgu_resources,+ .num_resources = ARRAY_SIZE(dbgu_resources),+};++static inline void configure_dbgu_pins(void)+{+ at91_set_A_periph(AT91_PIN_PA30, 0); /* DRXD */+ at91_set_A_periph(AT91_PIN_PA31, 1); /* DTXD */+}++static struct resource uart0_resources[] = {+ [0] = {+ .start = AT91RM9200_BASE_US0,+ .end = AT91RM9200_BASE_US0 + SZ_16K - 1,+ .flags = IORESOURCE_MEM,+ },+ [1] = {+ .start = AT91RM9200_ID_US0,+ .end = AT91RM9200_ID_US0,+ .flags = IORESOURCE_IRQ,+ },+};++static struct at91_uart_data uart0_data = {+ .use_dma_tx = 1,+ .use_dma_rx = 1,+};++static struct platform_device at91rm9200_uart0_device = {+ .name = "at91_usart",+ .id = 1,+ .dev = {+ .platform_data = &uart0_data,+ .coherent_dma_mask = 0xffffffff,+ },+ .resource = uart0_resources,+ .num_resources = ARRAY_SIZE(uart0_resources),+};++static inline void configure_usart0_pins(void)+{+ at91_set_A_periph(AT91_PIN_PA17, 1); /* TXD0 */+ at91_set_A_periph(AT91_PIN_PA18, 0); /* RXD0 */+ at91_set_A_periph(AT91_PIN_PA20, 0); /* CTS0 */++ /*+ * AT91RM9200 Errata #39 - RTS0 is not internally connected to PA21.+ * We need to drive the pin manually. Default is off (RTS is active low).+ */+ at91_set_gpio_output(AT91_PIN_PA21, 1);+}++static struct resource uart1_resources[] = {+ [0] = {+ .start = AT91RM9200_BASE_US1,+ .end = AT91RM9200_BASE_US1 + SZ_16K - 1,+ .flags = IORESOURCE_MEM,+ },+ [1] = {+ .start = AT91RM9200_ID_US1,+ .end = AT91RM9200_ID_US1,+ .flags = IORESOURCE_IRQ,+ },+};++static struct at91_uart_data uart1_data = {+ .use_dma_tx = 1,+ .use_dma_rx = 1,+};++static struct platform_device at91rm9200_uart1_device = {+ .name = "at91_usart",+ .id = 2,+ .dev = {+ .platform_data = &uart1_data,+ .coherent_dma_mask = 0xffffffff,+ },+ .resource = uart1_resources,+ .num_resources = ARRAY_SIZE(uart1_resources),+};++static inline void configure_usart1_pins(void)+{+ at91_set_A_periph(AT91_PIN_PB18, 0); /* RI1 */+ at91_set_A_periph(AT91_PIN_PB19, 0); /* DTR1 */+ at91_set_A_periph(AT91_PIN_PB20, 1); /* TXD1 */+ at91_set_A_periph(AT91_PIN_PB21, 0); /* RXD1 */+ at91_set_A_periph(AT91_PIN_PB23, 0); /* DCD1 */+ at91_set_A_periph(AT91_PIN_PB24, 0); /* CTS1 */+ at91_set_A_periph(AT91_PIN_PB25, 0); /* DSR1 */+ at91_set_A_periph(AT91_PIN_PB26, 0); /* RTS1 */+}++static struct resource uart2_resources[] = {+ [0] = {+ .start = AT91RM9200_BASE_US2,+ .end = AT91RM9200_BASE_US2 + SZ_16K - 1,+ .flags = IORESOURCE_MEM,+ },+ [1] = {+ .start = AT91RM9200_ID_US2,+ .end = AT91RM9200_ID_US2,+ .flags = IORESOURCE_IRQ,+ },+};++static struct at91_uart_data uart2_data = {+ .use_dma_tx = 1,+ .use_dma_rx = 1,+};++static struct platform_device at91rm9200_uart2_device = {+ .name = "at91_usart",+ .id = 3,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -