b/arch/arm/mach-davinci/boa
@@ -27,6 +27,8 @@
#include <linux/regulator/machine.h>
#include <linux/mfd/tps6507x.h>
#include <linux/input/tps6507x-ts.h>
+#include <linux/spi/spi.h>
+#include <linux/spi/flash.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
@@ -35,6 +37,7 @@
#include <mach/da8xx.h>
#include <mach/nand.h>
#include <mach/mux.h>
+#include <mach/spi.h>
#define DA850_EVM_PHY_MASK 0x1
#define DA850_EVM_MDIO_FREQUENCY 2200000 /* PHY bus frequency */
@@ -92,6 +95,59 @@ static struct platform_device
da850_evm_norflash_device = {
.resource = da850_evm_norflash_resource,
};
+static struct mtd_partition spi_flash_partitions[] = {
+ [0] = {
+ .name = "U-Boot",
+ .offset = 0,
+ .size = SZ_256K,
+ .mask_flags = MTD_WRITEABLE,
+ },
+ [1] = {
+ .name = "U-Boot Environment",
+ .offset = MTDPART_OFS_APPEND,
+ .size = SZ_64K,
+ .mask_flags = MTD_WRITEABLE,
+ },
+ [2] = {
+ .name = "Linux",
+ .offset = MTDPART_OFS_NXTBLK,
+ .size = SZ_8M - (SZ_256K + SZ_64K + SZ_64K),
+ .mask_flags = 0,
+ },
+};
+
+struct davinci_spi_config m25p64_spi_cfg = {
+ .odd_parity = 0,
+ .parity_enable = 0,
+ .intr_level = 1,
+ .io_type = SPI_IO_TYPE_DMA,
+ .wdelay = 0,
+ .timer_disable = 1,
+ .c2t_delay = 0,
+ .t2c_delay = 0,
+ .t2e_delay = 0,
+ .c2e_delay = 0,
+};
+
+static struct flash_platform_data spi_flash_data = {
+ .name = "m25p80",
+ .parts = spi_flash_partitions,
+ .nr_parts = ARRAY_SIZE(spi_flash_partitions),
+ .type = "m25p64",
+};
+
+static struct spi_board_info da850_spi_board_info[] = {
+ [0] = {
+ .modalias = "m25p80",
+ .platform_data = &spi_flash_data,
+ .controller_data = &m25p64_spi_cfg,
+ .mode = SPI_MODE_0,
+ .max_speed_hz = 30000000,
+ .bus_num = 1,
+ .chip_select = 0,
+ },
+};
+
static struct davinci_pm_config da850_pm_pdata = {
.sleepcount = 128,
};
@@ -629,6 +685,61 @@ static int __init da850_evm_config_emac(void)
}
device_initcall(da850_evm_config_emac);
+static struct davinci_spi_platform_data da850_spi_pdata1 = {
+ .version = SPI_VERSION_2,
+};
+
+static struct resource da850_spi_resources1[] = {
+ [0] = {
+ .start = 0x01F0E000,
+ .end = 0x01F0E000 + 0xfff,
+ .flags = IORESOURCE_MEM,
+ },
+ [1] = {
+ .start = IRQ_DA8XX_SPINT1,
+ .end = IRQ_DA8XX_SPINT1,
+ .flags = IORESOURCE_IRQ,
+ },
+ [2] = {
+ .start = EDMA_CTLR_CHAN(0, 18),
+ .end = EDMA_CTLR_CHAN(0, 18),
+ .flags = IORESOURCE_DMA | IORESOURCE_DMA_RX_CHAN,
+ },
+ [3] = {
+ .start = EDMA_CTLR_CHAN(0, 19),
+ .end = EDMA_CTLR_CHAN(0, 19),
+ .flags = IORESOURCE_DMA | IORESOURCE_DMA_TX_CHAN,
+ },
+ [4] = {
+ .start = 1,
+ .end = 1,
+ .flags = IORESOURCE_DMA | IORESOURCE_DMA_EVENT_Q,
+ },
+};
+
+static struct platform_device da850_spi_pdev1 = {
+ .name = "spi_davinci",
+ .id = 1,
+ .resource = da850_spi_resources1,
+ .num_resources = ARRAY_SIZE(da850_spi_resources1),
+ .dev = {
+ .platform_data = &da850_spi_pdata1,
+ },
+};
+
+static void __init da850_init_spi1(unsigned char* chip_sel,
+ unsigned int num_sel, struct spi_board_info *info, unsigned
num_dev)
+{
+ struct davinci_spi_platform_data *pdata =
+ da850_spi_pdev1.dev.platform_data;
+
+ spi_register_board_info(info, num_dev);
+
+ pdata->chip_sel = chip_sel;
+ pdata->num_chipselect = num_sel;
+ platform_device_register(&da850_spi_pdev1);
+}
+
static __init void da850_evm_init(void)
{
int ret;
@@ -739,6 +850,9 @@ static __init void da850_evm_init(void)
pr_warning("da850_evm_init: cpuidle registration failed:
%d\n",
ret);
+ da850_init_spi1(NULL, 1, da850_spi_board_info,
+ ARRAY_SIZE(da850_spi_board_info));
+
ret = da850_register_pm(&da850_pm_device);
if (ret)
pr_warning("da850_evm_init: suspend registration failed:
%d\n",
b/arch/arm/mach-davinci/da850.c
@@ -336,6 +336,13 @@ static struct clk aemif_clk = {
.flags = ALWAYS_ENABLED,
};
+static struct clk spi1_clk = {
+ .name = "spi1",
+ .parent = &pll0_sysclk2,
+ .lpsc = DA8XX_LPSC1_SPI1,
+ .gpsc = 1,
+};
+
static struct clk_lookup da850_clks[] = {
CLK(NULL, "ref", &ref_clk),
CLK(NULL, "pll0", &pll0_clk),
@@ -377,6 +384,7 @@ static struct clk_lookup da850_clks[] = {
CLK("da8xx_lcdc.0", NULL, &lcdc_clk),
CLK("davinci_mmc.0", NULL, &mmcsd_clk),
CLK(NULL, "aemif", &aemif_clk),
+ CLK("spi_davinci.1", NULL, &spi1_clk),
CLK(NULL, NULL, NULL),
};