davinci: misc cleanups from sparse
[safe/jmp/linux-2.6] / arch / arm / mach-davinci / dm365.c
index c9ae97a..871be5a 100644 (file)
  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
-#include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/clk.h>
 #include <linux/serial_8250.h>
 #include <linux/platform_device.h>
 #include <linux/dma-mapping.h>
 #include <linux/gpio.h>
+#include <linux/spi/spi.h>
 
 #include <asm/mach/map.h>
 
 #include <mach/dm365.h>
-#include <mach/clock.h>
 #include <mach/cputype.h>
 #include <mach/edma.h>
 #include <mach/psc.h>
 #include <mach/time.h>
 #include <mach/serial.h>
 #include <mach/common.h>
+#include <mach/asp.h>
+#include <mach/keyscan.h>
+#include <mach/spi.h>
+
 
 #include "clock.h"
 #include "mux.h"
@@ -369,7 +372,7 @@ static struct clk timer3_clk = {
 
 static struct clk usb_clk = {
        .name           = "usb",
-       .parent         = &pll2_sysclk1,
+       .parent         = &pll1_aux_clk,
        .lpsc           = DAVINCI_LPSC_USB,
 };
 
@@ -403,7 +406,7 @@ static struct clk mjcp_clk = {
        .lpsc           = DM365_LPSC_MJCP,
 };
 
-static struct davinci_clk dm365_clks[] = {
+static struct clk_lookup dm365_clks[] = {
        CLK(NULL, "ref", &ref_clk),
        CLK(NULL, "pll1", &pll1_clk),
        CLK(NULL, "pll1_aux", &pll1_aux_clk),
@@ -455,8 +458,8 @@ static struct davinci_clk dm365_clks[] = {
        CLK(NULL, "timer3", &timer3_clk),
        CLK(NULL, "usb", &usb_clk),
        CLK("davinci_emac.1", NULL, &emac_clk),
-       CLK("voice_codec", NULL, &voicecodec_clk),
-       CLK("soc-audio.0", NULL, &asp0_clk),
+       CLK("davinci_voicecodec", NULL, &voicecodec_clk),
+       CLK("davinci-asp.0", NULL, &asp0_clk),
        CLK(NULL, "rto", &rto_clk),
        CLK(NULL, "mjcp", &mjcp_clk),
        CLK(NULL, NULL, NULL),
@@ -531,7 +534,59 @@ MUX_CFG(DM365,  EMAC_CRS,  3,   2,     1,    1,     false)
 MUX_CFG(DM365,  EMAC_MDIO,     3,   1,     1,    1,     false)
 MUX_CFG(DM365,  EMAC_MDCLK,    3,   0,     1,    1,     false)
 
-MUX_CFG(DM365, KEYPAD,         2,   0,     0x3f, 0x3f,  false)
+MUX_CFG(DM365, KEYSCAN,        2,   0,     0x3f, 0x3f,  false)
+
+MUX_CFG(DM365, PWM0,           1,   0,     3,    2,     false)
+MUX_CFG(DM365, PWM0_G23,       3,   26,    3,    3,     false)
+MUX_CFG(DM365, PWM1,           1,   2,     3,    2,     false)
+MUX_CFG(DM365, PWM1_G25,       3,   29,    3,    2,     false)
+MUX_CFG(DM365, PWM2_G87,       1,   10,    3,    2,     false)
+MUX_CFG(DM365, PWM2_G88,       1,   8,     3,    2,     false)
+MUX_CFG(DM365, PWM2_G89,       1,   6,     3,    2,     false)
+MUX_CFG(DM365, PWM2_G90,       1,   4,     3,    2,     false)
+MUX_CFG(DM365, PWM3_G80,       1,   20,    3,    3,     false)
+MUX_CFG(DM365, PWM3_G81,       1,   18,    3,    3,     false)
+MUX_CFG(DM365, PWM3_G85,       1,   14,    3,    2,     false)
+MUX_CFG(DM365, PWM3_G86,       1,   12,    3,    2,     false)
+
+MUX_CFG(DM365, SPI1_SCLK,      4,   2,     3,    1,     false)
+MUX_CFG(DM365, SPI1_SDI,       3,   31,    1,    1,     false)
+MUX_CFG(DM365, SPI1_SDO,       4,   0,     3,    1,     false)
+MUX_CFG(DM365, SPI1_SDENA0,    4,   4,     3,    1,     false)
+MUX_CFG(DM365, SPI1_SDENA1,    4,   0,     3,    2,     false)
+
+MUX_CFG(DM365, SPI2_SCLK,      4,   10,    3,    1,     false)
+MUX_CFG(DM365, SPI2_SDI,       4,   6,     3,    1,     false)
+MUX_CFG(DM365, SPI2_SDO,       4,   8,     3,    1,     false)
+MUX_CFG(DM365, SPI2_SDENA0,    4,   12,    3,    1,     false)
+MUX_CFG(DM365, SPI2_SDENA1,    4,   8,     3,    2,     false)
+
+MUX_CFG(DM365, SPI3_SCLK,      0,   0,     3,    2,     false)
+MUX_CFG(DM365, SPI3_SDI,       0,   2,     3,    2,     false)
+MUX_CFG(DM365, SPI3_SDO,       0,   6,     3,    2,     false)
+MUX_CFG(DM365, SPI3_SDENA0,    0,   4,     3,    2,     false)
+MUX_CFG(DM365, SPI3_SDENA1,    0,   6,     3,    3,     false)
+
+MUX_CFG(DM365, SPI4_SCLK,      4,   18,    3,    1,     false)
+MUX_CFG(DM365, SPI4_SDI,       4,   14,    3,    1,     false)
+MUX_CFG(DM365, SPI4_SDO,       4,   16,    3,    1,     false)
+MUX_CFG(DM365, SPI4_SDENA0,    4,   20,    3,    1,     false)
+MUX_CFG(DM365, SPI4_SDENA1,    4,   16,    3,    2,     false)
+
+MUX_CFG(DM365, GPIO20,         3,   21,    3,    0,     false)
+MUX_CFG(DM365, GPIO33,         4,   12,    3,    0,     false)
+MUX_CFG(DM365, GPIO40,         4,   26,    3,    0,     false)
+
+MUX_CFG(DM365, VOUT_FIELD,     1,   18,    3,    1,     false)
+MUX_CFG(DM365, VOUT_FIELD_G81, 1,   18,    3,    0,     false)
+MUX_CFG(DM365, VOUT_HVSYNC,    1,   16,    1,    0,     false)
+MUX_CFG(DM365, VOUT_COUTL_EN,  1,   0,     0xff, 0x55,  false)
+MUX_CFG(DM365, VOUT_COUTH_EN,  1,   8,     0xff, 0x55,  false)
+MUX_CFG(DM365, VIN_CAM_WEN,    0,   14,    3,    0,     false)
+MUX_CFG(DM365, VIN_CAM_VD,     0,   13,    1,    0,     false)
+MUX_CFG(DM365, VIN_CAM_HD,     0,   12,    1,    0,     false)
+MUX_CFG(DM365, VIN_YIN4_7_EN,  0,   0,     0xff, 0,     false)
+MUX_CFG(DM365, VIN_YIN0_3_EN,  0,   8,     0xf,  0,     false)
 
 INT_CFG(DM365,  INT_EDMA_CC,         2,     1,    1,     false)
 INT_CFG(DM365,  INT_EDMA_TC0_ERR,    3,     1,    1,     false)
@@ -543,9 +598,135 @@ INT_CFG(DM365,  INT_EMAC_RXTHRESH,   14,    1,    1,     false)
 INT_CFG(DM365,  INT_EMAC_RXPULSE,    15,    1,    1,     false)
 INT_CFG(DM365,  INT_EMAC_TXPULSE,    16,    1,    1,     false)
 INT_CFG(DM365,  INT_EMAC_MISCPULSE,  17,    1,    1,     false)
+INT_CFG(DM365,  INT_IMX0_ENABLE,     0,     1,    0,     false)
+INT_CFG(DM365,  INT_IMX0_DISABLE,    0,     1,    1,     false)
+INT_CFG(DM365,  INT_HDVICP_ENABLE,   0,     1,    1,     false)
+INT_CFG(DM365,  INT_HDVICP_DISABLE,  0,     1,    0,     false)
+INT_CFG(DM365,  INT_IMX1_ENABLE,     24,    1,    1,     false)
+INT_CFG(DM365,  INT_IMX1_DISABLE,    24,    1,    0,     false)
+INT_CFG(DM365,  INT_NSF_ENABLE,      25,    1,    1,     false)
+INT_CFG(DM365,  INT_NSF_DISABLE,     25,    1,    0,     false)
+
+EVT_CFG(DM365, EVT2_ASP_TX,         0,     1,    0,     false)
+EVT_CFG(DM365, EVT3_ASP_RX,         1,     1,    0,     false)
+EVT_CFG(DM365, EVT2_VC_TX,          0,     1,    1,     false)
+EVT_CFG(DM365, EVT3_VC_RX,          1,     1,    1,     false)
 #endif
 };
 
+static u64 dm365_spi0_dma_mask = DMA_BIT_MASK(32);
+
+static struct davinci_spi_platform_data dm365_spi0_pdata = {
+       .version        = SPI_VERSION_1,
+       .num_chipselect = 2,
+       .clk_internal   = 1,
+       .cs_hold        = 1,
+       .intr_level     = 0,
+       .poll_mode      = 1,    /* 0 -> interrupt mode 1-> polling mode */
+       .c2tdelay       = 0,
+       .t2cdelay       = 0,
+};
+
+static struct resource dm365_spi0_resources[] = {
+       {
+               .start = 0x01c66000,
+               .end   = 0x01c667ff,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .start = IRQ_DM365_SPIINT0_0,
+               .flags = IORESOURCE_IRQ,
+       },
+       {
+               .start = 17,
+               .flags = IORESOURCE_DMA,
+       },
+       {
+               .start = 16,
+               .flags = IORESOURCE_DMA,
+       },
+       {
+               .start = EVENTQ_3,
+               .flags = IORESOURCE_DMA,
+       },
+};
+
+static struct platform_device dm365_spi0_device = {
+       .name = "spi_davinci",
+       .id = 0,
+       .dev = {
+               .dma_mask = &dm365_spi0_dma_mask,
+               .coherent_dma_mask = DMA_BIT_MASK(32),
+               .platform_data = &dm365_spi0_pdata,
+       },
+       .num_resources = ARRAY_SIZE(dm365_spi0_resources),
+       .resource = dm365_spi0_resources,
+};
+
+void __init dm365_init_spi0(unsigned chipselect_mask,
+               struct spi_board_info *info, unsigned len)
+{
+       davinci_cfg_reg(DM365_SPI0_SCLK);
+       davinci_cfg_reg(DM365_SPI0_SDI);
+       davinci_cfg_reg(DM365_SPI0_SDO);
+
+       /* not all slaves will be wired up */
+       if (chipselect_mask & BIT(0))
+               davinci_cfg_reg(DM365_SPI0_SDENA0);
+       if (chipselect_mask & BIT(1))
+               davinci_cfg_reg(DM365_SPI0_SDENA1);
+
+       spi_register_board_info(info, len);
+
+       platform_device_register(&dm365_spi0_device);
+}
+
+static struct emac_platform_data dm365_emac_pdata = {
+       .ctrl_reg_offset        = DM365_EMAC_CNTRL_OFFSET,
+       .ctrl_mod_reg_offset    = DM365_EMAC_CNTRL_MOD_OFFSET,
+       .ctrl_ram_offset        = DM365_EMAC_CNTRL_RAM_OFFSET,
+       .mdio_reg_offset        = DM365_EMAC_MDIO_OFFSET,
+       .ctrl_ram_size          = DM365_EMAC_CNTRL_RAM_SIZE,
+       .version                = EMAC_VERSION_2,
+};
+
+static struct resource dm365_emac_resources[] = {
+       {
+               .start  = DM365_EMAC_BASE,
+               .end    = DM365_EMAC_BASE + 0x47ff,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start  = IRQ_DM365_EMAC_RXTHRESH,
+               .end    = IRQ_DM365_EMAC_RXTHRESH,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               .start  = IRQ_DM365_EMAC_RXPULSE,
+               .end    = IRQ_DM365_EMAC_RXPULSE,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               .start  = IRQ_DM365_EMAC_TXPULSE,
+               .end    = IRQ_DM365_EMAC_TXPULSE,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               .start  = IRQ_DM365_EMAC_MISCPULSE,
+               .end    = IRQ_DM365_EMAC_MISCPULSE,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device dm365_emac_device = {
+       .name           = "davinci_emac",
+       .id             = 1,
+       .dev = {
+               .platform_data  = &dm365_emac_pdata,
+       },
+       .num_resources  = ARRAY_SIZE(dm365_emac_resources),
+       .resource       = dm365_emac_resources,
+};
 
 static u8 dm365_default_priorities[DAVINCI_N_AINTC_IRQ] = {
        [IRQ_VDINT0]                    = 2,
@@ -577,7 +758,6 @@ static u8 dm365_default_priorities[DAVINCI_N_AINTC_IRQ] = {
        [IRQ_MMCINT]                    = 7,
        [IRQ_DM365_MMCINT1]             = 7,
        [IRQ_DM365_PWMINT3]             = 7,
-       [IRQ_DDRINT]                    = 4,
        [IRQ_AEMIFINT]                  = 2,
        [IRQ_DM365_SDIOINT1]            = 2,
        [IRQ_TINT0_TINT12]              = 7,
@@ -590,6 +770,7 @@ static u8 dm365_default_priorities[DAVINCI_N_AINTC_IRQ] = {
        [IRQ_I2C]                       = 3,
        [IRQ_UARTINT0]                  = 3,
        [IRQ_UARTINT1]                  = 3,
+       [IRQ_DM365_RTCINT]              = 3,
        [IRQ_DM365_SPIINT0_0]           = 3,
        [IRQ_DM365_SPIINT3_0]           = 3,
        [IRQ_DM365_GPIO0]               = 3,
@@ -614,6 +795,161 @@ static u8 dm365_default_priorities[DAVINCI_N_AINTC_IRQ] = {
        [IRQ_DM365_EMUINT]              = 7,
 };
 
+/* Four Transfer Controllers on DM365 */
+static const s8
+dm365_queue_tc_mapping[][2] = {
+       /* {event queue no, TC no} */
+       {0, 0},
+       {1, 1},
+       {2, 2},
+       {3, 3},
+       {-1, -1},
+};
+
+static const s8
+dm365_queue_priority_mapping[][2] = {
+       /* {event queue no, Priority} */
+       {0, 7},
+       {1, 7},
+       {2, 7},
+       {3, 0},
+       {-1, -1},
+};
+
+static struct edma_soc_info dm365_edma_info[] = {
+       {
+               .n_channel              = 64,
+               .n_region               = 4,
+               .n_slot                 = 256,
+               .n_tc                   = 4,
+               .n_cc                   = 1,
+               .queue_tc_mapping       = dm365_queue_tc_mapping,
+               .queue_priority_mapping = dm365_queue_priority_mapping,
+               .default_queue          = EVENTQ_3,
+       },
+};
+
+static struct resource edma_resources[] = {
+       {
+               .name   = "edma_cc0",
+               .start  = 0x01c00000,
+               .end    = 0x01c00000 + SZ_64K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .name   = "edma_tc0",
+               .start  = 0x01c10000,
+               .end    = 0x01c10000 + SZ_1K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .name   = "edma_tc1",
+               .start  = 0x01c10400,
+               .end    = 0x01c10400 + SZ_1K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .name   = "edma_tc2",
+               .start  = 0x01c10800,
+               .end    = 0x01c10800 + SZ_1K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .name   = "edma_tc3",
+               .start  = 0x01c10c00,
+               .end    = 0x01c10c00 + SZ_1K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .name   = "edma0",
+               .start  = IRQ_CCINT0,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               .name   = "edma0_err",
+               .start  = IRQ_CCERRINT,
+               .flags  = IORESOURCE_IRQ,
+       },
+       /* not using TC*_ERR */
+};
+
+static struct platform_device dm365_edma_device = {
+       .name                   = "edma",
+       .id                     = 0,
+       .dev.platform_data      = dm365_edma_info,
+       .num_resources          = ARRAY_SIZE(edma_resources),
+       .resource               = edma_resources,
+};
+
+static struct resource dm365_asp_resources[] = {
+       {
+               .start  = DAVINCI_DM365_ASP0_BASE,
+               .end    = DAVINCI_DM365_ASP0_BASE + SZ_8K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start  = DAVINCI_DMA_ASP0_TX,
+               .end    = DAVINCI_DMA_ASP0_TX,
+               .flags  = IORESOURCE_DMA,
+       },
+       {
+               .start  = DAVINCI_DMA_ASP0_RX,
+               .end    = DAVINCI_DMA_ASP0_RX,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct platform_device dm365_asp_device = {
+       .name           = "davinci-asp",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(dm365_asp_resources),
+       .resource       = dm365_asp_resources,
+};
+
+static struct resource dm365_vc_resources[] = {
+       {
+               .start  = DAVINCI_DM365_VC_BASE,
+               .end    = DAVINCI_DM365_VC_BASE + SZ_1K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start  = DAVINCI_DMA_VC_TX,
+               .end    = DAVINCI_DMA_VC_TX,
+               .flags  = IORESOURCE_DMA,
+       },
+       {
+               .start  = DAVINCI_DMA_VC_RX,
+               .end    = DAVINCI_DMA_VC_RX,
+               .flags  = IORESOURCE_DMA,
+       },
+};
+
+static struct platform_device dm365_vc_device = {
+       .name           = "davinci_voicecodec",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(dm365_vc_resources),
+       .resource       = dm365_vc_resources,
+};
+
+static struct resource dm365_rtc_resources[] = {
+       {
+               .start = DM365_RTC_BASE,
+               .end = DM365_RTC_BASE + SZ_1K - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               .start = IRQ_DM365_RTCINT,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device dm365_rtc_device = {
+       .name = "rtc_davinci",
+       .id = 0,
+       .num_resources = ARRAY_SIZE(dm365_rtc_resources),
+       .resource = dm365_rtc_resources,
+};
+
 static struct map_desc dm365_io_desc[] = {
        {
                .virtual        = IO_VIRT,
@@ -630,6 +966,28 @@ static struct map_desc dm365_io_desc[] = {
        },
 };
 
+static struct resource dm365_ks_resources[] = {
+       {
+               /* registers */
+               .start = DM365_KEYSCAN_BASE,
+               .end = DM365_KEYSCAN_BASE + SZ_1K - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       {
+               /* interrupt */
+               .start = IRQ_DM365_KEYINT,
+               .end = IRQ_DM365_KEYINT,
+               .flags = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device dm365_ks_device = {
+       .name           = "davinci_keyscan",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(dm365_ks_resources),
+       .resource       = dm365_ks_resources,
+};
+
 /* Contents of JTAG ID register used to identify exact cpu type */
 static struct davinci_id dm365_ids[] = {
        {
@@ -637,7 +995,14 @@ static struct davinci_id dm365_ids[] = {
                .part_no        = 0xb83e,
                .manufacturer   = 0x017,
                .cpu_id         = DAVINCI_CPU_ID_DM365,
-               .name           = "dm365",
+               .name           = "dm365_rev1.1",
+       },
+       {
+               .variant        = 0x8,
+               .part_no        = 0xb83e,
+               .manufacturer   = 0x017,
+               .cpu_id         = DAVINCI_CPU_ID_DM365,
+               .name           = "dm365_rev1.2",
        },
 };
 
@@ -645,7 +1010,7 @@ static void __iomem *dm365_psc_bases[] = {
        IO_ADDRESS(DAVINCI_PWR_SLEEP_CNTRL_BASE),
 };
 
-struct davinci_timer_info dm365_timer_info = {
+static struct davinci_timer_info dm365_timer_info = {
        .timers         = davinci_timer_instance,
        .clockevent_id  = T0_BOT,
        .clocksource_id = T0_TOP,
@@ -700,13 +1065,162 @@ static struct davinci_soc_info davinci_soc_info_dm365 = {
        .timer_info             = &dm365_timer_info,
        .gpio_base              = IO_ADDRESS(DAVINCI_GPIO_BASE),
        .gpio_num               = 104,
-       .gpio_irq               = 44,
+       .gpio_irq               = IRQ_DM365_GPIO0,
+       .gpio_unbanked          = 8,    /* really 16 ... skip muxed GPIOs */
        .serial_dev             = &dm365_serial_device,
+       .emac_pdata             = &dm365_emac_pdata,
        .sram_dma               = 0x00010000,
        .sram_len               = SZ_32K,
 };
 
+void __init dm365_init_asp(struct snd_platform_data *pdata)
+{
+       davinci_cfg_reg(DM365_MCBSP0_BDX);
+       davinci_cfg_reg(DM365_MCBSP0_X);
+       davinci_cfg_reg(DM365_MCBSP0_BFSX);
+       davinci_cfg_reg(DM365_MCBSP0_BDR);
+       davinci_cfg_reg(DM365_MCBSP0_R);
+       davinci_cfg_reg(DM365_MCBSP0_BFSR);
+       davinci_cfg_reg(DM365_EVT2_ASP_TX);
+       davinci_cfg_reg(DM365_EVT3_ASP_RX);
+       dm365_asp_device.dev.platform_data = pdata;
+       platform_device_register(&dm365_asp_device);
+}
+
+void __init dm365_init_vc(struct snd_platform_data *pdata)
+{
+       davinci_cfg_reg(DM365_EVT2_VC_TX);
+       davinci_cfg_reg(DM365_EVT3_VC_RX);
+       dm365_vc_device.dev.platform_data = pdata;
+       platform_device_register(&dm365_vc_device);
+}
+
+void __init dm365_init_ks(struct davinci_ks_platform_data *pdata)
+{
+       dm365_ks_device.dev.platform_data = pdata;
+       platform_device_register(&dm365_ks_device);
+}
+
+void __init dm365_init_rtc(void)
+{
+       davinci_cfg_reg(DM365_INT_PRTCSS);
+       platform_device_register(&dm365_rtc_device);
+}
+
 void __init dm365_init(void)
 {
        davinci_common_init(&davinci_soc_info_dm365);
 }
+
+static struct resource dm365_vpss_resources[] = {
+       {
+               /* VPSS ISP5 Base address */
+               .name           = "isp5",
+               .start          = 0x01c70000,
+               .end            = 0x01c70000 + 0xff,
+               .flags          = IORESOURCE_MEM,
+       },
+       {
+               /* VPSS CLK Base address */
+               .name           = "vpss",
+               .start          = 0x01c70200,
+               .end            = 0x01c70200 + 0xff,
+               .flags          = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device dm365_vpss_device = {
+       .name                   = "vpss",
+       .id                     = -1,
+       .dev.platform_data      = "dm365_vpss",
+       .num_resources          = ARRAY_SIZE(dm365_vpss_resources),
+       .resource               = dm365_vpss_resources,
+};
+
+static struct resource vpfe_resources[] = {
+       {
+               .start          = IRQ_VDINT0,
+               .end            = IRQ_VDINT0,
+               .flags          = IORESOURCE_IRQ,
+       },
+       {
+               .start          = IRQ_VDINT1,
+               .end            = IRQ_VDINT1,
+               .flags          = IORESOURCE_IRQ,
+       },
+};
+
+static u64 vpfe_capture_dma_mask = DMA_BIT_MASK(32);
+static struct platform_device vpfe_capture_dev = {
+       .name           = CAPTURE_DRV_NAME,
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(vpfe_resources),
+       .resource       = vpfe_resources,
+       .dev = {
+               .dma_mask               = &vpfe_capture_dma_mask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+};
+
+static void dm365_isif_setup_pinmux(void)
+{
+       davinci_cfg_reg(DM365_VIN_CAM_WEN);
+       davinci_cfg_reg(DM365_VIN_CAM_VD);
+       davinci_cfg_reg(DM365_VIN_CAM_HD);
+       davinci_cfg_reg(DM365_VIN_YIN4_7_EN);
+       davinci_cfg_reg(DM365_VIN_YIN0_3_EN);
+}
+
+static struct resource isif_resource[] = {
+       /* ISIF Base address */
+       {
+               .start          = 0x01c71000,
+               .end            = 0x01c71000 + 0x1ff,
+               .flags          = IORESOURCE_MEM,
+       },
+       /* ISIF Linearization table 0 */
+       {
+               .start          = 0x1C7C000,
+               .end            = 0x1C7C000 + 0x2ff,
+               .flags          = IORESOURCE_MEM,
+       },
+       /* ISIF Linearization table 1 */
+       {
+               .start          = 0x1C7C400,
+               .end            = 0x1C7C400 + 0x2ff,
+               .flags          = IORESOURCE_MEM,
+       },
+};
+static struct platform_device dm365_isif_dev = {
+       .name           = "isif",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(isif_resource),
+       .resource       = isif_resource,
+       .dev = {
+               .dma_mask               = &vpfe_capture_dma_mask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+               .platform_data          = dm365_isif_setup_pinmux,
+       },
+};
+
+static int __init dm365_init_devices(void)
+{
+       if (!cpu_is_davinci_dm365())
+               return 0;
+
+       davinci_cfg_reg(DM365_INT_EDMA_CC);
+       platform_device_register(&dm365_edma_device);
+       platform_device_register(&dm365_emac_device);
+       /* Add isif clock alias */
+       clk_add_alias("master", dm365_isif_dev.name, "vpss_master", NULL);
+       platform_device_register(&dm365_vpss_device);
+       platform_device_register(&dm365_isif_dev);
+       platform_device_register(&vpfe_capture_dev);
+       return 0;
+}
+postcore_initcall(dm365_init_devices);
+
+void dm365_set_vpfe_config(struct vpfe_config *cfg)
+{
+       vpfe_capture_dev.dev.platform_data = cfg;
+}