]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/arm/plat-omap/devices.c
ARM: OMAP: Fix GCC-reported compile time bug
[linux-2.6-omap-h63xx.git] / arch / arm / plat-omap / devices.c
index ca486c9f36b508cf763765006486f8b9ac3bdac1..2e0419fd976ff3c97d24daf5c9e18f016d96c92a 100644 (file)
 #include <asm/arch/gpio.h>
 #include <asm/arch/menelaus.h>
 
-#if    defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE)
+#if    defined(CONFIG_OMAP_DSP) || defined(CONFIG_OMAP_DSP_MODULE)
+
+#include "../plat-omap/dsp/dsp_common.h"
+
+static struct dsp_platform_data dsp_pdata = {
+       .kdev_list = LIST_HEAD_INIT(dsp_pdata.kdev_list),
+};
+
+static struct resource omap_dsp_resources[] = {
+       {
+               .name   = "dsp_mmu",
+               .start  = -1,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device omap_dsp_device = {
+       .name           = "dsp",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(omap_dsp_resources),
+       .resource       = omap_dsp_resources,
+       .dev = {
+               .platform_data = &dsp_pdata,
+       },
+};
+
+static inline void omap_init_dsp(void)
+{
+       struct resource *res;
+       int irq;
+
+       if (cpu_is_omap15xx())
+               irq = INT_1510_DSP_MMU;
+       else if (cpu_is_omap16xx())
+               irq = INT_1610_DSP_MMU;
+       else if (cpu_is_omap24xx())
+               irq = INT_24XX_DSP_MMU;
+
+       res = platform_get_resource_byname(&omap_dsp_device,
+                                          IORESOURCE_IRQ, "dsp_mmu");
+       res->start = irq;
+
+       platform_device_register(&omap_dsp_device);
+}
+
+int dsp_kfunc_device_register(struct dsp_kfunc_device *kdev)
+{
+       static DEFINE_MUTEX(dsp_pdata_lock);
+
+       mutex_init(&kdev->lock);
+
+       mutex_lock(&dsp_pdata_lock);
+       list_add_tail(&kdev->entry, &dsp_pdata.kdev_list);
+       mutex_unlock(&dsp_pdata_lock);
+
+       return 0;
+}
+EXPORT_SYMBOL(dsp_kfunc_device_register);
+
+#else
+static inline void omap_init_dsp(void) { }
+#endif /* CONFIG_OMAP_DSP */
+
+/*-------------------------------------------------------------------------*/
+#if    defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE)
 
 #define        OMAP1_I2C_BASE          0xfffb3800
 #define OMAP2_I2C_BASE1                0x48070000
@@ -48,8 +112,8 @@ static struct resource i2c_resources1[] = {
 /* DMA not used; works around erratum writing to non-empty i2c fifo */
 
 static struct platform_device omap_i2c_device1 = {
-        .name           = "i2c_omap",
-        .id             = 1,
+       .name           = "i2c_omap",
+       .id             = 1,
        .num_resources  = ARRAY_SIZE(i2c_resources1),
        .resource       = i2c_resources1,
 };
@@ -72,8 +136,10 @@ static void omap_init_i2c(void)
         * it can include clocking and address info, maybe more.
         */
        if (cpu_is_omap24xx()) {
-               omap_cfg_reg(M19_24XX_I2C1_SCL);
-               omap_cfg_reg(L15_24XX_I2C1_SDA);
+               if (machine_is_omap_h4()) {
+                       omap_cfg_reg(M19_24XX_I2C1_SCL);
+                       omap_cfg_reg(L15_24XX_I2C1_SDA);
+               }
        } else {
                omap_cfg_reg(I2C_SCL);
                omap_cfg_reg(I2C_SDA);
@@ -104,7 +170,7 @@ static void omap_init_kp(void)
                omap_cfg_reg(E20_1610_KBR3);
                omap_cfg_reg(E19_1610_KBR4);
                omap_cfg_reg(N19_1610_KBR5);
-       } else if (machine_is_omap_perseus2()) {
+       } else if (machine_is_omap_perseus2() || machine_is_omap_fsample()) {
                omap_cfg_reg(E2_730_KBR0);
                omap_cfg_reg(J7_730_KBR1);
                omap_cfg_reg(E1_730_KBR2);
@@ -148,7 +214,7 @@ static inline void omap_init_kp(void) {}
 
 #ifdef CONFIG_ARCH_OMAP24XX
 #define        OMAP_MMC1_BASE          0x4809c000
-#define OMAP_MMC1_INT          83
+#define OMAP_MMC1_INT          INT_24XX_MMC_IRQ
 #else
 #define        OMAP_MMC1_BASE          0xfffb7800
 #define OMAP_MMC1_INT          INT_MMC
@@ -161,8 +227,8 @@ static u64 mmc1_dmamask = 0xffffffff;
 
 static struct resource mmc1_resources[] = {
        {
-               .start          = IO_ADDRESS(OMAP_MMC1_BASE),
-               .end            = IO_ADDRESS(OMAP_MMC1_BASE) + 0x7f,
+               .start          = OMAP_MMC1_BASE,
+               .end            = OMAP_MMC1_BASE + 0x7f,
                .flags          = IORESOURCE_MEM,
        },
        {
@@ -190,8 +256,8 @@ static u64 mmc2_dmamask = 0xffffffff;
 
 static struct resource mmc2_resources[] = {
        {
-               .start          = IO_ADDRESS(OMAP_MMC2_BASE),
-               .end            = IO_ADDRESS(OMAP_MMC2_BASE) + 0x7f,
+               .start          = OMAP_MMC2_BASE,
+               .end            = OMAP_MMC2_BASE + 0x7f,
                .flags          = IORESOURCE_MEM,
        },
        {
@@ -225,7 +291,14 @@ static void __init omap_init_mmc(void)
        /* block 1 is always available and has just one pinout option */
        mmc = &mmc_conf->mmc[0];
        if (mmc->enabled) {
-               if (!cpu_is_omap24xx()) {
+               if (cpu_is_omap24xx()) {
+                       omap_cfg_reg(H18_24XX_MMC_CMD);
+                       omap_cfg_reg(H15_24XX_MMC_CLKI);
+                       omap_cfg_reg(G19_24XX_MMC_CLKO);
+                       omap_cfg_reg(F20_24XX_MMC_DAT0);
+                       omap_cfg_reg(F19_24XX_MMC_DAT_DIR0);
+                       omap_cfg_reg(G18_24XX_MMC_CMD_DIR);
+               } else {
                        omap_cfg_reg(MMC_CMD);
                        omap_cfg_reg(MMC_CLK);
                        omap_cfg_reg(MMC_DAT0);
@@ -236,7 +309,14 @@ static void __init omap_init_mmc(void)
                        }
                }
                if (mmc->wire4) {
-                       if (!cpu_is_omap24xx()) {
+                       if (cpu_is_omap24xx()) {
+                               omap_cfg_reg(H14_24XX_MMC_DAT1);
+                               omap_cfg_reg(E19_24XX_MMC_DAT2);
+                               omap_cfg_reg(D19_24XX_MMC_DAT3);
+                               omap_cfg_reg(E20_24XX_MMC_DAT_DIR1);
+                               omap_cfg_reg(F18_24XX_MMC_DAT_DIR2);
+                               omap_cfg_reg(E18_24XX_MMC_DAT_DIR3);
+                       } else {
                                omap_cfg_reg(MMC_DAT1);
                                /* NOTE:  DAT2 can be on W10 (here) or M15 */
                                if (!mmc->nomux)
@@ -362,7 +442,7 @@ static inline void omap_init_wdt(void) {}
 
 /*-------------------------------------------------------------------------*/
 
-#if    defined(CONFIG_OMAP_RNG) || defined(CONFIG_OMAP_RNG_MODULE)
+#if defined(CONFIG_HW_RANDOM_OMAP) || defined(CONFIG_HW_RANDOM_OMAP_MODULE)
 
 #ifdef CONFIG_ARCH_OMAP24XX
 #define        OMAP_RNG_BASE           0x480A0000
@@ -415,17 +495,21 @@ static inline void omap_init_rng(void) {}
  */
 static int __init omap_init_devices(void)
 {
+/*
+ * Need to enable relevant once for 2430 SDP
+ */
+#ifndef CONFIG_MACH_OMAP_2430SDP
        /* please keep these calls, and their implementations above,
         * in alphabetical order so they're easier to sort through.
         */
-       omap_init_i2c();
+       omap_init_dsp();
        omap_init_kp();
        omap_init_mmc();
        omap_init_uwire();
        omap_init_wdt();
        omap_init_rng();
-
+#endif
+       omap_init_i2c();
        return 0;
 }
 arch_initcall(omap_init_devices);
-