Index: linux-2.6.35/arch/arm/mach-at91/at91sam9260_devices.c =================================================================== --- linux-2.6.35.orig/arch/arm/mach-at91/at91sam9260_devices.c 2010-08-01 17:11:14.000000000 -0500 +++ linux-2.6.35/arch/arm/mach-at91/at91sam9260_devices.c 2013-07-02 14:13:34.956479927 -0500 @@ -183,9 +183,9 @@ at91_set_B_periph(AT91_PIN_PA25, 0); /* ERX2 */ at91_set_B_periph(AT91_PIN_PA26, 0); /* ERX3 */ at91_set_B_periph(AT91_PIN_PA27, 0); /* ERXCK */ - at91_set_B_periph(AT91_PIN_PA23, 0); /* ETX2 */ - at91_set_B_periph(AT91_PIN_PA24, 0); /* ETX3 */ - at91_set_B_periph(AT91_PIN_PA22, 0); /* ETXER */ + at91_set_B_periph(AT91_PIN_PA10, 0); /* ETX2 */ + at91_set_B_periph(AT91_PIN_PA11, 0); /* ETX3 */ + /*at91_set_B_periph(AT91_PIN_PA22, 0);*/ /* ETXER */ } eth_data = *data; @@ -571,7 +571,15 @@ .num_resources = ARRAY_SIZE(spi1_resources), }; -static const unsigned spi1_standard_cs[4] = { AT91_PIN_PB3, AT91_PIN_PC5, AT91_PIN_PC4, AT91_PIN_PC3 }; +static const unsigned spi1_standard_cs[7] = { + AT91_PIN_PB21, // CS0 - external pin SPI_CS7 + AT91_PIN_PC5, // CS1 - GP output + AT91_PIN_PC4, // CS2 - temp sensor + AT91_PIN_PC6, // CS3 - unused/floating + AT91_PIN_PB12, // CS4 - GP input + AT91_PIN_PB13, // CS5 - external pin SPI_CS5 + AT91_PIN_PB16 // CS6 - external pin SPI_CS6 +}; void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) { Index: linux-2.6.35/arch/arm/mach-at91/board-sam9g20ek.c =================================================================== --- linux-2.6.35.orig/arch/arm/mach-at91/board-sam9g20ek.c 2010-08-01 17:11:14.000000000 -0500 +++ linux-2.6.35/arch/arm/mach-at91/board-sam9g20ek.c 2013-12-17 15:16:55.593333335 -0600 @@ -27,6 +27,11 @@ #include #include #include +#include +#include +#include +#include +#include #include #include @@ -44,9 +49,12 @@ #include "sam9_smc.h" #include "generic.h" +static int i2c_present; static void __init ek_map_io(void) { + int tmp; + /* Initialize processor: 18.432 MHz crystal */ at91sam9260_initialize(18432000); @@ -61,12 +69,55 @@ /* USART1 on ttyS2. (Rx, Tx, RTS, CTS) */ at91_register_uart(AT91SAM9260_ID_US1, 2, ATMEL_UART_CTS | ATMEL_UART_RTS); + /* + * Reset any initiated i2c data transfers? + */ + at91_set_gpio_input(AT91_PIN_PA23, 0); + at91_set_gpio_output(AT91_PIN_PA24, 0); + for (tmp = 0; tmp < 11; tmp++) { + at91_set_gpio_value(AT91_PIN_PA24, 0); + udelay(20); + at91_set_gpio_value(AT91_PIN_PA24, 1); + udelay(20); + } + at91_set_gpio_input(AT91_PIN_PA24, 0); + + /* + * PA24 and PA23 are used as ID pins on MTCBA/MTCDP-0.0 and I2C pins on MTCDP-1.0. + * + * MTCBA Rev. B: 0x01, C: 0x02, D: 0x03 + * MTCDP Rev. A reads as 0x00 with TWCK and TWD pulled high + * + */ + tmp = !at91_get_gpio_value(AT91_PIN_PA24) << 1 | !at91_get_gpio_value(AT91_PIN_PA23); + + i2c_present = !tmp; + + /* + * The GPS receiver is either at US2 on MTCBA/MTCDP-0.0 and US3 on MTCDP-1.0. + */ + if (i2c_present) { + at91_register_uart(AT91SAM9260_ID_US3, 3, ATMEL_UART_CTS | ATMEL_UART_RTS); + printk(KERN_INFO "sam9g20: i2c available\n"); + } else { + at91_register_uart(AT91SAM9260_ID_US2, 3, 0); + printk(KERN_INFO "sam9g20: i2c not available\n"); + } + /* set serial console to ttyS0 (ie, DBGU) */ at91_set_serial_console(0); } static void __init ek_init_irq(void) { + /* + * Ensure RTT interrupts are disabled + */ + u32 mr; + mr = __raw_readl(AT91_VA_BASE_SYS + AT91_RTT + AT91_RTT_MR); + __raw_writel(mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN), + AT91_VA_BASE_SYS + AT91_RTT + AT91_RTT_MR); + at91sam9260_init_interrupts(NULL); } @@ -82,10 +133,37 @@ * USB Device port */ static struct at91_udc_data __initdata ek_udc_data = { - .vbus_pin = AT91_PIN_PC5, - .pullup_pin = 0, /* pull-up driven by UDC */ + .vbus_pin = AT91_PIN_PC12, + .pullup_pin = 0, /* pull-up driven by UDC */ +}; + + +#define MTS_EXT_AT25_TEST 0 +#if MTS_EXT_AT25_TEST +static struct spi_eeprom at25040b = { + .byte_len = SZ_4K / 8, + .name = "at25040b", + .page_size = 8, + .flags = EE_ADDR1, }; +#endif +#define MTS_EXT_STT25_TEST 0 +#if MTS_EXT_STT25_TEST +static struct mtd_partition m25_partitions[] = { + { + .name = "flash", + .offset = 0x00000000, + .size = MTDPART_SIZ_FULL, + }, +}; + +static struct flash_platform_data m25_spi_flash_data = { + .type = "sst25vf080b", + .nr_parts = ARRAY_SIZE(m25_partitions), + .parts = m25_partitions, +}; +#endif /* * SPI devices. @@ -107,6 +185,70 @@ }, #endif #endif + { + .modalias = "mts-io-board-temp", + .chip_select = 2, + .bus_num = 1, + }, + { + .modalias = "mts-io-dout", + .chip_select = 1, + .bus_num = 1, + }, + { + .modalias = "mts-io-din", + .chip_select = 4, + .bus_num = 1, + }, + /* max_speed_hz = 0 means as slow as possible + * for OCG, this means approx 520kHz + */ + { /* SPI_CS5 to board-to-board connector */ + .modalias = "spidev", + .chip_select = 5, + .max_speed_hz = 0, + .bus_num = 1, + }, + { /* SPI_CS6 to board-to-board connector */ + .modalias = "spidev", + .chip_select = 6, + .max_speed_hz = 0, + .bus_num = 1, + }, + { /* SPI_CS7 to board-to-board connector (chip select 0 in board code) */ + .modalias = "spidev", + .chip_select = 0, + .max_speed_hz = 0, + .bus_num = 1, + }, +#if MTS_EXT_AT25_TEST + { + .modalias = "at25", + .platform_data = &at25040b, + .max_speed_hz = 20 * 1000 * 1000, + .bus_num = 1, + .chip_select = 5, + .mode = SPI_MODE_0, + }, + { + .modalias = "at25", + .platform_data = &at25040b, + .max_speed_hz = 20 * 1000 * 1000, + .bus_num = 1, + .chip_select = 6, + .mode = SPI_MODE_0, + }, +#endif +#if MTS_EXT_STT25_TEST + { + .modalias = "m25p80", + .platform_data = &m25_spi_flash_data, + .irq = NO_IRQ, + .max_speed_hz = 33 * 1000 * 1000, + .bus_num = 1, + .chip_select = 5, + }, +#endif }; @@ -115,7 +257,7 @@ */ static struct at91_eth_data __initdata ek_macb_data = { .phy_irq_pin = AT91_PIN_PA7, - .is_rmii = 1, + .is_rmii = 0, }; @@ -124,18 +266,48 @@ */ static struct mtd_partition __initdata ek_nand_partition[] = { { - .name = "Bootstrap", - .offset = 0, - .size = 4 * SZ_1M, + .name = "MTNCG-NANDFlash", + .offset = 0, + .size = 256*1024*1024, + }, + { + .name = "AT91Bootstrap", + .offset = 0, + .size = 128*1024, + }, + { + .name = "UBoot", + .offset = 128*1024, + .size = 256*1024, + }, + { + .name = "UBoot Config", + .offset = 384*1024, + .size = 128*1024, + }, + { + .name = "UBoot Redundant Config", + .offset = 512*1024, + .size = 128*1024, + }, + { + .name = "uImage", + .offset = 640*1024, + .size = 59*128*1024, }, { - .name = "Partition 1", - .offset = MTDPART_OFS_NXTBLK, - .size = 60 * SZ_1M, + .name = "Config", + .offset = 64*128*1024, + .size = 64*128*1024, }, { - .name = "Partition 2", - .offset = MTDPART_OFS_NXTBLK, + .name = "Oem Config", + .offset = 128*128*1024, + .size = 64*128*1024, + }, + { + .name = "Rootfs", + .offset = 192*128*1024, .size = MTDPART_SIZ_FULL, }, }; @@ -195,11 +367,13 @@ /* * MCI (SD/MMC) - * det_pin, wp_pin and vcc_pin are not connected + * vcc_pin is not connected */ static struct at91_mmc_data __initdata ek_mmc_data = { .slot_b = 1, .wire4 = 1, + .det_pin = AT91_PIN_PA6, + .wp_pin = AT91_PIN_PA9, }; @@ -207,15 +381,10 @@ * LEDs */ static struct gpio_led ek_leds[] = { - { /* "bottom" led, green, userled1 to be defined */ - .name = "ds5", - .gpio = AT91_PIN_PA6, + { /* "status" led, green */ + .name = "status", + .gpio = AT91_PIN_PA30, .active_low = 1, - .default_trigger = "none", - }, - { /* "power" led, yellow */ - .name = "ds1", - .gpio = AT91_PIN_PA9, .default_trigger = "heartbeat", } }; @@ -269,14 +438,36 @@ static void __init ek_add_device_buttons(void) {} #endif +uint8_t mts_id_eeprom[512]; + +EXPORT_SYMBOL(mts_id_eeprom); + +static void mts_id_eeprom_load(struct memory_accessor *macc, void *context) +{ + int tmp; + + memset(mts_id_eeprom, 0, sizeof(mts_id_eeprom)); + + tmp = macc->read(macc, mts_id_eeprom, 0, sizeof(mts_id_eeprom)); + if (tmp != sizeof(mts_id_eeprom)) { + printk(KERN_ERR "sam9g20: id eeprom read failed: %d\n", tmp); + } else { + printk(KERN_INFO "sam9g20: read %d bytes from id eeprom\n", tmp); + } +} + +static struct at24_platform_data at24c04_data = { + .byte_len = SZ_4K / 8, + .page_size = 16, + .setup = mts_id_eeprom_load, +}; + static struct i2c_board_info __initdata ek_i2c_devices[] = { - { - I2C_BOARD_INFO("24c512", 0x50) - }, - { - I2C_BOARD_INFO("wm8731", 0x1b) - }, + { + I2C_BOARD_INFO("24c04", 0x56), + .platform_data = &at24c04_data, + }, }; @@ -305,7 +496,7 @@ /* PCK0 provides MCLK to the WM8731 */ at91_set_B_periph(AT91_PIN_PC1, 0); /* SSC (for WM8731) */ - at91_add_device_ssc(AT91SAM9260_ID_SSC, ATMEL_SSC_TX); + /* at91_add_device_ssc(AT91SAM9260_ID_SSC, ATMEL_SSC_TX); */ } MACHINE_START(AT91SAM9G20EK, "Atmel AT91SAM9G20-EK")