davinci: fix section mismatch warning in arch/arm/mach-davinci/board-dm646x-evm.c
[safe/jmp/linux-2.6] / arch / arm / mach-davinci / dm365.c
index 69d35d9..2ec619e 100644 (file)
@@ -12,7 +12,6 @@
  * 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>
@@ -23,7 +22,6 @@
 #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>
@@ -32,6 +30,8 @@
 #include <mach/time.h>
 #include <mach/serial.h>
 #include <mach/common.h>
+#include <mach/asp.h>
+#include <mach/keyscan.h>
 
 #include "clock.h"
 #include "mux.h"
@@ -369,7 +369,7 @@ static struct clk timer3_clk = {
 
 static struct clk usb_clk = {
        .name           = "usb",
-       .parent         = &pll2_sysclk1,
+       .parent         = &pll1_aux_clk,
        .lpsc           = DAVINCI_LPSC_USB,
 };
 
@@ -456,7 +456,7 @@ static struct davinci_clk dm365_clks[] = {
        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-asp.0", NULL, &asp0_clk),
        CLK(NULL, "rto", &rto_clk),
        CLK(NULL, "mjcp", &mjcp_clk),
        CLK(NULL, NULL, NULL),
@@ -530,9 +530,131 @@ MUX_CFG(DM365,  EMAC_RX_ER,       3,   3,     1,    1,     false)
 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, 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)
+INT_CFG(DM365,  INT_EDMA_TC1_ERR,    4,     1,    1,     false)
+INT_CFG(DM365,  INT_EDMA_TC2_ERR,    22,    1,    1,     false)
+INT_CFG(DM365,  INT_EDMA_TC3_ERR,    23,    1,    1,     false)
+INT_CFG(DM365,  INT_PRTCSS,          10,    1,    1,     false)
+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)
 #endif
 };
 
+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,6 +699,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,
@@ -601,6 +724,136 @@ 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_2,
+       },
+};
+
+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_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,
@@ -617,6 +870,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[] = {
        {
@@ -624,7 +899,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",
        },
 };
 
@@ -687,13 +969,55 @@ 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_ks(struct davinci_ks_platform_data *pdata)
+{
+       davinci_cfg_reg(DM365_KEYSCAN);
+       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 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);
+
+       return 0;
+}
+postcore_initcall(dm365_init_devices);