Merge branch 'for-2.6.39' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[pandora-kernel.git] / arch / arm / mach-davinci / board-tnetv107x-evm.c
index a6db854..1a656e8 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/mtd/partitions.h>
 #include <linux/input.h>
 #include <linux/input/matrix_keypad.h>
+#include <linux/spi/spi.h>
 
 #include <asm/mach/arch.h>
 #include <asm/mach-types.h>
@@ -37,6 +38,7 @@
 
 #define EVM_MMC_WP_GPIO                21
 #define EVM_MMC_CD_GPIO                24
+#define EVM_SPI_CS_GPIO                54
 
 static int initialize_gpio(int gpio, char *desc)
 {
@@ -99,6 +101,12 @@ static const short uart1_pins[] __initdata = {
        -1
 };
 
+static const short ssp_pins[] __initdata = {
+       TNETV107X_SSP0_0, TNETV107X_SSP0_1, TNETV107X_SSP0_2,
+       TNETV107X_SSP1_0, TNETV107X_SSP1_1, TNETV107X_SSP1_2,
+       TNETV107X_SSP1_3, -1
+};
+
 static struct mtd_partition nand_partitions[] = {
        /* bootloader (U-Boot, etc) in first 12 sectors */
        {
@@ -196,19 +204,68 @@ static struct matrix_keypad_platform_data keypad_config = {
        .no_autorepeat  = 0,
 };
 
+static void spi_select_device(int cs)
+{
+       static int gpio;
+
+       if (!gpio) {
+               int ret;
+               ret = gpio_request(EVM_SPI_CS_GPIO, "spi chipsel");
+               if (ret < 0) {
+                       pr_err("cannot open spi chipsel gpio\n");
+                       gpio = -ENOSYS;
+                       return;
+               } else {
+                       gpio = EVM_SPI_CS_GPIO;
+                       gpio_direction_output(gpio, 0);
+               }
+       }
+
+       if (gpio < 0)
+               return;
+
+       return gpio_set_value(gpio, cs ? 1 : 0);
+}
+
+static struct ti_ssp_spi_data spi_master_data = {
+       .num_cs = 2,
+       .select = spi_select_device,
+       .iosel  = SSP_PIN_SEL(0, SSP_CLOCK)     | SSP_PIN_SEL(1, SSP_DATA) |
+                 SSP_PIN_SEL(2, SSP_CHIPSEL)   | SSP_PIN_SEL(3, SSP_IN)   |
+                 SSP_INPUT_SEL(3),
+};
+
+static struct ti_ssp_data ssp_config = {
+       .out_clock      = 250 * 1000,
+       .dev_data       = {
+               [1] = {
+                       .dev_name = "ti-ssp-spi",
+                       .pdata = &spi_master_data,
+                       .pdata_size = sizeof(spi_master_data),
+               },
+       },
+};
+
 static struct tnetv107x_device_info evm_device_info __initconst = {
        .serial_config          = &serial_config,
        .mmc_config[1]          = &mmc_config,  /* controller 1 */
        .nand_config[0]         = &nand_config, /* chip select 0 */
        .keypad_config          = &keypad_config,
+       .ssp_config             = &ssp_config,
+};
+
+static struct spi_board_info spi_info[] __initconst = {
 };
 
 static __init void tnetv107x_evm_board_init(void)
 {
        davinci_cfg_reg_list(sdio1_pins);
        davinci_cfg_reg_list(uart1_pins);
+       davinci_cfg_reg_list(ssp_pins);
 
        tnetv107x_devices_init(&evm_device_info);
+
+       spi_register_board_info(spi_info, ARRAY_SIZE(spi_info));
 }
 
 #ifdef CONFIG_SERIAL_8250_CONSOLE