Merge branch 'sh-latest' of git://github.com/pmundt/linux-sh
[pandora-kernel.git] / arch / arm / mach-u300 / core.c
index fd435f4..ac0791e 100644 (file)
@@ -25,6 +25,9 @@
 #include <linux/err.h>
 #include <linux/mtd/nand.h>
 #include <linux/mtd/fsmc.h>
+#include <linux/pinctrl/machine.h>
+#include <linux/pinctrl/pinmux.h>
+#include <linux/dma-mapping.h>
 
 #include <asm/types.h>
 #include <asm/setup.h>
@@ -69,30 +72,13 @@ static struct map_desc u300_io_desc[] __initdata = {
                .length         = SZ_32K,
                .type           = MT_DEVICE,
        },
-       {
-               .virtual        = 0xffff2000, /* TCM memory */
-               .pfn            = __phys_to_pfn(0xffff2000),
-               .length         = SZ_16K,
-               .type           = MT_DEVICE,
-       },
-
-       /*
-        * This overlaps with the IRQ vectors etc at 0xffff0000, so these
-        * may have to be moved to 0x00000000 in order to use the ROM.
-        */
-       /*
-       {
-               .virtual        = U300_BOOTROM_VIRT_BASE,
-               .pfn            = __phys_to_pfn(U300_BOOTROM_PHYS_BASE),
-               .length         = SZ_64K,
-               .type           = MT_ROM,
-       },
-       */
 };
 
 void __init u300_map_io(void)
 {
        iotable_init(u300_io_desc, ARRAY_SIZE(u300_io_desc));
+       /* We enable a real big DMA buffer if need be. */
+       init_consistent_dma_size(SZ_4M);
 }
 
 /*
@@ -362,51 +348,6 @@ static struct resource wdog_resources[] = {
        }
 };
 
-/* TODO: These should be protected by suitable #ifdef's */
-static struct resource ave_resources[] = {
-       {
-               .name  = "AVE3e I/O Area",
-               .start = U300_VIDEOENC_BASE,
-               .end   = U300_VIDEOENC_BASE + SZ_512K - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .name  = "AVE3e IRQ0",
-               .start = IRQ_U300_VIDEO_ENC_0,
-               .end   = IRQ_U300_VIDEO_ENC_0,
-               .flags = IORESOURCE_IRQ,
-       },
-       {
-               .name  = "AVE3e IRQ1",
-               .start = IRQ_U300_VIDEO_ENC_1,
-               .end   = IRQ_U300_VIDEO_ENC_1,
-               .flags = IORESOURCE_IRQ,
-       },
-       {
-               .name  = "AVE3e Physmem Area",
-               .start = 0, /* 0 will be remapped to reserved memory */
-               .end   = SZ_1M - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       /*
-        * The AVE3e requires two regions of 256MB that it considers
-        * "invisible". The hardware will not be able to access these
-        * addresses, so they should never point to system RAM.
-        */
-       {
-               .name  = "AVE3e Reserved 0",
-               .start = 0xd0000000,
-               .end   = 0xd0000000 + SZ_256M - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               .name  = "AVE3e Reserved 1",
-               .start = 0xe0000000,
-               .end   = 0xe0000000 + SZ_256M - 1,
-               .flags = IORESOURCE_MEM,
-       },
-};
-
 static struct resource dma_resource[] = {
        {
                .start = U300_DMAC_BASE,
@@ -1536,6 +1477,14 @@ static struct coh901318_platform coh901318_platform = {
        .max_channels = U300_DMA_CHANNELS,
 };
 
+static struct resource pinmux_resources[] = {
+       {
+               .start = U300_SYSCON_BASE,
+               .end   = U300_SYSCON_BASE + SZ_4K - 1,
+               .flags = IORESOURCE_MEM,
+       },
+};
+
 static struct platform_device wdog_device = {
        .name = "coh901327_wdog",
        .id = -1,
@@ -1637,13 +1586,6 @@ static struct platform_device nand_device = {
        },
 };
 
-static struct platform_device ave_device = {
-       .name = "video_enc",
-       .id = -1,
-       .num_resources = ARRAY_SIZE(ave_resources),
-       .resource = ave_resources,
-};
-
 static struct platform_device dma_device = {
        .name           = "coh901318",
        .id             = -1,
@@ -1655,6 +1597,72 @@ static struct platform_device dma_device = {
        },
 };
 
+static struct platform_device pinmux_device = {
+       .name = "pinmux-u300",
+       .id = -1,
+       .num_resources = ARRAY_SIZE(pinmux_resources),
+       .resource = pinmux_resources,
+};
+
+/* Pinmux settings */
+static struct pinmux_map u300_pinmux_map[] = {
+       /* anonymous maps for chip power and EMIFs */
+       PINMUX_MAP_PRIMARY_SYS_HOG("POWER", "power"),
+       PINMUX_MAP_PRIMARY_SYS_HOG("EMIF0", "emif0"),
+       PINMUX_MAP_PRIMARY_SYS_HOG("EMIF1", "emif1"),
+       /* per-device maps for MMC/SD, SPI and UART */
+       PINMUX_MAP_PRIMARY("MMCSD", "mmc0", "mmci"),
+       PINMUX_MAP_PRIMARY("SPI", "spi0", "pl022"),
+       PINMUX_MAP_PRIMARY("UART0", "uart0", "uart0"),
+};
+
+struct u300_mux_hog {
+       const char *name;
+       struct device *dev;
+       struct pinmux *pmx;
+};
+
+static struct u300_mux_hog u300_mux_hogs[] = {
+       {
+               .name = "uart0",
+               .dev = &uart0_device.dev,
+       },
+       {
+               .name = "spi0",
+               .dev = &pl022_device.dev,
+       },
+       {
+               .name = "mmc0",
+               .dev = &mmcsd_device.dev,
+       },
+};
+
+static int __init u300_pinmux_fetch(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(u300_mux_hogs); i++) {
+               struct pinmux *pmx;
+               int ret;
+
+               pmx = pinmux_get(u300_mux_hogs[i].dev, NULL);
+               if (IS_ERR(pmx)) {
+                       pr_err("u300: could not get pinmux hog %s\n",
+                              u300_mux_hogs[i].name);
+                       continue;
+               }
+               ret = pinmux_enable(pmx);
+               if (ret) {
+                       pr_err("u300: could enable pinmux hog %s\n",
+                              u300_mux_hogs[i].name);
+                       continue;
+               }
+               u300_mux_hogs[i].pmx = pmx;
+       }
+       return 0;
+}
+subsys_initcall(u300_pinmux_fetch);
+
 /*
  * Notice that AMBA devices are initialized before platform devices.
  *
@@ -1668,10 +1676,9 @@ static struct platform_device *platform_devs[] __initdata = {
        &gpio_device,
        &nand_device,
        &wdog_device,
-       &ave_device
+       &pinmux_device,
 };
 
-
 /*
  * Interrupts: the U300 platforms have two pl190 ARM PrimeCells connected
  * together so some interrupts are connected to the first one and some
@@ -1853,6 +1860,10 @@ void __init u300_init_devices(void)
 
        u300_assign_physmem();
 
+       /* Initialize pinmuxing */
+       pinmux_register_mappings(u300_pinmux_map,
+                                ARRAY_SIZE(u300_pinmux_map));
+
        /* Register subdevices on the I2C buses */
        u300_i2c_register_board_devices();
 
@@ -1862,17 +1873,10 @@ void __init u300_init_devices(void)
        /* Register subdevices on the SPI bus */
        u300_spi_register_board_devices();
 
-#ifndef CONFIG_MACH_U300_SEMI_IS_SHARED
-       /*
-        * Enable SEMI self refresh. Self-refresh of the SDRAM is entered when
-        * both subsystems are requesting this mode.
-        * If we not share the Acc SDRAM, this is never the case. Therefore
-        * enable it here from the App side.
-        */
+       /* Enable SEMI self refresh */
        val = readw(U300_SYSCON_VBASE + U300_SYSCON_SMCR) |
                U300_SYSCON_SMCR_SEMI_SREFREQ_ENABLE;
        writew(val, U300_SYSCON_VBASE + U300_SYSCON_SMCR);
-#endif /* CONFIG_MACH_U300_SEMI_IS_SHARED */
 }
 
 static int core_module_init(void)