Path: blob/master/arch/arm/mach-davinci/devices-da8xx.c
10699 views
/*1* DA8XX/OMAP L1XX platform device data2*3* Copyright (c) 2007-2009, MontaVista Software, Inc. <[email protected]>4* Derived from code that was:5* Copyright (C) 2006 Komal Shah <[email protected]>6*7* This program is free software; you can redistribute it and/or modify8* it under the terms of the GNU General Public License as published by9* the Free Software Foundation; either version 2 of the License, or10* (at your option) any later version.11*/12#include <linux/init.h>13#include <linux/platform_device.h>14#include <linux/dma-mapping.h>15#include <linux/serial_8250.h>1617#include <mach/cputype.h>18#include <mach/common.h>19#include <mach/time.h>20#include <mach/da8xx.h>21#include <mach/cpuidle.h>2223#include "clock.h"2425#define DA8XX_TPCC_BASE 0x01c0000026#define DA8XX_TPTC0_BASE 0x01c0800027#define DA8XX_TPTC1_BASE 0x01c0840028#define DA8XX_WDOG_BASE 0x01c21000 /* DA8XX_TIMER64P1_BASE */29#define DA8XX_I2C0_BASE 0x01c2200030#define DA8XX_RTC_BASE 0x01c2300031#define DA8XX_MMCSD0_BASE 0x01c4000032#define DA8XX_SPI0_BASE 0x01c4100033#define DA830_SPI1_BASE 0x01e1200034#define DA8XX_LCD_CNTRL_BASE 0x01e1300035#define DA850_MMCSD1_BASE 0x01e1b00036#define DA8XX_EMAC_CPPI_PORT_BASE 0x01e2000037#define DA8XX_EMAC_CPGMACSS_BASE 0x01e2200038#define DA8XX_EMAC_CPGMAC_BASE 0x01e2300039#define DA8XX_EMAC_MDIO_BASE 0x01e2400040#define DA8XX_I2C1_BASE 0x01e2800041#define DA850_TPCC1_BASE 0x01e3000042#define DA850_TPTC2_BASE 0x01e3800043#define DA850_SPI1_BASE 0x01f0e00044#define DA8XX_DDR2_CTL_BASE 0xb00000004546#define DA8XX_EMAC_CTRL_REG_OFFSET 0x300047#define DA8XX_EMAC_MOD_REG_OFFSET 0x200048#define DA8XX_EMAC_RAM_OFFSET 0x000049#define DA8XX_EMAC_CTRL_RAM_SIZE SZ_8K5051#define DA8XX_DMA_SPI0_RX EDMA_CTLR_CHAN(0, 14)52#define DA8XX_DMA_SPI0_TX EDMA_CTLR_CHAN(0, 15)53#define DA8XX_DMA_MMCSD0_RX EDMA_CTLR_CHAN(0, 16)54#define DA8XX_DMA_MMCSD0_TX EDMA_CTLR_CHAN(0, 17)55#define DA8XX_DMA_SPI1_RX EDMA_CTLR_CHAN(0, 18)56#define DA8XX_DMA_SPI1_TX EDMA_CTLR_CHAN(0, 19)57#define DA850_DMA_MMCSD1_RX EDMA_CTLR_CHAN(1, 28)58#define DA850_DMA_MMCSD1_TX EDMA_CTLR_CHAN(1, 29)5960void __iomem *da8xx_syscfg0_base;61void __iomem *da8xx_syscfg1_base;6263static struct plat_serial8250_port da8xx_serial_pdata[] = {64{65.mapbase = DA8XX_UART0_BASE,66.irq = IRQ_DA8XX_UARTINT0,67.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |68UPF_IOREMAP,69.iotype = UPIO_MEM,70.regshift = 2,71},72{73.mapbase = DA8XX_UART1_BASE,74.irq = IRQ_DA8XX_UARTINT1,75.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |76UPF_IOREMAP,77.iotype = UPIO_MEM,78.regshift = 2,79},80{81.mapbase = DA8XX_UART2_BASE,82.irq = IRQ_DA8XX_UARTINT2,83.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |84UPF_IOREMAP,85.iotype = UPIO_MEM,86.regshift = 2,87},88{89.flags = 0,90},91};9293struct platform_device da8xx_serial_device = {94.name = "serial8250",95.id = PLAT8250_DEV_PLATFORM,96.dev = {97.platform_data = da8xx_serial_pdata,98},99};100101static const s8 da8xx_queue_tc_mapping[][2] = {102/* {event queue no, TC no} */103{0, 0},104{1, 1},105{-1, -1}106};107108static const s8 da8xx_queue_priority_mapping[][2] = {109/* {event queue no, Priority} */110{0, 3},111{1, 7},112{-1, -1}113};114115static const s8 da850_queue_tc_mapping[][2] = {116/* {event queue no, TC no} */117{0, 0},118{-1, -1}119};120121static const s8 da850_queue_priority_mapping[][2] = {122/* {event queue no, Priority} */123{0, 3},124{-1, -1}125};126127static struct edma_soc_info da830_edma_cc0_info = {128.n_channel = 32,129.n_region = 4,130.n_slot = 128,131.n_tc = 2,132.n_cc = 1,133.queue_tc_mapping = da8xx_queue_tc_mapping,134.queue_priority_mapping = da8xx_queue_priority_mapping,135};136137static struct edma_soc_info *da830_edma_info[EDMA_MAX_CC] = {138&da830_edma_cc0_info,139};140141static struct edma_soc_info da850_edma_cc_info[] = {142{143.n_channel = 32,144.n_region = 4,145.n_slot = 128,146.n_tc = 2,147.n_cc = 1,148.queue_tc_mapping = da8xx_queue_tc_mapping,149.queue_priority_mapping = da8xx_queue_priority_mapping,150},151{152.n_channel = 32,153.n_region = 4,154.n_slot = 128,155.n_tc = 1,156.n_cc = 1,157.queue_tc_mapping = da850_queue_tc_mapping,158.queue_priority_mapping = da850_queue_priority_mapping,159},160};161162static struct edma_soc_info *da850_edma_info[EDMA_MAX_CC] = {163&da850_edma_cc_info[0],164&da850_edma_cc_info[1],165};166167static struct resource da830_edma_resources[] = {168{169.name = "edma_cc0",170.start = DA8XX_TPCC_BASE,171.end = DA8XX_TPCC_BASE + SZ_32K - 1,172.flags = IORESOURCE_MEM,173},174{175.name = "edma_tc0",176.start = DA8XX_TPTC0_BASE,177.end = DA8XX_TPTC0_BASE + SZ_1K - 1,178.flags = IORESOURCE_MEM,179},180{181.name = "edma_tc1",182.start = DA8XX_TPTC1_BASE,183.end = DA8XX_TPTC1_BASE + SZ_1K - 1,184.flags = IORESOURCE_MEM,185},186{187.name = "edma0",188.start = IRQ_DA8XX_CCINT0,189.flags = IORESOURCE_IRQ,190},191{192.name = "edma0_err",193.start = IRQ_DA8XX_CCERRINT,194.flags = IORESOURCE_IRQ,195},196};197198static struct resource da850_edma_resources[] = {199{200.name = "edma_cc0",201.start = DA8XX_TPCC_BASE,202.end = DA8XX_TPCC_BASE + SZ_32K - 1,203.flags = IORESOURCE_MEM,204},205{206.name = "edma_tc0",207.start = DA8XX_TPTC0_BASE,208.end = DA8XX_TPTC0_BASE + SZ_1K - 1,209.flags = IORESOURCE_MEM,210},211{212.name = "edma_tc1",213.start = DA8XX_TPTC1_BASE,214.end = DA8XX_TPTC1_BASE + SZ_1K - 1,215.flags = IORESOURCE_MEM,216},217{218.name = "edma_cc1",219.start = DA850_TPCC1_BASE,220.end = DA850_TPCC1_BASE + SZ_32K - 1,221.flags = IORESOURCE_MEM,222},223{224.name = "edma_tc2",225.start = DA850_TPTC2_BASE,226.end = DA850_TPTC2_BASE + SZ_1K - 1,227.flags = IORESOURCE_MEM,228},229{230.name = "edma0",231.start = IRQ_DA8XX_CCINT0,232.flags = IORESOURCE_IRQ,233},234{235.name = "edma0_err",236.start = IRQ_DA8XX_CCERRINT,237.flags = IORESOURCE_IRQ,238},239{240.name = "edma1",241.start = IRQ_DA850_CCINT1,242.flags = IORESOURCE_IRQ,243},244{245.name = "edma1_err",246.start = IRQ_DA850_CCERRINT1,247.flags = IORESOURCE_IRQ,248},249};250251static struct platform_device da830_edma_device = {252.name = "edma",253.id = -1,254.dev = {255.platform_data = da830_edma_info,256},257.num_resources = ARRAY_SIZE(da830_edma_resources),258.resource = da830_edma_resources,259};260261static struct platform_device da850_edma_device = {262.name = "edma",263.id = -1,264.dev = {265.platform_data = da850_edma_info,266},267.num_resources = ARRAY_SIZE(da850_edma_resources),268.resource = da850_edma_resources,269};270271int __init da830_register_edma(struct edma_rsv_info *rsv)272{273da830_edma_cc0_info.rsv = rsv;274275return platform_device_register(&da830_edma_device);276}277278int __init da850_register_edma(struct edma_rsv_info *rsv[2])279{280if (rsv) {281da850_edma_cc_info[0].rsv = rsv[0];282da850_edma_cc_info[1].rsv = rsv[1];283}284285return platform_device_register(&da850_edma_device);286}287288static struct resource da8xx_i2c_resources0[] = {289{290.start = DA8XX_I2C0_BASE,291.end = DA8XX_I2C0_BASE + SZ_4K - 1,292.flags = IORESOURCE_MEM,293},294{295.start = IRQ_DA8XX_I2CINT0,296.end = IRQ_DA8XX_I2CINT0,297.flags = IORESOURCE_IRQ,298},299};300301static struct platform_device da8xx_i2c_device0 = {302.name = "i2c_davinci",303.id = 1,304.num_resources = ARRAY_SIZE(da8xx_i2c_resources0),305.resource = da8xx_i2c_resources0,306};307308static struct resource da8xx_i2c_resources1[] = {309{310.start = DA8XX_I2C1_BASE,311.end = DA8XX_I2C1_BASE + SZ_4K - 1,312.flags = IORESOURCE_MEM,313},314{315.start = IRQ_DA8XX_I2CINT1,316.end = IRQ_DA8XX_I2CINT1,317.flags = IORESOURCE_IRQ,318},319};320321static struct platform_device da8xx_i2c_device1 = {322.name = "i2c_davinci",323.id = 2,324.num_resources = ARRAY_SIZE(da8xx_i2c_resources1),325.resource = da8xx_i2c_resources1,326};327328int __init da8xx_register_i2c(int instance,329struct davinci_i2c_platform_data *pdata)330{331struct platform_device *pdev;332333if (instance == 0)334pdev = &da8xx_i2c_device0;335else if (instance == 1)336pdev = &da8xx_i2c_device1;337else338return -EINVAL;339340pdev->dev.platform_data = pdata;341return platform_device_register(pdev);342}343344static struct resource da8xx_watchdog_resources[] = {345{346.start = DA8XX_WDOG_BASE,347.end = DA8XX_WDOG_BASE + SZ_4K - 1,348.flags = IORESOURCE_MEM,349},350};351352struct platform_device da8xx_wdt_device = {353.name = "watchdog",354.id = -1,355.num_resources = ARRAY_SIZE(da8xx_watchdog_resources),356.resource = da8xx_watchdog_resources,357};358359int __init da8xx_register_watchdog(void)360{361return platform_device_register(&da8xx_wdt_device);362}363364static struct resource da8xx_emac_resources[] = {365{366.start = DA8XX_EMAC_CPPI_PORT_BASE,367.end = DA8XX_EMAC_CPPI_PORT_BASE + SZ_16K - 1,368.flags = IORESOURCE_MEM,369},370{371.start = IRQ_DA8XX_C0_RX_THRESH_PULSE,372.end = IRQ_DA8XX_C0_RX_THRESH_PULSE,373.flags = IORESOURCE_IRQ,374},375{376.start = IRQ_DA8XX_C0_RX_PULSE,377.end = IRQ_DA8XX_C0_RX_PULSE,378.flags = IORESOURCE_IRQ,379},380{381.start = IRQ_DA8XX_C0_TX_PULSE,382.end = IRQ_DA8XX_C0_TX_PULSE,383.flags = IORESOURCE_IRQ,384},385{386.start = IRQ_DA8XX_C0_MISC_PULSE,387.end = IRQ_DA8XX_C0_MISC_PULSE,388.flags = IORESOURCE_IRQ,389},390};391392struct emac_platform_data da8xx_emac_pdata = {393.ctrl_reg_offset = DA8XX_EMAC_CTRL_REG_OFFSET,394.ctrl_mod_reg_offset = DA8XX_EMAC_MOD_REG_OFFSET,395.ctrl_ram_offset = DA8XX_EMAC_RAM_OFFSET,396.ctrl_ram_size = DA8XX_EMAC_CTRL_RAM_SIZE,397.version = EMAC_VERSION_2,398};399400static struct platform_device da8xx_emac_device = {401.name = "davinci_emac",402.id = 1,403.dev = {404.platform_data = &da8xx_emac_pdata,405},406.num_resources = ARRAY_SIZE(da8xx_emac_resources),407.resource = da8xx_emac_resources,408};409410static struct resource da8xx_mdio_resources[] = {411{412.start = DA8XX_EMAC_MDIO_BASE,413.end = DA8XX_EMAC_MDIO_BASE + SZ_4K - 1,414.flags = IORESOURCE_MEM,415},416};417418static struct platform_device da8xx_mdio_device = {419.name = "davinci_mdio",420.id = 0,421.num_resources = ARRAY_SIZE(da8xx_mdio_resources),422.resource = da8xx_mdio_resources,423};424425int __init da8xx_register_emac(void)426{427int ret;428429ret = platform_device_register(&da8xx_mdio_device);430if (ret < 0)431return ret;432ret = platform_device_register(&da8xx_emac_device);433if (ret < 0)434return ret;435ret = clk_add_alias(NULL, dev_name(&da8xx_mdio_device.dev),436NULL, &da8xx_emac_device.dev);437return ret;438}439440static struct resource da830_mcasp1_resources[] = {441{442.name = "mcasp1",443.start = DAVINCI_DA830_MCASP1_REG_BASE,444.end = DAVINCI_DA830_MCASP1_REG_BASE + (SZ_1K * 12) - 1,445.flags = IORESOURCE_MEM,446},447/* TX event */448{449.start = DAVINCI_DA830_DMA_MCASP1_AXEVT,450.end = DAVINCI_DA830_DMA_MCASP1_AXEVT,451.flags = IORESOURCE_DMA,452},453/* RX event */454{455.start = DAVINCI_DA830_DMA_MCASP1_AREVT,456.end = DAVINCI_DA830_DMA_MCASP1_AREVT,457.flags = IORESOURCE_DMA,458},459};460461static struct platform_device da830_mcasp1_device = {462.name = "davinci-mcasp",463.id = 1,464.num_resources = ARRAY_SIZE(da830_mcasp1_resources),465.resource = da830_mcasp1_resources,466};467468static struct resource da850_mcasp_resources[] = {469{470.name = "mcasp",471.start = DAVINCI_DA8XX_MCASP0_REG_BASE,472.end = DAVINCI_DA8XX_MCASP0_REG_BASE + (SZ_1K * 12) - 1,473.flags = IORESOURCE_MEM,474},475/* TX event */476{477.start = DAVINCI_DA8XX_DMA_MCASP0_AXEVT,478.end = DAVINCI_DA8XX_DMA_MCASP0_AXEVT,479.flags = IORESOURCE_DMA,480},481/* RX event */482{483.start = DAVINCI_DA8XX_DMA_MCASP0_AREVT,484.end = DAVINCI_DA8XX_DMA_MCASP0_AREVT,485.flags = IORESOURCE_DMA,486},487};488489static struct platform_device da850_mcasp_device = {490.name = "davinci-mcasp",491.id = 0,492.num_resources = ARRAY_SIZE(da850_mcasp_resources),493.resource = da850_mcasp_resources,494};495496static struct platform_device davinci_pcm_device = {497.name = "davinci-pcm-audio",498.id = -1,499};500501void __init da8xx_register_mcasp(int id, struct snd_platform_data *pdata)502{503platform_device_register(&davinci_pcm_device);504505/* DA830/OMAP-L137 has 3 instances of McASP */506if (cpu_is_davinci_da830() && id == 1) {507da830_mcasp1_device.dev.platform_data = pdata;508platform_device_register(&da830_mcasp1_device);509} else if (cpu_is_davinci_da850()) {510da850_mcasp_device.dev.platform_data = pdata;511platform_device_register(&da850_mcasp_device);512}513}514515static const struct display_panel disp_panel = {516QVGA,51716,51816,519COLOR_ACTIVE,520};521522static struct lcd_ctrl_config lcd_cfg = {523&disp_panel,524.ac_bias = 255,525.ac_bias_intrpt = 0,526.dma_burst_sz = 16,527.bpp = 16,528.fdd = 255,529.tft_alt_mode = 0,530.stn_565_mode = 0,531.mono_8bit_mode = 0,532.invert_line_clock = 1,533.invert_frm_clock = 1,534.sync_edge = 0,535.sync_ctrl = 1,536.raster_order = 0,537};538539struct da8xx_lcdc_platform_data sharp_lcd035q3dg01_pdata = {540.manu_name = "sharp",541.controller_data = &lcd_cfg,542.type = "Sharp_LCD035Q3DG01",543};544545struct da8xx_lcdc_platform_data sharp_lk043t1dg01_pdata = {546.manu_name = "sharp",547.controller_data = &lcd_cfg,548.type = "Sharp_LK043T1DG01",549};550551static struct resource da8xx_lcdc_resources[] = {552[0] = { /* registers */553.start = DA8XX_LCD_CNTRL_BASE,554.end = DA8XX_LCD_CNTRL_BASE + SZ_4K - 1,555.flags = IORESOURCE_MEM,556},557[1] = { /* interrupt */558.start = IRQ_DA8XX_LCDINT,559.end = IRQ_DA8XX_LCDINT,560.flags = IORESOURCE_IRQ,561},562};563564static struct platform_device da8xx_lcdc_device = {565.name = "da8xx_lcdc",566.id = 0,567.num_resources = ARRAY_SIZE(da8xx_lcdc_resources),568.resource = da8xx_lcdc_resources,569};570571int __init da8xx_register_lcdc(struct da8xx_lcdc_platform_data *pdata)572{573da8xx_lcdc_device.dev.platform_data = pdata;574return platform_device_register(&da8xx_lcdc_device);575}576577static struct resource da8xx_mmcsd0_resources[] = {578{ /* registers */579.start = DA8XX_MMCSD0_BASE,580.end = DA8XX_MMCSD0_BASE + SZ_4K - 1,581.flags = IORESOURCE_MEM,582},583{ /* interrupt */584.start = IRQ_DA8XX_MMCSDINT0,585.end = IRQ_DA8XX_MMCSDINT0,586.flags = IORESOURCE_IRQ,587},588{ /* DMA RX */589.start = DA8XX_DMA_MMCSD0_RX,590.end = DA8XX_DMA_MMCSD0_RX,591.flags = IORESOURCE_DMA,592},593{ /* DMA TX */594.start = DA8XX_DMA_MMCSD0_TX,595.end = DA8XX_DMA_MMCSD0_TX,596.flags = IORESOURCE_DMA,597},598};599600static struct platform_device da8xx_mmcsd0_device = {601.name = "davinci_mmc",602.id = 0,603.num_resources = ARRAY_SIZE(da8xx_mmcsd0_resources),604.resource = da8xx_mmcsd0_resources,605};606607int __init da8xx_register_mmcsd0(struct davinci_mmc_config *config)608{609da8xx_mmcsd0_device.dev.platform_data = config;610return platform_device_register(&da8xx_mmcsd0_device);611}612613#ifdef CONFIG_ARCH_DAVINCI_DA850614static struct resource da850_mmcsd1_resources[] = {615{ /* registers */616.start = DA850_MMCSD1_BASE,617.end = DA850_MMCSD1_BASE + SZ_4K - 1,618.flags = IORESOURCE_MEM,619},620{ /* interrupt */621.start = IRQ_DA850_MMCSDINT0_1,622.end = IRQ_DA850_MMCSDINT0_1,623.flags = IORESOURCE_IRQ,624},625{ /* DMA RX */626.start = DA850_DMA_MMCSD1_RX,627.end = DA850_DMA_MMCSD1_RX,628.flags = IORESOURCE_DMA,629},630{ /* DMA TX */631.start = DA850_DMA_MMCSD1_TX,632.end = DA850_DMA_MMCSD1_TX,633.flags = IORESOURCE_DMA,634},635};636637static struct platform_device da850_mmcsd1_device = {638.name = "davinci_mmc",639.id = 1,640.num_resources = ARRAY_SIZE(da850_mmcsd1_resources),641.resource = da850_mmcsd1_resources,642};643644int __init da850_register_mmcsd1(struct davinci_mmc_config *config)645{646da850_mmcsd1_device.dev.platform_data = config;647return platform_device_register(&da850_mmcsd1_device);648}649#endif650651static struct resource da8xx_rtc_resources[] = {652{653.start = DA8XX_RTC_BASE,654.end = DA8XX_RTC_BASE + SZ_4K - 1,655.flags = IORESOURCE_MEM,656},657{ /* timer irq */658.start = IRQ_DA8XX_RTC,659.end = IRQ_DA8XX_RTC,660.flags = IORESOURCE_IRQ,661},662{ /* alarm irq */663.start = IRQ_DA8XX_RTC,664.end = IRQ_DA8XX_RTC,665.flags = IORESOURCE_IRQ,666},667};668669static struct platform_device da8xx_rtc_device = {670.name = "omap_rtc",671.id = -1,672.num_resources = ARRAY_SIZE(da8xx_rtc_resources),673.resource = da8xx_rtc_resources,674};675676int da8xx_register_rtc(void)677{678int ret;679void __iomem *base;680681base = ioremap(DA8XX_RTC_BASE, SZ_4K);682if (WARN_ON(!base))683return -ENOMEM;684685/* Unlock the rtc's registers */686__raw_writel(0x83e70b13, base + 0x6c);687__raw_writel(0x95a4f1e0, base + 0x70);688689iounmap(base);690691ret = platform_device_register(&da8xx_rtc_device);692if (!ret)693/* Atleast on DA850, RTC is a wakeup source */694device_init_wakeup(&da8xx_rtc_device.dev, true);695696return ret;697}698699static void __iomem *da8xx_ddr2_ctlr_base;700void __iomem * __init da8xx_get_mem_ctlr(void)701{702if (da8xx_ddr2_ctlr_base)703return da8xx_ddr2_ctlr_base;704705da8xx_ddr2_ctlr_base = ioremap(DA8XX_DDR2_CTL_BASE, SZ_32K);706if (!da8xx_ddr2_ctlr_base)707pr_warning("%s: Unable to map DDR2 controller", __func__);708709return da8xx_ddr2_ctlr_base;710}711712static struct resource da8xx_cpuidle_resources[] = {713{714.start = DA8XX_DDR2_CTL_BASE,715.end = DA8XX_DDR2_CTL_BASE + SZ_32K - 1,716.flags = IORESOURCE_MEM,717},718};719720/* DA8XX devices support DDR2 power down */721static struct davinci_cpuidle_config da8xx_cpuidle_pdata = {722.ddr2_pdown = 1,723};724725726static struct platform_device da8xx_cpuidle_device = {727.name = "cpuidle-davinci",728.num_resources = ARRAY_SIZE(da8xx_cpuidle_resources),729.resource = da8xx_cpuidle_resources,730.dev = {731.platform_data = &da8xx_cpuidle_pdata,732},733};734735int __init da8xx_register_cpuidle(void)736{737da8xx_cpuidle_pdata.ddr2_ctlr_base = da8xx_get_mem_ctlr();738739return platform_device_register(&da8xx_cpuidle_device);740}741742static struct resource da8xx_spi0_resources[] = {743[0] = {744.start = DA8XX_SPI0_BASE,745.end = DA8XX_SPI0_BASE + SZ_4K - 1,746.flags = IORESOURCE_MEM,747},748[1] = {749.start = IRQ_DA8XX_SPINT0,750.end = IRQ_DA8XX_SPINT0,751.flags = IORESOURCE_IRQ,752},753[2] = {754.start = DA8XX_DMA_SPI0_RX,755.end = DA8XX_DMA_SPI0_RX,756.flags = IORESOURCE_DMA,757},758[3] = {759.start = DA8XX_DMA_SPI0_TX,760.end = DA8XX_DMA_SPI0_TX,761.flags = IORESOURCE_DMA,762},763};764765static struct resource da8xx_spi1_resources[] = {766[0] = {767.start = DA830_SPI1_BASE,768.end = DA830_SPI1_BASE + SZ_4K - 1,769.flags = IORESOURCE_MEM,770},771[1] = {772.start = IRQ_DA8XX_SPINT1,773.end = IRQ_DA8XX_SPINT1,774.flags = IORESOURCE_IRQ,775},776[2] = {777.start = DA8XX_DMA_SPI1_RX,778.end = DA8XX_DMA_SPI1_RX,779.flags = IORESOURCE_DMA,780},781[3] = {782.start = DA8XX_DMA_SPI1_TX,783.end = DA8XX_DMA_SPI1_TX,784.flags = IORESOURCE_DMA,785},786};787788struct davinci_spi_platform_data da8xx_spi_pdata[] = {789[0] = {790.version = SPI_VERSION_2,791.intr_line = 1,792.dma_event_q = EVENTQ_0,793},794[1] = {795.version = SPI_VERSION_2,796.intr_line = 1,797.dma_event_q = EVENTQ_0,798},799};800801static struct platform_device da8xx_spi_device[] = {802[0] = {803.name = "spi_davinci",804.id = 0,805.num_resources = ARRAY_SIZE(da8xx_spi0_resources),806.resource = da8xx_spi0_resources,807.dev = {808.platform_data = &da8xx_spi_pdata[0],809},810},811[1] = {812.name = "spi_davinci",813.id = 1,814.num_resources = ARRAY_SIZE(da8xx_spi1_resources),815.resource = da8xx_spi1_resources,816.dev = {817.platform_data = &da8xx_spi_pdata[1],818},819},820};821822int __init da8xx_register_spi(int instance, struct spi_board_info *info,823unsigned len)824{825int ret;826827if (instance < 0 || instance > 1)828return -EINVAL;829830ret = spi_register_board_info(info, len);831if (ret)832pr_warning("%s: failed to register board info for spi %d :"833" %d\n", __func__, instance, ret);834835da8xx_spi_pdata[instance].num_chipselect = len;836837if (instance == 1 && cpu_is_davinci_da850()) {838da8xx_spi1_resources[0].start = DA850_SPI1_BASE;839da8xx_spi1_resources[0].end = DA850_SPI1_BASE + SZ_4K - 1;840}841842return platform_device_register(&da8xx_spi_device[instance]);843}844845846