Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux...
authorPaul Mundt <lethal@linux-sh.org>
Thu, 13 Jan 2011 06:06:28 +0000 (15:06 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Thu, 13 Jan 2011 06:06:28 +0000 (15:06 +0900)
Conflicts:
arch/sh/kernel/cpu/sh2/setup-sh7619.c
arch/sh/kernel/cpu/sh2a/setup-mxg.c
arch/sh/kernel/cpu/sh2a/setup-sh7201.c
arch/sh/kernel/cpu/sh2a/setup-sh7203.c
arch/sh/kernel/cpu/sh2a/setup-sh7206.c
arch/sh/kernel/cpu/sh3/setup-sh7705.c
arch/sh/kernel/cpu/sh3/setup-sh770x.c
arch/sh/kernel/cpu/sh3/setup-sh7710.c
arch/sh/kernel/cpu/sh3/setup-sh7720.c
arch/sh/kernel/cpu/sh4/setup-sh4-202.c
arch/sh/kernel/cpu/sh4/setup-sh7750.c
arch/sh/kernel/cpu/sh4/setup-sh7760.c
arch/sh/kernel/cpu/sh4a/setup-sh7343.c
arch/sh/kernel/cpu/sh4a/setup-sh7366.c
arch/sh/kernel/cpu/sh4a/setup-sh7722.c
arch/sh/kernel/cpu/sh4a/setup-sh7723.c
arch/sh/kernel/cpu/sh4a/setup-sh7724.c
arch/sh/kernel/cpu/sh4a/setup-sh7763.c
arch/sh/kernel/cpu/sh4a/setup-sh7770.c
arch/sh/kernel/cpu/sh4a/setup-sh7780.c
arch/sh/kernel/cpu/sh4a/setup-sh7785.c
arch/sh/kernel/cpu/sh4a/setup-sh7786.c
arch/sh/kernel/cpu/sh4a/setup-shx3.c
arch/sh/kernel/cpu/sh5/setup-sh5.c
drivers/serial/sh-sci.c
drivers/serial/sh-sci.h
include/linux/serial_sci.h

32 files changed:
1  2 
arch/arm/mach-shmobile/setup-sh7367.c
arch/arm/mach-shmobile/setup-sh7372.c
arch/arm/mach-shmobile/setup-sh7377.c
arch/arm/mach-shmobile/setup-sh73a0.c
arch/sh/kernel/cpu/sh2/setup-sh7619.c
arch/sh/kernel/cpu/sh2a/setup-mxg.c
arch/sh/kernel/cpu/sh2a/setup-sh7201.c
arch/sh/kernel/cpu/sh2a/setup-sh7203.c
arch/sh/kernel/cpu/sh2a/setup-sh7206.c
arch/sh/kernel/cpu/sh3/setup-sh7705.c
arch/sh/kernel/cpu/sh3/setup-sh770x.c
arch/sh/kernel/cpu/sh3/setup-sh7710.c
arch/sh/kernel/cpu/sh3/setup-sh7720.c
arch/sh/kernel/cpu/sh4/setup-sh4-202.c
arch/sh/kernel/cpu/sh4/setup-sh7750.c
arch/sh/kernel/cpu/sh4/setup-sh7760.c
arch/sh/kernel/cpu/sh4a/setup-sh7343.c
arch/sh/kernel/cpu/sh4a/setup-sh7366.c
arch/sh/kernel/cpu/sh4a/setup-sh7722.c
arch/sh/kernel/cpu/sh4a/setup-sh7723.c
arch/sh/kernel/cpu/sh4a/setup-sh7724.c
arch/sh/kernel/cpu/sh4a/setup-sh7757.c
arch/sh/kernel/cpu/sh4a/setup-sh7763.c
arch/sh/kernel/cpu/sh4a/setup-sh7770.c
arch/sh/kernel/cpu/sh4a/setup-sh7780.c
arch/sh/kernel/cpu/sh4a/setup-sh7785.c
arch/sh/kernel/cpu/sh4a/setup-sh7786.c
arch/sh/kernel/cpu/sh4a/setup-shx3.c
arch/sh/kernel/cpu/sh5/setup-sh5.c
drivers/serial/sh-sci.c
drivers/serial/sh-sci.h
include/linux/serial_sci.h

index 0000000,003008c..ce28141
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,211 +1,225 @@@
+ /*
+  * sh7367 processor support
+  *
+  * Copyright (C) 2010  Magnus Damm
+  * Copyright (C) 2008  Yoshihiro Shimoda
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+  * the Free Software Foundation; version 2 of the License.
+  *
+  * This program is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  * GNU General Public License for more details.
+  *
+  * You should have received a copy of the GNU General Public License
+  * along with this program; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+  */
+ #include <linux/kernel.h>
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+ #include <linux/irq.h>
+ #include <linux/platform_device.h>
+ #include <linux/delay.h>
+ #include <linux/input.h>
+ #include <linux/io.h>
+ #include <linux/serial_sci.h>
+ #include <linux/sh_timer.h>
+ #include <mach/hardware.h>
+ #include <asm/mach-types.h>
+ #include <asm/mach/arch.h>
+ /* SCIFA0 */
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xe6c40000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { evt2irq(0xc00), evt2irq(0xc00),
+                           evt2irq(0xc00), evt2irq(0xc00) },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ /* SCIFA1 */
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xe6c50000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { evt2irq(0xc20), evt2irq(0xc20),
+                           evt2irq(0xc20), evt2irq(0xc20) },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ /* SCIFA2 */
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xe6c60000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { evt2irq(0xc40), evt2irq(0xc40),
+                           evt2irq(0xc40), evt2irq(0xc40) },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &scif2_platform_data,
+       },
+ };
+ /* SCIFA3 */
+ static struct plat_sci_port scif3_platform_data = {
+       .mapbase        = 0xe6c70000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { evt2irq(0xc60), evt2irq(0xc60),
+                           evt2irq(0xc60), evt2irq(0xc60) },
+ };
+ static struct platform_device scif3_device = {
+       .name           = "sh-sci",
+       .id             = 3,
+       .dev            = {
+               .platform_data  = &scif3_platform_data,
+       },
+ };
+ /* SCIFA4 */
+ static struct plat_sci_port scif4_platform_data = {
+       .mapbase        = 0xe6c80000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { evt2irq(0xd20), evt2irq(0xd20),
+                           evt2irq(0xd20), evt2irq(0xd20) },
+ };
+ static struct platform_device scif4_device = {
+       .name           = "sh-sci",
+       .id             = 4,
+       .dev            = {
+               .platform_data  = &scif4_platform_data,
+       },
+ };
+ /* SCIFA5 */
+ static struct plat_sci_port scif5_platform_data = {
+       .mapbase        = 0xe6cb0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { evt2irq(0xd40), evt2irq(0xd40),
+                           evt2irq(0xd40), evt2irq(0xd40) },
+ };
+ static struct platform_device scif5_device = {
+       .name           = "sh-sci",
+       .id             = 5,
+       .dev            = {
+               .platform_data  = &scif5_platform_data,
+       },
+ };
+ /* SCIFB */
+ static struct plat_sci_port scif6_platform_data = {
+       .mapbase        = 0xe6c30000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { evt2irq(0xd60), evt2irq(0xd60),
+                           evt2irq(0xd60), evt2irq(0xd60) },
+ };
+ static struct platform_device scif6_device = {
+       .name           = "sh-sci",
+       .id             = 6,
+       .dev            = {
+               .platform_data  = &scif6_platform_data,
+       },
+ };
+ static struct sh_timer_config cmt10_platform_data = {
+       .name = "CMT10",
+       .channel_offset = 0x10,
+       .timer_bit = 0,
+       .clockevent_rating = 125,
+       .clocksource_rating = 125,
+ };
+ static struct resource cmt10_resources[] = {
+       [0] = {
+               .name   = "CMT10",
+               .start  = 0xe6138010,
+               .end    = 0xe613801b,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = evt2irq(0xb00), /* CMT1_CMT10 */
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device cmt10_device = {
+       .name           = "sh_cmt",
+       .id             = 10,
+       .dev = {
+               .platform_data  = &cmt10_platform_data,
+       },
+       .resource       = cmt10_resources,
+       .num_resources  = ARRAY_SIZE(cmt10_resources),
+ };
+ static struct platform_device *sh7367_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &scif5_device,
+       &scif6_device,
+       &cmt10_device,
+ };
+ void __init sh7367_add_standard_devices(void)
+ {
+       platform_add_devices(sh7367_early_devices,
+                            ARRAY_SIZE(sh7367_early_devices));
+ }
+ #define SYMSTPCR2 0xe6158048
+ #define SYMSTPCR2_CMT1 (1 << 29)
+ void __init sh7367_add_early_devices(void)
+ {
+       /* enable clock to CMT1 */
+       __raw_writel(__raw_readl(SYMSTPCR2) & ~SYMSTPCR2_CMT1, SYMSTPCR2);
+       early_platform_add_devices(sh7367_early_devices,
+                                  ARRAY_SIZE(sh7367_early_devices));
+ }
index 0000000,2e3e11e..ff0494f
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,624 +1,638 @@@
+ /*
+  * sh7372 processor support
+  *
+  * Copyright (C) 2010  Magnus Damm
+  * Copyright (C) 2008  Yoshihiro Shimoda
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+  * the Free Software Foundation; version 2 of the License.
+  *
+  * This program is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  * GNU General Public License for more details.
+  *
+  * You should have received a copy of the GNU General Public License
+  * along with this program; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+  */
+ #include <linux/kernel.h>
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+ #include <linux/irq.h>
+ #include <linux/platform_device.h>
+ #include <linux/delay.h>
+ #include <linux/input.h>
+ #include <linux/io.h>
+ #include <linux/serial_sci.h>
+ #include <linux/sh_dma.h>
+ #include <linux/sh_intc.h>
+ #include <linux/sh_timer.h>
+ #include <mach/hardware.h>
+ #include <mach/sh7372.h>
+ #include <asm/mach-types.h>
+ #include <asm/mach/arch.h>
+ /* SCIFA0 */
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xe6c40000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFA,
+       .irqs           = { evt2irq(0x0c00), evt2irq(0x0c00),
+                           evt2irq(0x0c00), evt2irq(0x0c00) },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ /* SCIFA1 */
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xe6c50000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFA,
+       .irqs           = { evt2irq(0x0c20), evt2irq(0x0c20),
+                           evt2irq(0x0c20), evt2irq(0x0c20) },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ /* SCIFA2 */
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xe6c60000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFA,
+       .irqs           = { evt2irq(0x0c40), evt2irq(0x0c40),
+                           evt2irq(0x0c40), evt2irq(0x0c40) },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &scif2_platform_data,
+       },
+ };
+ /* SCIFA3 */
+ static struct plat_sci_port scif3_platform_data = {
+       .mapbase        = 0xe6c70000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFA,
+       .irqs           = { evt2irq(0x0c60), evt2irq(0x0c60),
+                           evt2irq(0x0c60), evt2irq(0x0c60) },
+ };
+ static struct platform_device scif3_device = {
+       .name           = "sh-sci",
+       .id             = 3,
+       .dev            = {
+               .platform_data  = &scif3_platform_data,
+       },
+ };
+ /* SCIFA4 */
+ static struct plat_sci_port scif4_platform_data = {
+       .mapbase        = 0xe6c80000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFA,
+       .irqs           = { evt2irq(0x0d20), evt2irq(0x0d20),
+                           evt2irq(0x0d20), evt2irq(0x0d20) },
+ };
+ static struct platform_device scif4_device = {
+       .name           = "sh-sci",
+       .id             = 4,
+       .dev            = {
+               .platform_data  = &scif4_platform_data,
+       },
+ };
+ /* SCIFA5 */
+ static struct plat_sci_port scif5_platform_data = {
+       .mapbase        = 0xe6cb0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFA,
+       .irqs           = { evt2irq(0x0d40), evt2irq(0x0d40),
+                           evt2irq(0x0d40), evt2irq(0x0d40) },
+ };
+ static struct platform_device scif5_device = {
+       .name           = "sh-sci",
+       .id             = 5,
+       .dev            = {
+               .platform_data  = &scif5_platform_data,
+       },
+ };
+ /* SCIFB */
+ static struct plat_sci_port scif6_platform_data = {
+       .mapbase        = 0xe6c30000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFB,
+       .irqs           = { evt2irq(0x0d60), evt2irq(0x0d60),
+                           evt2irq(0x0d60), evt2irq(0x0d60) },
+ };
+ static struct platform_device scif6_device = {
+       .name           = "sh-sci",
+       .id             = 6,
+       .dev            = {
+               .platform_data  = &scif6_platform_data,
+       },
+ };
+ /* CMT */
+ static struct sh_timer_config cmt10_platform_data = {
+       .name = "CMT10",
+       .channel_offset = 0x10,
+       .timer_bit = 0,
+       .clockevent_rating = 125,
+       .clocksource_rating = 125,
+ };
+ static struct resource cmt10_resources[] = {
+       [0] = {
+               .name   = "CMT10",
+               .start  = 0xe6138010,
+               .end    = 0xe613801b,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = evt2irq(0x0b00), /* CMT1_CMT10 */
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device cmt10_device = {
+       .name           = "sh_cmt",
+       .id             = 10,
+       .dev = {
+               .platform_data  = &cmt10_platform_data,
+       },
+       .resource       = cmt10_resources,
+       .num_resources  = ARRAY_SIZE(cmt10_resources),
+ };
+ /* TMU */
+ static struct sh_timer_config tmu00_platform_data = {
+       .name = "TMU00",
+       .channel_offset = 0x4,
+       .timer_bit = 0,
+       .clockevent_rating = 200,
+ };
+ static struct resource tmu00_resources[] = {
+       [0] = {
+               .name   = "TMU00",
+               .start  = 0xfff60008,
+               .end    = 0xfff60013,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = intcs_evt2irq(0xe80), /* TMU_TUNI0 */
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device tmu00_device = {
+       .name           = "sh_tmu",
+       .id             = 0,
+       .dev = {
+               .platform_data  = &tmu00_platform_data,
+       },
+       .resource       = tmu00_resources,
+       .num_resources  = ARRAY_SIZE(tmu00_resources),
+ };
+ static struct sh_timer_config tmu01_platform_data = {
+       .name = "TMU01",
+       .channel_offset = 0x10,
+       .timer_bit = 1,
+       .clocksource_rating = 200,
+ };
+ static struct resource tmu01_resources[] = {
+       [0] = {
+               .name   = "TMU01",
+               .start  = 0xfff60014,
+               .end    = 0xfff6001f,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = intcs_evt2irq(0xea0), /* TMU_TUNI1 */
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device tmu01_device = {
+       .name           = "sh_tmu",
+       .id             = 1,
+       .dev = {
+               .platform_data  = &tmu01_platform_data,
+       },
+       .resource       = tmu01_resources,
+       .num_resources  = ARRAY_SIZE(tmu01_resources),
+ };
+ /* I2C */
+ static struct resource iic0_resources[] = {
+       [0] = {
+               .name   = "IIC0",
+               .start  = 0xFFF20000,
+               .end    = 0xFFF20425 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = intcs_evt2irq(0xe00), /* IIC0_ALI0 */
+               .end    = intcs_evt2irq(0xe60), /* IIC0_DTEI0 */
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device iic0_device = {
+       .name           = "i2c-sh_mobile",
+       .id             = 0, /* "i2c0" clock */
+       .num_resources  = ARRAY_SIZE(iic0_resources),
+       .resource       = iic0_resources,
+ };
+ static struct resource iic1_resources[] = {
+       [0] = {
+               .name   = "IIC1",
+               .start  = 0xE6C20000,
+               .end    = 0xE6C20425 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = evt2irq(0x780), /* IIC1_ALI1 */
+               .end    = evt2irq(0x7e0), /* IIC1_DTEI1 */
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device iic1_device = {
+       .name           = "i2c-sh_mobile",
+       .id             = 1, /* "i2c1" clock */
+       .num_resources  = ARRAY_SIZE(iic1_resources),
+       .resource       = iic1_resources,
+ };
+ /* DMA */
+ /* Transmit sizes and respective CHCR register values */
+ enum {
+       XMIT_SZ_8BIT            = 0,
+       XMIT_SZ_16BIT           = 1,
+       XMIT_SZ_32BIT           = 2,
+       XMIT_SZ_64BIT           = 7,
+       XMIT_SZ_128BIT          = 3,
+       XMIT_SZ_256BIT          = 4,
+       XMIT_SZ_512BIT          = 5,
+ };
+ /* log2(size / 8) - used to calculate number of transfers */
+ #define TS_SHIFT {                    \
+       [XMIT_SZ_8BIT]          = 0,    \
+       [XMIT_SZ_16BIT]         = 1,    \
+       [XMIT_SZ_32BIT]         = 2,    \
+       [XMIT_SZ_64BIT]         = 3,    \
+       [XMIT_SZ_128BIT]        = 4,    \
+       [XMIT_SZ_256BIT]        = 5,    \
+       [XMIT_SZ_512BIT]        = 6,    \
+ }
+ #define TS_INDEX2VAL(i) ((((i) & 3) << 3) | \
+                        (((i) & 0xc) << (20 - 2)))
+ static const struct sh_dmae_slave_config sh7372_dmae_slaves[] = {
+       {
+               .slave_id       = SHDMA_SLAVE_SCIF0_TX,
+               .addr           = 0xe6c40020,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x21,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF0_RX,
+               .addr           = 0xe6c40024,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x22,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF1_TX,
+               .addr           = 0xe6c50020,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x25,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF1_RX,
+               .addr           = 0xe6c50024,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x26,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF2_TX,
+               .addr           = 0xe6c60020,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x29,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF2_RX,
+               .addr           = 0xe6c60024,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x2a,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF3_TX,
+               .addr           = 0xe6c70020,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x2d,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF3_RX,
+               .addr           = 0xe6c70024,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x2e,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF4_TX,
+               .addr           = 0xe6c80020,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x39,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF4_RX,
+               .addr           = 0xe6c80024,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x3a,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF5_TX,
+               .addr           = 0xe6cb0020,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x35,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF5_RX,
+               .addr           = 0xe6cb0024,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x36,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF6_TX,
+               .addr           = 0xe6c30040,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x3d,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF6_RX,
+               .addr           = 0xe6c30060,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x3e,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SDHI0_TX,
+               .addr           = 0xe6850030,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
+               .mid_rid        = 0xc1,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SDHI0_RX,
+               .addr           = 0xe6850030,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
+               .mid_rid        = 0xc2,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SDHI1_TX,
+               .addr           = 0xe6860030,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
+               .mid_rid        = 0xc9,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SDHI1_RX,
+               .addr           = 0xe6860030,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
+               .mid_rid        = 0xca,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SDHI2_TX,
+               .addr           = 0xe6870030,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
+               .mid_rid        = 0xcd,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SDHI2_RX,
+               .addr           = 0xe6870030,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
+               .mid_rid        = 0xce,
+       }, {
+               .slave_id       = SHDMA_SLAVE_MMCIF_TX,
+               .addr           = 0xe6bd0034,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT),
+               .mid_rid        = 0xd1,
+       }, {
+               .slave_id       = SHDMA_SLAVE_MMCIF_RX,
+               .addr           = 0xe6bd0034,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT),
+               .mid_rid        = 0xd2,
+       },
+ };
+ static const struct sh_dmae_channel sh7372_dmae_channels[] = {
+       {
+               .offset = 0,
+               .dmars = 0,
+               .dmars_bit = 0,
+       }, {
+               .offset = 0x10,
+               .dmars = 0,
+               .dmars_bit = 8,
+       }, {
+               .offset = 0x20,
+               .dmars = 4,
+               .dmars_bit = 0,
+       }, {
+               .offset = 0x30,
+               .dmars = 4,
+               .dmars_bit = 8,
+       }, {
+               .offset = 0x50,
+               .dmars = 8,
+               .dmars_bit = 0,
+       }, {
+               .offset = 0x60,
+               .dmars = 8,
+               .dmars_bit = 8,
+       }
+ };
+ static const unsigned int ts_shift[] = TS_SHIFT;
+ static struct sh_dmae_pdata dma_platform_data = {
+       .slave          = sh7372_dmae_slaves,
+       .slave_num      = ARRAY_SIZE(sh7372_dmae_slaves),
+       .channel        = sh7372_dmae_channels,
+       .channel_num    = ARRAY_SIZE(sh7372_dmae_channels),
+       .ts_low_shift   = 3,
+       .ts_low_mask    = 0x18,
+       .ts_high_shift  = (20 - 2),     /* 2 bits for shifted low TS */
+       .ts_high_mask   = 0x00300000,
+       .ts_shift       = ts_shift,
+       .ts_shift_num   = ARRAY_SIZE(ts_shift),
+       .dmaor_init     = DMAOR_DME,
+ };
+ /* Resource order important! */
+ static struct resource sh7372_dmae0_resources[] = {
+       {
+               /* Channel registers and DMAOR */
+               .start  = 0xfe008020,
+               .end    = 0xfe00808f,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* DMARSx */
+               .start  = 0xfe009000,
+               .end    = 0xfe00900b,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* DMA error IRQ */
+               .start  = evt2irq(0x20c0),
+               .end    = evt2irq(0x20c0),
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               /* IRQ for channels 0-5 */
+               .start  = evt2irq(0x2000),
+               .end    = evt2irq(0x20a0),
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ /* Resource order important! */
+ static struct resource sh7372_dmae1_resources[] = {
+       {
+               /* Channel registers and DMAOR */
+               .start  = 0xfe018020,
+               .end    = 0xfe01808f,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* DMARSx */
+               .start  = 0xfe019000,
+               .end    = 0xfe01900b,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* DMA error IRQ */
+               .start  = evt2irq(0x21c0),
+               .end    = evt2irq(0x21c0),
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               /* IRQ for channels 0-5 */
+               .start  = evt2irq(0x2100),
+               .end    = evt2irq(0x21a0),
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ /* Resource order important! */
+ static struct resource sh7372_dmae2_resources[] = {
+       {
+               /* Channel registers and DMAOR */
+               .start  = 0xfe028020,
+               .end    = 0xfe02808f,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* DMARSx */
+               .start  = 0xfe029000,
+               .end    = 0xfe02900b,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* DMA error IRQ */
+               .start  = evt2irq(0x22c0),
+               .end    = evt2irq(0x22c0),
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               /* IRQ for channels 0-5 */
+               .start  = evt2irq(0x2200),
+               .end    = evt2irq(0x22a0),
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device dma0_device = {
+       .name           = "sh-dma-engine",
+       .id             = 0,
+       .resource       = sh7372_dmae0_resources,
+       .num_resources  = ARRAY_SIZE(sh7372_dmae0_resources),
+       .dev            = {
+               .platform_data  = &dma_platform_data,
+       },
+ };
+ static struct platform_device dma1_device = {
+       .name           = "sh-dma-engine",
+       .id             = 1,
+       .resource       = sh7372_dmae1_resources,
+       .num_resources  = ARRAY_SIZE(sh7372_dmae1_resources),
+       .dev            = {
+               .platform_data  = &dma_platform_data,
+       },
+ };
+ static struct platform_device dma2_device = {
+       .name           = "sh-dma-engine",
+       .id             = 2,
+       .resource       = sh7372_dmae2_resources,
+       .num_resources  = ARRAY_SIZE(sh7372_dmae2_resources),
+       .dev            = {
+               .platform_data  = &dma_platform_data,
+       },
+ };
+ static struct platform_device *sh7372_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &scif5_device,
+       &scif6_device,
+       &cmt10_device,
+       &tmu00_device,
+       &tmu01_device,
+ };
+ static struct platform_device *sh7372_late_devices[] __initdata = {
+       &iic0_device,
+       &iic1_device,
+       &dma0_device,
+       &dma1_device,
+       &dma2_device,
+ };
+ void __init sh7372_add_standard_devices(void)
+ {
+       platform_add_devices(sh7372_early_devices,
+                           ARRAY_SIZE(sh7372_early_devices));
+       platform_add_devices(sh7372_late_devices,
+                           ARRAY_SIZE(sh7372_late_devices));
+ }
+ void __init sh7372_add_early_devices(void)
+ {
+       early_platform_add_devices(sh7372_early_devices,
+                                  ARRAY_SIZE(sh7372_early_devices));
+ }
index 0000000,575dbd6..8099b0b
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,230 +1,246 @@@
+ /*
+  * sh7377 processor support
+  *
+  * Copyright (C) 2010  Magnus Damm
+  * Copyright (C) 2008  Yoshihiro Shimoda
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+  * the Free Software Foundation; version 2 of the License.
+  *
+  * This program is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  * GNU General Public License for more details.
+  *
+  * You should have received a copy of the GNU General Public License
+  * along with this program; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+  */
+ #include <linux/kernel.h>
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+ #include <linux/irq.h>
+ #include <linux/platform_device.h>
+ #include <linux/delay.h>
+ #include <linux/input.h>
+ #include <linux/io.h>
+ #include <linux/serial_sci.h>
+ #include <linux/sh_intc.h>
+ #include <linux/sh_timer.h>
+ #include <mach/hardware.h>
+ #include <asm/mach-types.h>
+ #include <asm/mach/arch.h>
+ /* SCIFA0 */
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xe6c40000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { evt2irq(0xc00), evt2irq(0xc00),
+                           evt2irq(0xc00), evt2irq(0xc00) },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ /* SCIFA1 */
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xe6c50000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { evt2irq(0xc20), evt2irq(0xc20),
+                           evt2irq(0xc20), evt2irq(0xc20) },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ /* SCIFA2 */
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xe6c60000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { evt2irq(0xc40), evt2irq(0xc40),
+                           evt2irq(0xc40), evt2irq(0xc40) },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &scif2_platform_data,
+       },
+ };
+ /* SCIFA3 */
+ static struct plat_sci_port scif3_platform_data = {
+       .mapbase        = 0xe6c70000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { evt2irq(0xc60), evt2irq(0xc60),
+                           evt2irq(0xc60), evt2irq(0xc60) },
+ };
+ static struct platform_device scif3_device = {
+       .name           = "sh-sci",
+       .id             = 3,
+       .dev            = {
+               .platform_data  = &scif3_platform_data,
+       },
+ };
+ /* SCIFA4 */
+ static struct plat_sci_port scif4_platform_data = {
+       .mapbase        = 0xe6c80000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { evt2irq(0xd20), evt2irq(0xd20),
+                           evt2irq(0xd20), evt2irq(0xd20) },
+ };
+ static struct platform_device scif4_device = {
+       .name           = "sh-sci",
+       .id             = 4,
+       .dev            = {
+               .platform_data  = &scif4_platform_data,
+       },
+ };
+ /* SCIFA5 */
+ static struct plat_sci_port scif5_platform_data = {
+       .mapbase        = 0xe6cb0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { evt2irq(0xd40), evt2irq(0xd40),
+                           evt2irq(0xd40), evt2irq(0xd40) },
+ };
+ static struct platform_device scif5_device = {
+       .name           = "sh-sci",
+       .id             = 5,
+       .dev            = {
+               .platform_data  = &scif5_platform_data,
+       },
+ };
+ /* SCIFA6 */
+ static struct plat_sci_port scif6_platform_data = {
+       .mapbase        = 0xe6cc0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { intcs_evt2irq(0x1a80), intcs_evt2irq(0x1a80),
+                           intcs_evt2irq(0x1a80), intcs_evt2irq(0x1a80) },
+ };
+ static struct platform_device scif6_device = {
+       .name           = "sh-sci",
+       .id             = 6,
+       .dev            = {
+               .platform_data  = &scif6_platform_data,
+       },
+ };
+ /* SCIFB */
+ static struct plat_sci_port scif7_platform_data = {
+       .mapbase        = 0xe6c30000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { evt2irq(0xd60), evt2irq(0xd60),
+                           evt2irq(0xd60), evt2irq(0xd60) },
+ };
+ static struct platform_device scif7_device = {
+       .name           = "sh-sci",
+       .id             = 7,
+       .dev            = {
+               .platform_data  = &scif7_platform_data,
+       },
+ };
+ static struct sh_timer_config cmt10_platform_data = {
+       .name = "CMT10",
+       .channel_offset = 0x10,
+       .timer_bit = 0,
+       .clockevent_rating = 125,
+       .clocksource_rating = 125,
+ };
+ static struct resource cmt10_resources[] = {
+       [0] = {
+               .name   = "CMT10",
+               .start  = 0xe6138010,
+               .end    = 0xe613801b,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = evt2irq(0xb00), /* CMT1_CMT10 */
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device cmt10_device = {
+       .name           = "sh_cmt",
+       .id             = 10,
+       .dev = {
+               .platform_data  = &cmt10_platform_data,
+       },
+       .resource       = cmt10_resources,
+       .num_resources  = ARRAY_SIZE(cmt10_resources),
+ };
+ static struct platform_device *sh7377_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &scif5_device,
+       &scif6_device,
+       &scif7_device,
+       &cmt10_device,
+ };
+ void __init sh7377_add_standard_devices(void)
+ {
+       platform_add_devices(sh7377_early_devices,
+                           ARRAY_SIZE(sh7377_early_devices));
+ }
+ #define SMSTPCR3 0xe615013c
+ #define SMSTPCR3_CMT1 (1 << 29)
+ void __init sh7377_add_early_devices(void)
+ {
+       /* enable clock to CMT1 */
+       __raw_writel(__raw_readl(SMSTPCR3) & ~SMSTPCR3_CMT1, SMSTPCR3);
+       early_platform_add_devices(sh7377_early_devices,
+                                  ARRAY_SIZE(sh7377_early_devices));
+ }
index 0000000,f1eff8b..685c40a
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,412 +1,430 @@@
+ /*
+  * sh73a0 processor support
+  *
+  * Copyright (C) 2010  Takashi Yoshii
+  * Copyright (C) 2010  Magnus Damm
+  * Copyright (C) 2008  Yoshihiro Shimoda
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+  * the Free Software Foundation; version 2 of the License.
+  *
+  * This program is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  * GNU General Public License for more details.
+  *
+  * You should have received a copy of the GNU General Public License
+  * along with this program; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+  */
+ #include <linux/kernel.h>
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+ #include <linux/irq.h>
+ #include <linux/platform_device.h>
+ #include <linux/delay.h>
+ #include <linux/input.h>
+ #include <linux/io.h>
+ #include <linux/serial_sci.h>
+ #include <linux/sh_intc.h>
+ #include <linux/sh_timer.h>
+ #include <mach/hardware.h>
+ #include <asm/mach-types.h>
+ #include <asm/mach/arch.h>
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xe6c40000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFA,
+       .irqs           = { gic_spi(72), gic_spi(72),
+                           gic_spi(72), gic_spi(72) },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xe6c50000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFA,
+       .irqs           = { gic_spi(73), gic_spi(73),
+                           gic_spi(73), gic_spi(73) },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xe6c60000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFA,
+       .irqs           = { gic_spi(74), gic_spi(74),
+                           gic_spi(74), gic_spi(74) },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &scif2_platform_data,
+       },
+ };
+ static struct plat_sci_port scif3_platform_data = {
+       .mapbase        = 0xe6c70000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFA,
+       .irqs           = { gic_spi(75), gic_spi(75),
+                           gic_spi(75), gic_spi(75) },
+ };
+ static struct platform_device scif3_device = {
+       .name           = "sh-sci",
+       .id             = 3,
+       .dev            = {
+               .platform_data  = &scif3_platform_data,
+       },
+ };
+ static struct plat_sci_port scif4_platform_data = {
+       .mapbase        = 0xe6c80000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFA,
+       .irqs           = { gic_spi(78), gic_spi(78),
+                           gic_spi(78), gic_spi(78) },
+ };
+ static struct platform_device scif4_device = {
+       .name           = "sh-sci",
+       .id             = 4,
+       .dev            = {
+               .platform_data  = &scif4_platform_data,
+       },
+ };
+ static struct plat_sci_port scif5_platform_data = {
+       .mapbase        = 0xe6cb0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFA,
+       .irqs           = { gic_spi(79), gic_spi(79),
+                           gic_spi(79), gic_spi(79) },
+ };
+ static struct platform_device scif5_device = {
+       .name           = "sh-sci",
+       .id             = 5,
+       .dev            = {
+               .platform_data  = &scif5_platform_data,
+       },
+ };
+ static struct plat_sci_port scif6_platform_data = {
+       .mapbase        = 0xe6cc0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFA,
+       .irqs           = { gic_spi(156), gic_spi(156),
+                           gic_spi(156), gic_spi(156) },
+ };
+ static struct platform_device scif6_device = {
+       .name           = "sh-sci",
+       .id             = 6,
+       .dev            = {
+               .platform_data  = &scif6_platform_data,
+       },
+ };
+ static struct plat_sci_port scif7_platform_data = {
+       .mapbase        = 0xe6cd0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFA,
+       .irqs           = { gic_spi(143), gic_spi(143),
+                           gic_spi(143), gic_spi(143) },
+ };
+ static struct platform_device scif7_device = {
+       .name           = "sh-sci",
+       .id             = 7,
+       .dev            = {
+               .platform_data  = &scif7_platform_data,
+       },
+ };
+ static struct plat_sci_port scif8_platform_data = {
+       .mapbase        = 0xe6c30000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIFB,
+       .irqs           = { gic_spi(80), gic_spi(80),
+                           gic_spi(80), gic_spi(80) },
+ };
+ static struct platform_device scif8_device = {
+       .name           = "sh-sci",
+       .id             = 8,
+       .dev            = {
+               .platform_data  = &scif8_platform_data,
+       },
+ };
+ static struct sh_timer_config cmt10_platform_data = {
+       .name = "CMT10",
+       .channel_offset = 0x10,
+       .timer_bit = 0,
+       .clockevent_rating = 125,
+       .clocksource_rating = 125,
+ };
+ static struct resource cmt10_resources[] = {
+       [0] = {
+               .name   = "CMT10",
+               .start  = 0xe6138010,
+               .end    = 0xe613801b,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = gic_spi(65),
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device cmt10_device = {
+       .name           = "sh_cmt",
+       .id             = 10,
+       .dev = {
+               .platform_data  = &cmt10_platform_data,
+       },
+       .resource       = cmt10_resources,
+       .num_resources  = ARRAY_SIZE(cmt10_resources),
+ };
+ /* TMU */
+ static struct sh_timer_config tmu00_platform_data = {
+       .name = "TMU00",
+       .channel_offset = 0x4,
+       .timer_bit = 0,
+       .clockevent_rating = 200,
+ };
+ static struct resource tmu00_resources[] = {
+       [0] = {
+               .name   = "TMU00",
+               .start  = 0xfff60008,
+               .end    = 0xfff60013,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = intcs_evt2irq(0x0e80), /* TMU0_TUNI00 */
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device tmu00_device = {
+       .name           = "sh_tmu",
+       .id             = 0,
+       .dev = {
+               .platform_data  = &tmu00_platform_data,
+       },
+       .resource       = tmu00_resources,
+       .num_resources  = ARRAY_SIZE(tmu00_resources),
+ };
+ static struct sh_timer_config tmu01_platform_data = {
+       .name = "TMU01",
+       .channel_offset = 0x10,
+       .timer_bit = 1,
+       .clocksource_rating = 200,
+ };
+ static struct resource tmu01_resources[] = {
+       [0] = {
+               .name   = "TMU01",
+               .start  = 0xfff60014,
+               .end    = 0xfff6001f,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = intcs_evt2irq(0x0ea0), /* TMU0_TUNI01 */
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device tmu01_device = {
+       .name           = "sh_tmu",
+       .id             = 1,
+       .dev = {
+               .platform_data  = &tmu01_platform_data,
+       },
+       .resource       = tmu01_resources,
+       .num_resources  = ARRAY_SIZE(tmu01_resources),
+ };
+ static struct resource i2c0_resources[] = {
+       [0] = {
+               .name   = "IIC0",
+               .start  = 0xe6820000,
+               .end    = 0xe6820425 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = gic_spi(167),
+               .end    = gic_spi(170),
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct resource i2c1_resources[] = {
+       [0] = {
+               .name   = "IIC1",
+               .start  = 0xe6822000,
+               .end    = 0xe6822425 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = gic_spi(51),
+               .end    = gic_spi(54),
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct resource i2c2_resources[] = {
+       [0] = {
+               .name   = "IIC2",
+               .start  = 0xe6824000,
+               .end    = 0xe6824425 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = gic_spi(171),
+               .end    = gic_spi(174),
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct resource i2c3_resources[] = {
+       [0] = {
+               .name   = "IIC3",
+               .start  = 0xe6826000,
+               .end    = 0xe6826425 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = gic_spi(183),
+               .end    = gic_spi(186),
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct resource i2c4_resources[] = {
+       [0] = {
+               .name   = "IIC4",
+               .start  = 0xe6828000,
+               .end    = 0xe6828425 - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = gic_spi(187),
+               .end    = gic_spi(190),
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device i2c0_device = {
+       .name           = "i2c-sh_mobile",
+       .id             = 0,
+       .resource       = i2c0_resources,
+       .num_resources  = ARRAY_SIZE(i2c0_resources),
+ };
+ static struct platform_device i2c1_device = {
+       .name           = "i2c-sh_mobile",
+       .id             = 1,
+       .resource       = i2c1_resources,
+       .num_resources  = ARRAY_SIZE(i2c1_resources),
+ };
+ static struct platform_device i2c2_device = {
+       .name           = "i2c-sh_mobile",
+       .id             = 2,
+       .resource       = i2c2_resources,
+       .num_resources  = ARRAY_SIZE(i2c2_resources),
+ };
+ static struct platform_device i2c3_device = {
+       .name           = "i2c-sh_mobile",
+       .id             = 3,
+       .resource       = i2c3_resources,
+       .num_resources  = ARRAY_SIZE(i2c3_resources),
+ };
+ static struct platform_device i2c4_device = {
+       .name           = "i2c-sh_mobile",
+       .id             = 4,
+       .resource       = i2c4_resources,
+       .num_resources  = ARRAY_SIZE(i2c4_resources),
+ };
+ static struct platform_device *sh73a0_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &scif5_device,
+       &scif6_device,
+       &scif7_device,
+       &scif8_device,
+       &cmt10_device,
+       &tmu00_device,
+       &tmu01_device,
+ };
+ static struct platform_device *sh73a0_late_devices[] __initdata = {
+       &i2c0_device,
+       &i2c1_device,
+       &i2c2_device,
+       &i2c3_device,
+       &i2c4_device,
+ };
+ void __init sh73a0_add_standard_devices(void)
+ {
+       platform_add_devices(sh73a0_early_devices,
+                           ARRAY_SIZE(sh73a0_early_devices));
+       platform_add_devices(sh73a0_late_devices,
+                           ARRAY_SIZE(sh73a0_late_devices));
+ }
+ void __init sh73a0_add_early_devices(void)
+ {
+       early_platform_add_devices(sh73a0_early_devices,
+                                  ARRAY_SIZE(sh73a0_early_devices));
+ }
@@@ -59,38 -59,48 +59,54 @@@ static struct intc_prio_reg prio_regist
  static DECLARE_INTC_DESC(intc_desc, "sh7619", vectors, NULL,
                         NULL, prio_registers, NULL);
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xf8400000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 88, 88, 88, 88 },
-       }, {
-               .mapbase        = 0xf8410000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 92, 92, 92, 92 },
-       }, {
-               .mapbase        = 0xf8420000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 96, 96, 96, 96 },
-       }, {
-               .flags = 0,
-       }
- };
- static struct platform_device sci_device = {
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xf8400000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 88, 88, 88, 88 },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xf8410000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 92, 92, 92, 92 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xf8420000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 96, 96, 96, 96 },
+ };
+ static struct platform_device scif2_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 2,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif2_platform_data,
        },
  };
  
@@@ -118,17 -128,14 +134,14 @@@ static struct platform_device eth_devic
  };
  
  static struct sh_timer_config cmt0_platform_data = {
-       .name = "CMT0",
        .channel_offset = 0x02,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 125,
        .clocksource_rating = 0, /* disabled due to code generation issues */
  };
  
  static struct resource cmt0_resources[] = {
        [0] = {
-               .name   = "CMT0",
                .start  = 0xf84a0072,
                .end    = 0xf84a0077,
                .flags  = IORESOURCE_MEM,
@@@ -150,17 -157,14 +163,14 @@@ static struct platform_device cmt0_devi
  };
  
  static struct sh_timer_config cmt1_platform_data = {
-       .name = "CMT1",
        .channel_offset = 0x08,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clockevent_rating = 125,
        .clocksource_rating = 0, /* disabled due to code generation issues */
  };
  
  static struct resource cmt1_resources[] = {
        [0] = {
-               .name   = "CMT1",
                .start  = 0xf84a0078,
                .end    = 0xf84a007d,
                .flags  = IORESOURCE_MEM,
@@@ -182,7 -186,9 +192,9 @@@ static struct platform_device cmt1_devi
  };
  
  static struct platform_device *sh7619_devices[] __initdata = {
-       &sci_device,
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
        &eth_device,
        &cmt0_device,
        &cmt1_device,
@@@ -193,7 -199,7 +205,7 @@@ static int __init sh7619_devices_setup(
        return platform_add_devices(sh7619_devices,
                                    ARRAY_SIZE(sh7619_devices));
  }
__initcall(sh7619_devices_setup);
arch_initcall(sh7619_devices_setup);
  
  void __init plat_irq_setup(void)
  {
  }
  
  static struct platform_device *sh7619_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
        &cmt0_device,
        &cmt1_device,
  };
@@@ -115,16 -115,13 +115,13 @@@ static DECLARE_INTC_DESC(intc_desc, "mx
                         mask_registers, prio_registers, NULL);
  
  static struct sh_timer_config mtu2_0_platform_data = {
-       .name = "MTU2_0",
        .channel_offset = -0x80,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource mtu2_0_resources[] = {
        [0] = {
-               .name   = "MTU2_0",
                .start  = 0xff801300,
                .end    = 0xff801326,
                .flags  = IORESOURCE_MEM,
@@@ -146,16 -143,13 +143,13 @@@ static struct platform_device mtu2_0_de
  };
  
  static struct sh_timer_config mtu2_1_platform_data = {
-       .name = "MTU2_1",
        .channel_offset = -0x100,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource mtu2_1_resources[] = {
        [0] = {
-               .name   = "MTU2_1",
                .start  = 0xff801380,
                .end    = 0xff801390,
                .flags  = IORESOURCE_MEM,
@@@ -177,16 -171,13 +171,13 @@@ static struct platform_device mtu2_1_de
  };
  
  static struct sh_timer_config mtu2_2_platform_data = {
-       .name = "MTU2_2",
        .channel_offset = 0x80,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource mtu2_2_resources[] = {
        [0] = {
-               .name   = "MTU2_2",
                .start  = 0xff801000,
                .end    = 0xff80100a,
                .flags  = IORESOURCE_MEM,
@@@ -207,29 -198,23 +198,25 @@@ static struct platform_device mtu2_2_de
        .num_resources  = ARRAY_SIZE(mtu2_2_resources),
  };
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xff804000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 220, 220, 220, 220 },
-       }, {
-               .flags = 0,
-       }
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xff804000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 220, 220, 220, 220 },
  };
  
- static struct platform_device sci_device = {
+ static struct platform_device scif0_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 0,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif0_platform_data,
        },
  };
  
  static struct platform_device *mxg_devices[] __initdata = {
-       &sci_device,
+       &scif0_device,
        &mtu2_0_device,
        &mtu2_1_device,
        &mtu2_2_device,
@@@ -240,7 -225,7 +227,7 @@@ static int __init mxg_devices_setup(voi
        return platform_add_devices(mxg_devices,
                                    ARRAY_SIZE(mxg_devices));
  }
__initcall(mxg_devices_setup);
arch_initcall(mxg_devices_setup);
  
  void __init plat_irq_setup(void)
  {
  }
  
  static struct platform_device *mxg_early_devices[] __initdata = {
+       &scif0_device,
        &mtu2_0_device,
        &mtu2_1_device,
        &mtu2_2_device,
@@@ -177,73 -177,123 +177,139 @@@ static struct intc_mask_reg mask_regist
  static DECLARE_INTC_DESC(intc_desc, "sh7201", vectors, groups,
                         mask_registers, prio_registers, NULL);
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xfffe8000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 180, 180, 180, 180 }
-       }, {
-               .mapbase        = 0xfffe8800,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 184, 184, 184, 184 }
-       }, {
-               .mapbase        = 0xfffe9000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 188, 188, 188, 188 }
-       }, {
-               .mapbase        = 0xfffe9800,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 192, 192, 192, 192 }
-       }, {
-               .mapbase        = 0xfffea000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 196, 196, 196, 196 }
-       }, {
-               .mapbase        = 0xfffea800,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 200, 200, 200, 200 }
-       }, {
-               .mapbase        = 0xfffeb000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 204, 204, 204, 204 }
-       }, {
-               .mapbase        = 0xfffeb800,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 208, 208, 208, 208 }
-       }, {
-               .flags = 0,
-       }
- };
- static struct platform_device sci_device = {
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xfffe8000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 180, 180, 180, 180 }
+ };
+ static struct platform_device scif0_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xfffe8800,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 184, 184, 184, 184 }
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xfffe9000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 188, 188, 188, 188 }
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &scif2_platform_data,
+       },
+ };
+ static struct plat_sci_port scif3_platform_data = {
+       .mapbase        = 0xfffe9800,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 192, 192, 192, 192 }
+ };
+ static struct platform_device scif3_device = {
+       .name           = "sh-sci",
+       .id             = 3,
+       .dev            = {
+               .platform_data  = &scif3_platform_data,
+       },
+ };
+ static struct plat_sci_port scif4_platform_data = {
+       .mapbase        = 0xfffea000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 196, 196, 196, 196 }
+ };
+ static struct platform_device scif4_device = {
+       .name           = "sh-sci",
+       .id             = 4,
+       .dev            = {
+               .platform_data  = &scif4_platform_data,
+       },
+ };
+ static struct plat_sci_port scif5_platform_data = {
+       .mapbase        = 0xfffea800,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 200, 200, 200, 200 }
+ };
+ static struct platform_device scif5_device = {
+       .name           = "sh-sci",
+       .id             = 5,
+       .dev            = {
+               .platform_data  = &scif5_platform_data,
+       },
+ };
+ static struct plat_sci_port scif6_platform_data = {
+       .mapbase        = 0xfffeb000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 204, 204, 204, 204 }
+ };
+ static struct platform_device scif6_device = {
+       .name           = "sh-sci",
+       .id             = 6,
+       .dev            = {
+               .platform_data  = &scif6_platform_data,
+       },
+ };
+ static struct plat_sci_port scif7_platform_data = {
+       .mapbase        = 0xfffeb800,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 208, 208, 208, 208 }
+ };
+ static struct platform_device scif7_device = {
+       .name           = "sh-sci",
+       .id             = 7,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif7_platform_data,
        },
  };
  
@@@ -268,16 -318,13 +334,13 @@@ static struct platform_device rtc_devic
  };
  
  static struct sh_timer_config mtu2_0_platform_data = {
-       .name = "MTU2_0",
        .channel_offset = -0x80,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource mtu2_0_resources[] = {
        [0] = {
-               .name   = "MTU2_0",
                .start  = 0xfffe4300,
                .end    = 0xfffe4326,
                .flags  = IORESOURCE_MEM,
@@@ -299,16 -346,13 +362,13 @@@ static struct platform_device mtu2_0_de
  };
  
  static struct sh_timer_config mtu2_1_platform_data = {
-       .name = "MTU2_1",
        .channel_offset = -0x100,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource mtu2_1_resources[] = {
        [0] = {
-               .name   = "MTU2_1",
                .start  = 0xfffe4380,
                .end    = 0xfffe4390,
                .flags  = IORESOURCE_MEM,
@@@ -330,16 -374,13 +390,13 @@@ static struct platform_device mtu2_1_de
  };
  
  static struct sh_timer_config mtu2_2_platform_data = {
-       .name = "MTU2_2",
        .channel_offset = 0x80,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource mtu2_2_resources[] = {
        [0] = {
-               .name   = "MTU2_2",
                .start  = 0xfffe4000,
                .end    = 0xfffe400a,
                .flags  = IORESOURCE_MEM,
@@@ -361,7 -402,14 +418,14 @@@ static struct platform_device mtu2_2_de
  };
  
  static struct platform_device *sh7201_devices[] __initdata = {
-       &sci_device,
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &scif5_device,
+       &scif6_device,
+       &scif7_device,
        &rtc_device,
        &mtu2_0_device,
        &mtu2_1_device,
@@@ -373,7 -421,7 +437,7 @@@ static int __init sh7201_devices_setup(
        return platform_add_devices(sh7201_devices,
                                    ARRAY_SIZE(sh7201_devices));
  }
__initcall(sh7201_devices_setup);
arch_initcall(sh7201_devices_setup);
  
  void __init plat_irq_setup(void)
  {
  }
  
  static struct platform_device *sh7201_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &scif5_device,
+       &scif6_device,
+       &scif7_device,
        &mtu2_0_device,
        &mtu2_1_device,
        &mtu2_2_device,
@@@ -173,60 -173,75 +173,83 @@@ static struct intc_mask_reg mask_regist
  static DECLARE_INTC_DESC(intc_desc, "sh7203", vectors, groups,
                         mask_registers, prio_registers, NULL);
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xfffe8000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           =  { 192, 192, 192, 192 },
-       }, {
-               .mapbase        = 0xfffe8800,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           =  { 196, 196, 196, 196 },
-       }, {
-               .mapbase        = 0xfffe9000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           =  { 200, 200, 200, 200 },
-       }, {
-               .mapbase        = 0xfffe9800,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           =  { 204, 204, 204, 204 },
-       }, {
-               .flags = 0,
-       }
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xfffe8000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           =  { 192, 192, 192, 192 },
  };
  
- static struct platform_device sci_device = {
+ static struct platform_device scif0_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xfffe8800,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           =  { 196, 196, 196, 196 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xfffe9000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           =  { 200, 200, 200, 200 },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &scif2_platform_data,
+       },
+ };
+ static struct plat_sci_port scif3_platform_data = {
+       .mapbase        = 0xfffe9800,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           =  { 204, 204, 204, 204 },
+ };
+ static struct platform_device scif3_device = {
+       .name           = "sh-sci",
+       .id             = 3,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif3_platform_data,
        },
  };
  
  static struct sh_timer_config cmt0_platform_data = {
-       .name = "CMT0",
        .channel_offset = 0x02,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 125,
        .clocksource_rating = 0, /* disabled due to code generation issues */
  };
  
  static struct resource cmt0_resources[] = {
        [0] = {
-               .name   = "CMT0",
                .start  = 0xfffec002,
                .end    = 0xfffec007,
                .flags  = IORESOURCE_MEM,
@@@ -248,17 -263,14 +271,14 @@@ static struct platform_device cmt0_devi
  };
  
  static struct sh_timer_config cmt1_platform_data = {
-       .name = "CMT1",
        .channel_offset = 0x08,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clockevent_rating = 125,
        .clocksource_rating = 0, /* disabled due to code generation issues */
  };
  
  static struct resource cmt1_resources[] = {
        [0] = {
-               .name   = "CMT1",
                .start  = 0xfffec008,
                .end    = 0xfffec00d,
                .flags  = IORESOURCE_MEM,
@@@ -280,16 -292,13 +300,13 @@@ static struct platform_device cmt1_devi
  };
  
  static struct sh_timer_config mtu2_0_platform_data = {
-       .name = "MTU2_0",
        .channel_offset = -0x80,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource mtu2_0_resources[] = {
        [0] = {
-               .name   = "MTU2_0",
                .start  = 0xfffe4300,
                .end    = 0xfffe4326,
                .flags  = IORESOURCE_MEM,
@@@ -311,16 -320,13 +328,13 @@@ static struct platform_device mtu2_0_de
  };
  
  static struct sh_timer_config mtu2_1_platform_data = {
-       .name = "MTU2_1",
        .channel_offset = -0x100,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource mtu2_1_resources[] = {
        [0] = {
-               .name   = "MTU2_1",
                .start  = 0xfffe4380,
                .end    = 0xfffe4390,
                .flags  = IORESOURCE_MEM,
@@@ -362,7 -368,10 +376,10 @@@ static struct platform_device rtc_devic
  };
  
  static struct platform_device *sh7203_devices[] __initdata = {
-       &sci_device,
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
        &cmt0_device,
        &cmt1_device,
        &mtu2_0_device,
@@@ -375,7 -384,7 +392,7 @@@ static int __init sh7203_devices_setup(
        return platform_add_devices(sh7203_devices,
                                    ARRAY_SIZE(sh7203_devices));
  }
__initcall(sh7203_devices_setup);
arch_initcall(sh7203_devices_setup);
  
  void __init plat_irq_setup(void)
  {
  }
  
  static struct platform_device *sh7203_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
        &cmt0_device,
        &cmt1_device,
        &mtu2_0_device,
@@@ -133,60 -133,75 +133,83 @@@ static struct intc_mask_reg mask_regist
  static DECLARE_INTC_DESC(intc_desc, "sh7206", vectors, groups,
                         mask_registers, prio_registers, NULL);
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xfffe8000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 240, 240, 240, 240 },
-       }, {
-               .mapbase        = 0xfffe8800,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 244, 244, 244, 244 },
-       }, {
-               .mapbase        = 0xfffe9000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 248, 248, 248, 248 },
-       }, {
-               .mapbase        = 0xfffe9800,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 252, 252, 252, 252 },
-       }, {
-               .flags = 0,
-       }
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xfffe8000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 240, 240, 240, 240 },
  };
  
- static struct platform_device sci_device = {
+ static struct platform_device scif0_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xfffe8800,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 244, 244, 244, 244 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xfffe9000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 248, 248, 248, 248 },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &scif2_platform_data,
+       },
+ };
+ static struct plat_sci_port scif3_platform_data = {
+       .mapbase        = 0xfffe9800,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 252, 252, 252, 252 },
+ };
+ static struct platform_device scif3_device = {
+       .name           = "sh-sci",
+       .id             = 3,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif3_platform_data,
        },
  };
  
  static struct sh_timer_config cmt0_platform_data = {
-       .name = "CMT0",
        .channel_offset = 0x02,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 125,
        .clocksource_rating = 0, /* disabled due to code generation issues */
  };
  
  static struct resource cmt0_resources[] = {
        [0] = {
-               .name   = "CMT0",
                .start  = 0xfffec002,
                .end    = 0xfffec007,
                .flags  = IORESOURCE_MEM,
@@@ -208,17 -223,14 +231,14 @@@ static struct platform_device cmt0_devi
  };
  
  static struct sh_timer_config cmt1_platform_data = {
-       .name = "CMT1",
        .channel_offset = 0x08,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clockevent_rating = 125,
        .clocksource_rating = 0, /* disabled due to code generation issues */
  };
  
  static struct resource cmt1_resources[] = {
        [0] = {
-               .name   = "CMT1",
                .start  = 0xfffec008,
                .end    = 0xfffec00d,
                .flags  = IORESOURCE_MEM,
@@@ -240,16 -252,13 +260,13 @@@ static struct platform_device cmt1_devi
  };
  
  static struct sh_timer_config mtu2_0_platform_data = {
-       .name = "MTU2_0",
        .channel_offset = -0x80,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource mtu2_0_resources[] = {
        [0] = {
-               .name   = "MTU2_0",
                .start  = 0xfffe4300,
                .end    = 0xfffe4326,
                .flags  = IORESOURCE_MEM,
@@@ -271,16 -280,13 +288,13 @@@ static struct platform_device mtu2_0_de
  };
  
  static struct sh_timer_config mtu2_1_platform_data = {
-       .name = "MTU2_1",
        .channel_offset = -0x100,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource mtu2_1_resources[] = {
        [0] = {
-               .name   = "MTU2_1",
                .start  = 0xfffe4380,
                .end    = 0xfffe4390,
                .flags  = IORESOURCE_MEM,
@@@ -302,16 -308,13 +316,13 @@@ static struct platform_device mtu2_1_de
  };
  
  static struct sh_timer_config mtu2_2_platform_data = {
-       .name = "MTU2_2",
        .channel_offset = 0x80,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource mtu2_2_resources[] = {
        [0] = {
-               .name   = "MTU2_2",
                .start  = 0xfffe4000,
                .end    = 0xfffe400a,
                .flags  = IORESOURCE_MEM,
@@@ -333,7 -336,10 +344,10 @@@ static struct platform_device mtu2_2_de
  };
  
  static struct platform_device *sh7206_devices[] __initdata = {
-       &sci_device,
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
        &cmt0_device,
        &cmt1_device,
        &mtu2_0_device,
@@@ -346,7 -352,7 +360,7 @@@ static int __init sh7206_devices_setup(
        return platform_add_devices(sh7206_devices,
                                    ARRAY_SIZE(sh7206_devices));
  }
__initcall(sh7206_devices_setup);
arch_initcall(sh7206_devices_setup);
  
  void __init plat_irq_setup(void)
  {
  }
  
  static struct platform_device *sh7206_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
        &cmt0_device,
        &cmt1_device,
        &mtu2_0_device,
@@@ -67,32 -67,33 +67,38 @@@ static struct intc_prio_reg prio_regist
  static DECLARE_INTC_DESC(intc_desc, "sh7705", vectors, NULL,
                         NULL, prio_registers, NULL);
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xa4410000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_TIE | SCSCR_RIE  | SCSCR_TE |
-                                 SCSCR_RE  | SCSCR_CKE1 | SCSCR_CKE0,
-               .scbrr_algo_id  = SCBRR_ALGO_4,
-               .type           = PORT_SCIF,
-               .irqs           = { 56, 56, 56 },
-       }, {
-               .mapbase        = 0xa4400000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_TIE | SCSCR_RIE | SCSCR_TE | SCSCR_RE,
-               .scbrr_algo_id  = SCBRR_ALGO_4,
-               .type           = PORT_SCIF,
-               .irqs           = { 52, 52, 52 },
-       }, {
-               .flags = 0,
-       }
- };
- static struct platform_device sci_device = {
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xa4410000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_TIE | SCSCR_RIE  | SCSCR_TE |
++                        SCSCR_RE  | SCSCR_CKE1 | SCSCR_CKE0,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { 56, 56, 56 },
+ };
+ static struct platform_device scif0_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xa4400000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_TIE | SCSCR_RIE | SCSCR_TE | SCSCR_RE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { 52, 52, 52 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif1_platform_data,
        },
  };
  
@@@ -123,16 -124,13 +129,13 @@@ static struct platform_device rtc_devic
  };
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x02,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xfffffe94,
                .end    = 0xfffffe9f,
                .flags  = IORESOURCE_MEM,
@@@ -154,16 -152,13 +157,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0xe,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xfffffea0,
                .end    = 0xfffffeab,
                .flags  = IORESOURCE_MEM,
@@@ -185,15 -180,12 +185,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1a,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xfffffeac,
                .end    = 0xfffffebb,
                .flags  = IORESOURCE_MEM,
@@@ -215,10 -207,11 +212,11 @@@ static struct platform_device tmu2_devi
  };
  
  static struct platform_device *sh7705_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
-       &sci_device,
        &rtc_device,
  };
  
@@@ -227,9 -220,11 +225,11 @@@ static int __init sh7705_devices_setup(
        return platform_add_devices(sh7705_devices,
                                    ARRAY_SIZE(sh7705_devices));
  }
__initcall(sh7705_devices_setup);
arch_initcall(sh7705_devices_setup);
  
  static struct platform_device *sh7705_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
@@@ -106,62 -106,64 +106,70 @@@ static struct platform_device rtc_devic
        .resource       = rtc_resources,
  };
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xfffffe80,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_TE | SCSCR_RE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCI,
-               .irqs           = { 23, 23, 23, 0 },
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xfffffe80,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_TE | SCSCR_RE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCI,
+       .irqs           = { 23, 23, 23, 0 },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
        },
+ };
  #if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
      defined(CONFIG_CPU_SUBTYPE_SH7707) || \
      defined(CONFIG_CPU_SUBTYPE_SH7709)
-       {
-               .mapbase        = 0xa4000150,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_TE | SCSCR_RE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 56, 56, 56, 56 },
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xa4000150,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_TE | SCSCR_RE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 56, 56, 56, 56 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
        },
+ };
  #endif
  #if defined(CONFIG_CPU_SUBTYPE_SH7707) || \
      defined(CONFIG_CPU_SUBTYPE_SH7709)
-       {
-               .mapbase        = 0xa4000140,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_TE | SCSCR_RE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_IRDA,
-               .irqs           = { 52, 52, 52, 52 },
-       },
- #endif
-       {
-               .flags = 0,
-       }
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xa4000140,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_TE | SCSCR_RE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_IRDA,
+       .irqs           = { 52, 52, 52, 52 },
  };
  
- static struct platform_device sci_device = {
+ static struct platform_device scif2_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 2,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif2_platform_data,
        },
  };
+ #endif
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x02,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xfffffe94,
                .end    = 0xfffffe9f,
                .flags  = IORESOURCE_MEM,
@@@ -183,16 -185,13 +191,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0xe,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xfffffea0,
                .end    = 0xfffffeab,
                .flags  = IORESOURCE_MEM,
@@@ -214,15 -213,12 +219,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1a,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xfffffeac,
                .end    = 0xfffffebb,
                .flags  = IORESOURCE_MEM,
@@@ -244,10 -240,19 +246,19 @@@ static struct platform_device tmu2_devi
  };
  
  static struct platform_device *sh770x_devices[] __initdata = {
+       &scif0_device,
+ #if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
+     defined(CONFIG_CPU_SUBTYPE_SH7707) || \
+     defined(CONFIG_CPU_SUBTYPE_SH7709)
+       &scif1_device,
+ #endif
+ #if defined(CONFIG_CPU_SUBTYPE_SH7707) || \
+     defined(CONFIG_CPU_SUBTYPE_SH7709)
+       &scif2_device,
+ #endif
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
-       &sci_device,
        &rtc_device,
  };
  
@@@ -256,9 -261,19 +267,19 @@@ static int __init sh770x_devices_setup(
        return platform_add_devices(sh770x_devices,
                ARRAY_SIZE(sh770x_devices));
  }
__initcall(sh770x_devices_setup);
arch_initcall(sh770x_devices_setup);
  
  static struct platform_device *sh770x_early_devices[] __initdata = {
+       &scif0_device,
+ #if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
+     defined(CONFIG_CPU_SUBTYPE_SH7707) || \
+     defined(CONFIG_CPU_SUBTYPE_SH7709)
+       &scif1_device,
+ #endif
+ #if defined(CONFIG_CPU_SUBTYPE_SH7707) || \
+     defined(CONFIG_CPU_SUBTYPE_SH7709)
+       &scif2_device,
+ #endif
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
@@@ -96,48 -96,44 +96,50 @@@ static struct platform_device rtc_devic
        },
  };
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xa4400000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_TE | SCSCR_RE | SCSCR_REIE |
-                                 SCSCR_CKE1 | SCSCR_CKE0,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 52, 52, 52, 52 },
-       }, {
-               .mapbase        = 0xa4410000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_TE | SCSCR_RE | SCSCR_REIE |
-                                 SCSCR_CKE1 | SCSCR_CKE0,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 56, 56, 56, 56 },
-       }, {
-               .flags = 0,
-       }
- };
- static struct platform_device sci_device = {
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xa4400000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_TE | SCSCR_RE | SCSCR_REIE |
++                        SCSCR_CKE1 | SCSCR_CKE0,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 52, 52, 52, 52 },
+ };
+ static struct platform_device scif0_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xa4410000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_TE | SCSCR_RE | SCSCR_REIE |
++                        SCSCR_CKE1 | SCSCR_CKE0,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 56, 56, 56, 56 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif1_platform_data,
        },
  };
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x02,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xa412fe94,
                .end    = 0xa412fe9f,
                .flags  = IORESOURCE_MEM,
@@@ -159,16 -155,13 +161,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0xe,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xa412fea0,
                .end    = 0xa412feab,
                .flags  = IORESOURCE_MEM,
@@@ -190,15 -183,12 +189,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1a,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xa412feac,
                .end    = 0xa412feb5,
                .flags  = IORESOURCE_MEM,
@@@ -220,10 -210,11 +216,11 @@@ static struct platform_device tmu2_devi
  };
  
  static struct platform_device *sh7710_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
-       &sci_device,
        &rtc_device,
  };
  
@@@ -232,9 -223,11 +229,11 @@@ static int __init sh7710_devices_setup(
        return platform_add_devices(sh7710_devices,
                                    ARRAY_SIZE(sh7710_devices));
  }
__initcall(sh7710_devices_setup);
arch_initcall(sh7710_devices_setup);
  
  static struct platform_device *sh7710_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
@@@ -1,5 -1,5 +1,5 @@@
  /*
 - * SH7720 Setup
 + * Setup code for SH7720, SH7721.
   *
   *  Copyright (C) 2007  Markus Brunner, Mark Jonas
   *  Copyright (C) 2009  Paul Mundt
@@@ -48,31 -48,33 +48,37 @@@ static struct platform_device rtc_devic
        },
  };
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xa4430000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE,
-               .scbrr_algo_id  = SCBRR_ALGO_4,
-               .type           = PORT_SCIF,
-               .irqs           = { 80, 80, 80, 80 },
-       }, {
-               .mapbase        = 0xa4438000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE,
-               .scbrr_algo_id  = SCBRR_ALGO_4,
-               .type           = PORT_SCIF,
-               .irqs           = { 81, 81, 81, 81 },
-       }, {
-               .flags = 0,
-       }
- };
- static struct platform_device sci_device = {
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xa4430000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { 80, 80, 80, 80 },
+ };
+ static struct platform_device scif0_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xa4438000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_4,
+       .type           = PORT_SCIF,
+       .irqs           = { 81, 81, 81, 81 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif1_platform_data,
        },
  };
  
@@@ -128,17 -130,14 +134,14 @@@ static struct platform_device usbf_devi
  };
  
  static struct sh_timer_config cmt0_platform_data = {
-       .name = "CMT0",
        .channel_offset = 0x10,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 125,
        .clocksource_rating = 125,
  };
  
  static struct resource cmt0_resources[] = {
        [0] = {
-               .name   = "CMT0",
                .start  = 0x044a0010,
                .end    = 0x044a001b,
                .flags  = IORESOURCE_MEM,
@@@ -160,15 -159,12 +163,12 @@@ static struct platform_device cmt0_devi
  };
  
  static struct sh_timer_config cmt1_platform_data = {
-       .name = "CMT1",
        .channel_offset = 0x20,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
  };
  
  static struct resource cmt1_resources[] = {
        [0] = {
-               .name   = "CMT1",
                .start  = 0x044a0020,
                .end    = 0x044a002b,
                .flags  = IORESOURCE_MEM,
@@@ -190,15 -186,12 +190,12 @@@ static struct platform_device cmt1_devi
  };
  
  static struct sh_timer_config cmt2_platform_data = {
-       .name = "CMT2",
        .channel_offset = 0x30,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource cmt2_resources[] = {
        [0] = {
-               .name   = "CMT2",
                .start  = 0x044a0030,
                .end    = 0x044a003b,
                .flags  = IORESOURCE_MEM,
@@@ -220,15 -213,12 +217,12 @@@ static struct platform_device cmt2_devi
  };
  
  static struct sh_timer_config cmt3_platform_data = {
-       .name = "CMT3",
        .channel_offset = 0x40,
        .timer_bit = 3,
-       .clk = "peripheral_clk",
  };
  
  static struct resource cmt3_resources[] = {
        [0] = {
-               .name   = "CMT3",
                .start  = 0x044a0040,
                .end    = 0x044a004b,
                .flags  = IORESOURCE_MEM,
@@@ -250,15 -240,12 +244,12 @@@ static struct platform_device cmt3_devi
  };
  
  static struct sh_timer_config cmt4_platform_data = {
-       .name = "CMT4",
        .channel_offset = 0x50,
        .timer_bit = 4,
-       .clk = "peripheral_clk",
  };
  
  static struct resource cmt4_resources[] = {
        [0] = {
-               .name   = "CMT4",
                .start  = 0x044a0050,
                .end    = 0x044a005b,
                .flags  = IORESOURCE_MEM,
@@@ -280,16 -267,13 +271,13 @@@ static struct platform_device cmt4_devi
  };
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x02,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xa412fe94,
                .end    = 0xa412fe9f,
                .flags  = IORESOURCE_MEM,
@@@ -311,16 -295,13 +299,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0xe,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xa412fea0,
                .end    = 0xa412feab,
                .flags  = IORESOURCE_MEM,
@@@ -342,15 -323,12 +327,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1a,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xa412feac,
                .end    = 0xa412feb5,
                .flags  = IORESOURCE_MEM,
@@@ -372,6 -350,8 +354,8 @@@ static struct platform_device tmu2_devi
  };
  
  static struct platform_device *sh7720_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
        &cmt0_device,
        &cmt1_device,
        &cmt2_device,
        &tmu1_device,
        &tmu2_device,
        &rtc_device,
-       &sci_device,
        &usb_ohci_device,
        &usbf_device,
  };
@@@ -391,9 -370,11 +374,11 @@@ static int __init sh7720_devices_setup(
        return platform_add_devices(sh7720_devices,
                                    ARRAY_SIZE(sh7720_devices));
  }
__initcall(sh7720_devices_setup);
arch_initcall(sh7720_devices_setup);
  
  static struct platform_device *sh7720_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
        &cmt0_device,
        &cmt1_device,
        &cmt2_device,
  #include <linux/sh_timer.h>
  #include <linux/io.h>
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xffe80000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 40, 41, 43, 42 },
-       }, {
-               .flags = 0,
-       }
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xffe80000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 40, 41, 43, 42 },
  };
  
- static struct platform_device sci_device = {
+ static struct platform_device scif0_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 0,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif0_platform_data,
        },
  };
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xffd80008,
                .end    = 0xffd80013,
                .flags  = IORESOURCE_MEM,
@@@ -68,16 -59,13 +61,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xffd80014,
                .end    = 0xffd8001f,
                .flags  = IORESOURCE_MEM,
@@@ -99,15 -87,12 +89,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xffd80020,
                .end    = 0xffd8002f,
                .flags  = IORESOURCE_MEM,
@@@ -129,7 -114,7 +116,7 @@@ static struct platform_device tmu2_devi
  };
  
  static struct platform_device *sh4202_devices[] __initdata = {
-       &sci_device,
+       &scif0_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
@@@ -140,9 -125,10 +127,10 @@@ static int __init sh4202_devices_setup(
        return platform_add_devices(sh4202_devices,
                                    ARRAY_SIZE(sh4202_devices));
  }
__initcall(sh4202_devices_setup);
arch_initcall(sh4202_devices_setup);
  
  static struct platform_device *sh4202_early_devices[] __initdata = {
+       &scif0_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
@@@ -203,7 -189,7 +191,7 @@@ void __init plat_irq_setup_pins(int mod
  {
        switch (mode) {
        case IRQ_MODE_IRQ: /* individual interrupt mode for IRL3-0 */
-               ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR);
+               __raw_writew(__raw_readw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR);
                register_intc_controller(&intc_desc_irlm);
                break;
        default:
@@@ -14,7 -14,6 +14,7 @@@
  #include <linux/io.h>
  #include <linux/sh_timer.h>
  #include <linux/serial_sci.h>
 +#include <asm/machtypes.h>
  
  static struct resource rtc_resources[] = {
        [0] = {
@@@ -36,49 -35,44 +36,48 @@@ static struct platform_device rtc_devic
        .resource       = rtc_resources,
  };
  
 -static struct plat_sci_port scif0_platform_data = {
 +static struct plat_sci_port sci_platform_data = {
        .mapbase        = 0xffe00000,
        .flags          = UPF_BOOT_AUTOCONF,
-       .type           = PORT_SCI,
 +      .scscr          = SCSCR_TE | SCSCR_RE,
 +      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCI,
        .irqs           = { 23, 23, 23, 0 },
  };
  
 -static struct platform_device scif0_device = {
 +static struct platform_device sci_device = {
        .name           = "sh-sci",
+       .id             = 0,
        .dev            = {
-               .platform_data  = sci_platform_data,
 -              .platform_data  = &scif0_platform_data,
++              .platform_data  = &sci_platform_data,
        },
  };
  
 -static struct plat_sci_port scif1_platform_data = {
 +static struct plat_sci_port scif_platform_data = {
        .mapbase        = 0xffe80000,
        .flags          = UPF_BOOT_AUTOCONF,
 +      .scscr          = SCSCR_TE | SCSCR_RE | SCSCR_REIE,
 +      .scbrr_algo_id  = SCBRR_ALGO_2,
        .type           = PORT_SCIF,
        .irqs           = { 40, 40, 40, 40 },
  };
  
 -static struct platform_device scif1_device = {
 +static struct platform_device scif_device = {
        .name           = "sh-sci",
+       .id             = 1,
        .dev            = {
-               .platform_data  = scif_platform_data,
 -              .platform_data  = &scif1_platform_data,
++              .platform_data  = &scif_platform_data,
        },
  };
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xffd80008,
                .end    = 0xffd80013,
                .flags  = IORESOURCE_MEM,
@@@ -100,16 -94,13 +99,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xffd80014,
                .end    = 0xffd8001f,
                .flags  = IORESOURCE_MEM,
@@@ -131,15 -122,12 +127,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xffd80020,
                .end    = 0xffd8002f,
                .flags  = IORESOURCE_MEM,
@@@ -166,15 -154,12 +159,12 @@@ static struct platform_device tmu2_devi
        defined(CONFIG_CPU_SUBTYPE_SH7751R)
  
  static struct sh_timer_config tmu3_platform_data = {
-       .name = "TMU3",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu3_resources[] = {
        [0] = {
-               .name   = "TMU3",
                .start  = 0xfe100008,
                .end    = 0xfe100013,
                .flags  = IORESOURCE_MEM,
@@@ -196,15 -181,12 +186,12 @@@ static struct platform_device tmu3_devi
  };
  
  static struct sh_timer_config tmu4_platform_data = {
-       .name = "TMU4",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu4_resources[] = {
        [0] = {
-               .name   = "TMU4",
                .start  = 0xfe100014,
                .end    = 0xfe10001f,
                .flags  = IORESOURCE_MEM,
@@@ -228,6 -210,8 +215,6 @@@ static struct platform_device tmu4_devi
  #endif
  
  static struct platform_device *sh7750_devices[] __initdata = {
 -      &scif0_device,
 -      &scif1_device,
        &rtc_device,
        &tmu0_device,
        &tmu1_device,
  
  static int __init sh7750_devices_setup(void)
  {
-               scif_platform_data.scscr |= SCSCR_CKE1;
 +      if (mach_is_rts7751r2d()) {
 +              platform_register_device(&scif_device);
 +      } else {
 +              platform_register_device(&sci_device);
 +              platform_register_device(&scif_device);
 +      }
 +
        return platform_add_devices(sh7750_devices,
                                    ARRAY_SIZE(sh7750_devices));
  }
__initcall(sh7750_devices_setup);
arch_initcall(sh7750_devices_setup);
  
  static struct platform_device *sh7750_early_devices[] __initdata = {
 -      &scif0_device,
 -      &scif1_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
  
  void __init plat_early_device_setup(void)
  {
++      if (mach_is_rts7751r2d()) {
++              scif_platform_data.scscr |= SCSCR_CKE1;
++              early_platform_add_devices(&scif_device, 1);
++      } else {
++              early_platform_add_devices(&sci_device, 1);
++              early_platform_add_devices(&scif_device, 1);
++      }
++
        early_platform_add_devices(sh7750_early_devices,
                                   ARRAY_SIZE(sh7750_early_devices));
  }
@@@ -449,7 -427,7 +443,7 @@@ void __init plat_irq_setup_pins(int mod
  
        switch (mode) {
        case IRQ_MODE_IRQ: /* individual interrupt mode for IRL3-0 */
-               ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR);
+               __raw_writew(__raw_readw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR);
                register_intc_controller(&intc_desc_irlm);
                break;
        default:
@@@ -126,59 -126,74 +126,82 @@@ static struct intc_vect vectors_irq[] _
  static DECLARE_INTC_DESC(intc_desc_irq, "sh7760-irq", vectors_irq, groups,
                         mask_registers, prio_registers, NULL);
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xfe600000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 52, 53, 55, 54 },
-       }, {
-               .mapbase        = 0xfe610000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 72, 73, 75, 74 },
-       }, {
-               .mapbase        = 0xfe620000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 76, 77, 79, 78 },
-       }, {
-               .mapbase        = 0xfe480000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCI,
-               .irqs           = { 80, 81, 82, 0 },
-       }, {
-               .flags = 0,
-       }
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xfe600000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 52, 53, 55, 54 },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xfe610000,
+       .flags          = UPF_BOOT_AUTOCONF,
+       .type           = PORT_SCIF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .irqs           = { 72, 73, 75, 74 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xfe620000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 76, 77, 79, 78 },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &scif2_platform_data,
+       },
+ };
+ static struct plat_sci_port scif3_platform_data = {
+       .mapbase        = 0xfe480000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCI,
+       .irqs           = { 80, 81, 82, 0 },
  };
  
- static struct platform_device sci_device = {
+ static struct platform_device scif3_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 3,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif3_platform_data,
        },
  };
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xffd80008,
                .end    = 0xffd80013,
                .flags  = IORESOURCE_MEM,
@@@ -200,16 -215,13 +223,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xffd80014,
                .end    = 0xffd8001f,
                .flags  = IORESOURCE_MEM,
@@@ -231,15 -243,12 +251,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xffd80020,
                .end    = 0xffd8002f,
                .flags  = IORESOURCE_MEM,
@@@ -262,7 -271,10 +279,10 @@@ static struct platform_device tmu2_devi
  
  
  static struct platform_device *sh7760_devices[] __initdata = {
-       &sci_device,
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
@@@ -273,9 -285,13 +293,13 @@@ static int __init sh7760_devices_setup(
        return platform_add_devices(sh7760_devices,
                                    ARRAY_SIZE(sh7760_devices));
  }
__initcall(sh7760_devices_setup);
arch_initcall(sh7760_devices_setup);
  
  static struct platform_device *sh7760_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
@@@ -294,7 -310,7 +318,7 @@@ void __init plat_irq_setup_pins(int mod
  {
        switch (mode) {
        case IRQ_MODE_IRQ:
-               ctrl_outw(ctrl_inw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR);
+               __raw_writew(__raw_readw(INTC_ICR) | INTC_ICR_IRLM, INTC_ICR);
                register_intc_controller(&intc_desc_irq);
                break;
        default:
  #include <linux/sh_timer.h>
  #include <asm/clock.h>
  
+ /* Serial */
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xffe00000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 80, 80, 80, 80 },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xffe10000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 81, 81, 81, 81 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xffe20000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 82, 82, 82, 82 },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &scif2_platform_data,
+       },
+ };
+ static struct plat_sci_port scif3_platform_data = {
+       .mapbase        = 0xffe30000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 83, 83, 83, 83 },
+ };
+ static struct platform_device scif3_device = {
+       .name           = "sh-sci",
+       .id             = 3,
+       .dev            = {
+               .platform_data  = &scif3_platform_data,
+       },
+ };
  static struct resource iic0_resources[] = {
        [0] = {
                .name   = "IIC0",
@@@ -142,17 -203,14 +211,14 @@@ static struct platform_device jpu_devic
  };
  
  static struct sh_timer_config cmt_platform_data = {
-       .name = "CMT",
        .channel_offset = 0x60,
        .timer_bit = 5,
-       .clk = "cmt0",
        .clockevent_rating = 125,
        .clocksource_rating = 200,
  };
  
  static struct resource cmt_resources[] = {
        [0] = {
-               .name   = "CMT",
                .start  = 0x044a0060,
                .end    = 0x044a006b,
                .flags  = IORESOURCE_MEM,
@@@ -174,16 -232,13 +240,13 @@@ static struct platform_device cmt_devic
  };
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "tmu0",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xffd80008,
                .end    = 0xffd80013,
                .flags  = IORESOURCE_MEM,
@@@ -205,16 -260,13 +268,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "tmu0",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xffd80014,
                .end    = 0xffd8001f,
                .flags  = IORESOURCE_MEM,
@@@ -236,15 -288,12 +296,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "tmu0",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xffd80020,
                .end    = 0xffd8002b,
                .flags  = IORESOURCE_MEM,
@@@ -265,60 -314,17 +322,17 @@@ static struct platform_device tmu2_devi
        .num_resources  = ARRAY_SIZE(tmu2_resources),
  };
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xffe00000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 80, 80, 80, 80 },
-               .clk            = "scif0",
-       }, {
-               .mapbase        = 0xffe10000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 81, 81, 81, 81 },
-               .clk            = "scif1",
-       }, {
-               .mapbase        = 0xffe20000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 82, 82, 82, 82 },
-               .clk            = "scif2",
-       }, {
-               .mapbase        = 0xffe30000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 83, 83, 83, 83 },
-               .clk            = "scif3",
-       }, {
-               .flags = 0,
-       }
- };
- static struct platform_device sci_device = {
-       .name           = "sh-sci",
-       .id             = -1,
-       .dev            = {
-               .platform_data  = sci_platform_data,
-       },
- };
  static struct platform_device *sh7343_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
        &cmt_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
        &iic0_device,
        &iic1_device,
-       &sci_device,
        &vpu_device,
        &veu_device,
        &jpu_device,
@@@ -333,9 -339,13 +347,13 @@@ static int __init sh7343_devices_setup(
        return platform_add_devices(sh7343_devices,
                                    ARRAY_SIZE(sh7343_devices));
  }
__initcall(sh7343_devices_setup);
arch_initcall(sh7343_devices_setup);
  
  static struct platform_device *sh7343_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
        &cmt_device,
        &tmu0_device,
        &tmu1_device,
  #include <linux/usb/r8a66597.h>
  #include <asm/clock.h>
  
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xffe00000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 80, 80, 80, 80 },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
  static struct resource iic_resources[] = {
        [0] = {
                .name   = "IIC",
@@@ -40,7 -55,7 +57,7 @@@ static struct platform_device iic_devic
  };
  
  static struct r8a66597_platdata r8a66597_data = {
-       /* This set zero to all members */
+       .on_chip = 1,
  };
  
  static struct resource usb_host_resources[] = {
@@@ -153,17 -168,14 +170,14 @@@ static struct platform_device veu1_devi
  };
  
  static struct sh_timer_config cmt_platform_data = {
-       .name = "CMT",
        .channel_offset = 0x60,
        .timer_bit = 5,
-       .clk = "cmt0",
        .clockevent_rating = 125,
        .clocksource_rating = 200,
  };
  
  static struct resource cmt_resources[] = {
        [0] = {
-               .name   = "CMT",
                .start  = 0x044a0060,
                .end    = 0x044a006b,
                .flags  = IORESOURCE_MEM,
@@@ -185,16 -197,13 +199,13 @@@ static struct platform_device cmt_devic
  };
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "tmu0",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xffd80008,
                .end    = 0xffd80013,
                .flags  = IORESOURCE_MEM,
@@@ -216,16 -225,13 +227,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "tmu0",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xffd80014,
                .end    = 0xffd8001f,
                .flags  = IORESOURCE_MEM,
@@@ -247,15 -253,12 +255,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "tmu0",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xffd80020,
                .end    = 0xffd8002b,
                .flags  = IORESOURCE_MEM,
@@@ -276,35 -279,13 +281,13 @@@ static struct platform_device tmu2_devi
        .num_resources  = ARRAY_SIZE(tmu2_resources),
  };
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xffe00000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 80, 80, 80, 80 },
-               .clk            = "scif0",
-       }, {
-               .flags = 0,
-       }
- };
- static struct platform_device sci_device = {
-       .name           = "sh-sci",
-       .id             = -1,
-       .dev            = {
-               .platform_data  = sci_platform_data,
-       },
- };
  static struct platform_device *sh7366_devices[] __initdata = {
+       &scif0_device,
        &cmt_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
        &iic_device,
-       &sci_device,
        &usb_host_device,
        &vpu_device,
        &veu0_device,
@@@ -320,9 -301,10 +303,10 @@@ static int __init sh7366_devices_setup(
        return platform_add_devices(sh7366_devices,
                                    ARRAY_SIZE(sh7366_devices));
  }
__initcall(sh7366_devices_setup);
arch_initcall(sh7366_devices_setup);
  
  static struct platform_device *sh7366_early_devices[] __initdata = {
+       &scif0_device,
        &cmt_device,
        &tmu0_device,
        &tmu1_device,
   * License.  See the file "COPYING" in the main directory of this archive
   * for more details.
   */
- #include <linux/platform_device.h>
  #include <linux/init.h>
+ #include <linux/mm.h>
+ #include <linux/platform_device.h>
  #include <linux/serial.h>
  #include <linux/serial_sci.h>
- #include <linux/mm.h>
- #include <linux/uio_driver.h>
  #include <linux/sh_timer.h>
+ #include <linux/uio_driver.h>
+ #include <linux/usb/m66592.h>
  #include <asm/clock.h>
  #include <asm/mmzone.h>
+ #include <asm/siu.h>
+ #include <cpu/dma-register.h>
+ #include <cpu/sh7722.h>
+ static const struct sh_dmae_slave_config sh7722_dmae_slaves[] = {
+       {
+               .slave_id       = SHDMA_SLAVE_SCIF0_TX,
+               .addr           = 0xffe0000c,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x21,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF0_RX,
+               .addr           = 0xffe00014,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x22,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF1_TX,
+               .addr           = 0xffe1000c,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x25,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF1_RX,
+               .addr           = 0xffe10014,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x26,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF2_TX,
+               .addr           = 0xffe2000c,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x29,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF2_RX,
+               .addr           = 0xffe20014,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x2a,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SIUA_TX,
+               .addr           = 0xa454c098,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT),
+               .mid_rid        = 0xb1,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SIUA_RX,
+               .addr           = 0xa454c090,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT),
+               .mid_rid        = 0xb2,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SIUB_TX,
+               .addr           = 0xa454c09c,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT),
+               .mid_rid        = 0xb5,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SIUB_RX,
+               .addr           = 0xa454c094,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT),
+               .mid_rid        = 0xb6,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SDHI0_TX,
+               .addr           = 0x04ce0030,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
+               .mid_rid        = 0xc1,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SDHI0_RX,
+               .addr           = 0x04ce0030,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
+               .mid_rid        = 0xc2,
+       },
+ };
+ static const struct sh_dmae_channel sh7722_dmae_channels[] = {
+       {
+               .offset = 0,
+               .dmars = 0,
+               .dmars_bit = 0,
+       }, {
+               .offset = 0x10,
+               .dmars = 0,
+               .dmars_bit = 8,
+       }, {
+               .offset = 0x20,
+               .dmars = 4,
+               .dmars_bit = 0,
+       }, {
+               .offset = 0x30,
+               .dmars = 4,
+               .dmars_bit = 8,
+       }, {
+               .offset = 0x50,
+               .dmars = 8,
+               .dmars_bit = 0,
+       }, {
+               .offset = 0x60,
+               .dmars = 8,
+               .dmars_bit = 8,
+       }
+ };
+ static const unsigned int ts_shift[] = TS_SHIFT;
+ static struct sh_dmae_pdata dma_platform_data = {
+       .slave          = sh7722_dmae_slaves,
+       .slave_num      = ARRAY_SIZE(sh7722_dmae_slaves),
+       .channel        = sh7722_dmae_channels,
+       .channel_num    = ARRAY_SIZE(sh7722_dmae_channels),
+       .ts_low_shift   = CHCR_TS_LOW_SHIFT,
+       .ts_low_mask    = CHCR_TS_LOW_MASK,
+       .ts_high_shift  = CHCR_TS_HIGH_SHIFT,
+       .ts_high_mask   = CHCR_TS_HIGH_MASK,
+       .ts_shift       = ts_shift,
+       .ts_shift_num   = ARRAY_SIZE(ts_shift),
+       .dmaor_init     = DMAOR_INIT,
+ };
+ static struct resource sh7722_dmae_resources[] = {
+       [0] = {
+               /* Channel registers and DMAOR */
+               .start  = 0xfe008020,
+               .end    = 0xfe00808f,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               /* DMARSx */
+               .start  = 0xfe009000,
+               .end    = 0xfe00900b,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* DMA error IRQ */
+               .start  = 78,
+               .end    = 78,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               /* IRQ for channels 0-3 */
+               .start  = 48,
+               .end    = 51,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               /* IRQ for channels 4-5 */
+               .start  = 76,
+               .end    = 77,
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ struct platform_device dma_device = {
+       .name           = "sh-dma-engine",
+       .id             = -1,
+       .resource       = sh7722_dmae_resources,
+       .num_resources  = ARRAY_SIZE(sh7722_dmae_resources),
+       .dev            = {
+               .platform_data  = &dma_platform_data,
+       },
+       .archdata = {
+               .hwblk_id = HWBLK_DMAC,
+       },
+ };
+ /* Serial */
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xffe00000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 80, 80, 80, 80 },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xffe10000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 81, 81, 81, 81 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xffe20000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 82, 82, 82, 82 },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &scif2_platform_data,
+       },
+ };
  
  static struct resource rtc_resources[] = {
        [0] = {
@@@ -45,11 -251,18 +257,18 @@@ static struct platform_device rtc_devic
        .id             = -1,
        .num_resources  = ARRAY_SIZE(rtc_resources),
        .resource       = rtc_resources,
+       .archdata = {
+               .hwblk_id = HWBLK_RTC,
+       },
+ };
+ static struct m66592_platdata usbf_platdata = {
+       .on_chip = 1,
  };
  
  static struct resource usbf_resources[] = {
        [0] = {
-               .name   = "m66592_udc",
+               .name   = "USBF",
                .start  = 0x04480000,
                .end    = 0x044800FF,
                .flags  = IORESOURCE_MEM,
@@@ -67,9 -280,13 +286,13 @@@ static struct platform_device usbf_devi
        .dev = {
                .dma_mask               = NULL,
                .coherent_dma_mask      = 0xffffffff,
+               .platform_data          = &usbf_platdata,
        },
        .num_resources  = ARRAY_SIZE(usbf_resources),
        .resource       = usbf_resources,
+       .archdata = {
+               .hwblk_id = HWBLK_USBF,
+       },
  };
  
  static struct resource iic_resources[] = {
@@@ -91,6 -308,9 +314,9 @@@ static struct platform_device iic_devic
        .id             = 0, /* "i2c0" clock */
        .num_resources  = ARRAY_SIZE(iic_resources),
        .resource       = iic_resources,
+       .archdata = {
+               .hwblk_id = HWBLK_IIC,
+       },
  };
  
  static struct uio_info vpu_platform_data = {
@@@ -119,6 -339,9 +345,9 @@@ static struct platform_device vpu_devic
        },
        .resource       = vpu_resources,
        .num_resources  = ARRAY_SIZE(vpu_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_VPU,
+       },
  };
  
  static struct uio_info veu_platform_data = {
@@@ -147,6 -370,9 +376,9 @@@ static struct platform_device veu_devic
        },
        .resource       = veu_resources,
        .num_resources  = ARRAY_SIZE(veu_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_VEU,
+       },
  };
  
  static struct uio_info jpu_platform_data = {
@@@ -175,20 -401,20 +407,20 @@@ static struct platform_device jpu_devic
        },
        .resource       = jpu_resources,
        .num_resources  = ARRAY_SIZE(jpu_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_JPU,
+       },
  };
  
  static struct sh_timer_config cmt_platform_data = {
-       .name = "CMT",
        .channel_offset = 0x60,
        .timer_bit = 5,
-       .clk = "cmt0",
        .clockevent_rating = 125,
        .clocksource_rating = 125,
  };
  
  static struct resource cmt_resources[] = {
        [0] = {
-               .name   = "CMT",
                .start  = 0x044a0060,
                .end    = 0x044a006b,
                .flags  = IORESOURCE_MEM,
@@@ -207,19 -433,19 +439,19 @@@ static struct platform_device cmt_devic
        },
        .resource       = cmt_resources,
        .num_resources  = ARRAY_SIZE(cmt_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_CMT,
+       },
  };
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "tmu0",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xffd80008,
                .end    = 0xffd80013,
                .flags  = IORESOURCE_MEM,
@@@ -238,19 -464,19 +470,19 @@@ static struct platform_device tmu0_devi
        },
        .resource       = tmu0_resources,
        .num_resources  = ARRAY_SIZE(tmu0_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_TMU,
+       },
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "tmu0",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xffd80014,
                .end    = 0xffd8001f,
                .flags  = IORESOURCE_MEM,
@@@ -269,18 -495,18 +501,18 @@@ static struct platform_device tmu1_devi
        },
        .resource       = tmu1_resources,
        .num_resources  = ARRAY_SIZE(tmu1_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_TMU,
+       },
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "tmu0",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xffd80020,
                .end    = 0xffd8002b,
                .flags  = IORESOURCE_MEM,
@@@ -299,47 -525,48 +531,48 @@@ static struct platform_device tmu2_devi
        },
        .resource       = tmu2_resources,
        .num_resources  = ARRAY_SIZE(tmu2_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_TMU,
+       },
  };
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xffe00000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 80, 80, 80, 80 },
-               .clk            = "scif0",
-       }, {
-               .mapbase        = 0xffe10000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 81, 81, 81, 81 },
-               .clk            = "scif1",
-       }, {
-               .mapbase        = 0xffe20000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 82, 82, 82, 82 },
-               .clk            = "scif2",
-       }, {
-               .flags = 0,
-       }
+ static struct siu_platform siu_platform_data = {
+       .dma_dev        = &dma_device.dev,
+       .dma_slave_tx_a = SHDMA_SLAVE_SIUA_TX,
+       .dma_slave_rx_a = SHDMA_SLAVE_SIUA_RX,
+       .dma_slave_tx_b = SHDMA_SLAVE_SIUB_TX,
+       .dma_slave_rx_b = SHDMA_SLAVE_SIUB_RX,
  };
  
- static struct platform_device sci_device = {
-       .name           = "sh-sci",
+ static struct resource siu_resources[] = {
+       [0] = {
+               .start  = 0xa4540000,
+               .end    = 0xa454c10f,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = 108,
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device siu_device = {
+       .name           = "siu-pcm-audio",
        .id             = -1,
-       .dev            = {
-               .platform_data  = sci_platform_data,
+       .dev = {
+               .platform_data  = &siu_platform_data,
+       },
+       .resource       = siu_resources,
+       .num_resources  = ARRAY_SIZE(siu_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_SIU,
        },
  };
  
  static struct platform_device *sh7722_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
        &cmt_device,
        &tmu0_device,
        &tmu1_device,
        &rtc_device,
        &usbf_device,
        &iic_device,
-       &sci_device,
        &vpu_device,
        &veu_device,
        &jpu_device,
+       &siu_device,
+       &dma_device,
  };
  
  static int __init sh7722_devices_setup(void)
        return platform_add_devices(sh7722_devices,
                                    ARRAY_SIZE(sh7722_devices));
  }
__initcall(sh7722_devices_setup);
arch_initcall(sh7722_devices_setup);
  
  static struct platform_device *sh7722_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
        &cmt_device,
        &tmu0_device,
        &tmu1_device,
@@@ -379,6 -610,8 +616,8 @@@ void __init plat_early_device_setup(voi
  
  enum {
        UNUSED=0,
+       ENABLED,
+       DISABLED,
  
        /* interrupt sources */
        IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
        SCIF0, SCIF1, SCIF2, SIOF0, SIOF1, SIO,
        FLCTL_FLSTEI, FLCTL_FLENDI, FLCTL_FLTREQ0I, FLCTL_FLTREQ1I,
        I2C_ALI, I2C_TACKI, I2C_WAITI, I2C_DTEI,
-       SDHI0, SDHI1, SDHI2, SDHI3,
        CMT, TSIF, SIU, TWODG,
        TMU0, TMU1, TMU2,
        IRDA, JPU, LCDC,
@@@ -427,8 -659,8 +665,8 @@@ static struct intc_vect vectors[] __ini
        INTC_VECT(FLCTL_FLTREQ0I, 0xdc0), INTC_VECT(FLCTL_FLTREQ1I, 0xde0),
        INTC_VECT(I2C_ALI, 0xe00), INTC_VECT(I2C_TACKI, 0xe20),
        INTC_VECT(I2C_WAITI, 0xe40), INTC_VECT(I2C_DTEI, 0xe60),
-       INTC_VECT(SDHI0, 0xe80), INTC_VECT(SDHI1, 0xea0),
-       INTC_VECT(SDHI2, 0xec0), INTC_VECT(SDHI3, 0xee0),
+       INTC_VECT(SDHI, 0xe80), INTC_VECT(SDHI, 0xea0),
+       INTC_VECT(SDHI, 0xec0), INTC_VECT(SDHI, 0xee0),
        INTC_VECT(CMT, 0xf00), INTC_VECT(TSIF, 0xf20),
        INTC_VECT(SIU, 0xf80), INTC_VECT(TWODG, 0xfa0),
        INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420),
@@@ -446,7 -678,6 +684,6 @@@ static struct intc_group groups[] __ini
        INTC_GROUP(FLCTL, FLCTL_FLSTEI, FLCTL_FLENDI,
                   FLCTL_FLTREQ0I, FLCTL_FLTREQ1I),
        INTC_GROUP(I2C, I2C_ALI, I2C_TACKI, I2C_WAITI, I2C_DTEI),
-       INTC_GROUP(SDHI, SDHI0, SDHI1, SDHI2, SDHI3),
  };
  
  static struct intc_mask_reg mask_registers[] __initdata = {
          { I2C_DTEI, I2C_WAITI, I2C_TACKI, I2C_ALI,
            FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLENDI, FLCTL_FLSTEI } },
        { 0xa40800a0, 0xa40800e0, 8, /* IMR8 / IMCR8 */
-         { SDHI3, SDHI2, SDHI1, SDHI0, 0, 0, TWODG, SIU } },
+         { DISABLED, DISABLED, ENABLED, ENABLED, 0, 0, TWODG, SIU } },
        { 0xa40800a4, 0xa40800e4, 8, /* IMR9 / IMCR9 */
          { 0, 0, 0, CMT, 0, USB_USBI1, USB_USBI0, } },
        { 0xa40800a8, 0xa40800e8, 8, /* IMR10 / IMCR10 */
@@@ -506,9 -737,13 +743,13 @@@ static struct intc_mask_reg ack_registe
          { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
  };
  
- static DECLARE_INTC_DESC_ACK(intc_desc, "sh7722", vectors, groups,
-                            mask_registers, prio_registers, sense_registers,
-                            ack_registers);
+ static struct intc_desc intc_desc __initdata = {
+       .name = "sh7722",
+       .force_enable = ENABLED,
+       .force_disable = DISABLED,
+       .hw = INTC_HW_DESC(vectors, groups, mask_registers,
+                          prio_registers, sense_registers, ack_registers),
+ };
  
  void __init plat_irq_setup(void)
  {
  #include <linux/io.h>
  #include <asm/clock.h>
  #include <asm/mmzone.h>
+ #include <cpu/sh7723.h>
+ /* Serial */
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xffe00000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 80, 80, 80, 80 },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xffe10000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 81, 81, 81, 81 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xffe20000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 82, 82, 82, 82 },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &scif2_platform_data,
+       },
+ };
+ static struct plat_sci_port scif3_platform_data = {
+       .mapbase        = 0xa4e30000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_3,
+       .type           = PORT_SCIFA,
+       .irqs           = { 56, 56, 56, 56 },
+ };
+ static struct platform_device scif3_device = {
+       .name           = "sh-sci",
+       .id             = 3,
+       .dev            = {
+               .platform_data  = &scif3_platform_data,
+       },
+ };
+ static struct plat_sci_port scif4_platform_data = {
+       .mapbase        = 0xa4e40000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_3,
+       .type           = PORT_SCIFA,
+       .irqs           = { 88, 88, 88, 88 },
+ };
+ static struct platform_device scif4_device = {
+       .name           = "sh-sci",
+       .id             = 4,
+       .dev            = {
+               .platform_data  = &scif4_platform_data,
+       },
+ };
+ static struct plat_sci_port scif5_platform_data = {
+       .mapbase        = 0xa4e50000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_3,
+       .type           = PORT_SCIFA,
+       .irqs           = { 109, 109, 109, 109 },
+ };
+ static struct platform_device scif5_device = {
+       .name           = "sh-sci",
+       .id             = 5,
+       .dev            = {
+               .platform_data  = &scif5_platform_data,
+       },
+ };
  
  static struct uio_info vpu_platform_data = {
        .name = "VPU5",
@@@ -45,6 -137,9 +149,9 @@@ static struct platform_device vpu_devic
        },
        .resource       = vpu_resources,
        .num_resources  = ARRAY_SIZE(vpu_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_VPU,
+       },
  };
  
  static struct uio_info veu0_platform_data = {
@@@ -73,6 -168,9 +180,9 @@@ static struct platform_device veu0_devi
        },
        .resource       = veu0_resources,
        .num_resources  = ARRAY_SIZE(veu0_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_VEU2H0,
+       },
  };
  
  static struct uio_info veu1_platform_data = {
@@@ -101,20 -199,20 +211,20 @@@ static struct platform_device veu1_devi
        },
        .resource       = veu1_resources,
        .num_resources  = ARRAY_SIZE(veu1_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_VEU2H1,
+       },
  };
  
  static struct sh_timer_config cmt_platform_data = {
-       .name = "CMT",
        .channel_offset = 0x60,
        .timer_bit = 5,
-       .clk = "cmt0",
        .clockevent_rating = 125,
        .clocksource_rating = 125,
  };
  
  static struct resource cmt_resources[] = {
        [0] = {
-               .name   = "CMT",
                .start  = 0x044a0060,
                .end    = 0x044a006b,
                .flags  = IORESOURCE_MEM,
@@@ -133,19 -231,19 +243,19 @@@ static struct platform_device cmt_devic
        },
        .resource       = cmt_resources,
        .num_resources  = ARRAY_SIZE(cmt_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_CMT,
+       },
  };
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "tmu0",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xffd80008,
                .end    = 0xffd80013,
                .flags  = IORESOURCE_MEM,
@@@ -164,19 -262,19 +274,19 @@@ static struct platform_device tmu0_devi
        },
        .resource       = tmu0_resources,
        .num_resources  = ARRAY_SIZE(tmu0_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_TMU0,
+       },
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "tmu0",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xffd80014,
                .end    = 0xffd8001f,
                .flags  = IORESOURCE_MEM,
@@@ -195,18 -293,18 +305,18 @@@ static struct platform_device tmu1_devi
        },
        .resource       = tmu1_resources,
        .num_resources  = ARRAY_SIZE(tmu1_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_TMU0,
+       },
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "tmu0",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xffd80020,
                .end    = 0xffd8002b,
                .flags  = IORESOURCE_MEM,
@@@ -225,18 -323,18 +335,18 @@@ static struct platform_device tmu2_devi
        },
        .resource       = tmu2_resources,
        .num_resources  = ARRAY_SIZE(tmu2_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_TMU0,
+       },
  };
  
  static struct sh_timer_config tmu3_platform_data = {
-       .name = "TMU3",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "tmu1",
  };
  
  static struct resource tmu3_resources[] = {
        [0] = {
-               .name   = "TMU3",
                .start  = 0xffd90008,
                .end    = 0xffd90013,
                .flags  = IORESOURCE_MEM,
@@@ -255,18 -353,18 +365,18 @@@ static struct platform_device tmu3_devi
        },
        .resource       = tmu3_resources,
        .num_resources  = ARRAY_SIZE(tmu3_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_TMU1,
+       },
  };
  
  static struct sh_timer_config tmu4_platform_data = {
-       .name = "TMU4",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "tmu1",
  };
  
  static struct resource tmu4_resources[] = {
        [0] = {
-               .name   = "TMU4",
                .start  = 0xffd90014,
                .end    = 0xffd9001f,
                .flags  = IORESOURCE_MEM,
@@@ -285,18 -383,18 +395,18 @@@ static struct platform_device tmu4_devi
        },
        .resource       = tmu4_resources,
        .num_resources  = ARRAY_SIZE(tmu4_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_TMU1,
+       },
  };
  
  static struct sh_timer_config tmu5_platform_data = {
-       .name = "TMU5",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "tmu1",
  };
  
  static struct resource tmu5_resources[] = {
        [0] = {
-               .name   = "TMU5",
                .start  = 0xffd90020,
                .end    = 0xffd9002b,
                .flags  = IORESOURCE_MEM,
@@@ -315,67 -413,8 +425,8 @@@ static struct platform_device tmu5_devi
        },
        .resource       = tmu5_resources,
        .num_resources  = ARRAY_SIZE(tmu5_resources),
- };
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xffe00000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 80, 80, 80, 80 },
-               .clk            = "scif0",
-       },{
-               .mapbase        = 0xffe10000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 81, 81, 81, 81 },
-               .clk            = "scif1",
-       },{
-               .mapbase        = 0xffe20000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 82, 82, 82, 82 },
-               .clk            = "scif2",
-       },{
-               .mapbase        = 0xa4e30000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_3,
-               .type           = PORT_SCIFA,
-               .irqs           = { 56, 56, 56, 56 },
-               .clk            = "scif3",
-       },{
-               .mapbase        = 0xa4e40000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_3,
-               .type           = PORT_SCIFA,
-               .irqs           = { 88, 88, 88, 88 },
-               .clk            = "scif4",
-       },{
-               .mapbase        = 0xa4e50000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_3,
-               .type           = PORT_SCIFA,
-               .irqs           = { 109, 109, 109, 109 },
-               .clk            = "scif5",
-       }, {
-               .flags = 0,
-       }
- };
- static struct platform_device sci_device = {
-       .name           = "sh-sci",
-       .id             = -1,
-       .dev            = {
-               .platform_data  = sci_platform_data,
+       .archdata = {
+               .hwblk_id = HWBLK_TMU1,
        },
  };
  
@@@ -407,10 -446,13 +458,13 @@@ static struct platform_device rtc_devic
        .id             = -1,
        .num_resources  = ARRAY_SIZE(rtc_resources),
        .resource       = rtc_resources,
+       .archdata = {
+               .hwblk_id = HWBLK_RTC,
+       },
  };
  
  static struct r8a66597_platdata r8a66597_data = {
-       /* This set zero to all members */
+       .on_chip = 1,
  };
  
  static struct resource sh7723_usb_host_resources[] = {
@@@ -436,6 -478,9 +490,9 @@@ static struct platform_device sh7723_us
        },
        .num_resources  = ARRAY_SIZE(sh7723_usb_host_resources),
        .resource       = sh7723_usb_host_resources,
+       .archdata = {
+               .hwblk_id = HWBLK_USB,
+       },
  };
  
  static struct resource iic_resources[] = {
@@@ -457,9 -502,18 +514,18 @@@ static struct platform_device iic_devic
        .id             = 0, /* "i2c0" clock */
        .num_resources  = ARRAY_SIZE(iic_resources),
        .resource       = iic_resources,
+       .archdata = {
+               .hwblk_id = HWBLK_IIC,
+       },
  };
  
  static struct platform_device *sh7723_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &scif5_device,
        &cmt_device,
        &tmu0_device,
        &tmu1_device,
        &tmu3_device,
        &tmu4_device,
        &tmu5_device,
-       &sci_device,
        &rtc_device,
        &iic_device,
        &sh7723_usb_host_device,
@@@ -485,9 -538,15 +550,15 @@@ static int __init sh7723_devices_setup(
        return platform_add_devices(sh7723_devices,
                                    ARRAY_SIZE(sh7723_devices));
  }
__initcall(sh7723_devices_setup);
arch_initcall(sh7723_devices_setup);
  
  static struct platform_device *sh7723_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &scif5_device,
        &cmt_device,
        &tmu0_device,
        &tmu1_device,
@@@ -506,14 -565,17 +577,17 @@@ void __init plat_early_device_setup(voi
  #define RAMCR_CACHE_L2FC      0x0002
  #define RAMCR_CACHE_L2E               0x0001
  #define L2_CACHE_ENABLE               (RAMCR_CACHE_L2E|RAMCR_CACHE_L2FC)
- void __uses_jump_to_uncached l2_cache_init(void)
+ void l2_cache_init(void)
  {
        /* Enable L2 cache */
-       ctrl_outl(L2_CACHE_ENABLE, RAMCR);
+       __raw_writel(L2_CACHE_ENABLE, RAMCR);
  }
  
  enum {
        UNUSED=0,
+       ENABLED,
+       DISABLED,
  
        /* interrupt sources */
        IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
        SCIFA_SCIFA1,
        FLCTL_FLSTEI,FLCTL_FLTENDI,FLCTL_FLTREQ0I,FLCTL_FLTREQ1I,
        I2C_ALI,I2C_TACKI,I2C_WAITI,I2C_DTEI,
-       SDHI0_SDHII0,SDHI0_SDHII1,SDHI0_SDHII2,
        CMT_CMTI,
        TSIF_TSIFI,
        SIU_SIUI,
        TMU0_TUNI0, TMU0_TUNI1, TMU0_TUNI2,
        IRDA_IRDAI,
        ATAPI_ATAPII,
-       SDHI1_SDHII0,SDHI1_SDHII1,SDHI1_SDHII2,
        VEU2H1_VEU2HI,
        LCDC_LCDCI,
        TMU1_TUNI0,TMU1_TUNI1,TMU1_TUNI2,
@@@ -615,9 -675,9 +687,9 @@@ static struct intc_vect vectors[] __ini
        INTC_VECT(I2C_WAITI,0xE40),
        INTC_VECT(I2C_DTEI,0xE60),
  
-       INTC_VECT(SDHI0_SDHII0,0xE80),
-       INTC_VECT(SDHI0_SDHII1,0xEA0),
-       INTC_VECT(SDHI0_SDHII2,0xEC0),
+       INTC_VECT(SDHI00xE80),
+       INTC_VECT(SDHI00xEA0),
+       INTC_VECT(SDHI00xEC0),
  
        INTC_VECT(CMT_CMTI,0xF00),
        INTC_VECT(TSIF_TSIFI,0xF20),
        INTC_VECT(IRDA_IRDAI,0x480),
        INTC_VECT(ATAPI_ATAPII,0x4A0),
  
-       INTC_VECT(SDHI1_SDHII0,0x4E0),
-       INTC_VECT(SDHI1_SDHII1,0x500),
-       INTC_VECT(SDHI1_SDHII2,0x520),
+       INTC_VECT(SDHI10x4E0),
+       INTC_VECT(SDHI10x500),
+       INTC_VECT(SDHI10x520),
  
        INTC_VECT(VEU2H1_VEU2HI,0x560),
        INTC_VECT(LCDC_LCDCI,0x580),
@@@ -652,15 -712,14 +724,14 @@@ static struct intc_group groups[] __ini
        INTC_GROUP(FLCTL,FLCTL_FLSTEI,FLCTL_FLTENDI,FLCTL_FLTREQ0I,FLCTL_FLTREQ1I),
        INTC_GROUP(I2C,I2C_ALI,I2C_TACKI,I2C_WAITI,I2C_DTEI),
        INTC_GROUP(_2DG, _2DG_TRI,_2DG_INI,_2DG_CEI),
-       INTC_GROUP(SDHI1, SDHI1_SDHII0,SDHI1_SDHII1,SDHI1_SDHII2),
        INTC_GROUP(RTC, RTC_ATI,RTC_PRI,RTC_CUI),
        INTC_GROUP(DMAC1B, DMAC1B_DEI4,DMAC1B_DEI5,DMAC1B_DADERR),
-       INTC_GROUP(SDHI0,SDHI0_SDHII0,SDHI0_SDHII1,SDHI0_SDHII2),
  };
  
  static struct intc_mask_reg mask_registers[] __initdata = {
        { 0xa4080080, 0xa40800c0, 8, /* IMR0 / IMCR0 */
-         { 0,  TMU1_TUNI2,TMU1_TUNI1,TMU1_TUNI0,0,SDHI1_SDHII2,SDHI1_SDHII1,SDHI1_SDHII0} },
+         { 0, TMU1_TUNI2, TMU1_TUNI1, TMU1_TUNI0,
+           0, DISABLED, ENABLED, ENABLED } },
        { 0xa4080084, 0xa40800c4, 8, /* IMR1 / IMCR1 */
          { VIO_VOUI, VIO_VEU2HI,VIO_BEUI,VIO_CEUI,DMAC0A_DEI3,DMAC0A_DEI2,DMAC0A_DEI1,DMAC0A_DEI0 } },
        { 0xa4080088, 0xa40800c8, 8, /* IMR2 / IMCR2 */
          { I2C_DTEI, I2C_WAITI, I2C_TACKI, I2C_ALI,
            FLCTL_FLTREQ1I, FLCTL_FLTREQ0I, FLCTL_FLTENDI, FLCTL_FLSTEI } },
        { 0xa40800a0, 0xa40800e0, 8, /* IMR8 / IMCR8 */
-         { 0,SDHI0_SDHII2,SDHI0_SDHII1,SDHI0_SDHII0,0,0,SCIFA_SCIFA2,SIU_SIUI } },
+         { 0, DISABLED, ENABLED, ENABLED,
+           0, 0, SCIFA_SCIFA2, SIU_SIUI } },
        { 0xa40800a4, 0xa40800e4, 8, /* IMR9 / IMCR9 */
          { 0, 0, 0, CMT_CMTI, 0, 0, USB_USI0,0 } },
        { 0xa40800a8, 0xa40800e8, 8, /* IMR10 / IMCR10 */
@@@ -717,9 -777,13 +789,13 @@@ static struct intc_mask_reg ack_registe
          { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
  };
  
- static DECLARE_INTC_DESC_ACK(intc_desc, "sh7723", vectors, groups,
-                            mask_registers, prio_registers, sense_registers,
-                            ack_registers);
+ static struct intc_desc intc_desc __initdata = {
+       .name = "sh7723",
+       .force_enable = ENABLED,
+       .force_disable = DISABLED,
+       .hw = INTC_HW_DESC(vectors, groups, mask_registers,
+                          prio_registers, sense_registers, ack_registers),
+ };
  
  void __init plat_irq_setup(void)
  {
  #include <linux/mm.h>
  #include <linux/serial_sci.h>
  #include <linux/uio_driver.h>
+ #include <linux/sh_dma.h>
  #include <linux/sh_timer.h>
  #include <linux/io.h>
+ #include <linux/notifier.h>
+ #include <asm/suspend.h>
  #include <asm/clock.h>
  #include <asm/mmzone.h>
  
- /* Serial */
- static struct plat_sci_port sci_platform_data[] = {
+ #include <cpu/dma-register.h>
+ #include <cpu/sh7724.h>
+ /* DMA */
+ static const struct sh_dmae_slave_config sh7724_dmae_slaves[] = {
        {
-               .mapbase        = 0xffe00000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 80, 80, 80, 80 },
-               .clk            = "scif0",
+               .slave_id       = SHDMA_SLAVE_SCIF0_TX,
+               .addr           = 0xffe0000c,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x21,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF0_RX,
+               .addr           = 0xffe00014,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x22,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF1_TX,
+               .addr           = 0xffe1000c,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x25,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF1_RX,
+               .addr           = 0xffe10014,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x26,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF2_TX,
+               .addr           = 0xffe2000c,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x29,
        }, {
-               .mapbase        = 0xffe10000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 81, 81, 81, 81 },
-               .clk            = "scif1",
+               .slave_id       = SHDMA_SLAVE_SCIF2_RX,
+               .addr           = 0xffe20014,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x2a,
        }, {
-               .mapbase        = 0xffe20000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 82, 82, 82, 82 },
-               .clk            = "scif2",
+               .slave_id       = SHDMA_SLAVE_SCIF3_TX,
+               .addr           = 0xa4e30020,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x2d,
        }, {
-               .mapbase        = 0xa4e30000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_3,
-               .type           = PORT_SCIFA,
-               .irqs           = { 56, 56, 56, 56 },
-               .clk            = "scif3",
+               .slave_id       = SHDMA_SLAVE_SCIF3_RX,
+               .addr           = 0xa4e30024,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x2e,
        }, {
-               .mapbase        = 0xa4e40000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_3,
-               .type           = PORT_SCIFA,
-               .irqs           = { 88, 88, 88, 88 },
-               .clk            = "scif4",
+               .slave_id       = SHDMA_SLAVE_SCIF4_TX,
+               .addr           = 0xa4e40020,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x31,
        }, {
-               .mapbase        = 0xa4e50000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_3,
-               .type           = PORT_SCIFA,
-               .irqs           = { 109, 109, 109, 109 },
-               .clk            = "scif5",
+               .slave_id       = SHDMA_SLAVE_SCIF4_RX,
+               .addr           = 0xa4e40024,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x32,
        }, {
-               .flags = 0,
+               .slave_id       = SHDMA_SLAVE_SCIF5_TX,
+               .addr           = 0xa4e50020,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x35,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SCIF5_RX,
+               .addr           = 0xa4e50024,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
+               .mid_rid        = 0x36,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SDHI0_TX,
+               .addr           = 0x04ce0030,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
+               .mid_rid        = 0xc1,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SDHI0_RX,
+               .addr           = 0x04ce0030,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
+               .mid_rid        = 0xc2,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SDHI1_TX,
+               .addr           = 0x04cf0030,
+               .chcr           = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
+               .mid_rid        = 0xc9,
+       }, {
+               .slave_id       = SHDMA_SLAVE_SDHI1_RX,
+               .addr           = 0x04cf0030,
+               .chcr           = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_16BIT),
+               .mid_rid        = 0xca,
+       },
+ };
+ static const struct sh_dmae_channel sh7724_dmae_channels[] = {
+       {
+               .offset = 0,
+               .dmars = 0,
+               .dmars_bit = 0,
+       }, {
+               .offset = 0x10,
+               .dmars = 0,
+               .dmars_bit = 8,
+       }, {
+               .offset = 0x20,
+               .dmars = 4,
+               .dmars_bit = 0,
+       }, {
+               .offset = 0x30,
+               .dmars = 4,
+               .dmars_bit = 8,
+       }, {
+               .offset = 0x50,
+               .dmars = 8,
+               .dmars_bit = 0,
+       }, {
+               .offset = 0x60,
+               .dmars = 8,
+               .dmars_bit = 8,
        }
  };
  
- static struct platform_device sci_device = {
+ static const unsigned int ts_shift[] = TS_SHIFT;
+ static struct sh_dmae_pdata dma_platform_data = {
+       .slave          = sh7724_dmae_slaves,
+       .slave_num      = ARRAY_SIZE(sh7724_dmae_slaves),
+       .channel        = sh7724_dmae_channels,
+       .channel_num    = ARRAY_SIZE(sh7724_dmae_channels),
+       .ts_low_shift   = CHCR_TS_LOW_SHIFT,
+       .ts_low_mask    = CHCR_TS_LOW_MASK,
+       .ts_high_shift  = CHCR_TS_HIGH_SHIFT,
+       .ts_high_mask   = CHCR_TS_HIGH_MASK,
+       .ts_shift       = ts_shift,
+       .ts_shift_num   = ARRAY_SIZE(ts_shift),
+       .dmaor_init     = DMAOR_INIT,
+ };
+ /* Resource order important! */
+ static struct resource sh7724_dmae0_resources[] = {
+       {
+               /* Channel registers and DMAOR */
+               .start  = 0xfe008020,
+               .end    = 0xfe00808f,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* DMARSx */
+               .start  = 0xfe009000,
+               .end    = 0xfe00900b,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* DMA error IRQ */
+               .start  = 78,
+               .end    = 78,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               /* IRQ for channels 0-3 */
+               .start  = 48,
+               .end    = 51,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               /* IRQ for channels 4-5 */
+               .start  = 76,
+               .end    = 77,
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ /* Resource order important! */
+ static struct resource sh7724_dmae1_resources[] = {
+       {
+               /* Channel registers and DMAOR */
+               .start  = 0xfdc08020,
+               .end    = 0xfdc0808f,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* DMARSx */
+               .start  = 0xfdc09000,
+               .end    = 0xfdc0900b,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* DMA error IRQ */
+               .start  = 74,
+               .end    = 74,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               /* IRQ for channels 0-3 */
+               .start  = 40,
+               .end    = 43,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               /* IRQ for channels 4-5 */
+               .start  = 72,
+               .end    = 73,
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device dma0_device = {
+       .name           = "sh-dma-engine",
+       .id             = 0,
+       .resource       = sh7724_dmae0_resources,
+       .num_resources  = ARRAY_SIZE(sh7724_dmae0_resources),
+       .dev            = {
+               .platform_data  = &dma_platform_data,
+       },
+       .archdata = {
+               .hwblk_id = HWBLK_DMAC0,
+       },
+ };
+ static struct platform_device dma1_device = {
+       .name           = "sh-dma-engine",
+       .id             = 1,
+       .resource       = sh7724_dmae1_resources,
+       .num_resources  = ARRAY_SIZE(sh7724_dmae1_resources),
+       .dev            = {
+               .platform_data  = &dma_platform_data,
+       },
+       .archdata = {
+               .hwblk_id = HWBLK_DMAC1,
+       },
+ };
+ /* Serial */
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xffe00000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 80, 80, 80, 80 },
+ };
+ static struct platform_device scif0_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xffe10000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 81, 81, 81, 81 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xffe20000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 82, 82, 82, 82 },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif2_platform_data,
+       },
+ };
+ static struct plat_sci_port scif3_platform_data = {
+       .mapbase        = 0xa4e30000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_3,
+       .type           = PORT_SCIFA,
+       .irqs           = { 56, 56, 56, 56 },
+ };
+ static struct platform_device scif3_device = {
+       .name           = "sh-sci",
+       .id             = 3,
+       .dev            = {
+               .platform_data  = &scif3_platform_data,
+       },
+ };
+ static struct plat_sci_port scif4_platform_data = {
+       .mapbase        = 0xa4e40000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_3,
+       .type           = PORT_SCIFA,
+       .irqs           = { 88, 88, 88, 88 },
+ };
+ static struct platform_device scif4_device = {
+       .name           = "sh-sci",
+       .id             = 4,
+       .dev            = {
+               .platform_data  = &scif4_platform_data,
+       },
+ };
+ static struct plat_sci_port scif5_platform_data = {
+       .mapbase        = 0xa4e50000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE,
++      .scbrr_algo_id  = SCBRR_ALGO_3,
+       .type           = PORT_SCIFA,
+       .irqs           = { 109, 109, 109, 109 },
+ };
+ static struct platform_device scif5_device = {
+       .name           = "sh-sci",
+       .id             = 5,
+       .dev            = {
+               .platform_data  = &scif5_platform_data,
        },
  };
  
@@@ -115,6 -373,9 +385,9 @@@ static struct platform_device rtc_devic
        .id             = -1,
        .num_resources  = ARRAY_SIZE(rtc_resources),
        .resource       = rtc_resources,
+       .archdata = {
+               .hwblk_id = HWBLK_RTC,
+       },
  };
  
  /* I2C0 */
@@@ -137,6 -398,9 +410,9 @@@ static struct platform_device iic0_devi
        .id             = 0, /* "i2c0" clock */
        .num_resources  = ARRAY_SIZE(iic0_resources),
        .resource       = iic0_resources,
+       .archdata = {
+               .hwblk_id = HWBLK_IIC0,
+       },
  };
  
  /* I2C1 */
@@@ -159,6 -423,9 +435,9 @@@ static struct platform_device iic1_devi
        .id             = 1, /* "i2c1" clock */
        .num_resources  = ARRAY_SIZE(iic1_resources),
        .resource       = iic1_resources,
+       .archdata = {
+               .hwblk_id = HWBLK_IIC1,
+       },
  };
  
  /* VPU */
@@@ -188,6 -455,9 +467,9 @@@ static struct platform_device vpu_devic
        },
        .resource       = vpu_resources,
        .num_resources  = ARRAY_SIZE(vpu_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_VPU,
+       },
  };
  
  /* VEU0 */
@@@ -201,7 -471,7 +483,7 @@@ static struct resource veu0_resources[
        [0] = {
                .name   = "VEU3F0",
                .start  = 0xfe920000,
-               .end    = 0xfe9200cb - 1,
+               .end    = 0xfe9200cb,
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
@@@ -217,6 -487,9 +499,9 @@@ static struct platform_device veu0_devi
        },
        .resource       = veu0_resources,
        .num_resources  = ARRAY_SIZE(veu0_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_VEU0,
+       },
  };
  
  /* VEU1 */
@@@ -230,7 -503,7 +515,7 @@@ static struct resource veu1_resources[
        [0] = {
                .name   = "VEU3F1",
                .start  = 0xfe924000,
-               .end    = 0xfe9240cb - 1,
+               .end    = 0xfe9240cb,
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
@@@ -246,20 -519,84 +531,84 @@@ static struct platform_device veu1_devi
        },
        .resource       = veu1_resources,
        .num_resources  = ARRAY_SIZE(veu1_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_VEU1,
+       },
+ };
+ /* BEU0 */
+ static struct uio_info beu0_platform_data = {
+       .name = "BEU0",
+       .version = "0",
+       .irq = evt2irq(0x8A0),
+ };
+ static struct resource beu0_resources[] = {
+       [0] = {
+               .name   = "BEU0",
+               .start  = 0xfe930000,
+               .end    = 0xfe933400,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               /* place holder for contiguous memory */
+       },
+ };
+ static struct platform_device beu0_device = {
+       .name           = "uio_pdrv_genirq",
+       .id             = 6,
+       .dev = {
+               .platform_data  = &beu0_platform_data,
+       },
+       .resource       = beu0_resources,
+       .num_resources  = ARRAY_SIZE(beu0_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_BEU0,
+       },
+ };
+ /* BEU1 */
+ static struct uio_info beu1_platform_data = {
+       .name = "BEU1",
+       .version = "0",
+       .irq = evt2irq(0xA00),
+ };
+ static struct resource beu1_resources[] = {
+       [0] = {
+               .name   = "BEU1",
+               .start  = 0xfe940000,
+               .end    = 0xfe943400,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               /* place holder for contiguous memory */
+       },
+ };
+ static struct platform_device beu1_device = {
+       .name           = "uio_pdrv_genirq",
+       .id             = 7,
+       .dev = {
+               .platform_data  = &beu1_platform_data,
+       },
+       .resource       = beu1_resources,
+       .num_resources  = ARRAY_SIZE(beu1_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_BEU1,
+       },
  };
  
  static struct sh_timer_config cmt_platform_data = {
-       .name = "CMT",
        .channel_offset = 0x60,
        .timer_bit = 5,
-       .clk = "cmt0",
        .clockevent_rating = 125,
        .clocksource_rating = 200,
  };
  
  static struct resource cmt_resources[] = {
        [0] = {
-               .name   = "CMT",
                .start  = 0x044a0060,
                .end    = 0x044a006b,
                .flags  = IORESOURCE_MEM,
@@@ -278,19 -615,19 +627,19 @@@ static struct platform_device cmt_devic
        },
        .resource       = cmt_resources,
        .num_resources  = ARRAY_SIZE(cmt_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_CMT,
+       },
  };
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "tmu0",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xffd80008,
                .end    = 0xffd80013,
                .flags  = IORESOURCE_MEM,
@@@ -309,19 -646,19 +658,19 @@@ static struct platform_device tmu0_devi
        },
        .resource       = tmu0_resources,
        .num_resources  = ARRAY_SIZE(tmu0_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_TMU0,
+       },
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "tmu0",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xffd80014,
                .end    = 0xffd8001f,
                .flags  = IORESOURCE_MEM,
@@@ -340,18 -677,18 +689,18 @@@ static struct platform_device tmu1_devi
        },
        .resource       = tmu1_resources,
        .num_resources  = ARRAY_SIZE(tmu1_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_TMU0,
+       },
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "tmu0",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xffd80020,
                .end    = 0xffd8002b,
                .flags  = IORESOURCE_MEM,
@@@ -370,19 -707,19 +719,19 @@@ static struct platform_device tmu2_devi
        },
        .resource       = tmu2_resources,
        .num_resources  = ARRAY_SIZE(tmu2_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_TMU0,
+       },
  };
  
  
  static struct sh_timer_config tmu3_platform_data = {
-       .name = "TMU3",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "tmu1",
  };
  
  static struct resource tmu3_resources[] = {
        [0] = {
-               .name   = "TMU3",
                .start  = 0xffd90008,
                .end    = 0xffd90013,
                .flags  = IORESOURCE_MEM,
@@@ -401,18 -738,18 +750,18 @@@ static struct platform_device tmu3_devi
        },
        .resource       = tmu3_resources,
        .num_resources  = ARRAY_SIZE(tmu3_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_TMU1,
+       },
  };
  
  static struct sh_timer_config tmu4_platform_data = {
-       .name = "TMU4",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "tmu1",
  };
  
  static struct resource tmu4_resources[] = {
        [0] = {
-               .name   = "TMU4",
                .start  = 0xffd90014,
                .end    = 0xffd9001f,
                .flags  = IORESOURCE_MEM,
@@@ -431,18 -768,18 +780,18 @@@ static struct platform_device tmu4_devi
        },
        .resource       = tmu4_resources,
        .num_resources  = ARRAY_SIZE(tmu4_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_TMU1,
+       },
  };
  
  static struct sh_timer_config tmu5_platform_data = {
-       .name = "TMU5",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "tmu1",
  };
  
  static struct resource tmu5_resources[] = {
        [0] = {
-               .name   = "TMU5",
                .start  = 0xffd90020,
                .end    = 0xffd9002b,
                .flags  = IORESOURCE_MEM,
@@@ -461,6 -798,9 +810,9 @@@ static struct platform_device tmu5_devi
        },
        .resource       = tmu5_resources,
        .num_resources  = ARRAY_SIZE(tmu5_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_TMU1,
+       },
  };
  
  /* JPU */
@@@ -490,9 -830,82 +842,82 @@@ static struct platform_device jpu_devic
        },
        .resource       = jpu_resources,
        .num_resources  = ARRAY_SIZE(jpu_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_JPU,
+       },
+ };
+ /* SPU2DSP0 */
+ static struct uio_info spu0_platform_data = {
+       .name = "SPU2DSP0",
+       .version = "0",
+       .irq = 86,
+ };
+ static struct resource spu0_resources[] = {
+       [0] = {
+               .name   = "SPU2DSP0",
+               .start  = 0xFE200000,
+               .end    = 0xFE2FFFFF,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               /* place holder for contiguous memory */
+       },
+ };
+ static struct platform_device spu0_device = {
+       .name           = "uio_pdrv_genirq",
+       .id             = 4,
+       .dev = {
+               .platform_data  = &spu0_platform_data,
+       },
+       .resource       = spu0_resources,
+       .num_resources  = ARRAY_SIZE(spu0_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_SPU,
+       },
+ };
+ /* SPU2DSP1 */
+ static struct uio_info spu1_platform_data = {
+       .name = "SPU2DSP1",
+       .version = "0",
+       .irq = 87,
+ };
+ static struct resource spu1_resources[] = {
+       [0] = {
+               .name   = "SPU2DSP1",
+               .start  = 0xFE300000,
+               .end    = 0xFE3FFFFF,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               /* place holder for contiguous memory */
+       },
+ };
+ static struct platform_device spu1_device = {
+       .name           = "uio_pdrv_genirq",
+       .id             = 5,
+       .dev = {
+               .platform_data  = &spu1_platform_data,
+       },
+       .resource       = spu1_resources,
+       .num_resources  = ARRAY_SIZE(spu1_resources),
+       .archdata = {
+               .hwblk_id = HWBLK_SPU,
+       },
  };
  
  static struct platform_device *sh7724_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &scif5_device,
        &cmt_device,
        &tmu0_device,
        &tmu1_device,
        &tmu3_device,
        &tmu4_device,
        &tmu5_device,
-       &sci_device,
+       &dma0_device,
+       &dma1_device,
        &rtc_device,
        &iic0_device,
        &iic1_device,
        &vpu_device,
        &veu0_device,
        &veu1_device,
+       &beu0_device,
+       &beu1_device,
        &jpu_device,
+       &spu0_device,
+       &spu1_device,
  };
  
  static int __init sh7724_devices_setup(void)
        platform_resource_setup_memory(&veu0_device, "veu0", 2 << 20);
        platform_resource_setup_memory(&veu1_device, "veu1", 2 << 20);
        platform_resource_setup_memory(&jpu_device,  "jpu",  2 << 20);
+       platform_resource_setup_memory(&spu0_device, "spu0", 2 << 20);
+       platform_resource_setup_memory(&spu1_device, "spu1", 2 << 20);
  
        return platform_add_devices(sh7724_devices,
                                    ARRAY_SIZE(sh7724_devices));
  }
device_initcall(sh7724_devices_setup);
arch_initcall(sh7724_devices_setup);
  
  static struct platform_device *sh7724_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &scif5_device,
        &cmt_device,
        &tmu0_device,
        &tmu1_device,
@@@ -541,14 -967,17 +979,17 @@@ void __init plat_early_device_setup(voi
  #define RAMCR_CACHE_L2FC      0x0002
  #define RAMCR_CACHE_L2E               0x0001
  #define L2_CACHE_ENABLE               (RAMCR_CACHE_L2E|RAMCR_CACHE_L2FC)
- void __uses_jump_to_uncached l2_cache_init(void)
+ void l2_cache_init(void)
  {
        /* Enable L2 cache */
-       ctrl_outl(L2_CACHE_ENABLE, RAMCR);
+       __raw_writel(L2_CACHE_ENABLE, RAMCR);
  }
  
  enum {
        UNUSED = 0,
+       ENABLED,
+       DISABLED,
  
        /* interrupt sources */
        IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
        ETHI,
        I2C1_ALI, I2C1_TACKI, I2C1_WAITI, I2C1_DTEI,
        I2C0_ALI, I2C0_TACKI, I2C0_WAITI, I2C0_DTEI,
-       SDHI0_SDHII0, SDHI0_SDHII1, SDHI0_SDHII2, SDHI0_SDHII3,
        CMT,
        TSIF,
        FSI,
        SCIFA5,
        TMU0_TUNI0, TMU0_TUNI1, TMU0_TUNI2,
        IRDA,
-       SDHI1_SDHII0, SDHI1_SDHII1, SDHI1_SDHII2,
        JPU,
        _2DDMAC,
        MMC_MMC2I, MMC_MMC3I,
@@@ -666,10 -1093,10 +1105,10 @@@ static struct intc_vect vectors[] __ini
        INTC_VECT(I2C0_WAITI, 0xE40),
        INTC_VECT(I2C0_DTEI, 0xE60),
  
-       INTC_VECT(SDHI0_SDHII0, 0xE80),
-       INTC_VECT(SDHI0_SDHII1, 0xEA0),
-       INTC_VECT(SDHI0_SDHII2, 0xEC0),
-       INTC_VECT(SDHI0_SDHII3, 0xEE0),
+       INTC_VECT(SDHI0, 0xE80),
+       INTC_VECT(SDHI0, 0xEA0),
+       INTC_VECT(SDHI0, 0xEC0),
+       INTC_VECT(SDHI0, 0xEE0),
  
        INTC_VECT(CMT,    0xF00),
        INTC_VECT(TSIF,   0xF20),
  
        INTC_VECT(IRDA,    0x480),
  
-       INTC_VECT(SDHI1_SDHII0, 0x4E0),
-       INTC_VECT(SDHI1_SDHII1, 0x500),
-       INTC_VECT(SDHI1_SDHII2, 0x520),
+       INTC_VECT(SDHI1, 0x4E0),
+       INTC_VECT(SDHI1, 0x500),
+       INTC_VECT(SDHI1, 0x520),
  
        INTC_VECT(JPU, 0x560),
        INTC_VECT(_2DDMAC, 0x4A0),
@@@ -710,8 -1137,6 +1149,6 @@@ static struct intc_group groups[] __ini
        INTC_GROUP(DMAC0B, DMAC0B_DEI4, DMAC0B_DEI5, DMAC0B_DADERR),
        INTC_GROUP(I2C0, I2C0_ALI, I2C0_TACKI, I2C0_WAITI, I2C0_DTEI),
        INTC_GROUP(I2C1, I2C1_ALI, I2C1_TACKI, I2C1_WAITI, I2C1_DTEI),
-       INTC_GROUP(SDHI0, SDHI0_SDHII0, SDHI0_SDHII1, SDHI0_SDHII2, SDHI0_SDHII3),
-       INTC_GROUP(SDHI1, SDHI1_SDHII0, SDHI1_SDHII1, SDHI1_SDHII2),
        INTC_GROUP(SPU, SPU_SPUI0, SPU_SPUI1),
        INTC_GROUP(MMCIF, MMC_MMC2I, MMC_MMC3I),
  };
  static struct intc_mask_reg mask_registers[] __initdata = {
        { 0xa4080080, 0xa40800c0, 8, /* IMR0 / IMCR0 */
          { 0, TMU1_TUNI2, TMU1_TUNI1, TMU1_TUNI0,
-           0, SDHI1_SDHII2, SDHI1_SDHII1, SDHI1_SDHII0 } },
+           0, DISABLED, ENABLED, ENABLED } },
        { 0xa4080084, 0xa40800c4, 8, /* IMR1 / IMCR1 */
          { VIO_VOU, VIO_VEU1, VIO_BEU0, VIO_CEU0,
            DMAC0A_DEI3, DMAC0A_DEI2, DMAC0A_DEI1, DMAC0A_DEI0 } },
          { I2C0_DTEI, I2C0_WAITI, I2C0_TACKI, I2C0_ALI,
            I2C1_DTEI, I2C1_WAITI, I2C1_TACKI, I2C1_ALI } },
        { 0xa40800a0, 0xa40800e0, 8, /* IMR8 / IMCR8 */
-         { SDHI0_SDHII3, SDHI0_SDHII2, SDHI0_SDHII1, SDHI0_SDHII0,
+         { DISABLED, DISABLED, ENABLED, ENABLED,
            0, 0, SCIFA5, FSI } },
        { 0xa40800a4, 0xa40800e4, 8, /* IMR9 / IMCR9 */
          { 0, 0, 0, CMT, 0, USB1, USB0, 0 } },
@@@ -788,11 -1213,205 +1225,205 @@@ static struct intc_mask_reg ack_registe
          { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
  };
  
- static DECLARE_INTC_DESC_ACK(intc_desc, "sh7724", vectors, groups,
-                            mask_registers, prio_registers, sense_registers,
-                            ack_registers);
+ static struct intc_desc intc_desc __initdata = {
+       .name = "sh7724",
+       .force_enable = ENABLED,
+       .force_disable = DISABLED,
+       .hw = INTC_HW_DESC(vectors, groups, mask_registers,
+                          prio_registers, sense_registers, ack_registers),
+ };
  
  void __init plat_irq_setup(void)
  {
        register_intc_controller(&intc_desc);
  }
+ static struct {
+       /* BSC */
+       unsigned long mmselr;
+       unsigned long cs0bcr;
+       unsigned long cs4bcr;
+       unsigned long cs5abcr;
+       unsigned long cs5bbcr;
+       unsigned long cs6abcr;
+       unsigned long cs6bbcr;
+       unsigned long cs4wcr;
+       unsigned long cs5awcr;
+       unsigned long cs5bwcr;
+       unsigned long cs6awcr;
+       unsigned long cs6bwcr;
+       /* INTC */
+       unsigned short ipra;
+       unsigned short iprb;
+       unsigned short iprc;
+       unsigned short iprd;
+       unsigned short ipre;
+       unsigned short iprf;
+       unsigned short iprg;
+       unsigned short iprh;
+       unsigned short ipri;
+       unsigned short iprj;
+       unsigned short iprk;
+       unsigned short iprl;
+       unsigned char imr0;
+       unsigned char imr1;
+       unsigned char imr2;
+       unsigned char imr3;
+       unsigned char imr4;
+       unsigned char imr5;
+       unsigned char imr6;
+       unsigned char imr7;
+       unsigned char imr8;
+       unsigned char imr9;
+       unsigned char imr10;
+       unsigned char imr11;
+       unsigned char imr12;
+       /* RWDT */
+       unsigned short rwtcnt;
+       unsigned short rwtcsr;
+       /* CPG */
+       unsigned long irdaclk;
+       unsigned long spuclk;
+ } sh7724_rstandby_state;
+ static int sh7724_pre_sleep_notifier_call(struct notifier_block *nb,
+                                         unsigned long flags, void *unused)
+ {
+       if (!(flags & SUSP_SH_RSTANDBY))
+               return NOTIFY_DONE;
+       /* BCR */
+       sh7724_rstandby_state.mmselr = __raw_readl(0xff800020); /* MMSELR */
+       sh7724_rstandby_state.mmselr |= 0xa5a50000;
+       sh7724_rstandby_state.cs0bcr = __raw_readl(0xfec10004); /* CS0BCR */
+       sh7724_rstandby_state.cs4bcr = __raw_readl(0xfec10010); /* CS4BCR */
+       sh7724_rstandby_state.cs5abcr = __raw_readl(0xfec10014); /* CS5ABCR */
+       sh7724_rstandby_state.cs5bbcr = __raw_readl(0xfec10018); /* CS5BBCR */
+       sh7724_rstandby_state.cs6abcr = __raw_readl(0xfec1001c); /* CS6ABCR */
+       sh7724_rstandby_state.cs6bbcr = __raw_readl(0xfec10020); /* CS6BBCR */
+       sh7724_rstandby_state.cs4wcr = __raw_readl(0xfec10030); /* CS4WCR */
+       sh7724_rstandby_state.cs5awcr = __raw_readl(0xfec10034); /* CS5AWCR */
+       sh7724_rstandby_state.cs5bwcr = __raw_readl(0xfec10038); /* CS5BWCR */
+       sh7724_rstandby_state.cs6awcr = __raw_readl(0xfec1003c); /* CS6AWCR */
+       sh7724_rstandby_state.cs6bwcr = __raw_readl(0xfec10040); /* CS6BWCR */
+       /* INTC */
+       sh7724_rstandby_state.ipra = __raw_readw(0xa4080000); /* IPRA */
+       sh7724_rstandby_state.iprb = __raw_readw(0xa4080004); /* IPRB */
+       sh7724_rstandby_state.iprc = __raw_readw(0xa4080008); /* IPRC */
+       sh7724_rstandby_state.iprd = __raw_readw(0xa408000c); /* IPRD */
+       sh7724_rstandby_state.ipre = __raw_readw(0xa4080010); /* IPRE */
+       sh7724_rstandby_state.iprf = __raw_readw(0xa4080014); /* IPRF */
+       sh7724_rstandby_state.iprg = __raw_readw(0xa4080018); /* IPRG */
+       sh7724_rstandby_state.iprh = __raw_readw(0xa408001c); /* IPRH */
+       sh7724_rstandby_state.ipri = __raw_readw(0xa4080020); /* IPRI */
+       sh7724_rstandby_state.iprj = __raw_readw(0xa4080024); /* IPRJ */
+       sh7724_rstandby_state.iprk = __raw_readw(0xa4080028); /* IPRK */
+       sh7724_rstandby_state.iprl = __raw_readw(0xa408002c); /* IPRL */
+       sh7724_rstandby_state.imr0 = __raw_readb(0xa4080080); /* IMR0 */
+       sh7724_rstandby_state.imr1 = __raw_readb(0xa4080084); /* IMR1 */
+       sh7724_rstandby_state.imr2 = __raw_readb(0xa4080088); /* IMR2 */
+       sh7724_rstandby_state.imr3 = __raw_readb(0xa408008c); /* IMR3 */
+       sh7724_rstandby_state.imr4 = __raw_readb(0xa4080090); /* IMR4 */
+       sh7724_rstandby_state.imr5 = __raw_readb(0xa4080094); /* IMR5 */
+       sh7724_rstandby_state.imr6 = __raw_readb(0xa4080098); /* IMR6 */
+       sh7724_rstandby_state.imr7 = __raw_readb(0xa408009c); /* IMR7 */
+       sh7724_rstandby_state.imr8 = __raw_readb(0xa40800a0); /* IMR8 */
+       sh7724_rstandby_state.imr9 = __raw_readb(0xa40800a4); /* IMR9 */
+       sh7724_rstandby_state.imr10 = __raw_readb(0xa40800a8); /* IMR10 */
+       sh7724_rstandby_state.imr11 = __raw_readb(0xa40800ac); /* IMR11 */
+       sh7724_rstandby_state.imr12 = __raw_readb(0xa40800b0); /* IMR12 */
+       /* RWDT */
+       sh7724_rstandby_state.rwtcnt = __raw_readb(0xa4520000); /* RWTCNT */
+       sh7724_rstandby_state.rwtcnt |= 0x5a00;
+       sh7724_rstandby_state.rwtcsr = __raw_readb(0xa4520004); /* RWTCSR */
+       sh7724_rstandby_state.rwtcsr |= 0xa500;
+       __raw_writew(sh7724_rstandby_state.rwtcsr & 0x07, 0xa4520004);
+       /* CPG */
+       sh7724_rstandby_state.irdaclk = __raw_readl(0xa4150018); /* IRDACLKCR */
+       sh7724_rstandby_state.spuclk = __raw_readl(0xa415003c); /* SPUCLKCR */
+       return NOTIFY_DONE;
+ }
+ static int sh7724_post_sleep_notifier_call(struct notifier_block *nb,
+                                          unsigned long flags, void *unused)
+ {
+       if (!(flags & SUSP_SH_RSTANDBY))
+               return NOTIFY_DONE;
+       /* BCR */
+       __raw_writel(sh7724_rstandby_state.mmselr, 0xff800020); /* MMSELR */
+       __raw_writel(sh7724_rstandby_state.cs0bcr, 0xfec10004); /* CS0BCR */
+       __raw_writel(sh7724_rstandby_state.cs4bcr, 0xfec10010); /* CS4BCR */
+       __raw_writel(sh7724_rstandby_state.cs5abcr, 0xfec10014); /* CS5ABCR */
+       __raw_writel(sh7724_rstandby_state.cs5bbcr, 0xfec10018); /* CS5BBCR */
+       __raw_writel(sh7724_rstandby_state.cs6abcr, 0xfec1001c); /* CS6ABCR */
+       __raw_writel(sh7724_rstandby_state.cs6bbcr, 0xfec10020); /* CS6BBCR */
+       __raw_writel(sh7724_rstandby_state.cs4wcr, 0xfec10030); /* CS4WCR */
+       __raw_writel(sh7724_rstandby_state.cs5awcr, 0xfec10034); /* CS5AWCR */
+       __raw_writel(sh7724_rstandby_state.cs5bwcr, 0xfec10038); /* CS5BWCR */
+       __raw_writel(sh7724_rstandby_state.cs6awcr, 0xfec1003c); /* CS6AWCR */
+       __raw_writel(sh7724_rstandby_state.cs6bwcr, 0xfec10040); /* CS6BWCR */
+       /* INTC */
+       __raw_writew(sh7724_rstandby_state.ipra, 0xa4080000); /* IPRA */
+       __raw_writew(sh7724_rstandby_state.iprb, 0xa4080004); /* IPRB */
+       __raw_writew(sh7724_rstandby_state.iprc, 0xa4080008); /* IPRC */
+       __raw_writew(sh7724_rstandby_state.iprd, 0xa408000c); /* IPRD */
+       __raw_writew(sh7724_rstandby_state.ipre, 0xa4080010); /* IPRE */
+       __raw_writew(sh7724_rstandby_state.iprf, 0xa4080014); /* IPRF */
+       __raw_writew(sh7724_rstandby_state.iprg, 0xa4080018); /* IPRG */
+       __raw_writew(sh7724_rstandby_state.iprh, 0xa408001c); /* IPRH */
+       __raw_writew(sh7724_rstandby_state.ipri, 0xa4080020); /* IPRI */
+       __raw_writew(sh7724_rstandby_state.iprj, 0xa4080024); /* IPRJ */
+       __raw_writew(sh7724_rstandby_state.iprk, 0xa4080028); /* IPRK */
+       __raw_writew(sh7724_rstandby_state.iprl, 0xa408002c); /* IPRL */
+       __raw_writeb(sh7724_rstandby_state.imr0, 0xa4080080); /* IMR0 */
+       __raw_writeb(sh7724_rstandby_state.imr1, 0xa4080084); /* IMR1 */
+       __raw_writeb(sh7724_rstandby_state.imr2, 0xa4080088); /* IMR2 */
+       __raw_writeb(sh7724_rstandby_state.imr3, 0xa408008c); /* IMR3 */
+       __raw_writeb(sh7724_rstandby_state.imr4, 0xa4080090); /* IMR4 */
+       __raw_writeb(sh7724_rstandby_state.imr5, 0xa4080094); /* IMR5 */
+       __raw_writeb(sh7724_rstandby_state.imr6, 0xa4080098); /* IMR6 */
+       __raw_writeb(sh7724_rstandby_state.imr7, 0xa408009c); /* IMR7 */
+       __raw_writeb(sh7724_rstandby_state.imr8, 0xa40800a0); /* IMR8 */
+       __raw_writeb(sh7724_rstandby_state.imr9, 0xa40800a4); /* IMR9 */
+       __raw_writeb(sh7724_rstandby_state.imr10, 0xa40800a8); /* IMR10 */
+       __raw_writeb(sh7724_rstandby_state.imr11, 0xa40800ac); /* IMR11 */
+       __raw_writeb(sh7724_rstandby_state.imr12, 0xa40800b0); /* IMR12 */
+       /* RWDT */
+       __raw_writew(sh7724_rstandby_state.rwtcnt, 0xa4520000); /* RWTCNT */
+       __raw_writew(sh7724_rstandby_state.rwtcsr, 0xa4520004); /* RWTCSR */
+       /* CPG */
+       __raw_writel(sh7724_rstandby_state.irdaclk, 0xa4150018); /* IRDACLKCR */
+       __raw_writel(sh7724_rstandby_state.spuclk, 0xa415003c); /* SPUCLKCR */
+       return NOTIFY_DONE;
+ }
+ static struct notifier_block sh7724_pre_sleep_notifier = {
+       .notifier_call = sh7724_pre_sleep_notifier_call,
+       .priority = SH_MOBILE_PRE(SH_MOBILE_SLEEP_CPU),
+ };
+ static struct notifier_block sh7724_post_sleep_notifier = {
+       .notifier_call = sh7724_post_sleep_notifier_call,
+       .priority = SH_MOBILE_POST(SH_MOBILE_SLEEP_CPU),
+ };
+ static int __init sh7724_sleep_setup(void)
+ {
+       atomic_notifier_chain_register(&sh_mobile_pre_sleep_notifier_list,
+                                      &sh7724_pre_sleep_notifier);
+       atomic_notifier_chain_register(&sh_mobile_post_sleep_notifier_list,
+                                      &sh7724_post_sleep_notifier);
+       return 0;
+ }
+ arch_initcall(sh7724_sleep_setup);
index 0000000,749c638..9c1de26
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,617 +1,623 @@@
+ /*
+  * SH7757 Setup
+  *
+  * Copyright (C) 2009  Renesas Solutions Corp.
+  *
+  *  based on setup-sh7785.c : Copyright (C) 2007  Paul Mundt
+  *
+  * This file is subject to the terms and conditions of the GNU General Public
+  * License.  See the file "COPYING" in the main directory of this archive
+  * for more details.
+  */
+ #include <linux/platform_device.h>
+ #include <linux/init.h>
+ #include <linux/serial.h>
+ #include <linux/serial_sci.h>
+ #include <linux/io.h>
+ #include <linux/mm.h>
+ #include <linux/sh_timer.h>
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xfe4b0000,           /* SCIF2 */
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 40, 40, 40, 40 },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif2_platform_data,
+       },
+ };
+ static struct plat_sci_port scif3_platform_data = {
+       .mapbase        = 0xfe4c0000,           /* SCIF3 */
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 76, 76, 76, 76 },
+ };
+ static struct platform_device scif3_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif3_platform_data,
+       },
+ };
+ static struct plat_sci_port scif4_platform_data = {
+       .mapbase        = 0xfe4d0000,           /* SCIF4 */
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 104, 104, 104, 104 },
+ };
+ static struct platform_device scif4_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &scif4_platform_data,
+       },
+ };
+ static struct sh_timer_config tmu0_platform_data = {
+       .channel_offset = 0x04,
+       .timer_bit = 0,
+       .clockevent_rating = 200,
+ };
+ static struct resource tmu0_resources[] = {
+       [0] = {
+               .start  = 0xfe430008,
+               .end    = 0xfe430013,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = 28,
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device tmu0_device = {
+       .name           = "sh_tmu",
+       .id             = 0,
+       .dev = {
+               .platform_data  = &tmu0_platform_data,
+       },
+       .resource       = tmu0_resources,
+       .num_resources  = ARRAY_SIZE(tmu0_resources),
+ };
+ static struct sh_timer_config tmu1_platform_data = {
+       .channel_offset = 0x10,
+       .timer_bit = 1,
+       .clocksource_rating = 200,
+ };
+ static struct resource tmu1_resources[] = {
+       [0] = {
+               .start  = 0xfe430014,
+               .end    = 0xfe43001f,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = 29,
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device tmu1_device = {
+       .name           = "sh_tmu",
+       .id             = 1,
+       .dev = {
+               .platform_data  = &tmu1_platform_data,
+       },
+       .resource       = tmu1_resources,
+       .num_resources  = ARRAY_SIZE(tmu1_resources),
+ };
+ static struct platform_device *sh7757_devices[] __initdata = {
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &tmu0_device,
+       &tmu1_device,
+ };
+ static int __init sh7757_devices_setup(void)
+ {
+       return platform_add_devices(sh7757_devices,
+                                   ARRAY_SIZE(sh7757_devices));
+ }
+ arch_initcall(sh7757_devices_setup);
+ static struct platform_device *sh7757_early_devices[] __initdata = {
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &tmu0_device,
+       &tmu1_device,
+ };
+ void __init plat_early_device_setup(void)
+ {
+       early_platform_add_devices(sh7757_early_devices,
+                                  ARRAY_SIZE(sh7757_early_devices));
+ }
+ enum {
+       UNUSED = 0,
+       /* interrupt sources */
+       IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
+       IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
+       IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
+       IRL0_HHLL, IRL0_HHLH, IRL0_HHHL,
+       IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
+       IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
+       IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
+       IRL4_HHLL, IRL4_HHLH, IRL4_HHHL,
+       IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7,
+       SDHI, DVC,
+       IRQ8, IRQ9, IRQ11, IRQ10, IRQ12, IRQ13, IRQ14, IRQ15,
+       TMU0, TMU1, TMU2, TMU2_TICPI, TMU3, TMU4, TMU5,
+       HUDI,
+       ARC4,
+       DMAC0_5, DMAC6_7, DMAC8_11,
+       SCIF0, SCIF1, SCIF2, SCIF3, SCIF4,
+       USB0, USB1,
+       JMC,
+       SPI0, SPI1,
+       TMR01, TMR23, TMR45,
+       FRT,
+       LPC, LPC5, LPC6, LPC7, LPC8,
+       PECI0, PECI1, PECI2, PECI3, PECI4, PECI5,
+       ETHERC,
+       ADC0, ADC1,
+       SIM,
+       IIC0_0, IIC0_1, IIC0_2, IIC0_3,
+       IIC1_0, IIC1_1, IIC1_2, IIC1_3,
+       IIC2_0, IIC2_1, IIC2_2, IIC2_3,
+       IIC3_0, IIC3_1, IIC3_2, IIC3_3,
+       IIC4_0, IIC4_1, IIC4_2, IIC4_3,
+       IIC5_0, IIC5_1, IIC5_2, IIC5_3,
+       IIC6_0, IIC6_1, IIC6_2, IIC6_3,
+       IIC7_0, IIC7_1, IIC7_2, IIC7_3,
+       IIC8_0, IIC8_1, IIC8_2, IIC8_3,
+       IIC9_0, IIC9_1, IIC9_2, IIC9_3,
+       ONFICTL,
+       MMC1, MMC2,
+       ECCU,
+       PCIC,
+       G200,
+       RSPI,
+       SGPIO,
+       DMINT12, DMINT13, DMINT14, DMINT15, DMINT16, DMINT17, DMINT18, DMINT19,
+       DMINT20, DMINT21, DMINT22, DMINT23,
+       DDRECC,
+       TSIP,
+       PCIE_BRIDGE,
+       WDT0B, WDT1B, WDT2B, WDT3B, WDT4B, WDT5B, WDT6B, WDT7B, WDT8B,
+       GETHER0, GETHER1, GETHER2,
+       PBIA, PBIB, PBIC,
+       DMAE2, DMAE3,
+       SERMUX2, SERMUX3,
+       /* interrupt groups */
+       TMU012, TMU345,
+ };
+ static struct intc_vect vectors[] __initdata = {
+       INTC_VECT(SDHI, 0x480), INTC_VECT(SDHI, 0x04a0),
+       INTC_VECT(SDHI, 0x4c0),
+       INTC_VECT(DVC, 0x4e0),
+       INTC_VECT(IRQ8, 0x500), INTC_VECT(IRQ9, 0x520),
+       INTC_VECT(IRQ10, 0x540),
+       INTC_VECT(TMU0, 0x580), INTC_VECT(TMU1, 0x5a0),
+       INTC_VECT(TMU2, 0x5c0), INTC_VECT(TMU2_TICPI, 0x5e0),
+       INTC_VECT(HUDI, 0x600),
+       INTC_VECT(ARC4, 0x620),
+       INTC_VECT(DMAC0_5, 0x640), INTC_VECT(DMAC0_5, 0x660),
+       INTC_VECT(DMAC0_5, 0x680), INTC_VECT(DMAC0_5, 0x6a0),
+       INTC_VECT(DMAC0_5, 0x6c0),
+       INTC_VECT(IRQ11, 0x6e0),
+       INTC_VECT(SCIF2, 0x700), INTC_VECT(SCIF2, 0x720),
+       INTC_VECT(SCIF2, 0x740), INTC_VECT(SCIF2, 0x760),
+       INTC_VECT(DMAC0_5, 0x780), INTC_VECT(DMAC0_5, 0x7a0),
+       INTC_VECT(DMAC6_7, 0x7c0), INTC_VECT(DMAC6_7, 0x7e0),
+       INTC_VECT(USB0, 0x840),
+       INTC_VECT(IRQ12, 0x880),
+       INTC_VECT(JMC, 0x8a0),
+       INTC_VECT(SPI1, 0x8c0),
+       INTC_VECT(IRQ13, 0x8e0), INTC_VECT(IRQ14, 0x900),
+       INTC_VECT(USB1, 0x920),
+       INTC_VECT(TMR01, 0xa00), INTC_VECT(TMR23, 0xa20),
+       INTC_VECT(TMR45, 0xa40),
+       INTC_VECT(FRT, 0xa80),
+       INTC_VECT(LPC, 0xaa0), INTC_VECT(LPC, 0xac0),
+       INTC_VECT(LPC, 0xae0), INTC_VECT(LPC, 0xb00),
+       INTC_VECT(LPC, 0xb20),
+       INTC_VECT(SCIF0, 0xb40), INTC_VECT(SCIF1, 0xb60),
+       INTC_VECT(SCIF3, 0xb80), INTC_VECT(SCIF3, 0xba0),
+       INTC_VECT(SCIF3, 0xbc0), INTC_VECT(SCIF3, 0xbe0),
+       INTC_VECT(PECI0, 0xc00), INTC_VECT(PECI1, 0xc20),
+       INTC_VECT(PECI2, 0xc40),
+       INTC_VECT(IRQ15, 0xc60),
+       INTC_VECT(ETHERC, 0xc80), INTC_VECT(ETHERC, 0xca0),
+       INTC_VECT(SPI0, 0xcc0),
+       INTC_VECT(ADC1, 0xce0),
+       INTC_VECT(DMAC8_11, 0xd00), INTC_VECT(DMAC8_11, 0xd20),
+       INTC_VECT(DMAC8_11, 0xd40), INTC_VECT(DMAC8_11, 0xd60),
+       INTC_VECT(SIM, 0xd80), INTC_VECT(SIM, 0xda0),
+       INTC_VECT(SIM, 0xdc0), INTC_VECT(SIM, 0xde0),
+       INTC_VECT(TMU3, 0xe00), INTC_VECT(TMU4, 0xe20),
+       INTC_VECT(TMU5, 0xe40),
+       INTC_VECT(ADC0, 0xe60),
+       INTC_VECT(SCIF4, 0xf00), INTC_VECT(SCIF4, 0xf20),
+       INTC_VECT(SCIF4, 0xf40), INTC_VECT(SCIF4, 0xf60),
+       INTC_VECT(IIC0_0, 0x1400), INTC_VECT(IIC0_1, 0x1420),
+       INTC_VECT(IIC0_2, 0x1440), INTC_VECT(IIC0_3, 0x1460),
+       INTC_VECT(IIC1_0, 0x1480), INTC_VECT(IIC1_1, 0x14e0),
+       INTC_VECT(IIC1_2, 0x1500), INTC_VECT(IIC1_3, 0x1520),
+       INTC_VECT(IIC2_0, 0x1540), INTC_VECT(IIC2_1, 0x1560),
+       INTC_VECT(IIC2_2, 0x1580), INTC_VECT(IIC2_3, 0x1600),
+       INTC_VECT(IIC3_0, 0x1620), INTC_VECT(IIC3_1, 0x1640),
+       INTC_VECT(IIC3_2, 0x16e0), INTC_VECT(IIC3_3, 0x1700),
+       INTC_VECT(IIC4_0, 0x17c0), INTC_VECT(IIC4_1, 0x1800),
+       INTC_VECT(IIC4_2, 0x1820), INTC_VECT(IIC4_3, 0x1840),
+       INTC_VECT(IIC5_0, 0x1860), INTC_VECT(IIC5_1, 0x1880),
+       INTC_VECT(IIC5_2, 0x18a0), INTC_VECT(IIC5_3, 0x18c0),
+       INTC_VECT(IIC6_0, 0x18e0), INTC_VECT(IIC6_1, 0x1900),
+       INTC_VECT(IIC6_2, 0x1920),
+       INTC_VECT(ONFICTL, 0x1960),
+       INTC_VECT(IIC6_3, 0x1980),
+       INTC_VECT(IIC7_0, 0x19a0), INTC_VECT(IIC7_1, 0x1a00),
+       INTC_VECT(IIC7_2, 0x1a20), INTC_VECT(IIC7_3, 0x1a40),
+       INTC_VECT(IIC8_0, 0x1a60), INTC_VECT(IIC8_1, 0x1a80),
+       INTC_VECT(IIC8_2, 0x1aa0), INTC_VECT(IIC8_3, 0x1b40),
+       INTC_VECT(IIC9_0, 0x1b60), INTC_VECT(IIC9_1, 0x1b80),
+       INTC_VECT(IIC9_2, 0x1c00), INTC_VECT(IIC9_3, 0x1c20),
+       INTC_VECT(MMC1, 0x1c60), INTC_VECT(MMC2, 0x1c80),
+       INTC_VECT(ECCU, 0x1cc0),
+       INTC_VECT(PCIC, 0x1ce0),
+       INTC_VECT(G200, 0x1d00),
+       INTC_VECT(RSPI, 0x1d80), INTC_VECT(RSPI, 0x1da0),
+       INTC_VECT(RSPI, 0x1dc0), INTC_VECT(RSPI, 0x1de0),
+       INTC_VECT(PECI3, 0x1ec0), INTC_VECT(PECI4, 0x1ee0),
+       INTC_VECT(PECI5, 0x1f00),
+       INTC_VECT(SGPIO, 0x1f80), INTC_VECT(SGPIO, 0x1fa0),
+       INTC_VECT(SGPIO, 0x1fc0),
+       INTC_VECT(DMINT12, 0x2400), INTC_VECT(DMINT13, 0x2420),
+       INTC_VECT(DMINT14, 0x2440), INTC_VECT(DMINT15, 0x2460),
+       INTC_VECT(DMINT16, 0x2480), INTC_VECT(DMINT17, 0x24e0),
+       INTC_VECT(DMINT18, 0x2500), INTC_VECT(DMINT19, 0x2520),
+       INTC_VECT(DMINT20, 0x2540), INTC_VECT(DMINT21, 0x2560),
+       INTC_VECT(DMINT22, 0x2580), INTC_VECT(DMINT23, 0x2600),
+       INTC_VECT(DDRECC, 0x2620),
+       INTC_VECT(TSIP, 0x2640),
+       INTC_VECT(PCIE_BRIDGE, 0x27c0),
+       INTC_VECT(WDT0B, 0x2800), INTC_VECT(WDT1B, 0x2820),
+       INTC_VECT(WDT2B, 0x2840), INTC_VECT(WDT3B, 0x2860),
+       INTC_VECT(WDT4B, 0x2880), INTC_VECT(WDT5B, 0x28a0),
+       INTC_VECT(WDT6B, 0x28c0), INTC_VECT(WDT7B, 0x28e0),
+       INTC_VECT(WDT8B, 0x2900),
+       INTC_VECT(GETHER0, 0x2960), INTC_VECT(GETHER1, 0x2980),
+       INTC_VECT(GETHER2, 0x29a0),
+       INTC_VECT(PBIA, 0x2a00), INTC_VECT(PBIB, 0x2a20),
+       INTC_VECT(PBIC, 0x2a40),
+       INTC_VECT(DMAE2, 0x2a60), INTC_VECT(DMAE3, 0x2a80),
+       INTC_VECT(SERMUX2, 0x2aa0), INTC_VECT(SERMUX3, 0x2b40),
+       INTC_VECT(LPC5, 0x2b60), INTC_VECT(LPC6, 0x2b80),
+       INTC_VECT(LPC7, 0x2c00), INTC_VECT(LPC8, 0x2c20),
+ };
+ static struct intc_group groups[] __initdata = {
+       INTC_GROUP(TMU012, TMU0, TMU1, TMU2, TMU2_TICPI),
+       INTC_GROUP(TMU345, TMU3, TMU4, TMU5),
+ };
+ static struct intc_mask_reg mask_registers[] __initdata = {
+       { 0xffd00044, 0xffd00064, 32, /* INTMSK0 / INTMSKCLR0 */
+         { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
+       { 0xffd40080, 0xffd40084, 32, /* INTMSK2 / INTMSKCLR2 */
+         { IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
+           IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
+           IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
+           IRL0_HHLL, IRL0_HHLH, IRL0_HHHL, 0,
+           IRL4_LLLL, IRL4_LLLH, IRL4_LLHL, IRL4_LLHH,
+           IRL4_LHLL, IRL4_LHLH, IRL4_LHHL, IRL4_LHHH,
+           IRL4_HLLL, IRL4_HLLH, IRL4_HLHL, IRL4_HLHH,
+           IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, 0, } },
+       { 0xffd40038, 0xffd4003c, 32, /* INT2MSKR / INT2MSKCR */
+         { 0, 0, 0, 0, 0, 0, 0, 0,
+           0, DMAC8_11, 0, PECI0, LPC, FRT, 0, TMR45,
+           TMR23, TMR01, 0, 0, 0, 0, 0, DMAC0_5,
+           HUDI, 0, 0, SCIF3, SCIF2, SDHI, TMU345, TMU012
+            } },
+       { 0xffd400d0, 0xffd400d4, 32, /* INT2MSKR1 / INT2MSKCR1 */
+         { IRQ15, IRQ14, IRQ13, IRQ12, IRQ11, IRQ10, SCIF4, ETHERC,
+           IRQ9, IRQ8, SCIF1, SCIF0, USB0, 0, 0, USB1,
+           ADC1, 0, DMAC6_7, ADC0, SPI0, SIM, PECI2, PECI1,
+           ARC4, 0, SPI1, JMC, 0, 0, 0, DVC
+            } },
+       { 0xffd10038, 0xffd1003c, 32, /* INT2MSKR2 / INT2MSKCR2 */
+         { IIC4_1, IIC4_2, IIC5_0, ONFICTL, 0, 0, SGPIO, 0,
+           0, G200, 0, IIC9_2, IIC8_2, IIC8_1, IIC8_0, IIC7_3,
+           IIC7_2, IIC7_1, IIC6_3, IIC0_0, IIC0_1, IIC0_2, IIC0_3, IIC3_1,
+           IIC2_3, 0, IIC2_1, IIC9_1, IIC3_3, IIC1_0, 0, IIC2_2
+            } },
+       { 0xffd100d0, 0xffd100d4, 32, /* INT2MSKR3 / INT2MSKCR3 */
+         { MMC1, IIC6_1, IIC6_0, IIC5_1, IIC3_2, IIC2_0, PECI5, MMC2,
+           IIC1_3, IIC1_2, IIC9_0, IIC8_3, IIC4_3, IIC7_0, 0, IIC6_2,
+           PCIC, 0, IIC4_0, 0, ECCU, RSPI, 0, IIC9_3,
+           IIC3_0, 0, IIC5_3, IIC5_2, 0, 0, 0, IIC1_1
+            } },
+       { 0xffd20038, 0xffd2003c, 32, /* INT2MSKR4 / INT2MSKCR4 */
+         { WDT0B, WDT1B, WDT3B, GETHER0, 0, 0, 0, 0,
+           0, 0, 0, LPC7, SERMUX2, DMAE3, DMAE2, PBIC,
+           PBIB, PBIA, GETHER1, DMINT12, DMINT13, DMINT14, DMINT15, TSIP,
+           DMINT23, 0, DMINT21, LPC6, 0, DMINT16, 0, DMINT22
+            } },
+       { 0xffd200d0, 0xffd200d4, 32, /* INT2MSKR5 / INT2MSKCR5 */
+         { 0, WDT8B, WDT7B, WDT4B, 0, DMINT20, 0, 0,
+           DMINT19, DMINT18, LPC5, SERMUX3, WDT2B, GETHER2, 0, 0,
+           0, 0, PCIE_BRIDGE, 0, 0, 0, 0, LPC8,
+           DDRECC, 0, WDT6B, WDT5B, 0, 0, 0, DMINT17
+            } },
+ };
+ #define INTPRI                0xffd00010
+ #define INT2PRI0      0xffd40000
+ #define INT2PRI1      0xffd40004
+ #define INT2PRI2      0xffd40008
+ #define INT2PRI3      0xffd4000c
+ #define INT2PRI4      0xffd40010
+ #define INT2PRI5      0xffd40014
+ #define INT2PRI6      0xffd40018
+ #define INT2PRI7      0xffd4001c
+ #define INT2PRI8      0xffd400a0
+ #define INT2PRI9      0xffd400a4
+ #define INT2PRI10     0xffd400a8
+ #define INT2PRI11     0xffd400ac
+ #define INT2PRI12     0xffd400b0
+ #define INT2PRI13     0xffd400b4
+ #define INT2PRI14     0xffd400b8
+ #define INT2PRI15     0xffd400bc
+ #define INT2PRI16     0xffd10000
+ #define INT2PRI17     0xffd10004
+ #define INT2PRI18     0xffd10008
+ #define INT2PRI19     0xffd1000c
+ #define INT2PRI20     0xffd10010
+ #define INT2PRI21     0xffd10014
+ #define INT2PRI22     0xffd10018
+ #define INT2PRI23     0xffd1001c
+ #define INT2PRI24     0xffd100a0
+ #define INT2PRI25     0xffd100a4
+ #define INT2PRI26     0xffd100a8
+ #define INT2PRI27     0xffd100ac
+ #define INT2PRI28     0xffd100b0
+ #define INT2PRI29     0xffd100b4
+ #define INT2PRI30     0xffd100b8
+ #define INT2PRI31     0xffd100bc
+ #define INT2PRI32     0xffd20000
+ #define INT2PRI33     0xffd20004
+ #define INT2PRI34     0xffd20008
+ #define INT2PRI35     0xffd2000c
+ #define INT2PRI36     0xffd20010
+ #define INT2PRI37     0xffd20014
+ #define INT2PRI38     0xffd20018
+ #define INT2PRI39     0xffd2001c
+ #define INT2PRI40     0xffd200a0
+ #define INT2PRI41     0xffd200a4
+ #define INT2PRI42     0xffd200a8
+ #define INT2PRI43     0xffd200ac
+ #define INT2PRI44     0xffd200b0
+ #define INT2PRI45     0xffd200b4
+ #define INT2PRI46     0xffd200b8
+ #define INT2PRI47     0xffd200bc
+ static struct intc_prio_reg prio_registers[] __initdata = {
+       { INTPRI, 0, 32, 4, { IRQ0, IRQ1, IRQ2, IRQ3,
+                             IRQ4, IRQ5, IRQ6, IRQ7 } },
+       { INT2PRI0, 0, 32, 8, { TMU0, TMU1, TMU2, TMU2_TICPI } },
+       { INT2PRI1, 0, 32, 8, { TMU3, TMU4, TMU5, SDHI } },
+       { INT2PRI2, 0, 32, 8, { SCIF2, SCIF3, 0, IRQ8 } },
+       { INT2PRI3, 0, 32, 8, { HUDI, DMAC0_5, ADC0, IRQ9 } },
+       { INT2PRI4, 0, 32, 8, { IRQ10, 0, TMR01, TMR23 } },
+       { INT2PRI5, 0, 32, 8, { TMR45, 0, FRT, LPC } },
+       { INT2PRI6, 0, 32, 8, { PECI0, ETHERC, DMAC8_11, 0 } },
+       { INT2PRI7, 0, 32, 8, { SCIF4, 0, IRQ11, IRQ12 } },
+       { INT2PRI8, 0, 32, 8, { 0, 0, 0, DVC } },
+       { INT2PRI9, 0, 32, 8, { ARC4, 0, SPI1, JMC } },
+       { INT2PRI10, 0, 32, 8, { SPI0, SIM, PECI2, PECI1 } },
+       { INT2PRI11, 0, 32, 8, { ADC1, IRQ13, DMAC6_7, IRQ14 } },
+       { INT2PRI12, 0, 32, 8, { USB0, 0, IRQ15, USB1 } },
+       { INT2PRI13, 0, 32, 8, { 0, 0, SCIF1, SCIF0 } },
+       { INT2PRI16, 0, 32, 8, { IIC2_2, 0, 0, 0 } },
+       { INT2PRI17, 0, 32, 8, { 0, 0, 0, IIC1_0 } },
+       { INT2PRI18, 0, 32, 8, { IIC3_3, IIC9_1, IIC2_1, IIC1_2 } },
+       { INT2PRI19, 0, 32, 8, { IIC2_3, IIC3_1, 0, IIC1_3 } },
+       { INT2PRI20, 0, 32, 8, { IIC2_0, IIC6_3, IIC7_1, IIC7_2 } },
+       { INT2PRI21, 0, 32, 8, { IIC7_3, IIC8_0, IIC8_1, IIC8_2 } },
+       { INT2PRI22, 0, 32, 8, { IIC9_2, MMC2, G200, 0 } },
+       { INT2PRI23, 0, 32, 8, { PECI5, SGPIO, IIC3_2, IIC5_1 } },
+       { INT2PRI24, 0, 32, 8, { PECI4, PECI3, 0, IIC1_1 } },
+       { INT2PRI25, 0, 32, 8, { IIC3_0, 0, IIC5_3, IIC5_2 } },
+       { INT2PRI26, 0, 32, 8, { ECCU, RSPI, 0, IIC9_3 } },
+       { INT2PRI27, 0, 32, 8, { PCIC, IIC6_0, IIC4_0, IIC6_1 } },
+       { INT2PRI28, 0, 32, 8, { IIC4_3, IIC7_0, MMC1, IIC6_2 } },
+       { INT2PRI29, 0, 32, 8, { 0, 0, IIC9_0, IIC8_3 } },
+       { INT2PRI30, 0, 32, 8, { IIC4_1, IIC4_2, IIC5_0, ONFICTL } },
+       { INT2PRI31, 0, 32, 8, { IIC0_0, IIC0_1, IIC0_2, IIC0_3 } },
+       { INT2PRI32, 0, 32, 8, { DMINT22, 0, 0, 0 } },
+       { INT2PRI33, 0, 32, 8, { 0, 0, 0, DMINT16 } },
+       { INT2PRI34, 0, 32, 8, { 0, LPC6, DMINT21, DMINT18 } },
+       { INT2PRI35, 0, 32, 8, { DMINT23, TSIP, 0, DMINT19 } },
+       { INT2PRI36, 0, 32, 8, { DMINT20, GETHER1, PBIA, PBIB } },
+       { INT2PRI37, 0, 32, 8, { PBIC, DMAE2, DMAE3, SERMUX2 } },
+       { INT2PRI38, 0, 32, 8, { LPC7, 0, 0, 0 } },
+       { INT2PRI39, 0, 32, 8, { 0, 0, 0, WDT4B } },
+       { INT2PRI40, 0, 32, 8, { 0, 0, 0, DMINT17 } },
+       { INT2PRI41, 0, 32, 8, { DDRECC, 0, WDT6B, WDT5B } },
+       { INT2PRI42, 0, 32, 8, { 0, 0, 0, LPC8 } },
+       { INT2PRI43, 0, 32, 8, { 0, WDT7B, PCIE_BRIDGE, WDT8B } },
+       { INT2PRI44, 0, 32, 8, { WDT2B, GETHER2, 0, 0 } },
+       { INT2PRI45, 0, 32, 8, { 0, 0, LPC5, SERMUX3 } },
+       { INT2PRI46, 0, 32, 8, { WDT0B, WDT1B, WDT3B, GETHER0 } },
+       { INT2PRI47, 0, 32, 8, { DMINT12, DMINT13, DMINT14, DMINT15 } },
+ };
+ static struct intc_sense_reg sense_registers_irq8to15[] __initdata = {
+       { 0xffd100f8, 32, 2, /* ICR2 */   { IRQ15, IRQ14, IRQ13, IRQ12,
+                                           IRQ11, IRQ10, IRQ9, IRQ8 } },
+ };
+ static DECLARE_INTC_DESC(intc_desc, "sh7757", vectors, groups,
+                        mask_registers, prio_registers,
+                        sense_registers_irq8to15);
+ /* Support for external interrupt pins in IRQ mode */
+ static struct intc_vect vectors_irq0123[] __initdata = {
+       INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
+       INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300),
+ };
+ static struct intc_vect vectors_irq4567[] __initdata = {
+       INTC_VECT(IRQ4, 0x340), INTC_VECT(IRQ5, 0x380),
+       INTC_VECT(IRQ6, 0x3c0), INTC_VECT(IRQ7, 0x200),
+ };
+ static struct intc_sense_reg sense_registers[] __initdata = {
+       { 0xffd0001c, 32, 2, /* ICR1 */   { IRQ0, IRQ1, IRQ2, IRQ3,
+                                           IRQ4, IRQ5, IRQ6, IRQ7 } },
+ };
+ static struct intc_mask_reg ack_registers[] __initdata = {
+       { 0xffd00024, 0, 32, /* INTREQ */
+         { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
+ };
+ static DECLARE_INTC_DESC_ACK(intc_desc_irq0123, "sh7757-irq0123",
+                            vectors_irq0123, NULL, mask_registers,
+                            prio_registers, sense_registers, ack_registers);
+ static DECLARE_INTC_DESC_ACK(intc_desc_irq4567, "sh7757-irq4567",
+                            vectors_irq4567, NULL, mask_registers,
+                            prio_registers, sense_registers, ack_registers);
+ /* External interrupt pins in IRL mode */
+ static struct intc_vect vectors_irl0123[] __initdata = {
+       INTC_VECT(IRL0_LLLL, 0x200), INTC_VECT(IRL0_LLLH, 0x220),
+       INTC_VECT(IRL0_LLHL, 0x240), INTC_VECT(IRL0_LLHH, 0x260),
+       INTC_VECT(IRL0_LHLL, 0x280), INTC_VECT(IRL0_LHLH, 0x2a0),
+       INTC_VECT(IRL0_LHHL, 0x2c0), INTC_VECT(IRL0_LHHH, 0x2e0),
+       INTC_VECT(IRL0_HLLL, 0x300), INTC_VECT(IRL0_HLLH, 0x320),
+       INTC_VECT(IRL0_HLHL, 0x340), INTC_VECT(IRL0_HLHH, 0x360),
+       INTC_VECT(IRL0_HHLL, 0x380), INTC_VECT(IRL0_HHLH, 0x3a0),
+       INTC_VECT(IRL0_HHHL, 0x3c0),
+ };
+ static struct intc_vect vectors_irl4567[] __initdata = {
+       INTC_VECT(IRL4_LLLL, 0xb00), INTC_VECT(IRL4_LLLH, 0xb20),
+       INTC_VECT(IRL4_LLHL, 0xb40), INTC_VECT(IRL4_LLHH, 0xb60),
+       INTC_VECT(IRL4_LHLL, 0xb80), INTC_VECT(IRL4_LHLH, 0xba0),
+       INTC_VECT(IRL4_LHHL, 0xbc0), INTC_VECT(IRL4_LHHH, 0xbe0),
+       INTC_VECT(IRL4_HLLL, 0xc00), INTC_VECT(IRL4_HLLH, 0xc20),
+       INTC_VECT(IRL4_HLHL, 0xc40), INTC_VECT(IRL4_HLHH, 0xc60),
+       INTC_VECT(IRL4_HHLL, 0xc80), INTC_VECT(IRL4_HHLH, 0xca0),
+       INTC_VECT(IRL4_HHHL, 0xcc0),
+ };
+ static DECLARE_INTC_DESC(intc_desc_irl0123, "sh7757-irl0123", vectors_irl0123,
+                        NULL, mask_registers, NULL, NULL);
+ static DECLARE_INTC_DESC(intc_desc_irl4567, "sh7757-irl4567", vectors_irl4567,
+                        NULL, mask_registers, NULL, NULL);
+ #define INTC_ICR0     0xffd00000
+ #define INTC_INTMSK0  0xffd00044
+ #define INTC_INTMSK1  0xffd00048
+ #define INTC_INTMSK2  0xffd40080
+ #define INTC_INTMSKCLR1       0xffd00068
+ #define INTC_INTMSKCLR2       0xffd40084
+ void __init plat_irq_setup(void)
+ {
+       /* disable IRQ3-0 + IRQ7-4 */
+       __raw_writel(0xff000000, INTC_INTMSK0);
+       /* disable IRL3-0 + IRL7-4 */
+       __raw_writel(0xc0000000, INTC_INTMSK1);
+       __raw_writel(0xfffefffe, INTC_INTMSK2);
+       /* select IRL mode for IRL3-0 + IRL7-4 */
+       __raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
+       /* disable holding function, ie enable "SH-4 Mode" */
+       __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
+       register_intc_controller(&intc_desc);
+ }
+ void __init plat_irq_setup_pins(int mode)
+ {
+       switch (mode) {
+       case IRQ_MODE_IRQ7654:
+               /* select IRQ mode for IRL7-4 */
+               __raw_writel(__raw_readl(INTC_ICR0) | 0x00400000, INTC_ICR0);
+               register_intc_controller(&intc_desc_irq4567);
+               break;
+       case IRQ_MODE_IRQ3210:
+               /* select IRQ mode for IRL3-0 */
+               __raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0);
+               register_intc_controller(&intc_desc_irq0123);
+               break;
+       case IRQ_MODE_IRL7654:
+               /* enable IRL7-4 but don't provide any masking */
+               __raw_writel(0x40000000, INTC_INTMSKCLR1);
+               __raw_writel(0x0000fffe, INTC_INTMSKCLR2);
+               break;
+       case IRQ_MODE_IRL3210:
+               /* enable IRL0-3 but don't provide any masking */
+               __raw_writel(0x80000000, INTC_INTMSKCLR1);
+               __raw_writel(0xfffe0000, INTC_INTMSKCLR2);
+               break;
+       case IRQ_MODE_IRL7654_MASK:
+               /* enable IRL7-4 and mask using cpu intc controller */
+               __raw_writel(0x40000000, INTC_INTMSKCLR1);
+               register_intc_controller(&intc_desc_irl4567);
+               break;
+       case IRQ_MODE_IRL3210_MASK:
+               /* enable IRL0-3 and mask using cpu intc controller */
+               __raw_writel(0x80000000, INTC_INTMSKCLR1);
+               register_intc_controller(&intc_desc_irl0123);
+               break;
+       default:
+               BUG();
+       }
+ }
+ void __init plat_mem_setup(void)
+ {
+ }
  #include <linux/io.h>
  #include <linux/serial_sci.h>
  
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xffe00000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 40, 40, 40, 40 },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xffe08000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 76, 76, 76, 76 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xffe10000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 104, 104, 104, 104 },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &scif2_platform_data,
+       },
+ };
  static struct resource rtc_resources[] = {
        [0] = {
                .start  = 0xffe80000,
@@@ -36,41 -81,6 +87,6 @@@ static struct platform_device rtc_devic
        .resource       = rtc_resources,
  };
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xffe00000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 40, 40, 40, 40 },
-       }, {
-               .mapbase        = 0xffe08000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 76, 76, 76, 76 },
-       }, {
-               .mapbase        = 0xffe10000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 104, 104, 104, 104 },
-       }, {
-               .flags = 0,
-       }
- };
- static struct platform_device sci_device = {
-       .name           = "sh-sci",
-       .id             = -1,
-       .dev            = {
-               .platform_data  = sci_platform_data,
-       },
- };
  static struct resource usb_ohci_resources[] = {
        [0] = {
                .start  = 0xffec8000,
@@@ -121,16 -131,13 +137,13 @@@ static struct platform_device usbf_devi
  };
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xffd80008,
                .end    = 0xffd80013,
                .flags  = IORESOURCE_MEM,
@@@ -152,16 -159,13 +165,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xffd80014,
                .end    = 0xffd8001f,
                .flags  = IORESOURCE_MEM,
@@@ -183,15 -187,12 +193,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xffd80020,
                .end    = 0xffd8002f,
                .flags  = IORESOURCE_MEM,
@@@ -213,15 -214,12 +220,12 @@@ static struct platform_device tmu2_devi
  };
  
  static struct sh_timer_config tmu3_platform_data = {
-       .name = "TMU3",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu3_resources[] = {
        [0] = {
-               .name   = "TMU3",
                .start  = 0xffd88008,
                .end    = 0xffd88013,
                .flags  = IORESOURCE_MEM,
@@@ -243,15 -241,12 +247,12 @@@ static struct platform_device tmu3_devi
  };
  
  static struct sh_timer_config tmu4_platform_data = {
-       .name = "TMU4",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu4_resources[] = {
        [0] = {
-               .name   = "TMU4",
                .start  = 0xffd88014,
                .end    = 0xffd8801f,
                .flags  = IORESOURCE_MEM,
@@@ -273,15 -268,12 +274,12 @@@ static struct platform_device tmu4_devi
  };
  
  static struct sh_timer_config tmu5_platform_data = {
-       .name = "TMU5",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu5_resources[] = {
        [0] = {
-               .name   = "TMU5",
                .start  = 0xffd88020,
                .end    = 0xffd8802b,
                .flags  = IORESOURCE_MEM,
@@@ -303,6 -295,9 +301,9 @@@ static struct platform_device tmu5_devi
  };
  
  static struct platform_device *sh7763_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
        &tmu4_device,
        &tmu5_device,
        &rtc_device,
-       &sci_device,
        &usb_ohci_device,
        &usbf_device,
  };
@@@ -320,9 -314,12 +320,12 @@@ static int __init sh7763_devices_setup(
        return platform_add_devices(sh7763_devices,
                                    ARRAY_SIZE(sh7763_devices));
  }
__initcall(sh7763_devices_setup);
arch_initcall(sh7763_devices_setup);
  
  static struct platform_device *sh7763_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
@@@ -523,11 -520,11 +526,11 @@@ static DECLARE_INTC_DESC(intc_irl3210_d
  void __init plat_irq_setup(void)
  {
        /* disable IRQ7-0 */
-       ctrl_outl(0xff000000, INTC_INTMSK0);
+       __raw_writel(0xff000000, INTC_INTMSK0);
  
        /* disable IRL3-0 + IRL7-4 */
-       ctrl_outl(0xc0000000, INTC_INTMSK1);
-       ctrl_outl(0xfffefffe, INTC_INTMSK2);
+       __raw_writel(0xc0000000, INTC_INTMSK1);
+       __raw_writel(0xfffefffe, INTC_INTMSK2);
  
        register_intc_controller(&intc_desc);
  }
@@@ -537,27 -534,27 +540,27 @@@ void __init plat_irq_setup_pins(int mod
        switch (mode) {
        case IRQ_MODE_IRQ:
                /* select IRQ mode for IRL3-0 + IRL7-4 */
-               ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00c00000, INTC_ICR0);
+               __raw_writel(__raw_readl(INTC_ICR0) | 0x00c00000, INTC_ICR0);
                register_intc_controller(&intc_irq_desc);
                break;
        case IRQ_MODE_IRL7654:
                /* enable IRL7-4 but don't provide any masking */
-               ctrl_outl(0x40000000, INTC_INTMSKCLR1);
-               ctrl_outl(0x0000fffe, INTC_INTMSKCLR2);
+               __raw_writel(0x40000000, INTC_INTMSKCLR1);
+               __raw_writel(0x0000fffe, INTC_INTMSKCLR2);
                break;
        case IRQ_MODE_IRL3210:
                /* enable IRL0-3 but don't provide any masking */
-               ctrl_outl(0x80000000, INTC_INTMSKCLR1);
-               ctrl_outl(0xfffe0000, INTC_INTMSKCLR2);
+               __raw_writel(0x80000000, INTC_INTMSKCLR1);
+               __raw_writel(0xfffe0000, INTC_INTMSKCLR2);
                break;
        case IRQ_MODE_IRL7654_MASK:
                /* enable IRL7-4 and mask using cpu intc controller */
-               ctrl_outl(0x40000000, INTC_INTMSKCLR1);
+               __raw_writel(0x40000000, INTC_INTMSKCLR1);
                register_intc_controller(&intc_irl7654_desc);
                break;
        case IRQ_MODE_IRL3210_MASK:
                /* enable IRL0-3 and mask using cpu intc controller */
-               ctrl_outl(0x80000000, INTC_INTMSKCLR1);
+               __raw_writel(0x80000000, INTC_INTMSKCLR1);
                register_intc_controller(&intc_irl3210_desc);
                break;
        default:
  #include <linux/sh_timer.h>
  #include <linux/io.h>
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xff923000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 61, 61, 61, 61 },
-       }, {
-               .mapbase        = 0xff924000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 62, 62, 62, 62 },
-       }, {
-               .mapbase        = 0xff925000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 63, 63, 63, 63 },
-       }, {
-               .mapbase        = 0xff926000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 64, 64, 64, 64 },
-       }, {
-               .mapbase        = 0xff927000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 65, 65, 65, 65 },
-       }, {
-               .mapbase        = 0xff928000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 66, 66, 66, 66 },
-       }, {
-               .mapbase        = 0xff929000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 67, 67, 67, 67 },
-       }, {
-               .mapbase        = 0xff92a000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 68, 68, 68, 68 },
-       }, {
-               .mapbase        = 0xff92b000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 69, 69, 69, 69 },
-       }, {
-               .mapbase        = 0xff92c000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 70, 70, 70, 70 },
-       }, {
-               .flags = 0,
-       }
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xff923000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 61, 61, 61, 61 },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xff924000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 62, 62, 62, 62 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xff925000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 63, 63, 63, 63 },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &scif2_platform_data,
+       },
+ };
+ static struct plat_sci_port scif3_platform_data = {
+       .mapbase        = 0xff926000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 64, 64, 64, 64 },
+ };
+ static struct platform_device scif3_device = {
+       .name           = "sh-sci",
+       .id             = 3,
+       .dev            = {
+               .platform_data  = &scif3_platform_data,
+       },
+ };
+ static struct plat_sci_port scif4_platform_data = {
+       .mapbase        = 0xff927000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 65, 65, 65, 65 },
+ };
+ static struct platform_device scif4_device = {
+       .name           = "sh-sci",
+       .id             = 4,
+       .dev            = {
+               .platform_data  = &scif4_platform_data,
+       },
+ };
+ static struct plat_sci_port scif5_platform_data = {
+       .mapbase        = 0xff928000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 66, 66, 66, 66 },
+ };
+ static struct platform_device scif5_device = {
+       .name           = "sh-sci",
+       .id             = 5,
+       .dev            = {
+               .platform_data  = &scif5_platform_data,
+       },
+ };
+ static struct plat_sci_port scif6_platform_data = {
+       .mapbase        = 0xff929000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 67, 67, 67, 67 },
+ };
+ static struct platform_device scif6_device = {
+       .name           = "sh-sci",
+       .id             = 6,
+       .dev            = {
+               .platform_data  = &scif6_platform_data,
+       },
+ };
+ static struct plat_sci_port scif7_platform_data = {
+       .mapbase        = 0xff92a000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 68, 68, 68, 68 },
+ };
+ static struct platform_device scif7_device = {
+       .name           = "sh-sci",
+       .id             = 7,
+       .dev            = {
+               .platform_data  = &scif7_platform_data,
+       },
+ };
+ static struct plat_sci_port scif8_platform_data = {
+       .mapbase        = 0xff92b000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 69, 69, 69, 69 },
+ };
+ static struct platform_device scif8_device = {
+       .name           = "sh-sci",
+       .id             = 8,
+       .dev            = {
+               .platform_data  = &scif8_platform_data,
+       },
+ };
+ static struct plat_sci_port scif9_platform_data = {
+       .mapbase        = 0xff92c000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_TOIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 70, 70, 70, 70 },
  };
  
- static struct platform_device sci_device = {
+ static struct platform_device scif9_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 9,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif9_platform_data,
        },
  };
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xffd80008,
                .end    = 0xffd80013,
                .flags  = IORESOURCE_MEM,
@@@ -130,16 -193,13 +213,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xffd80014,
                .end    = 0xffd8001f,
                .flags  = IORESOURCE_MEM,
@@@ -161,15 -221,12 +241,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xffd80020,
                .end    = 0xffd8002f,
                .flags  = IORESOURCE_MEM,
@@@ -191,15 -248,12 +268,12 @@@ static struct platform_device tmu2_devi
  };
  
  static struct sh_timer_config tmu3_platform_data = {
-       .name = "TMU3",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu3_resources[] = {
        [0] = {
-               .name   = "TMU3",
                .start  = 0xffd81008,
                .end    = 0xffd81013,
                .flags  = IORESOURCE_MEM,
@@@ -221,15 -275,12 +295,12 @@@ static struct platform_device tmu3_devi
  };
  
  static struct sh_timer_config tmu4_platform_data = {
-       .name = "TMU4",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu4_resources[] = {
        [0] = {
-               .name   = "TMU4",
                .start  = 0xffd81014,
                .end    = 0xffd8101f,
                .flags  = IORESOURCE_MEM,
@@@ -251,15 -302,12 +322,12 @@@ static struct platform_device tmu4_devi
  };
  
  static struct sh_timer_config tmu5_platform_data = {
-       .name = "TMU5",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu5_resources[] = {
        [0] = {
-               .name   = "TMU5",
                .start  = 0xffd81020,
                .end    = 0xffd8102f,
                .flags  = IORESOURCE_MEM,
@@@ -281,15 -329,12 +349,12 @@@ static struct platform_device tmu5_devi
  };
  
  static struct sh_timer_config tmu6_platform_data = {
-       .name = "TMU6",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu6_resources[] = {
        [0] = {
-               .name   = "TMU6",
                .start  = 0xffd82008,
                .end    = 0xffd82013,
                .flags  = IORESOURCE_MEM,
@@@ -311,15 -356,12 +376,12 @@@ static struct platform_device tmu6_devi
  };
  
  static struct sh_timer_config tmu7_platform_data = {
-       .name = "TMU7",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu7_resources[] = {
        [0] = {
-               .name   = "TMU7",
                .start  = 0xffd82014,
                .end    = 0xffd8201f,
                .flags  = IORESOURCE_MEM,
@@@ -341,15 -383,12 +403,12 @@@ static struct platform_device tmu7_devi
  };
  
  static struct sh_timer_config tmu8_platform_data = {
-       .name = "TMU8",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu8_resources[] = {
        [0] = {
-               .name   = "TMU8",
                .start  = 0xffd82020,
                .end    = 0xffd8202b,
                .flags  = IORESOURCE_MEM,
@@@ -371,6 -410,16 +430,16 @@@ static struct platform_device tmu8_devi
  };
  
  static struct platform_device *sh7770_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &scif5_device,
+       &scif6_device,
+       &scif7_device,
+       &scif8_device,
+       &scif9_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
        &tmu6_device,
        &tmu7_device,
        &tmu8_device,
-       &sci_device,
  };
  
  static int __init sh7770_devices_setup(void)
        return platform_add_devices(sh7770_devices,
                                    ARRAY_SIZE(sh7770_devices));
  }
__initcall(sh7770_devices_setup);
arch_initcall(sh7770_devices_setup);
  
  static struct platform_device *sh7770_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &scif5_device,
+       &scif6_device,
+       &scif7_device,
+       &scif8_device,
+       &scif9_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
@@@ -609,17 -667,17 +687,17 @@@ static DECLARE_INTC_DESC(intc_irl3210_d
  void __init plat_irq_setup(void)
  {
        /* disable IRQ7-0 */
-       ctrl_outl(0xff000000, INTC_INTMSK0);
+       __raw_writel(0xff000000, INTC_INTMSK0);
  
        /* disable IRL3-0 + IRL7-4 */
-       ctrl_outl(0xc0000000, INTC_INTMSK1);
-       ctrl_outl(0xfffefffe, INTC_INTMSK2);
+       __raw_writel(0xc0000000, INTC_INTMSK1);
+       __raw_writel(0xfffefffe, INTC_INTMSK2);
  
        /* select IRL mode for IRL3-0 + IRL7-4 */
-       ctrl_outl(ctrl_inl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
+       __raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
  
        /* disable holding function, ie enable "SH-4 Mode" */
-       ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00200000, INTC_ICR0);
+       __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
  
        register_intc_controller(&intc_desc);
  }
@@@ -629,27 -687,27 +707,27 @@@ void __init plat_irq_setup_pins(int mod
        switch (mode) {
        case IRQ_MODE_IRQ:
                /* select IRQ mode for IRL3-0 + IRL7-4 */
-               ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00c00000, INTC_ICR0);
+               __raw_writel(__raw_readl(INTC_ICR0) | 0x00c00000, INTC_ICR0);
                register_intc_controller(&intc_irq_desc);
                break;
        case IRQ_MODE_IRL7654:
                /* enable IRL7-4 but don't provide any masking */
-               ctrl_outl(0x40000000, INTC_INTMSKCLR1);
-               ctrl_outl(0x0000fffe, INTC_INTMSKCLR2);
+               __raw_writel(0x40000000, INTC_INTMSKCLR1);
+               __raw_writel(0x0000fffe, INTC_INTMSKCLR2);
                break;
        case IRQ_MODE_IRL3210:
                /* enable IRL0-3 but don't provide any masking */
-               ctrl_outl(0x80000000, INTC_INTMSKCLR1);
-               ctrl_outl(0xfffe0000, INTC_INTMSKCLR2);
+               __raw_writel(0x80000000, INTC_INTMSKCLR1);
+               __raw_writel(0xfffe0000, INTC_INTMSKCLR2);
                break;
        case IRQ_MODE_IRL7654_MASK:
                /* enable IRL7-4 and mask using cpu intc controller */
-               ctrl_outl(0x40000000, INTC_INTMSKCLR1);
+               __raw_writel(0x40000000, INTC_INTMSKCLR1);
                register_intc_controller(&intc_irl7654_desc);
                break;
        case IRQ_MODE_IRL3210_MASK:
                /* enable IRL0-3 and mask using cpu intc controller */
-               ctrl_outl(0x80000000, INTC_INTMSKCLR1);
+               __raw_writel(0x80000000, INTC_INTMSKCLR1);
                register_intc_controller(&intc_irl3210_desc);
                break;
        default:
  #include <linux/serial.h>
  #include <linux/io.h>
  #include <linux/serial_sci.h>
+ #include <linux/sh_dma.h>
  #include <linux/sh_timer.h>
  
+ #include <cpu/dma-register.h>
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xffe00000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_1,
+       .type           = PORT_SCIF,
+       .irqs           = { 40, 40, 40, 40 },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xffe10000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_1,
+       .type           = PORT_SCIF,
+       .irqs           = { 76, 76, 76, 76 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xffd80008,
                .end    = 0xffd80013,
                .flags  = IORESOURCE_MEM,
@@@ -46,16 -76,13 +80,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xffd80014,
                .end    = 0xffd8001f,
                .flags  = IORESOURCE_MEM,
@@@ -77,15 -104,12 +108,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xffd80020,
                .end    = 0xffd8002f,
                .flags  = IORESOURCE_MEM,
@@@ -107,15 -131,12 +135,12 @@@ static struct platform_device tmu2_devi
  };
  
  static struct sh_timer_config tmu3_platform_data = {
-       .name = "TMU3",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu3_resources[] = {
        [0] = {
-               .name   = "TMU3",
                .start  = 0xffdc0008,
                .end    = 0xffdc0013,
                .flags  = IORESOURCE_MEM,
@@@ -137,15 -158,12 +162,12 @@@ static struct platform_device tmu3_devi
  };
  
  static struct sh_timer_config tmu4_platform_data = {
-       .name = "TMU4",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu4_resources[] = {
        [0] = {
-               .name   = "TMU4",
                .start  = 0xffdc0014,
                .end    = 0xffdc001f,
                .flags  = IORESOURCE_MEM,
@@@ -167,15 -185,12 +189,12 @@@ static struct platform_device tmu4_devi
  };
  
  static struct sh_timer_config tmu5_platform_data = {
-       .name = "TMU5",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu5_resources[] = {
        [0] = {
-               .name   = "TMU5",
                .start  = 0xffdc0020,
                .end    = 0xffdc002b,
                .flags  = IORESOURCE_MEM,
@@@ -216,35 -231,137 +235,137 @@@ static struct platform_device rtc_devic
        .resource       = rtc_resources,
  };
  
- static struct plat_sci_port sci_platform_data[] = {
+ /* DMA */
+ static const struct sh_dmae_channel sh7780_dmae0_channels[] = {
        {
-               .mapbase        = 0xffe00000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_1,
-               .type           = PORT_SCIF,
-               .irqs           = { 40, 40, 40, 40 },
+               .offset = 0,
+               .dmars = 0,
+               .dmars_bit = 0,
+       }, {
+               .offset = 0x10,
+               .dmars = 0,
+               .dmars_bit = 8,
+       }, {
+               .offset = 0x20,
+               .dmars = 4,
+               .dmars_bit = 0,
        }, {
-               .mapbase        = 0xffe10000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_1,
-               .type           = PORT_SCIF,
-               .irqs           = { 76, 76, 76, 76 },
+               .offset = 0x30,
+               .dmars = 4,
+               .dmars_bit = 8,
        }, {
-               .flags = 0,
+               .offset = 0x50,
+               .dmars = 8,
+               .dmars_bit = 0,
+       }, {
+               .offset = 0x60,
+               .dmars = 8,
+               .dmars_bit = 8,
        }
  };
  
- static struct platform_device sci_device = {
-       .name           = "sh-sci",
-       .id             = -1,
+ static const struct sh_dmae_channel sh7780_dmae1_channels[] = {
+       {
+               .offset = 0,
+       }, {
+               .offset = 0x10,
+       }, {
+               .offset = 0x20,
+       }, {
+               .offset = 0x30,
+       }, {
+               .offset = 0x50,
+       }, {
+               .offset = 0x60,
+       }
+ };
+ static const unsigned int ts_shift[] = TS_SHIFT;
+ static struct sh_dmae_pdata dma0_platform_data = {
+       .channel        = sh7780_dmae0_channels,
+       .channel_num    = ARRAY_SIZE(sh7780_dmae0_channels),
+       .ts_low_shift   = CHCR_TS_LOW_SHIFT,
+       .ts_low_mask    = CHCR_TS_LOW_MASK,
+       .ts_high_shift  = CHCR_TS_HIGH_SHIFT,
+       .ts_high_mask   = CHCR_TS_HIGH_MASK,
+       .ts_shift       = ts_shift,
+       .ts_shift_num   = ARRAY_SIZE(ts_shift),
+       .dmaor_init     = DMAOR_INIT,
+ };
+ static struct sh_dmae_pdata dma1_platform_data = {
+       .channel        = sh7780_dmae1_channels,
+       .channel_num    = ARRAY_SIZE(sh7780_dmae1_channels),
+       .ts_low_shift   = CHCR_TS_LOW_SHIFT,
+       .ts_low_mask    = CHCR_TS_LOW_MASK,
+       .ts_high_shift  = CHCR_TS_HIGH_SHIFT,
+       .ts_high_mask   = CHCR_TS_HIGH_MASK,
+       .ts_shift       = ts_shift,
+       .ts_shift_num   = ARRAY_SIZE(ts_shift),
+       .dmaor_init     = DMAOR_INIT,
+ };
+ static struct resource sh7780_dmae0_resources[] = {
+       [0] = {
+               /* Channel registers and DMAOR */
+               .start  = 0xfc808020,
+               .end    = 0xfc80808f,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               /* DMARSx */
+               .start  = 0xfc809000,
+               .end    = 0xfc80900b,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* Real DMA error IRQ is 38, and channel IRQs are 34-37, 44-45 */
+               .start  = 34,
+               .end    = 34,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
+       },
+ };
+ static struct resource sh7780_dmae1_resources[] = {
+       [0] = {
+               /* Channel registers and DMAOR */
+               .start  = 0xfc818020,
+               .end    = 0xfc81808f,
+               .flags  = IORESOURCE_MEM,
+       },
+       /* DMAC1 has no DMARS */
+       {
+               /* Real DMA error IRQ is 38, and channel IRQs are 46-47, 92-95 */
+               .start  = 46,
+               .end    = 46,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
+       },
+ };
+ static struct platform_device dma0_device = {
+       .name           = "sh-dma-engine",
+       .id             = 0,
+       .resource       = sh7780_dmae0_resources,
+       .num_resources  = ARRAY_SIZE(sh7780_dmae0_resources),
+       .dev            = {
+               .platform_data  = &dma0_platform_data,
+       },
+ };
+ static struct platform_device dma1_device = {
+       .name           = "sh-dma-engine",
+       .id             = 1,
+       .resource       = sh7780_dmae1_resources,
+       .num_resources  = ARRAY_SIZE(sh7780_dmae1_resources),
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &dma1_platform_data,
        },
  };
  
  static struct platform_device *sh7780_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
        &tmu4_device,
        &tmu5_device,
        &rtc_device,
-       &sci_device,
+       &dma0_device,
+       &dma1_device,
  };
  
  static int __init sh7780_devices_setup(void)
        return platform_add_devices(sh7780_devices,
                                    ARRAY_SIZE(sh7780_devices));
  }
- __initcall(sh7780_devices_setup);
+ arch_initcall(sh7780_devices_setup);
 +
  static struct platform_device *sh7780_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
  
  void __init plat_early_device_setup(void)
  {
++      if (mach_is_sh2007()) {
++              scif0_platform_data.scscr &= ~SCSCR_CKE1;
++              scif0_platform_data.scbrr_algo_id = SCBRR_ALGO_2;
++              scif1_platform_data.scscr &= ~SCSCR_CKE1;
++              scif1_platform_data.scbrr_algo_id = SCBRR_ALGO_2;
++      }
++
        early_platform_add_devices(sh7780_early_devices,
                                   ARRAY_SIZE(sh7780_early_devices));
  }
@@@ -443,17 -562,17 +574,17 @@@ static DECLARE_INTC_DESC(intc_irl3210_d
  void __init plat_irq_setup(void)
  {
        /* disable IRQ7-0 */
-       ctrl_outl(0xff000000, INTC_INTMSK0);
+       __raw_writel(0xff000000, INTC_INTMSK0);
  
        /* disable IRL3-0 + IRL7-4 */
-       ctrl_outl(0xc0000000, INTC_INTMSK1);
-       ctrl_outl(0xfffefffe, INTC_INTMSK2);
+       __raw_writel(0xc0000000, INTC_INTMSK1);
+       __raw_writel(0xfffefffe, INTC_INTMSK2);
  
        /* select IRL mode for IRL3-0 + IRL7-4 */
-       ctrl_outl(ctrl_inl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
+       __raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
  
        /* disable holding function, ie enable "SH-4 Mode" */
-       ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00200000, INTC_ICR0);
+       __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
  
        register_intc_controller(&intc_desc);
  }
@@@ -463,27 -582,27 +594,27 @@@ void __init plat_irq_setup_pins(int mod
        switch (mode) {
        case IRQ_MODE_IRQ:
                /* select IRQ mode for IRL3-0 + IRL7-4 */
-               ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00c00000, INTC_ICR0);
+               __raw_writel(__raw_readl(INTC_ICR0) | 0x00c00000, INTC_ICR0);
                register_intc_controller(&intc_irq_desc);
                break;
        case IRQ_MODE_IRL7654:
                /* enable IRL7-4 but don't provide any masking */
-               ctrl_outl(0x40000000, INTC_INTMSKCLR1);
-               ctrl_outl(0x0000fffe, INTC_INTMSKCLR2);
+               __raw_writel(0x40000000, INTC_INTMSKCLR1);
+               __raw_writel(0x0000fffe, INTC_INTMSKCLR2);
                break;
        case IRQ_MODE_IRL3210:
                /* enable IRL0-3 but don't provide any masking */
-               ctrl_outl(0x80000000, INTC_INTMSKCLR1);
-               ctrl_outl(0xfffe0000, INTC_INTMSKCLR2);
+               __raw_writel(0x80000000, INTC_INTMSKCLR1);
+               __raw_writel(0xfffe0000, INTC_INTMSKCLR2);
                break;
        case IRQ_MODE_IRL7654_MASK:
                /* enable IRL7-4 and mask using cpu intc controller */
-               ctrl_outl(0x40000000, INTC_INTMSKCLR1);
+               __raw_writel(0x40000000, INTC_INTMSKCLR1);
                register_intc_controller(&intc_irl7654_desc);
                break;
        case IRQ_MODE_IRL3210_MASK:
                /* enable IRL0-3 and mask using cpu intc controller */
-               ctrl_outl(0x80000000, INTC_INTMSKCLR1);
+               __raw_writel(0x80000000, INTC_INTMSKCLR1);
                register_intc_controller(&intc_irl3210_desc);
                break;
        default:
  #include <linux/serial_sci.h>
  #include <linux/io.h>
  #include <linux/mm.h>
+ #include <linux/sh_dma.h>
  #include <linux/sh_timer.h>
  #include <asm/mmzone.h>
  
+ #include <cpu/dma-register.h>
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xffea0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_1,
+       .type           = PORT_SCIF,
+       .irqs           = { 40, 40, 40, 40 },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xffeb0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_1,
+       .type           = PORT_SCIF,
+       .irqs           = { 44, 44, 44, 44 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xffec0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_1,
+       .type           = PORT_SCIF,
+       .irqs           = { 60, 60, 60, 60 },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
+       .dev            = {
+               .platform_data  = &scif2_platform_data,
+       },
+ };
+ static struct plat_sci_port scif3_platform_data = {
+       .mapbase        = 0xffed0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_1,
+       .type           = PORT_SCIF,
+       .irqs           = { 61, 61, 61, 61 },
+ };
+ static struct platform_device scif3_device = {
+       .name           = "sh-sci",
+       .id             = 3,
+       .dev            = {
+               .platform_data  = &scif3_platform_data,
+       },
+ };
+ static struct plat_sci_port scif4_platform_data = {
+       .mapbase        = 0xffee0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_1,
+       .type           = PORT_SCIF,
+       .irqs           = { 62, 62, 62, 62 },
+ };
+ static struct platform_device scif4_device = {
+       .name           = "sh-sci",
+       .id             = 4,
+       .dev            = {
+               .platform_data  = &scif4_platform_data,
+       },
+ };
+ static struct plat_sci_port scif5_platform_data = {
+       .mapbase        = 0xffef0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_1,
+       .type           = PORT_SCIF,
+       .irqs           = { 63, 63, 63, 63 },
+ };
+ static struct platform_device scif5_device = {
+       .name           = "sh-sci",
+       .id             = 5,
+       .dev            = {
+               .platform_data  = &scif5_platform_data,
+       },
+ };
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "tmu012_fck",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xffd80008,
                .end    = 0xffd80013,
                .flags  = IORESOURCE_MEM,
@@@ -48,16 -139,13 +151,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "tmu012_fck",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xffd80014,
                .end    = 0xffd8001f,
                .flags  = IORESOURCE_MEM,
@@@ -79,15 -167,12 +179,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "tmu012_fck",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xffd80020,
                .end    = 0xffd8002f,
                .flags  = IORESOURCE_MEM,
@@@ -109,15 -194,12 +206,12 @@@ static struct platform_device tmu2_devi
  };
  
  static struct sh_timer_config tmu3_platform_data = {
-       .name = "TMU3",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "tmu345_fck",
  };
  
  static struct resource tmu3_resources[] = {
        [0] = {
-               .name   = "TMU3",
                .start  = 0xffdc0008,
                .end    = 0xffdc0013,
                .flags  = IORESOURCE_MEM,
@@@ -139,15 -221,12 +233,12 @@@ static struct platform_device tmu3_devi
  };
  
  static struct sh_timer_config tmu4_platform_data = {
-       .name = "TMU4",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "tmu345_fck",
  };
  
  static struct resource tmu4_resources[] = {
        [0] = {
-               .name   = "TMU4",
                .start  = 0xffdc0014,
                .end    = 0xffdc001f,
                .flags  = IORESOURCE_MEM,
@@@ -169,15 -248,12 +260,12 @@@ static struct platform_device tmu4_devi
  };
  
  static struct sh_timer_config tmu5_platform_data = {
-       .name = "TMU5",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "tmu345_fck",
  };
  
  static struct resource tmu5_resources[] = {
        [0] = {
-               .name   = "TMU5",
                .start  = 0xffdc0020,
                .end    = 0xffdc002b,
                .flags  = IORESOURCE_MEM,
@@@ -198,76 -274,149 +286,149 @@@ static struct platform_device tmu5_devi
        .num_resources  = ARRAY_SIZE(tmu5_resources),
  };
  
- static struct plat_sci_port sci_platform_data[] = {
+ /* DMA */
+ static const struct sh_dmae_channel sh7785_dmae0_channels[] = {
        {
-               .mapbase        = 0xffea0000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_1,
-               .type           = PORT_SCIF,
-               .irqs           = { 40, 40, 40, 40 },
-               .clk            = "scif_fck",
+               .offset = 0,
+               .dmars = 0,
+               .dmars_bit = 0,
        }, {
-               .mapbase        = 0xffeb0000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_1,
-               .type           = PORT_SCIF,
-               .irqs           = { 44, 44, 44, 44 },
-               .clk            = "scif_fck",
+               .offset = 0x10,
+               .dmars = 0,
+               .dmars_bit = 8,
        }, {
-               .mapbase        = 0xffec0000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_1,
-               .type           = PORT_SCIF,
-               .irqs           = { 60, 60, 60, 60 },
-               .clk            = "scif_fck",
+               .offset = 0x20,
+               .dmars = 4,
+               .dmars_bit = 0,
        }, {
-               .mapbase        = 0xffed0000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_1,
-               .type           = PORT_SCIF,
-               .irqs           = { 61, 61, 61, 61 },
-               .clk            = "scif_fck",
+               .offset = 0x30,
+               .dmars = 4,
+               .dmars_bit = 8,
        }, {
-               .mapbase        = 0xffee0000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_1,
-               .type           = PORT_SCIF,
-               .irqs           = { 62, 62, 62, 62 },
-               .clk            = "scif_fck",
+               .offset = 0x50,
+               .dmars = 8,
+               .dmars_bit = 0,
        }, {
-               .mapbase        = 0xffef0000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_1,
-               .type           = PORT_SCIF,
-               .irqs           = { 63, 63, 63, 63 },
-               .clk            = "scif_fck",
+               .offset = 0x60,
+               .dmars = 8,
+               .dmars_bit = 8,
+       }
+ };
+ static const struct sh_dmae_channel sh7785_dmae1_channels[] = {
+       {
+               .offset = 0,
        }, {
-               .flags = 0,
+               .offset = 0x10,
+       }, {
+               .offset = 0x20,
+       }, {
+               .offset = 0x30,
+       }, {
+               .offset = 0x50,
+       }, {
+               .offset = 0x60,
        }
  };
  
- static struct platform_device sci_device = {
-       .name           = "sh-sci",
-       .id             = -1,
+ static const unsigned int ts_shift[] = TS_SHIFT;
+ static struct sh_dmae_pdata dma0_platform_data = {
+       .channel        = sh7785_dmae0_channels,
+       .channel_num    = ARRAY_SIZE(sh7785_dmae0_channels),
+       .ts_low_shift   = CHCR_TS_LOW_SHIFT,
+       .ts_low_mask    = CHCR_TS_LOW_MASK,
+       .ts_high_shift  = CHCR_TS_HIGH_SHIFT,
+       .ts_high_mask   = CHCR_TS_HIGH_MASK,
+       .ts_shift       = ts_shift,
+       .ts_shift_num   = ARRAY_SIZE(ts_shift),
+       .dmaor_init     = DMAOR_INIT,
+ };
+ static struct sh_dmae_pdata dma1_platform_data = {
+       .channel        = sh7785_dmae1_channels,
+       .channel_num    = ARRAY_SIZE(sh7785_dmae1_channels),
+       .ts_low_shift   = CHCR_TS_LOW_SHIFT,
+       .ts_low_mask    = CHCR_TS_LOW_MASK,
+       .ts_high_shift  = CHCR_TS_HIGH_SHIFT,
+       .ts_high_mask   = CHCR_TS_HIGH_MASK,
+       .ts_shift       = ts_shift,
+       .ts_shift_num   = ARRAY_SIZE(ts_shift),
+       .dmaor_init     = DMAOR_INIT,
+ };
+ static struct resource sh7785_dmae0_resources[] = {
+       [0] = {
+               /* Channel registers and DMAOR */
+               .start  = 0xfc808020,
+               .end    = 0xfc80808f,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               /* DMARSx */
+               .start  = 0xfc809000,
+               .end    = 0xfc80900b,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               /* Real DMA error IRQ is 39, and channel IRQs are 33-38 */
+               .start  = 33,
+               .end    = 33,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
+       },
+ };
+ static struct resource sh7785_dmae1_resources[] = {
+       [0] = {
+               /* Channel registers and DMAOR */
+               .start  = 0xfcc08020,
+               .end    = 0xfcc0808f,
+               .flags  = IORESOURCE_MEM,
+       },
+       /* DMAC1 has no DMARS */
+       {
+               /* Real DMA error IRQ is 58, and channel IRQs are 52-57 */
+               .start  = 52,
+               .end    = 52,
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_SHAREABLE,
+       },
+ };
+ static struct platform_device dma0_device = {
+       .name           = "sh-dma-engine",
+       .id             = 0,
+       .resource       = sh7785_dmae0_resources,
+       .num_resources  = ARRAY_SIZE(sh7785_dmae0_resources),
+       .dev            = {
+               .platform_data  = &dma0_platform_data,
+       },
+ };
+ static struct platform_device dma1_device = {
+       .name           = "sh-dma-engine",
+       .id             = 1,
+       .resource       = sh7785_dmae1_resources,
+       .num_resources  = ARRAY_SIZE(sh7785_dmae1_resources),
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &dma1_platform_data,
        },
  };
  
  static struct platform_device *sh7785_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &scif5_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
        &tmu3_device,
        &tmu4_device,
        &tmu5_device,
-       &sci_device,
+       &dma0_device,
+       &dma1_device,
  };
  
  static int __init sh7785_devices_setup(void)
        return platform_add_devices(sh7785_devices,
                                    ARRAY_SIZE(sh7785_devices));
  }
__initcall(sh7785_devices_setup);
arch_initcall(sh7785_devices_setup);
  
  static struct platform_device *sh7785_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &scif5_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
@@@ -482,17 -637,17 +649,17 @@@ static DECLARE_INTC_DESC(intc_desc_irl4
  void __init plat_irq_setup(void)
  {
        /* disable IRQ3-0 + IRQ7-4 */
-       ctrl_outl(0xff000000, INTC_INTMSK0);
+       __raw_writel(0xff000000, INTC_INTMSK0);
  
        /* disable IRL3-0 + IRL7-4 */
-       ctrl_outl(0xc0000000, INTC_INTMSK1);
-       ctrl_outl(0xfffefffe, INTC_INTMSK2);
+       __raw_writel(0xc0000000, INTC_INTMSK1);
+       __raw_writel(0xfffefffe, INTC_INTMSK2);
  
        /* select IRL mode for IRL3-0 + IRL7-4 */
-       ctrl_outl(ctrl_inl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
+       __raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
  
        /* disable holding function, ie enable "SH-4 Mode" */
-       ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00200000, INTC_ICR0);
+       __raw_writel(__raw_readl(INTC_ICR0) | 0x00200000, INTC_ICR0);
  
        register_intc_controller(&intc_desc);
  }
@@@ -502,32 -657,32 +669,32 @@@ void __init plat_irq_setup_pins(int mod
        switch (mode) {
        case IRQ_MODE_IRQ7654:
                /* select IRQ mode for IRL7-4 */
-               ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00400000, INTC_ICR0);
+               __raw_writel(__raw_readl(INTC_ICR0) | 0x00400000, INTC_ICR0);
                register_intc_controller(&intc_desc_irq4567);
                break;
        case IRQ_MODE_IRQ3210:
                /* select IRQ mode for IRL3-0 */
-               ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00800000, INTC_ICR0);
+               __raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0);
                register_intc_controller(&intc_desc_irq0123);
                break;
        case IRQ_MODE_IRL7654:
                /* enable IRL7-4 but don't provide any masking */
-               ctrl_outl(0x40000000, INTC_INTMSKCLR1);
-               ctrl_outl(0x0000fffe, INTC_INTMSKCLR2);
+               __raw_writel(0x40000000, INTC_INTMSKCLR1);
+               __raw_writel(0x0000fffe, INTC_INTMSKCLR2);
                break;
        case IRQ_MODE_IRL3210:
                /* enable IRL0-3 but don't provide any masking */
-               ctrl_outl(0x80000000, INTC_INTMSKCLR1);
-               ctrl_outl(0xfffe0000, INTC_INTMSKCLR2);
+               __raw_writel(0x80000000, INTC_INTMSKCLR1);
+               __raw_writel(0xfffe0000, INTC_INTMSKCLR2);
                break;
        case IRQ_MODE_IRL7654_MASK:
                /* enable IRL7-4 and mask using cpu intc controller */
-               ctrl_outl(0x40000000, INTC_INTMSKCLR1);
+               __raw_writel(0x40000000, INTC_INTMSKCLR1);
                register_intc_controller(&intc_desc_irl4567);
                break;
        case IRQ_MODE_IRL3210_MASK:
                /* enable IRL0-3 and mask using cpu intc controller */
-               ctrl_outl(0x80000000, INTC_INTMSKCLR1);
+               __raw_writel(0x80000000, INTC_INTMSKCLR1);
                register_intc_controller(&intc_desc_irl0123);
                break;
        default:
@@@ -1,7 -1,7 +1,7 @@@
  /*
   * SH7786 Setup
   *
-  * Copyright (C) 2009  Renesas Solutions Corp.
+  * Copyright (C) 2009 - 2010  Renesas Solutions Corp.
   * Kuninori Morimoto <morimoto.kuninori@renesas.com>
   * Paul Mundt <paul.mundt@renesas.com>
   *
  #include <linux/mm.h>
  #include <linux/dma-mapping.h>
  #include <linux/sh_timer.h>
+ #include <linux/sh_dma.h>
+ #include <linux/sh_intc.h>
+ #include <cpu/dma-register.h>
  #include <asm/mmzone.h>
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xffea0000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_1,
-               .type           = PORT_SCIF,
-               .irqs           = { 40, 41, 43, 42 },
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xffea0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_1,
+       .type           = PORT_SCIF,
+       .irqs           = { 40, 41, 43, 42 },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
        },
-       /*
-        * The rest of these all have multiplexed IRQs
-        */
-       {
-               .mapbase        = 0xffeb0000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_1,
-               .type           = PORT_SCIF,
-               .irqs           = { 44, 44, 44, 44 },
-       }, {
-               .mapbase        = 0xffec0000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_1,
-               .type           = PORT_SCIF,
-               .irqs           = { 50, 50, 50, 50 },
-       }, {
-               .mapbase        = 0xffed0000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_1,
-               .type           = PORT_SCIF,
-               .irqs           = { 51, 51, 51, 51 },
-       }, {
-               .mapbase        = 0xffee0000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_1,
-               .type           = PORT_SCIF,
-               .irqs           = { 52, 52, 52, 52 },
-       }, {
-               .mapbase        = 0xffef0000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
-               .scbrr_algo_id  = SCBRR_ALGO_1,
-               .type           = PORT_SCIF,
-               .irqs           = { 53, 53, 53, 53 },
-       }, {
-               .flags = 0,
-       }
  };
  
- static struct platform_device sci_device = {
+ /*
+  * The rest of these all have multiplexed IRQs
+  */
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xffeb0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_1,
+       .type           = PORT_SCIF,
+       .irqs           = { 44, 44, 44, 44 },
+ };
+ static struct platform_device scif1_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xffec0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_1,
+       .type           = PORT_SCIF,
+       .irqs           = { 50, 50, 50, 50 },
+ };
+ static struct platform_device scif2_device = {
+       .name           = "sh-sci",
+       .id             = 2,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif2_platform_data,
+       },
+ };
+ static struct plat_sci_port scif3_platform_data = {
+       .mapbase        = 0xffed0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_1,
+       .type           = PORT_SCIF,
+       .irqs           = { 51, 51, 51, 51 },
+ };
+ static struct platform_device scif3_device = {
+       .name           = "sh-sci",
+       .id             = 3,
+       .dev            = {
+               .platform_data  = &scif3_platform_data,
+       },
+ };
+ static struct plat_sci_port scif4_platform_data = {
+       .mapbase        = 0xffee0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_1,
+       .type           = PORT_SCIF,
+       .irqs           = { 52, 52, 52, 52 },
+ };
+ static struct platform_device scif4_device = {
+       .name           = "sh-sci",
+       .id             = 4,
+       .dev            = {
+               .platform_data  = &scif4_platform_data,
+       },
+ };
+ static struct plat_sci_port scif5_platform_data = {
+       .mapbase        = 0xffef0000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE | SCSCR_CKE1,
++      .scbrr_algo_id  = SCBRR_ALGO_1,
+       .type           = PORT_SCIF,
+       .irqs           = { 53, 53, 53, 53 },
+ };
+ static struct platform_device scif5_device = {
+       .name           = "sh-sci",
+       .id             = 5,
+       .dev            = {
+               .platform_data  = &scif5_platform_data,
        },
  };
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xffd80008,
                .end    = 0xffd80013,
                .flags  = IORESOURCE_MEM,
@@@ -115,16 -148,13 +160,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xffd80014,
                .end    = 0xffd8001f,
                .flags  = IORESOURCE_MEM,
@@@ -146,15 -176,12 +188,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xffd80020,
                .end    = 0xffd8002f,
                .flags  = IORESOURCE_MEM,
@@@ -176,15 -203,12 +215,12 @@@ static struct platform_device tmu2_devi
  };
  
  static struct sh_timer_config tmu3_platform_data = {
-       .name = "TMU3",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu3_resources[] = {
        [0] = {
-               .name   = "TMU3",
                .start  = 0xffda0008,
                .end    = 0xffda0013,
                .flags  = IORESOURCE_MEM,
@@@ -206,15 -230,12 +242,12 @@@ static struct platform_device tmu3_devi
  };
  
  static struct sh_timer_config tmu4_platform_data = {
-       .name = "TMU4",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu4_resources[] = {
        [0] = {
-               .name   = "TMU4",
                .start  = 0xffda0014,
                .end    = 0xffda001f,
                .flags  = IORESOURCE_MEM,
@@@ -236,15 -257,12 +269,12 @@@ static struct platform_device tmu4_devi
  };
  
  static struct sh_timer_config tmu5_platform_data = {
-       .name = "TMU5",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu5_resources[] = {
        [0] = {
-               .name   = "TMU5",
                .start  = 0xffda0020,
                .end    = 0xffda002b,
                .flags  = IORESOURCE_MEM,
@@@ -266,15 -284,12 +296,12 @@@ static struct platform_device tmu5_devi
  };
  
  static struct sh_timer_config tmu6_platform_data = {
-       .name = "TMU6",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu6_resources[] = {
        [0] = {
-               .name   = "TMU6",
                .start  = 0xffdc0008,
                .end    = 0xffdc0013,
                .flags  = IORESOURCE_MEM,
@@@ -296,15 -311,12 +323,12 @@@ static struct platform_device tmu6_devi
  };
  
  static struct sh_timer_config tmu7_platform_data = {
-       .name = "TMU7",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu7_resources[] = {
        [0] = {
-               .name   = "TMU7",
                .start  = 0xffdc0014,
                .end    = 0xffdc001f,
                .flags  = IORESOURCE_MEM,
@@@ -326,15 -338,12 +350,12 @@@ static struct platform_device tmu7_devi
  };
  
  static struct sh_timer_config tmu8_platform_data = {
-       .name = "TMU8",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu8_resources[] = {
        [0] = {
-               .name   = "TMU8",
                .start  = 0xffdc0020,
                .end    = 0xffdc002b,
                .flags  = IORESOURCE_MEM,
@@@ -356,15 -365,12 +377,12 @@@ static struct platform_device tmu8_devi
  };
  
  static struct sh_timer_config tmu9_platform_data = {
-       .name = "TMU9",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu9_resources[] = {
        [0] = {
-               .name   = "TMU9",
                .start  = 0xffde0008,
                .end    = 0xffde0013,
                .flags  = IORESOURCE_MEM,
@@@ -386,15 -392,12 +404,12 @@@ static struct platform_device tmu9_devi
  };
  
  static struct sh_timer_config tmu10_platform_data = {
-       .name = "TMU10",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu10_resources[] = {
        [0] = {
-               .name   = "TMU10",
                .start  = 0xffde0014,
                .end    = 0xffde001f,
                .flags  = IORESOURCE_MEM,
@@@ -416,15 -419,12 +431,12 @@@ static struct platform_device tmu10_dev
  };
  
  static struct sh_timer_config tmu11_platform_data = {
-       .name = "TMU11",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu11_resources[] = {
        [0] = {
-               .name   = "TMU11",
                .start  = 0xffde0020,
                .end    = 0xffde002b,
                .flags  = IORESOURCE_MEM,
@@@ -445,10 -445,114 +457,114 @@@ static struct platform_device tmu11_dev
        .num_resources  = ARRAY_SIZE(tmu11_resources),
  };
  
+ static const struct sh_dmae_channel dmac0_channels[] = {
+       {
+               .offset = 0,
+               .dmars = 0,
+               .dmars_bit = 0,
+       }, {
+               .offset = 0x10,
+               .dmars = 0,
+               .dmars_bit = 8,
+       }, {
+               .offset = 0x20,
+               .dmars = 4,
+               .dmars_bit = 0,
+       }, {
+               .offset = 0x30,
+               .dmars = 4,
+               .dmars_bit = 8,
+       }, {
+               .offset = 0x50,
+               .dmars = 8,
+               .dmars_bit = 0,
+       }, {
+               .offset = 0x60,
+               .dmars = 8,
+               .dmars_bit = 8,
+       }
+ };
+ static const unsigned int ts_shift[] = TS_SHIFT;
+ static struct sh_dmae_pdata dma0_platform_data = {
+       .channel        = dmac0_channels,
+       .channel_num    = ARRAY_SIZE(dmac0_channels),
+       .ts_low_shift   = CHCR_TS_LOW_SHIFT,
+       .ts_low_mask    = CHCR_TS_LOW_MASK,
+       .ts_high_shift  = CHCR_TS_HIGH_SHIFT,
+       .ts_high_mask   = CHCR_TS_HIGH_MASK,
+       .ts_shift       = ts_shift,
+       .ts_shift_num   = ARRAY_SIZE(ts_shift),
+       .dmaor_init     = DMAOR_INIT,
+ };
+ /* Resource order important! */
+ static struct resource dmac0_resources[] = {
+       {
+               /* Channel registers and DMAOR */
+               .start  = 0xfe008020,
+               .end    = 0xfe00808f,
+               .flags  = IORESOURCE_MEM,
+       }, {
+               /* DMARSx */
+               .start  = 0xfe009000,
+               .end    = 0xfe00900b,
+               .flags  = IORESOURCE_MEM,
+       }, {
+               /* DMA error IRQ */
+               .start  = evt2irq(0x5c0),
+               .end    = evt2irq(0x5c0),
+               .flags  = IORESOURCE_IRQ,
+       }, {
+               /* IRQ for channels 0-5 */
+               .start  = evt2irq(0x500),
+               .end    = evt2irq(0x5a0),
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device dma0_device = {
+       .name           = "sh-dma-engine",
+       .id             = 0,
+       .resource       = dmac0_resources,
+       .num_resources  = ARRAY_SIZE(dmac0_resources),
+       .dev            = {
+               .platform_data  = &dma0_platform_data,
+       },
+ };
+ #define USB_EHCI_START 0xffe70000
+ #define USB_OHCI_START 0xffe70400
+ static struct resource usb_ehci_resources[] = {
+       [0] = {
+               .start  = USB_EHCI_START,
+               .end    = USB_EHCI_START + 0x3ff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = 77,
+               .end    = 77,
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ static struct platform_device usb_ehci_device = {
+       .name           = "sh_ehci",
+       .id             = -1,
+       .dev = {
+               .dma_mask               = &usb_ehci_device.dev.coherent_dma_mask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+       .num_resources  = ARRAY_SIZE(usb_ehci_resources),
+       .resource       = usb_ehci_resources,
+ };
  static struct resource usb_ohci_resources[] = {
        [0] = {
-               .start  = 0xffe70400,
-               .end    = 0xffe704ff,
+               .start  = USB_OHCI_START,
+               .end    = USB_OHCI_START + 0x3ff,
                .flags  = IORESOURCE_MEM,
        },
        [1] = {
        },
  };
  
- static u64 usb_ohci_dma_mask = DMA_BIT_MASK(32);
  static struct platform_device usb_ohci_device = {
        .name           = "sh_ohci",
        .id             = -1,
        .dev = {
-               .dma_mask               = &usb_ohci_dma_mask,
+               .dma_mask               = &usb_ohci_device.dev.coherent_dma_mask,
                .coherent_dma_mask      = DMA_BIT_MASK(32),
        },
        .num_resources  = ARRAY_SIZE(usb_ohci_resources),
  };
  
  static struct platform_device *sh7786_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
+       &scif3_device,
+       &scif4_device,
+       &scif5_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
  };
  
  static struct platform_device *sh7786_devices[] __initdata = {
-       &sci_device,
+       &dma0_device,
+       &usb_ehci_device,
        &usb_ohci_device,
  };
  
  /*
   * Please call this function if your platform board
   * use external clock for USB
  #define USBCTL0               0xffe70858
  #define CLOCK_MODE_MASK 0xffffff7f
  #define EXT_CLOCK_MODE  0x00000080
  void __init sh7786_usb_use_exclock(void)
  {
        u32 val = __raw_readl(USBCTL0) & CLOCK_MODE_MASK;
  #define PLL_ENB               0x00000002
  #define PHY_RST               0x00000004
  #define ACT_PLL_STATUS        0xc0000000
  static void __init sh7786_usb_setup(void)
  {
        int i = 1000000;
        }
  }
  
- static int __init sh7786_devices_setup(void)
- {
-       int ret;
-       sh7786_usb_setup();
-       ret = platform_add_devices(sh7786_early_devices,
-                                  ARRAY_SIZE(sh7786_early_devices));
-       if (unlikely(ret != 0))
-               return ret;
-       return platform_add_devices(sh7786_devices,
-                                   ARRAY_SIZE(sh7786_devices));
- }
- device_initcall(sh7786_devices_setup);
- void __init plat_early_device_setup(void)
- {
-       early_platform_add_devices(sh7786_early_devices,
-                                  ARRAY_SIZE(sh7786_early_devices));
- }
  enum {
        UNUSED = 0,
  
        /* interrupt sources */
        IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
        IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
        IRL0_HLLL, IRL0_HLLH, IRL0_HLHL, IRL0_HLHH,
        Thermal,
        INTICI0, INTICI1, INTICI2, INTICI3,
        INTICI4, INTICI5, INTICI6, INTICI7,
+       /* Muxed sub-events */
+       TXI1, BRI1, RXI1, ERI1,
  };
  
- static struct intc_vect vectors[] __initdata = {
+ static struct intc_vect sh7786_vectors[] __initdata = {
        INTC_VECT(WDT, 0x3e0),
        INTC_VECT(TMU0_0, 0x400), INTC_VECT(TMU0_1, 0x420),
        INTC_VECT(TMU0_2, 0x440), INTC_VECT(TMU0_3, 0x460),
  #define INTMSK2               0xfe410068
  #define INTMSKCLR2    0xfe41006c
  
- static struct intc_mask_reg mask_registers[] __initdata = {
+ #define INTDISTCR0    0xfe4100b0
+ #define INTDISTCR1    0xfe4100b4
+ #define INT2DISTCR0   0xfe410900
+ #define INT2DISTCR1   0xfe410904
+ #define INT2DISTCR2   0xfe410908
+ #define INT2DISTCR3   0xfe41090c
+ static struct intc_mask_reg sh7786_mask_registers[] __initdata = {
        { CnINTMSK0, CnINTMSKCLR0, 32,
-         { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
+         { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 },
+           INTC_SMP_BALANCING(INTDISTCR0) },
        { INTMSK2, INTMSKCLR2, 32,
          { IRL0_LLLL, IRL0_LLLH, IRL0_LLHL, IRL0_LLHH,
            IRL0_LHLL, IRL0_LHLH, IRL0_LHHL, IRL0_LHHH,
            IRL4_HHLL, IRL4_HHLH, IRL4_HHHL, 0, } },
        { CnINT2MSKR0, CnINT2MSKCR0 , 32,
          { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, WDT } },
+           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, WDT },
+           INTC_SMP_BALANCING(INT2DISTCR0) },
        { CnINT2MSKR1, CnINT2MSKCR1, 32,
          { TMU0_0, TMU0_1, TMU0_2, TMU0_3, TMU1_0, TMU1_1, TMU1_2, 0,
            DMAC0_0, DMAC0_1, DMAC0_2, DMAC0_3, DMAC0_4, DMAC0_5, DMAC0_6,
            HPB_0, HPB_1, HPB_2,
            SCIF0_0, SCIF0_1, SCIF0_2, SCIF0_3,
            SCIF1,
-           TMU2, TMU3, 0, } },
+           TMU2, TMU3, 0, }, INTC_SMP_BALANCING(INT2DISTCR1) },
        { CnINT2MSKR2, CnINT2MSKCR2, 32,
          { 0, 0, SCIF2, SCIF3, SCIF4, SCIF5,
            Eth_0, Eth_1,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            PCIeC0_0, PCIeC0_1, PCIeC0_2,
            PCIeC1_0, PCIeC1_1, PCIeC1_2,
-           USB, 0, 0 } },
+           USB, 0, 0 }, INTC_SMP_BALANCING(INT2DISTCR2) },
        { CnINT2MSKR3, CnINT2MSKCR3, 32,
          { 0, 0, 0, 0, 0, 0,
            I2C0, I2C1,
            HAC0, HAC1,
            FLCTL, 0,
            HSPI, GPIO0, GPIO1, Thermal,
-           0, 0, 0, 0, 0, 0, 0, 0 } },
+           0, 0, 0, 0, 0, 0, 0, 0 }, INTC_SMP_BALANCING(INT2DISTCR3) },
  };
  
- static struct intc_prio_reg prio_registers[] __initdata = {
+ static struct intc_prio_reg sh7786_prio_registers[] __initdata = {
        { 0xfe410010, 0, 32, 4, /* INTPRI */   { IRQ0, IRQ1, IRQ2, IRQ3,
                                                 IRQ4, IRQ5, IRQ6, IRQ7 } },
        { 0xfe410800, 0, 32, 8, /* INT2PRI0 */ { 0, 0, 0, WDT } },
            INTICI3, INTICI2, INTICI1, INTICI0 }, INTC_SMP(4, 2) },
  };
  
- static DECLARE_INTC_DESC(intc_desc, "sh7786", vectors, NULL,
-                        mask_registers, prio_registers, NULL);
+ static struct intc_subgroup sh7786_subgroups[] __initdata = {
+       { 0xfe410c20, 32, SCIF1,
+         { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TXI1, BRI1, RXI1, ERI1 } },
+ };
  
- /* Support for external interrupt pins in IRQ mode */
+ static struct intc_desc sh7786_intc_desc __initdata = {
+       .name           = "sh7786",
+       .hw             = {
+               .vectors        = sh7786_vectors,
+               .nr_vectors     = ARRAY_SIZE(sh7786_vectors),
+               .mask_regs      = sh7786_mask_registers,
+               .nr_mask_regs   = ARRAY_SIZE(sh7786_mask_registers),
+               .subgroups      = sh7786_subgroups,
+               .nr_subgroups   = ARRAY_SIZE(sh7786_subgroups),
+               .prio_regs      = sh7786_prio_registers,
+               .nr_prio_regs   = ARRAY_SIZE(sh7786_prio_registers),
+       },
+ };
  
+ /* Support for external interrupt pins in IRQ mode */
  static struct intc_vect vectors_irq0123[] __initdata = {
        INTC_VECT(IRQ0, 0x200), INTC_VECT(IRQ1, 0x240),
        INTC_VECT(IRQ2, 0x280), INTC_VECT(IRQ3, 0x2c0),
@@@ -771,23 -887,25 +899,25 @@@ static struct intc_vect vectors_irq4567
        INTC_VECT(IRQ6, 0x380), INTC_VECT(IRQ7, 0x3c0),
  };
  
- static struct intc_sense_reg sense_registers[] __initdata = {
+ static struct intc_sense_reg sh7786_sense_registers[] __initdata = {
        { 0xfe41001c, 32, 2, /* ICR1 */   { IRQ0, IRQ1, IRQ2, IRQ3,
                                            IRQ4, IRQ5, IRQ6, IRQ7 } },
  };
  
- static struct intc_mask_reg ack_registers[] __initdata = {
+ static struct intc_mask_reg sh7786_ack_registers[] __initdata = {
        { 0xfe410024, 0, 32, /* INTREQ */
          { IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7 } },
  };
  
  static DECLARE_INTC_DESC_ACK(intc_desc_irq0123, "sh7786-irq0123",
-                            vectors_irq0123, NULL, mask_registers,
-                            prio_registers, sense_registers, ack_registers);
+                            vectors_irq0123, NULL, sh7786_mask_registers,
+                            sh7786_prio_registers, sh7786_sense_registers,
+                            sh7786_ack_registers);
  
  static DECLARE_INTC_DESC_ACK(intc_desc_irq4567, "sh7786-irq4567",
-                            vectors_irq4567, NULL, mask_registers,
-                            prio_registers, sense_registers, ack_registers);
+                            vectors_irq4567, NULL, sh7786_mask_registers,
+                            sh7786_prio_registers, sh7786_sense_registers,
+                            sh7786_ack_registers);
  
  /* External interrupt pins in IRL mode */
  
@@@ -814,10 -932,10 +944,10 @@@ static struct intc_vect vectors_irl4567
  };
  
  static DECLARE_INTC_DESC(intc_desc_irl0123, "sh7786-irl0123", vectors_irl0123,
-                        NULL, mask_registers, NULL, NULL);
+                        NULL, sh7786_mask_registers, NULL, NULL);
  
  static DECLARE_INTC_DESC(intc_desc_irl4567, "sh7786-irl4567", vectors_irl4567,
-                        NULL, mask_registers, NULL, NULL);
+                        NULL, sh7786_mask_registers, NULL, NULL);
  
  #define INTC_ICR0     0xfe410000
  #define INTC_INTMSK0  CnINTMSK0
  void __init plat_irq_setup(void)
  {
        /* disable IRQ3-0 + IRQ7-4 */
-       ctrl_outl(0xff000000, INTC_INTMSK0);
+       __raw_writel(0xff000000, INTC_INTMSK0);
  
        /* disable IRL3-0 + IRL7-4 */
-       ctrl_outl(0xc0000000, INTC_INTMSK1);
-       ctrl_outl(0xfffefffe, INTC_INTMSK2);
+       __raw_writel(0xc0000000, INTC_INTMSK1);
+       __raw_writel(0xfffefffe, INTC_INTMSK2);
  
        /* select IRL mode for IRL3-0 + IRL7-4 */
-       ctrl_outl(ctrl_inl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
+       __raw_writel(__raw_readl(INTC_ICR0) & ~0x00c00000, INTC_ICR0);
  
-       register_intc_controller(&intc_desc);
+       register_intc_controller(&sh7786_intc_desc);
  }
  
  void __init plat_irq_setup_pins(int mode)
        switch (mode) {
        case IRQ_MODE_IRQ7654:
                /* select IRQ mode for IRL7-4 */
-               ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00400000, INTC_ICR0);
+               __raw_writel(__raw_readl(INTC_ICR0) | 0x00400000, INTC_ICR0);
                register_intc_controller(&intc_desc_irq4567);
                break;
        case IRQ_MODE_IRQ3210:
                /* select IRQ mode for IRL3-0 */
-               ctrl_outl(ctrl_inl(INTC_ICR0) | 0x00800000, INTC_ICR0);
+               __raw_writel(__raw_readl(INTC_ICR0) | 0x00800000, INTC_ICR0);
                register_intc_controller(&intc_desc_irq0123);
                break;
        case IRQ_MODE_IRL7654:
                /* enable IRL7-4 but don't provide any masking */
-               ctrl_outl(0x40000000, INTC_INTMSKCLR1);
-               ctrl_outl(0x0000fffe, INTC_INTMSKCLR2);
+               __raw_writel(0x40000000, INTC_INTMSKCLR1);
+               __raw_writel(0x0000fffe, INTC_INTMSKCLR2);
                break;
        case IRQ_MODE_IRL3210:
                /* enable IRL0-3 but don't provide any masking */
-               ctrl_outl(0x80000000, INTC_INTMSKCLR1);
-               ctrl_outl(0xfffe0000, INTC_INTMSKCLR2);
+               __raw_writel(0x80000000, INTC_INTMSKCLR1);
+               __raw_writel(0xfffe0000, INTC_INTMSKCLR2);
                break;
        case IRQ_MODE_IRL7654_MASK:
                /* enable IRL7-4 and mask using cpu intc controller */
-               ctrl_outl(0x40000000, INTC_INTMSKCLR1);
+               __raw_writel(0x40000000, INTC_INTMSKCLR1);
                register_intc_controller(&intc_desc_irl4567);
                break;
        case IRQ_MODE_IRL3210_MASK:
                /* enable IRL0-3 and mask using cpu intc controller */
-               ctrl_outl(0x80000000, INTC_INTMSKCLR1);
+               __raw_writel(0x80000000, INTC_INTMSKCLR1);
                register_intc_controller(&intc_desc_irl0123);
                break;
        default:
  void __init plat_mem_setup(void)
  {
  }
+ static int __init sh7786_devices_setup(void)
+ {
+       int ret, irq;
+       sh7786_usb_setup();
+       /*
+        * De-mux SCIF1 IRQs if possible
+        */
+       irq = intc_irq_lookup(sh7786_intc_desc.name, TXI1);
+       if (irq > 0) {
+               scif1_platform_data.irqs[SCIx_TXI_IRQ] = irq;
+               scif1_platform_data.irqs[SCIx_ERI_IRQ] =
+                       intc_irq_lookup(sh7786_intc_desc.name, ERI1);
+               scif1_platform_data.irqs[SCIx_BRI_IRQ] =
+                       intc_irq_lookup(sh7786_intc_desc.name, BRI1);
+               scif1_platform_data.irqs[SCIx_RXI_IRQ] =
+                       intc_irq_lookup(sh7786_intc_desc.name, RXI1);
+       }
+       ret = platform_add_devices(sh7786_early_devices,
+                                  ARRAY_SIZE(sh7786_early_devices));
+       if (unlikely(ret != 0))
+               return ret;
+       return platform_add_devices(sh7786_devices,
+                                   ARRAY_SIZE(sh7786_devices));
+ }
+ arch_initcall(sh7786_devices_setup);
+ void __init plat_early_device_setup(void)
+ {
+       early_platform_add_devices(sh7786_early_devices,
+                                  ARRAY_SIZE(sh7786_early_devices));
+ }
@@@ -1,7 -1,7 +1,7 @@@
  /*
   * SH-X3 Prototype Setup
   *
-  *  Copyright (C) 2007 - 2009  Paul Mundt
+  *  Copyright (C) 2007 - 2010  Paul Mundt
   *
   * This file is subject to the terms and conditions of the GNU General Public
   * License.  See the file "COPYING" in the main directory of this archive
  #include <linux/serial.h>
  #include <linux/serial_sci.h>
  #include <linux/io.h>
+ #include <linux/gpio.h>
  #include <linux/sh_timer.h>
+ #include <cpu/shx3.h>
  #include <asm/mmzone.h>
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = 0xffc30000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 40, 41, 43, 42 },
-       }, {
-               .mapbase        = 0xffc40000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 44, 45, 47, 46 },
-       }, {
-               .mapbase        = 0xffc50000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 48, 49, 51, 50 },
-       }, {
-               .mapbase        = 0xffc60000,
-               .flags          = UPF_BOOT_AUTOCONF,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 52, 53, 55, 54 },
-       }, {
-               .flags = 0,
-       }
+ /*
+  * This intentionally only registers SCIF ports 0, 1, and 3. SCIF 2
+  * INTEVT values overlap with the FPU EXPEVT ones, requiring special
+  * demuxing in the exception dispatch path.
+  *
+  * As this overlap is something that never should have made it in to
+  * silicon in the first place, we just refuse to deal with the port at
+  * all rather than adding infrastructure to hack around it.
+  */
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = 0xffc30000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 40, 41, 43, 42 },
+ };
+ static struct platform_device scif0_device = {
+       .name           = "sh-sci",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &scif0_platform_data,
+       },
+ };
+ static struct plat_sci_port scif1_platform_data = {
+       .mapbase        = 0xffc40000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 44, 45, 47, 46 },
+ };
+ static struct platform_device scif1_device = {
+       .name           = "sh-sci",
+       .id             = 1,
+       .dev            = {
+               .platform_data  = &scif1_platform_data,
+       },
+ };
+ static struct plat_sci_port scif2_platform_data = {
+       .mapbase        = 0xffc60000,
+       .flags          = UPF_BOOT_AUTOCONF,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 52, 53, 55, 54 },
  };
  
- static struct platform_device sci_device = {
+ static struct platform_device scif2_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 2,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif2_platform_data,
        },
  };
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = 0xffc10008,
                .end    = 0xffc10013,
                .flags  = IORESOURCE_MEM,
@@@ -89,16 -100,13 +106,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = 0xffc10014,
                .end    = 0xffc1001f,
                .flags  = IORESOURCE_MEM,
@@@ -120,15 -128,12 +134,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = 0xffc10020,
                .end    = 0xffc1002f,
                .flags  = IORESOURCE_MEM,
@@@ -150,15 -155,12 +161,12 @@@ static struct platform_device tmu2_devi
  };
  
  static struct sh_timer_config tmu3_platform_data = {
-       .name = "TMU3",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu3_resources[] = {
        [0] = {
-               .name   = "TMU3",
                .start  = 0xffc20008,
                .end    = 0xffc20013,
                .flags  = IORESOURCE_MEM,
@@@ -180,15 -182,12 +188,12 @@@ static struct platform_device tmu3_devi
  };
  
  static struct sh_timer_config tmu4_platform_data = {
-       .name = "TMU4",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu4_resources[] = {
        [0] = {
-               .name   = "TMU4",
                .start  = 0xffc20014,
                .end    = 0xffc2001f,
                .flags  = IORESOURCE_MEM,
@@@ -210,15 -209,12 +215,12 @@@ static struct platform_device tmu4_devi
  };
  
  static struct sh_timer_config tmu5_platform_data = {
-       .name = "TMU5",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu5_resources[] = {
        [0] = {
-               .name   = "TMU5",
                .start  = 0xffc20020,
                .end    = 0xffc2002b,
                .flags  = IORESOURCE_MEM,
@@@ -240,6 -236,9 +242,9 @@@ static struct platform_device tmu5_devi
  };
  
  static struct platform_device *shx3_early_devices[] __initdata = {
+       &scif0_device,
+       &scif1_device,
+       &scif2_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
        &tmu5_device,
  };
  
- static struct platform_device *shx3_devices[] __initdata = {
-       &sci_device,
- };
  static int __init shx3_devices_setup(void)
  {
-       int ret;
-       ret = platform_add_devices(shx3_early_devices,
+       return platform_add_devices(shx3_early_devices,
                                   ARRAY_SIZE(shx3_early_devices));
-       if (unlikely(ret != 0))
-               return ret;
-       return platform_add_devices(shx3_devices,
-                                   ARRAY_SIZE(shx3_devices));
  }
__initcall(shx3_devices_setup);
arch_initcall(shx3_devices_setup);
  
  void __init plat_early_device_setup(void)
  {
@@@ -295,10 -283,7 +289,7 @@@ enum 
        DMAC1_DMINT6, DMAC1_DMINT7, DMAC1_DMINT8, DMAC1_DMINT9,
        DMAC1_DMINT10, DMAC1_DMINT11, DMAC1_DMAE,
        IIC, VIN0, VIN1, VCORE0, ATAPI,
-       DTU0_TEND, DTU0_AE, DTU0_TMISS,
-       DTU1_TEND, DTU1_AE, DTU1_TMISS,
-       DTU2_TEND, DTU2_AE, DTU2_TMISS,
-       DTU3_TEND, DTU3_AE, DTU3_TMISS,
+       DTU0, DTU1, DTU2, DTU3,
        FE0, FE1,
        GPIO0, GPIO1, GPIO2, GPIO3,
        PAM, IRM,
  
        /* interrupt groups */
        IRL, PCII56789, SCIF0, SCIF1, SCIF2, SCIF3,
-       DMAC0, DMAC1, DTU0, DTU1, DTU2, DTU3,
+       DMAC0, DMAC1,
  };
  
  static struct intc_vect vectors[] __initdata = {
        INTC_VECT(SCIF0_BRI, 0x740), INTC_VECT(SCIF0_TXI, 0x760),
        INTC_VECT(SCIF1_ERI, 0x780), INTC_VECT(SCIF1_RXI, 0x7a0),
        INTC_VECT(SCIF1_BRI, 0x7c0), INTC_VECT(SCIF1_TXI, 0x7e0),
-       INTC_VECT(SCIF2_ERI, 0x800), INTC_VECT(SCIF2_RXI, 0x820),
-       INTC_VECT(SCIF2_BRI, 0x840), INTC_VECT(SCIF2_TXI, 0x860),
        INTC_VECT(SCIF3_ERI, 0x880), INTC_VECT(SCIF3_RXI, 0x8a0),
        INTC_VECT(SCIF3_BRI, 0x8c0), INTC_VECT(SCIF3_TXI, 0x8e0),
        INTC_VECT(DMAC0_DMINT0, 0x900), INTC_VECT(DMAC0_DMINT1, 0x920),
        INTC_VECT(IIC, 0xae0),
        INTC_VECT(VIN0, 0xb00), INTC_VECT(VIN1, 0xb20),
        INTC_VECT(VCORE0, 0xb00), INTC_VECT(ATAPI, 0xb60),
-       INTC_VECT(DTU0_TEND, 0xc00), INTC_VECT(DTU0_AE, 0xc20),
-       INTC_VECT(DTU0_TMISS, 0xc40),
-       INTC_VECT(DTU1_TEND, 0xc60), INTC_VECT(DTU1_AE, 0xc80),
-       INTC_VECT(DTU1_TMISS, 0xca0),
-       INTC_VECT(DTU2_TEND, 0xcc0), INTC_VECT(DTU2_AE, 0xce0),
-       INTC_VECT(DTU2_TMISS, 0xd00),
-       INTC_VECT(DTU3_TEND, 0xd20), INTC_VECT(DTU3_AE, 0xd40),
-       INTC_VECT(DTU3_TMISS, 0xd60),
+       INTC_VECT(DTU0, 0xc00), INTC_VECT(DTU0, 0xc20),
+       INTC_VECT(DTU0, 0xc40),
+       INTC_VECT(DTU1, 0xc60), INTC_VECT(DTU1, 0xc80),
+       INTC_VECT(DTU1, 0xca0),
+       INTC_VECT(DTU2, 0xcc0), INTC_VECT(DTU2, 0xce0),
+       INTC_VECT(DTU2, 0xd00),
+       INTC_VECT(DTU3, 0xd20), INTC_VECT(DTU3, 0xd40),
+       INTC_VECT(DTU3, 0xd60),
        INTC_VECT(FE0, 0xe00), INTC_VECT(FE1, 0xe20),
        INTC_VECT(GPIO0, 0xe40), INTC_VECT(GPIO1, 0xe60),
        INTC_VECT(GPIO2, 0xe80), INTC_VECT(GPIO3, 0xea0),
@@@ -366,18 -349,17 +355,17 @@@ static struct intc_group groups[] __ini
        INTC_GROUP(PCII56789, PCII5, PCII6, PCII7, PCII8, PCII9),
        INTC_GROUP(SCIF0, SCIF0_ERI, SCIF0_RXI, SCIF0_BRI, SCIF0_TXI),
        INTC_GROUP(SCIF1, SCIF1_ERI, SCIF1_RXI, SCIF1_BRI, SCIF1_TXI),
-       INTC_GROUP(SCIF2, SCIF2_ERI, SCIF2_RXI, SCIF2_BRI, SCIF2_TXI),
        INTC_GROUP(SCIF3, SCIF3_ERI, SCIF3_RXI, SCIF3_BRI, SCIF3_TXI),
        INTC_GROUP(DMAC0, DMAC0_DMINT0, DMAC0_DMINT1, DMAC0_DMINT2,
                   DMAC0_DMINT3, DMAC0_DMINT4, DMAC0_DMINT5, DMAC0_DMAE),
        INTC_GROUP(DMAC1, DMAC1_DMINT6, DMAC1_DMINT7, DMAC1_DMINT8,
                   DMAC1_DMINT9, DMAC1_DMINT10, DMAC1_DMINT11),
-       INTC_GROUP(DTU0, DTU0_TEND, DTU0_AE, DTU0_TMISS),
-       INTC_GROUP(DTU1, DTU1_TEND, DTU1_AE, DTU1_TMISS),
-       INTC_GROUP(DTU2, DTU2_TEND, DTU2_AE, DTU2_TMISS),
-       INTC_GROUP(DTU3, DTU3_TEND, DTU3_AE, DTU3_TMISS),
  };
  
+ #define INT2DISTCR0   0xfe4108a0
+ #define INT2DISTCR1   0xfe4108a4
+ #define INT2DISTCR2   0xfe4108a8
  static struct intc_mask_reg mask_registers[] __initdata = {
        { 0xfe410030, 0xfe410050, 32, /* CnINTMSK0 / CnINTMSKCLR0 */
          { IRQ0, IRQ1, IRQ2, IRQ3 } },
          { FE1, FE0, 0, ATAPI, VCORE0, VIN1, VIN0, IIC,
            DU, GPIO3, GPIO2, GPIO1, GPIO0, PAM, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, /* HUDI bits ignored */
-           0, TMU5, TMU4, TMU3, TMU2, TMU1, TMU0, 0, } },
+           0, TMU5, TMU4, TMU3, TMU2, TMU1, TMU0, 0, },
+           INTC_SMP_BALANCING(INT2DISTCR0) },
        { 0xfe410830, 0xfe410860, 32, /* CnINT2MSK1 / CnINT2MSKCLR1 */
          { 0, 0, 0, 0, DTU3, DTU2, DTU1, DTU0, /* IRM bits ignored */
            PCII9, PCII8, PCII7, PCII6, PCII5, PCII4, PCII3, PCII2,
            PCII1, PCII0, DMAC1_DMAE, DMAC1_DMINT11,
            DMAC1_DMINT10, DMAC1_DMINT9, DMAC1_DMINT8, DMAC1_DMINT7,
            DMAC1_DMINT6, DMAC0_DMAE, DMAC0_DMINT5, DMAC0_DMINT4,
-           DMAC0_DMINT3, DMAC0_DMINT2, DMAC0_DMINT1, DMAC0_DMINT0 } },
+           DMAC0_DMINT3, DMAC0_DMINT2, DMAC0_DMINT1, DMAC0_DMINT0 },
+           INTC_SMP_BALANCING(INT2DISTCR1) },
        { 0xfe410840, 0xfe410870, 32, /* CnINT2MSK2 / CnINT2MSKCLR2 */
          { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            SCIF3_TXI, SCIF3_BRI, SCIF3_RXI, SCIF3_ERI,
            SCIF2_TXI, SCIF2_BRI, SCIF2_RXI, SCIF2_ERI,
            SCIF1_TXI, SCIF1_BRI, SCIF1_RXI, SCIF1_ERI,
-           SCIF0_TXI, SCIF0_BRI, SCIF0_RXI, SCIF0_ERI } },
+           SCIF0_TXI, SCIF0_BRI, SCIF0_RXI, SCIF0_ERI },
+           INTC_SMP_BALANCING(INT2DISTCR2) },
  };
  
  static struct intc_prio_reg prio_registers[] __initdata = {
@@@ -457,11 -442,33 +448,33 @@@ static DECLARE_INTC_DESC(intc_desc_irl
  
  void __init plat_irq_setup_pins(int mode)
  {
+       int ret = 0;
        switch (mode) {
        case IRQ_MODE_IRQ:
+               ret |= gpio_request(GPIO_FN_IRQ3, intc_desc_irq.name);
+               ret |= gpio_request(GPIO_FN_IRQ2, intc_desc_irq.name);
+               ret |= gpio_request(GPIO_FN_IRQ1, intc_desc_irq.name);
+               ret |= gpio_request(GPIO_FN_IRQ0, intc_desc_irq.name);
+               if (unlikely(ret)) {
+                       pr_err("Failed to set IRQ mode\n");
+                       return;
+               }
                register_intc_controller(&intc_desc_irq);
                break;
        case IRQ_MODE_IRL3210:
+               ret |= gpio_request(GPIO_FN_IRL3, intc_desc_irl.name);
+               ret |= gpio_request(GPIO_FN_IRL2, intc_desc_irl.name);
+               ret |= gpio_request(GPIO_FN_IRL1, intc_desc_irl.name);
+               ret |= gpio_request(GPIO_FN_IRL0, intc_desc_irl.name);
+               if (unlikely(ret)) {
+                       pr_err("Failed to set IRL mode\n");
+                       return;
+               }
                register_intc_controller(&intc_desc_irl);
                break;
        default:
  
  void __init plat_irq_setup(void)
  {
+       reserve_intc_vectors(vectors_irq, ARRAY_SIZE(vectors_irq));
+       reserve_intc_vectors(vectors_irl, ARRAY_SIZE(vectors_irl));
        register_intc_controller(&intc_desc);
  }
  
  #include <linux/sh_timer.h>
  #include <asm/addrspace.h>
  
- static struct plat_sci_port sci_platform_data[] = {
-       {
-               .mapbase        = PHYS_PERIPHERAL_BLOCK + 0x01030000,
-               .flags          = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
-               .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
-               .scbrr_algo_id  = SCBRR_ALGO_2,
-               .type           = PORT_SCIF,
-               .irqs           = { 39, 40, 42, 0 },
-       }, {
-               .flags = 0,
-       }
+ static struct plat_sci_port scif0_platform_data = {
+       .mapbase        = PHYS_PERIPHERAL_BLOCK + 0x01030000,
+       .flags          = UPF_BOOT_AUTOCONF | UPF_IOREMAP,
++      .scscr          = SCSCR_RE | SCSCR_TE | SCSCR_REIE,
++      .scbrr_algo_id  = SCBRR_ALGO_2,
+       .type           = PORT_SCIF,
+       .irqs           = { 39, 40, 42, 0 },
  };
  
- static struct platform_device sci_device = {
+ static struct platform_device scif0_device = {
        .name           = "sh-sci",
-       .id             = -1,
+       .id             = 0,
        .dev            = {
-               .platform_data  = sci_platform_data,
+               .platform_data  = &scif0_platform_data,
        },
  };
  
@@@ -74,16 -68,13 +70,13 @@@ static struct platform_device rtc_devic
  #define TMU2_BASE     (TMU_BASE + 0x8 + (0xc * 0x2))
  
  static struct sh_timer_config tmu0_platform_data = {
-       .name = "TMU0",
        .channel_offset = 0x04,
        .timer_bit = 0,
-       .clk = "peripheral_clk",
        .clockevent_rating = 200,
  };
  
  static struct resource tmu0_resources[] = {
        [0] = {
-               .name   = "TMU0",
                .start  = TMU0_BASE,
                .end    = TMU0_BASE + 0xc - 1,
                .flags  = IORESOURCE_MEM,
@@@ -105,16 -96,13 +98,13 @@@ static struct platform_device tmu0_devi
  };
  
  static struct sh_timer_config tmu1_platform_data = {
-       .name = "TMU1",
        .channel_offset = 0x10,
        .timer_bit = 1,
-       .clk = "peripheral_clk",
        .clocksource_rating = 200,
  };
  
  static struct resource tmu1_resources[] = {
        [0] = {
-               .name   = "TMU1",
                .start  = TMU1_BASE,
                .end    = TMU1_BASE + 0xc - 1,
                .flags  = IORESOURCE_MEM,
@@@ -136,15 -124,12 +126,12 @@@ static struct platform_device tmu1_devi
  };
  
  static struct sh_timer_config tmu2_platform_data = {
-       .name = "TMU2",
        .channel_offset = 0x1c,
        .timer_bit = 2,
-       .clk = "peripheral_clk",
  };
  
  static struct resource tmu2_resources[] = {
        [0] = {
-               .name   = "TMU2",
                .start  = TMU2_BASE,
                .end    = TMU2_BASE + 0xc - 1,
                .flags  = IORESOURCE_MEM,
@@@ -166,13 -151,13 +153,13 @@@ static struct platform_device tmu2_devi
  };
  
  static struct platform_device *sh5_early_devices[] __initdata = {
+       &scif0_device,
        &tmu0_device,
        &tmu1_device,
        &tmu2_device,
  };
  
  static struct platform_device *sh5_devices[] __initdata = {
-       &sci_device,
        &rtc_device,
  };
  
@@@ -188,7 -173,7 +175,7 @@@ static int __init sh5_devices_setup(voi
        return platform_add_devices(sh5_devices,
                                    ARRAY_SIZE(sh5_devices));
  }
__initcall(sh5_devices_setup);
arch_initcall(sh5_devices_setup);
  
  void __init plat_early_device_setup(void)
  {
diff --combined drivers/serial/sh-sci.c
@@@ -3,7 -3,7 +3,7 @@@
   *
   * SuperH on-chip serial module support.  (SCI with no FIFO / with FIFO)
   *
-- *  Copyright (C) 2002 - 2008  Paul Mundt
++ *  Copyright (C) 2002 - 2011  Paul Mundt
   *  Modified to support SH7720 SCIF. Markus Brunner, Mark Jonas (Jul 2007).
   *
   * based off of the old drivers/char/sh-sci.c by:
  #include <linux/ctype.h>
  #include <linux/err.h>
  #include <linux/list.h>
+ #include <linux/dmaengine.h>
+ #include <linux/scatterlist.h>
+ #include <linux/slab.h>
  
  #ifdef CONFIG_SUPERH
- #include <asm/clock.h>
  #include <asm/sh_bios.h>
  #endif
  
@@@ -79,28 -81,40 +81,48 @@@ struct sci_port 
        struct timer_list       break_timer;
        int                     break_flag;
  
- #ifdef CONFIG_HAVE_CLK
 +      /* SCSCR initialization */
 +      unsigned int            scscr;
 +
 +      /* SCBRR calculation algo */
 +      unsigned int            scbrr_algo_id;
 +
        /* Interface clock */
        struct clk              *iclk;
-       /* Data clock */
-       struct clk              *dclk;
- #endif
+       /* Function clock */
+       struct clk              *fclk;
        struct list_head        node;
++
+       struct dma_chan                 *chan_tx;
+       struct dma_chan                 *chan_rx;
++
+ #ifdef CONFIG_SERIAL_SH_SCI_DMA
+       struct device                   *dma_dev;
+       unsigned int                    slave_tx;
+       unsigned int                    slave_rx;
+       struct dma_async_tx_descriptor  *desc_tx;
+       struct dma_async_tx_descriptor  *desc_rx[2];
+       dma_cookie_t                    cookie_tx;
+       dma_cookie_t                    cookie_rx[2];
+       dma_cookie_t                    active_rx;
+       struct scatterlist              sg_tx;
+       unsigned int                    sg_len_tx;
+       struct scatterlist              sg_rx[2];
+       size_t                          buf_len_rx;
+       struct sh_dmae_slave            param_tx;
+       struct sh_dmae_slave            param_rx;
+       struct work_struct              work_tx;
+       struct work_struct              work_rx;
+       struct timer_list               rx_timer;
+       unsigned int                    rx_timeout;
+ #endif
  };
  
  struct sh_sci_priv {
        spinlock_t lock;
        struct list_head ports;
- #ifdef CONFIG_HAVE_CLK
        struct notifier_block clk_nb;
- #endif
  };
  
  /* Function prototypes */
@@@ -137,7 -151,11 +159,11 @@@ static int sci_poll_get_char(struct uar
                        handle_error(port);
                        continue;
                }
-       } while (!(status & SCxSR_RDxF(port)));
+               break;
+       } while (1);
+       if (!(status & SCxSR_RDxF(port)))
+               return NO_POLL_CHAR;
  
        c = sci_in(port, SCxRDR);
  
@@@ -162,32 -180,6 +188,6 @@@ static void sci_poll_put_char(struct ua
  }
  #endif /* CONFIG_CONSOLE_POLL || CONFIG_SERIAL_SH_SCI_CONSOLE */
  
- #if defined(__H8300S__)
- enum { sci_disable, sci_enable };
- static void h8300_sci_config(struct uart_port *port, unsigned int ctrl)
- {
-       volatile unsigned char *mstpcrl = (volatile unsigned char *)MSTPCRL;
-       int ch = (port->mapbase  - SMR0) >> 3;
-       unsigned char mask = 1 << (ch+1);
-       if (ctrl == sci_disable)
-               *mstpcrl |= mask;
-       else
-               *mstpcrl &= ~mask;
- }
- static void h8300_sci_enable(struct uart_port *port)
- {
-       h8300_sci_config(port, sci_enable);
- }
- static void h8300_sci_disable(struct uart_port *port)
- {
-       h8300_sci_config(port, sci_disable);
- }
- #endif
  #if defined(__H8300H__) || defined(__H8300S__)
  static void sci_init_pins(struct uart_port *port, unsigned int cflag)
  {
@@@ -259,9 -251,9 +259,9 @@@ static inline void sci_init_pins(struc
                   Set SCP6MD1,0 = {01} (output)  */
                __raw_writew((data & 0x0fcf) | 0x1000, SCPCR);
  
-               data = ctrl_inb(SCPDR);
+               data = __raw_readb(SCPDR);
                /* Set /RTS2 (bit6) = 0 */
-               ctrl_outb(data & 0xbf, SCPDR);
+               __raw_writeb(data & 0xbf, SCPDR);
        }
  }
  #elif defined(CONFIG_CPU_SUBTYPE_SH7722)
@@@ -278,7 -270,8 +278,8 @@@ static inline void sci_init_pins(struc
                __raw_writew(data, PSCR);
        }
  }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7763) || \
+ #elif defined(CONFIG_CPU_SUBTYPE_SH7757) || \
+       defined(CONFIG_CPU_SUBTYPE_SH7763) || \
        defined(CONFIG_CPU_SUBTYPE_SH7780) || \
        defined(CONFIG_CPU_SUBTYPE_SH7785) || \
        defined(CONFIG_CPU_SUBTYPE_SH7786) || \
@@@ -305,29 -298,44 +306,44 @@@ static inline void sci_init_pins(struc
      defined(CONFIG_CPU_SUBTYPE_SH7780) || \
      defined(CONFIG_CPU_SUBTYPE_SH7785) || \
      defined(CONFIG_CPU_SUBTYPE_SH7786)
- static inline int scif_txroom(struct uart_port *port)
+ static int scif_txfill(struct uart_port *port)
+ {
+       return sci_in(port, SCTFDR) & 0xff;
+ }
+ static int scif_txroom(struct uart_port *port)
  {
-       return SCIF_TXROOM_MAX - (sci_in(port, SCTFDR) & 0xff);
+       return SCIF_TXROOM_MAX - scif_txfill(port);
  }
  
- static inline int scif_rxroom(struct uart_port *port)
+ static int scif_rxfill(struct uart_port *port)
  {
        return sci_in(port, SCRFDR) & 0xff;
  }
  #elif defined(CONFIG_CPU_SUBTYPE_SH7763)
- static inline int scif_txroom(struct uart_port *port)
+ static int scif_txfill(struct uart_port *port)
  {
-       if ((port->mapbase == 0xffe00000) ||
-           (port->mapbase == 0xffe08000)) {
+       if (port->mapbase == 0xffe00000 ||
+           port->mapbase == 0xffe08000)
                /* SCIF0/1*/
-               return SCIF_TXROOM_MAX - (sci_in(port, SCTFDR) & 0xff);
-       } else {
+               return sci_in(port, SCTFDR) & 0xff;
+       else
                /* SCIF2 */
-               return SCIF2_TXROOM_MAX - (sci_in(port, SCFDR) >> 8);
-       }
+               return sci_in(port, SCFDR) >> 8;
  }
  
- static inline int scif_rxroom(struct uart_port *port)
+ static int scif_txroom(struct uart_port *port)
+ {
+       if (port->mapbase == 0xffe00000 ||
+           port->mapbase == 0xffe08000)
+               /* SCIF0/1*/
+               return SCIF_TXROOM_MAX - scif_txfill(port);
+       else
+               /* SCIF2 */
+               return SCIF2_TXROOM_MAX - scif_txfill(port);
+ }
+ static int scif_rxfill(struct uart_port *port)
  {
        if ((port->mapbase == 0xffe00000) ||
            (port->mapbase == 0xffe08000)) {
                return sci_in(port, SCFDR) & SCIF2_RFDC_MASK;
        }
  }
+ #elif defined(CONFIG_ARCH_SH7372)
+ static int scif_txfill(struct uart_port *port)
+ {
+       if (port->type == PORT_SCIFA)
+               return sci_in(port, SCFDR) >> 8;
+       else
+               return sci_in(port, SCTFDR);
+ }
+ static int scif_txroom(struct uart_port *port)
+ {
+       return port->fifosize - scif_txfill(port);
+ }
+ static int scif_rxfill(struct uart_port *port)
+ {
+       if (port->type == PORT_SCIFA)
+               return sci_in(port, SCFDR) & SCIF_RFDC_MASK;
+       else
+               return sci_in(port, SCRFDR);
+ }
  #else
- static inline int scif_txroom(struct uart_port *port)
+ static int scif_txfill(struct uart_port *port)
+ {
+       return sci_in(port, SCFDR) >> 8;
+ }
+ static int scif_txroom(struct uart_port *port)
  {
-       return SCIF_TXROOM_MAX - (sci_in(port, SCFDR) >> 8);
+       return SCIF_TXROOM_MAX - scif_txfill(port);
  }
  
- static inline int scif_rxroom(struct uart_port *port)
+ static int scif_rxfill(struct uart_port *port)
  {
        return sci_in(port, SCFDR) & SCIF_RFDC_MASK;
  }
  #endif
  
- static inline int sci_txroom(struct uart_port *port)
+ static int sci_txfill(struct uart_port *port)
  {
-       return (sci_in(port, SCxSR) & SCI_TDRE) != 0;
+       return !(sci_in(port, SCxSR) & SCI_TDRE);
  }
  
- static inline int sci_rxroom(struct uart_port *port)
+ static int sci_txroom(struct uart_port *port)
+ {
+       return !sci_txfill(port);
+ }
+ static int sci_rxfill(struct uart_port *port)
  {
        return (sci_in(port, SCxSR) & SCxSR_RDxF(port)) != 0;
  }
  
  static void sci_transmit_chars(struct uart_port *port)
  {
-       struct circ_buf *xmit = &port->info->xmit;
+       struct circ_buf *xmit = &port->state->xmit;
        unsigned int stopped = uart_tx_stopped(port);
        unsigned short status;
        unsigned short ctrl;
        if (!(status & SCxSR_TDxE(port))) {
                ctrl = sci_in(port, SCSCR);
                if (uart_circ_empty(xmit))
 -                      ctrl &= ~SCI_CTRL_FLAGS_TIE;
 +                      ctrl &= ~SCSCR_TIE;
                else
 -                      ctrl |= SCI_CTRL_FLAGS_TIE;
 +                      ctrl |= SCSCR_TIE;
                sci_out(port, SCSCR, ctrl);
                return;
        }
                        sci_out(port, SCxSR, SCxSR_TDxE_CLEAR(port));
                }
  
 -              ctrl |= SCI_CTRL_FLAGS_TIE;
 +              ctrl |= SCSCR_TIE;
                sci_out(port, SCSCR, ctrl);
        }
  }
  static inline void sci_receive_chars(struct uart_port *port)
  {
        struct sci_port *sci_port = to_sci_port(port);
-       struct tty_struct *tty = port->info->port.tty;
+       struct tty_struct *tty = port->state->port.tty;
        int i, count, copied = 0;
        unsigned short status;
        unsigned char flag;
  
        while (1) {
                if (port->type == PORT_SCI)
-                       count = sci_rxroom(port);
+                       count = sci_rxfill(port);
                else
-                       count = scif_rxroom(port);
+                       count = scif_rxfill(port);
  
                /* Don't copy more bytes than there is room for in the buffer */
                count = tty_buffer_request_room(tty, count);
                                }
  
                                /* Store data and status */
-                               if (status&SCxSR_FER(port)) {
+                               if (status & SCxSR_FER(port)) {
                                        flag = TTY_FRAME;
                                        dev_notice(port->dev, "frame error\n");
-                               } else if (status&SCxSR_PER(port)) {
+                               } else if (status & SCxSR_PER(port)) {
                                        flag = TTY_PARITY;
                                        dev_notice(port->dev, "parity error\n");
                                } else
@@@ -551,7 -590,7 +598,7 @@@ static inline int sci_handle_errors(str
  {
        int copied = 0;
        unsigned short status = sci_in(port, SCxSR);
-       struct tty_struct *tty = port->info->port.tty;
+       struct tty_struct *tty = port->state->port.tty;
  
        if (status & SCxSR_ORER(port)) {
                /* overrun error */
  
  static inline int sci_handle_fifo_overrun(struct uart_port *port)
  {
-       struct tty_struct *tty = port->info->port.tty;
+       struct tty_struct *tty = port->state->port.tty;
        int copied = 0;
  
        if (port->type != PORT_SCIF)
@@@ -628,7 -667,7 +675,7 @@@ static inline int sci_handle_breaks(str
  {
        int copied = 0;
        unsigned short status = sci_in(port, SCxSR);
-       struct tty_struct *tty = port->info->port.tty;
+       struct tty_struct *tty = port->state->port.tty;
        struct sci_port *s = to_sci_port(port);
  
        if (uart_handle_break(port))
        return copied;
  }
  
- static irqreturn_t sci_rx_interrupt(int irq, void *port)
+ static irqreturn_t sci_rx_interrupt(int irq, void *ptr)
  {
 -                      scr &= ~SCI_CTRL_FLAGS_RIE;
+ #ifdef CONFIG_SERIAL_SH_SCI_DMA
+       struct uart_port *port = ptr;
+       struct sci_port *s = to_sci_port(port);
+       if (s->chan_rx) {
+               u16 scr = sci_in(port, SCSCR);
+               u16 ssr = sci_in(port, SCxSR);
+               /* Disable future Rx interrupts */
+               if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
+                       disable_irq_nosync(irq);
+                       scr |= 0x4000;
+               } else {
++                      scr &= ~SCSCR_RIE;
+               }
+               sci_out(port, SCSCR, scr);
+               /* Clear current interrupt */
+               sci_out(port, SCxSR, ssr & ~(1 | SCxSR_RDxF(port)));
+               dev_dbg(port->dev, "Rx IRQ %lu: setup t-out in %u jiffies\n",
+                       jiffies, s->rx_timeout);
+               mod_timer(&s->rx_timer, jiffies + s->rx_timeout);
+               return IRQ_HANDLED;
+       }
+ #endif
        /* I think sci_receive_chars has to be called irrespective
         * of whether the I_IXOFF is set, otherwise, how is the interrupt
         * to be disabled?
         */
-       sci_receive_chars(port);
+       sci_receive_chars(ptr);
  
        return IRQ_HANDLED;
  }
  static irqreturn_t sci_tx_interrupt(int irq, void *ptr)
  {
        struct uart_port *port = ptr;
+       unsigned long flags;
  
-       spin_lock_irq(&port->lock);
+       spin_lock_irqsave(&port->lock, flags);
        sci_transmit_chars(port);
-       spin_unlock_irq(&port->lock);
+       spin_unlock_irqrestore(&port->lock, flags);
  
        return IRQ_HANDLED;
  }
@@@ -711,32 -777,38 +785,53 @@@ static irqreturn_t sci_br_interrupt(in
        return IRQ_HANDLED;
  }
  
++static inline unsigned long port_rx_irq_mask(struct uart_port *port)
++{
++      /*
++       * Not all ports (such as SCIFA) will support REIE. Rather than
++       * special-casing the port type, we check the port initialization
++       * IRQ enable mask to see whether the IRQ is desired at all. If
++       * it's unset, it's logically inferred that there's no point in
++       * testing for it.
++       */
++      return SCSCR_RIE | (to_sci_port(port)->scscr & SCSR_REIE);
++}
++
  static irqreturn_t sci_mpxed_interrupt(int irq, void *ptr)
  {
-       unsigned short ssr_status, scr_status;
+       unsigned short ssr_status, scr_status, err_enabled;
        struct uart_port *port = ptr;
+       struct sci_port *s = to_sci_port(port);
        irqreturn_t ret = IRQ_NONE;
  
        ssr_status = sci_in(port, SCxSR);
        scr_status = sci_in(port, SCSCR);
 -      err_enabled = scr_status & (SCI_CTRL_FLAGS_REIE | SCI_CTRL_FLAGS_RIE);
++      err_enabled = scr_status & port_rx_irq_mask(port);
  
        /* Tx Interrupt */
-       if ((ssr_status & 0x0020) && (scr_status & SCSCR_TIE))
 -      if ((ssr_status & SCxSR_TDxE(port)) && (scr_status & SCI_CTRL_FLAGS_TIE) &&
++      if ((ssr_status & SCxSR_TDxE(port)) && (scr_status & SCSCR_TIE) &&
+           !s->chan_tx)
                ret = sci_tx_interrupt(irq, ptr);
-       /* Rx Interrupt */
-       if ((ssr_status & 0x0002) && (scr_status & SCSCR_RIE))
++
+       /*
+        * Rx Interrupt: if we're using DMA, the DMA controller clears RDF /
+        * DR flags
+        */
+       if (((ssr_status & SCxSR_RDxF(port)) || s->chan_rx) &&
 -          (scr_status & SCI_CTRL_FLAGS_RIE))
++          (scr_status & SCSCR_RIE))
                ret = sci_rx_interrupt(irq, ptr);
++
        /* Error Interrupt */
-       if ((ssr_status & 0x0080) && (scr_status & SCSCR_REIE))
+       if ((ssr_status & SCxSR_ERRORS(port)) && err_enabled)
                ret = sci_er_interrupt(irq, ptr);
++
        /* Break Interrupt */
-       if ((ssr_status & 0x0010) && (scr_status & SCSCR_REIE))
+       if ((ssr_status & SCxSR_BRK(port)) && err_enabled)
                ret = sci_br_interrupt(irq, ptr);
  
        return ret;
  }
  
- #ifdef CONFIG_HAVE_CLK
  /*
   * Here we define a transistion notifier so that we can update all of our
   * ports' baud rate when the peripheral clock changes.
@@@ -753,8 -825,7 +848,7 @@@ static int sci_notifier(struct notifier
            (phase == CPUFREQ_RESUMECHANGE)) {
                spin_lock_irqsave(&priv->lock, flags);
                list_for_each_entry(sci_port, &priv->ports, node)
-                       sci_port->port.uartclk = clk_get_rate(sci_port->dclk);
+                       sci_port->port.uartclk = clk_get_rate(sci_port->iclk);
                spin_unlock_irqrestore(&priv->lock, flags);
        }
  
@@@ -765,23 -836,18 +859,18 @@@ static void sci_clk_enable(struct uart_
  {
        struct sci_port *sci_port = to_sci_port(port);
  
-       clk_enable(sci_port->dclk);
-       sci_port->port.uartclk = clk_get_rate(sci_port->dclk);
-       if (sci_port->iclk)
-               clk_enable(sci_port->iclk);
+       clk_enable(sci_port->iclk);
+       sci_port->port.uartclk = clk_get_rate(sci_port->iclk);
+       clk_enable(sci_port->fclk);
  }
  
  static void sci_clk_disable(struct uart_port *port)
  {
        struct sci_port *sci_port = to_sci_port(port);
  
-       if (sci_port->iclk)
-               clk_disable(sci_port->iclk);
-       clk_disable(sci_port->dclk);
+       clk_disable(sci_port->fclk);
+       clk_disable(sci_port->iclk);
  }
- #endif
  
  static int sci_request_irq(struct sci_port *port)
  {
@@@ -836,8 -902,10 +925,10 @@@ static void sci_free_irq(struct sci_por
  
  static unsigned int sci_tx_empty(struct uart_port *port)
  {
-       /* Can't detect */
-       return TIOCSER_TEMT;
+       unsigned short status = sci_in(port, SCxSR);
+       unsigned short in_tx_fifo = scif_txfill(port);
+       return (status & SCxSR_TEND(port)) && !in_tx_fifo ? TIOCSER_TEMT : 0;
  }
  
  static void sci_set_mctrl(struct uart_port *port, unsigned int mctrl)
  
  static unsigned int sci_get_mctrl(struct uart_port *port)
  {
-       /* This routine is used for geting signals of: DTR, DCD, DSR, RI,
+       /* This routine is used for getting signals of: DTR, DCD, DSR, RI,
           and CTS/RTS */
  
        return TIOCM_DTR | TIOCM_RTS | TIOCM_DSR;
  }
  
 -              sci_out(port, SCSCR, ctrl & ~SCI_CTRL_FLAGS_TIE);
+ #ifdef CONFIG_SERIAL_SH_SCI_DMA
+ static void sci_dma_tx_complete(void *arg)
+ {
+       struct sci_port *s = arg;
+       struct uart_port *port = &s->port;
+       struct circ_buf *xmit = &port->state->xmit;
+       unsigned long flags;
+       dev_dbg(port->dev, "%s(%d)\n", __func__, port->line);
+       spin_lock_irqsave(&port->lock, flags);
+       xmit->tail += sg_dma_len(&s->sg_tx);
+       xmit->tail &= UART_XMIT_SIZE - 1;
+       port->icount.tx += sg_dma_len(&s->sg_tx);
+       async_tx_ack(s->desc_tx);
+       s->cookie_tx = -EINVAL;
+       s->desc_tx = NULL;
+       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+               uart_write_wakeup(port);
+       if (!uart_circ_empty(xmit)) {
+               schedule_work(&s->work_tx);
+       } else if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
+               u16 ctrl = sci_in(port, SCSCR);
++              sci_out(port, SCSCR, ctrl & ~SCSCR_TIE);
+       }
+       spin_unlock_irqrestore(&port->lock, flags);
+ }
+ /* Locking: called with port lock held */
+ static int sci_dma_rx_push(struct sci_port *s, struct tty_struct *tty,
+                          size_t count)
+ {
+       struct uart_port *port = &s->port;
+       int i, active, room;
+       room = tty_buffer_request_room(tty, count);
+       if (s->active_rx == s->cookie_rx[0]) {
+               active = 0;
+       } else if (s->active_rx == s->cookie_rx[1]) {
+               active = 1;
+       } else {
+               dev_err(port->dev, "cookie %d not found!\n", s->active_rx);
+               return 0;
+       }
+       if (room < count)
+               dev_warn(port->dev, "Rx overrun: dropping %u bytes\n",
+                        count - room);
+       if (!room)
+               return room;
+       for (i = 0; i < room; i++)
+               tty_insert_flip_char(tty, ((u8 *)sg_virt(&s->sg_rx[active]))[i],
+                                    TTY_NORMAL);
+       port->icount.rx += room;
+       return room;
+ }
+ static void sci_dma_rx_complete(void *arg)
+ {
+       struct sci_port *s = arg;
+       struct uart_port *port = &s->port;
+       struct tty_struct *tty = port->state->port.tty;
+       unsigned long flags;
+       int count;
+       dev_dbg(port->dev, "%s(%d) active #%d\n", __func__, port->line, s->active_rx);
+       spin_lock_irqsave(&port->lock, flags);
+       count = sci_dma_rx_push(s, tty, s->buf_len_rx);
+       mod_timer(&s->rx_timer, jiffies + s->rx_timeout);
+       spin_unlock_irqrestore(&port->lock, flags);
+       if (count)
+               tty_flip_buffer_push(tty);
+       schedule_work(&s->work_rx);
+ }
+ static void sci_start_rx(struct uart_port *port);
+ static void sci_start_tx(struct uart_port *port);
+ static void sci_rx_dma_release(struct sci_port *s, bool enable_pio)
+ {
+       struct dma_chan *chan = s->chan_rx;
+       struct uart_port *port = &s->port;
+       s->chan_rx = NULL;
+       s->cookie_rx[0] = s->cookie_rx[1] = -EINVAL;
+       dma_release_channel(chan);
+       if (sg_dma_address(&s->sg_rx[0]))
+               dma_free_coherent(port->dev, s->buf_len_rx * 2,
+                                 sg_virt(&s->sg_rx[0]), sg_dma_address(&s->sg_rx[0]));
+       if (enable_pio)
+               sci_start_rx(port);
+ }
+ static void sci_tx_dma_release(struct sci_port *s, bool enable_pio)
+ {
+       struct dma_chan *chan = s->chan_tx;
+       struct uart_port *port = &s->port;
+       s->chan_tx = NULL;
+       s->cookie_tx = -EINVAL;
+       dma_release_channel(chan);
+       if (enable_pio)
+               sci_start_tx(port);
+ }
+ static void sci_submit_rx(struct sci_port *s)
+ {
+       struct dma_chan *chan = s->chan_rx;
+       int i;
+       for (i = 0; i < 2; i++) {
+               struct scatterlist *sg = &s->sg_rx[i];
+               struct dma_async_tx_descriptor *desc;
+               desc = chan->device->device_prep_slave_sg(chan,
+                       sg, 1, DMA_FROM_DEVICE, DMA_PREP_INTERRUPT);
+               if (desc) {
+                       s->desc_rx[i] = desc;
+                       desc->callback = sci_dma_rx_complete;
+                       desc->callback_param = s;
+                       s->cookie_rx[i] = desc->tx_submit(desc);
+               }
+               if (!desc || s->cookie_rx[i] < 0) {
+                       if (i) {
+                               async_tx_ack(s->desc_rx[0]);
+                               s->cookie_rx[0] = -EINVAL;
+                       }
+                       if (desc) {
+                               async_tx_ack(desc);
+                               s->cookie_rx[i] = -EINVAL;
+                       }
+                       dev_warn(s->port.dev,
+                                "failed to re-start DMA, using PIO\n");
+                       sci_rx_dma_release(s, true);
+                       return;
+               }
+               dev_dbg(s->port.dev, "%s(): cookie %d to #%d\n", __func__,
+                       s->cookie_rx[i], i);
+       }
+       s->active_rx = s->cookie_rx[0];
+       dma_async_issue_pending(chan);
+ }
+ static void work_fn_rx(struct work_struct *work)
+ {
+       struct sci_port *s = container_of(work, struct sci_port, work_rx);
+       struct uart_port *port = &s->port;
+       struct dma_async_tx_descriptor *desc;
+       int new;
+       if (s->active_rx == s->cookie_rx[0]) {
+               new = 0;
+       } else if (s->active_rx == s->cookie_rx[1]) {
+               new = 1;
+       } else {
+               dev_err(port->dev, "cookie %d not found!\n", s->active_rx);
+               return;
+       }
+       desc = s->desc_rx[new];
+       if (dma_async_is_tx_complete(s->chan_rx, s->active_rx, NULL, NULL) !=
+           DMA_SUCCESS) {
+               /* Handle incomplete DMA receive */
+               struct tty_struct *tty = port->state->port.tty;
+               struct dma_chan *chan = s->chan_rx;
+               struct sh_desc *sh_desc = container_of(desc, struct sh_desc,
+                                                      async_tx);
+               unsigned long flags;
+               int count;
+               chan->device->device_control(chan, DMA_TERMINATE_ALL, 0);
+               dev_dbg(port->dev, "Read %u bytes with cookie %d\n",
+                       sh_desc->partial, sh_desc->cookie);
+               spin_lock_irqsave(&port->lock, flags);
+               count = sci_dma_rx_push(s, tty, sh_desc->partial);
+               spin_unlock_irqrestore(&port->lock, flags);
+               if (count)
+                       tty_flip_buffer_push(tty);
+               sci_submit_rx(s);
+               return;
+       }
+       s->cookie_rx[new] = desc->tx_submit(desc);
+       if (s->cookie_rx[new] < 0) {
+               dev_warn(port->dev, "Failed submitting Rx DMA descriptor\n");
+               sci_rx_dma_release(s, true);
+               return;
+       }
+       s->active_rx = s->cookie_rx[!new];
+       dev_dbg(port->dev, "%s: cookie %d #%d, new active #%d\n", __func__,
+               s->cookie_rx[new], new, s->active_rx);
+ }
+ static void work_fn_tx(struct work_struct *work)
+ {
+       struct sci_port *s = container_of(work, struct sci_port, work_tx);
+       struct dma_async_tx_descriptor *desc;
+       struct dma_chan *chan = s->chan_tx;
+       struct uart_port *port = &s->port;
+       struct circ_buf *xmit = &port->state->xmit;
+       struct scatterlist *sg = &s->sg_tx;
+       /*
+        * DMA is idle now.
+        * Port xmit buffer is already mapped, and it is one page... Just adjust
+        * offsets and lengths. Since it is a circular buffer, we have to
+        * transmit till the end, and then the rest. Take the port lock to get a
+        * consistent xmit buffer state.
+        */
+       spin_lock_irq(&port->lock);
+       sg->offset = xmit->tail & (UART_XMIT_SIZE - 1);
+       sg_dma_address(sg) = (sg_dma_address(sg) & ~(UART_XMIT_SIZE - 1)) +
+               sg->offset;
+       sg_dma_len(sg) = min((int)CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE),
+               CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE));
+       spin_unlock_irq(&port->lock);
+       BUG_ON(!sg_dma_len(sg));
+       desc = chan->device->device_prep_slave_sg(chan,
+                       sg, s->sg_len_tx, DMA_TO_DEVICE,
+                       DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
+       if (!desc) {
+               /* switch to PIO */
+               sci_tx_dma_release(s, true);
+               return;
+       }
+       dma_sync_sg_for_device(port->dev, sg, 1, DMA_TO_DEVICE);
+       spin_lock_irq(&port->lock);
+       s->desc_tx = desc;
+       desc->callback = sci_dma_tx_complete;
+       desc->callback_param = s;
+       spin_unlock_irq(&port->lock);
+       s->cookie_tx = desc->tx_submit(desc);
+       if (s->cookie_tx < 0) {
+               dev_warn(port->dev, "Failed submitting Tx DMA descriptor\n");
+               /* switch to PIO */
+               sci_tx_dma_release(s, true);
+               return;
+       }
+       dev_dbg(port->dev, "%s: %p: %d...%d, cookie %d\n", __func__,
+               xmit->buf, xmit->tail, xmit->head, s->cookie_tx);
+       dma_async_issue_pending(chan);
+ }
+ #endif
  static void sci_start_tx(struct uart_port *port)
  {
+       struct sci_port *s = to_sci_port(port);
        unsigned short ctrl;
  
-       /* Set TIE (Transmit Interrupt Enable) bit in SCSCR */
-       ctrl = sci_in(port, SCSCR);
-       ctrl |= SCSCR_TIE;
-       sci_out(port, SCSCR, ctrl);
+ #ifdef CONFIG_SERIAL_SH_SCI_DMA
+       if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
+               u16 new, scr = sci_in(port, SCSCR);
+               if (s->chan_tx)
+                       new = scr | 0x8000;
+               else
+                       new = scr & ~0x8000;
+               if (new != scr)
+                       sci_out(port, SCSCR, new);
+       }
++
+       if (s->chan_tx && !uart_circ_empty(&s->port.state->xmit) &&
+           s->cookie_tx < 0)
+               schedule_work(&s->work_tx);
+ #endif
++
+       if (!s->chan_tx || port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
+               /* Set TIE (Transmit Interrupt Enable) bit in SCSCR */
+               ctrl = sci_in(port, SCSCR);
 -              sci_out(port, SCSCR, ctrl | SCI_CTRL_FLAGS_TIE);
++              sci_out(port, SCSCR, ctrl | SCSCR_TIE);
+       }
  }
  
  static void sci_stop_tx(struct uart_port *port)
  
        /* Clear TIE (Transmit Interrupt Enable) bit in SCSCR */
        ctrl = sci_in(port, SCSCR);
 -      ctrl &= ~SCI_CTRL_FLAGS_TIE;
++
+       if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
+               ctrl &= ~0x8000;
++
 +      ctrl &= ~SCSCR_TIE;
++
        sci_out(port, SCSCR, ctrl);
  }
  
- static void sci_start_rx(struct uart_port *port, unsigned int tty_start)
+ static void sci_start_rx(struct uart_port *port)
  {
 -      unsigned short ctrl = SCI_CTRL_FLAGS_RIE | SCI_CTRL_FLAGS_REIE;
 +      unsigned short ctrl;
 +
-       /* Set RIE (Receive Interrupt Enable) bit in SCSCR */
-       ctrl = sci_in(port, SCSCR);
-       ctrl |= SCSCR_RIE | SCSCR_REIE;
++      ctrl = sci_in(port, SCSCR) | port_rx_irq_mask(port);
 -      /* Set RIE (Receive Interrupt Enable) bit in SCSCR */
 -      ctrl |= sci_in(port, SCSCR);
+       if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
+               ctrl &= ~0x4000;
++
        sci_out(port, SCSCR, ctrl);
  }
  
@@@ -889,9 -1252,11 +1281,13 @@@ static void sci_stop_rx(struct uart_por
  {
        unsigned short ctrl;
  
--      /* Clear RIE (Receive Interrupt Enable) bit in SCSCR */
        ctrl = sci_in(port, SCSCR);
-       ctrl &= ~(SCSCR_RIE | SCSCR_REIE);
++
+       if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
+               ctrl &= ~0x4000;
 -      ctrl &= ~(SCI_CTRL_FLAGS_RIE | SCI_CTRL_FLAGS_REIE);
++
++      ctrl &= ~port_rx_irq_mask(port);
++
        sci_out(port, SCSCR, ctrl);
  }
  
@@@ -905,16 -1270,157 +1301,157 @@@ static void sci_break_ctl(struct uart_p
        /* Nothing here yet .. */
  }
  
 -      sci_out(port, SCSCR, scr | SCI_CTRL_FLAGS_RIE);
+ #ifdef CONFIG_SERIAL_SH_SCI_DMA
+ static bool filter(struct dma_chan *chan, void *slave)
+ {
+       struct sh_dmae_slave *param = slave;
+       dev_dbg(chan->device->dev, "%s: slave ID %d\n", __func__,
+               param->slave_id);
+       if (param->dma_dev == chan->device->dev) {
+               chan->private = param;
+               return true;
+       } else {
+               return false;
+       }
+ }
+ static void rx_timer_fn(unsigned long arg)
+ {
+       struct sci_port *s = (struct sci_port *)arg;
+       struct uart_port *port = &s->port;
+       u16 scr = sci_in(port, SCSCR);
+       if (port->type == PORT_SCIFA || port->type == PORT_SCIFB) {
+               scr &= ~0x4000;
+               enable_irq(s->irqs[1]);
+       }
++      sci_out(port, SCSCR, scr | SCSCR_RIE);
+       dev_dbg(port->dev, "DMA Rx timed out\n");
+       schedule_work(&s->work_rx);
+ }
+ static void sci_request_dma(struct uart_port *port)
+ {
+       struct sci_port *s = to_sci_port(port);
+       struct sh_dmae_slave *param;
+       struct dma_chan *chan;
+       dma_cap_mask_t mask;
+       int nent;
+       dev_dbg(port->dev, "%s: port %d DMA %p\n", __func__,
+               port->line, s->dma_dev);
+       if (!s->dma_dev)
+               return;
+       dma_cap_zero(mask);
+       dma_cap_set(DMA_SLAVE, mask);
+       param = &s->param_tx;
+       /* Slave ID, e.g., SHDMA_SLAVE_SCIF0_TX */
+       param->slave_id = s->slave_tx;
+       param->dma_dev = s->dma_dev;
+       s->cookie_tx = -EINVAL;
+       chan = dma_request_channel(mask, filter, param);
+       dev_dbg(port->dev, "%s: TX: got channel %p\n", __func__, chan);
+       if (chan) {
+               s->chan_tx = chan;
+               sg_init_table(&s->sg_tx, 1);
+               /* UART circular tx buffer is an aligned page. */
+               BUG_ON((int)port->state->xmit.buf & ~PAGE_MASK);
+               sg_set_page(&s->sg_tx, virt_to_page(port->state->xmit.buf),
+                           UART_XMIT_SIZE, (int)port->state->xmit.buf & ~PAGE_MASK);
+               nent = dma_map_sg(port->dev, &s->sg_tx, 1, DMA_TO_DEVICE);
+               if (!nent)
+                       sci_tx_dma_release(s, false);
+               else
+                       dev_dbg(port->dev, "%s: mapped %d@%p to %x\n", __func__,
+                               sg_dma_len(&s->sg_tx),
+                               port->state->xmit.buf, sg_dma_address(&s->sg_tx));
+               s->sg_len_tx = nent;
+               INIT_WORK(&s->work_tx, work_fn_tx);
+       }
+       param = &s->param_rx;
+       /* Slave ID, e.g., SHDMA_SLAVE_SCIF0_RX */
+       param->slave_id = s->slave_rx;
+       param->dma_dev = s->dma_dev;
+       chan = dma_request_channel(mask, filter, param);
+       dev_dbg(port->dev, "%s: RX: got channel %p\n", __func__, chan);
+       if (chan) {
+               dma_addr_t dma[2];
+               void *buf[2];
+               int i;
+               s->chan_rx = chan;
+               s->buf_len_rx = 2 * max(16, (int)port->fifosize);
+               buf[0] = dma_alloc_coherent(port->dev, s->buf_len_rx * 2,
+                                           &dma[0], GFP_KERNEL);
+               if (!buf[0]) {
+                       dev_warn(port->dev,
+                                "failed to allocate dma buffer, using PIO\n");
+                       sci_rx_dma_release(s, true);
+                       return;
+               }
+               buf[1] = buf[0] + s->buf_len_rx;
+               dma[1] = dma[0] + s->buf_len_rx;
+               for (i = 0; i < 2; i++) {
+                       struct scatterlist *sg = &s->sg_rx[i];
+                       sg_init_table(sg, 1);
+                       sg_set_page(sg, virt_to_page(buf[i]), s->buf_len_rx,
+                                   (int)buf[i] & ~PAGE_MASK);
+                       sg_dma_address(sg) = dma[i];
+               }
+               INIT_WORK(&s->work_rx, work_fn_rx);
+               setup_timer(&s->rx_timer, rx_timer_fn, (unsigned long)s);
+               sci_submit_rx(s);
+       }
+ }
+ static void sci_free_dma(struct uart_port *port)
+ {
+       struct sci_port *s = to_sci_port(port);
+       if (!s->dma_dev)
+               return;
+       if (s->chan_tx)
+               sci_tx_dma_release(s, false);
+       if (s->chan_rx)
+               sci_rx_dma_release(s, false);
+ }
+ #endif
  static int sci_startup(struct uart_port *port)
  {
        struct sci_port *s = to_sci_port(port);
  
+       dev_dbg(port->dev, "%s(%d)\n", __func__, port->line);
        if (s->enable)
                s->enable(port);
  
        sci_request_irq(s);
+ #ifdef CONFIG_SERIAL_SH_SCI_DMA
+       sci_request_dma(port);
+ #endif
        sci_start_tx(port);
-       sci_start_rx(port, 1);
+       sci_start_rx(port);
  
        return 0;
  }
@@@ -923,45 -1429,42 +1460,61 @@@ static void sci_shutdown(struct uart_po
  {
        struct sci_port *s = to_sci_port(port);
  
+       dev_dbg(port->dev, "%s(%d)\n", __func__, port->line);
        sci_stop_rx(port);
        sci_stop_tx(port);
+ #ifdef CONFIG_SERIAL_SH_SCI_DMA
+       sci_free_dma(port);
+ #endif
        sci_free_irq(s);
  
        if (s->disable)
                s->disable(port);
  }
  
 +static unsigned int sci_scbrr_calc(unsigned int algo_id, unsigned int bps,
 +                                 unsigned long freq)
 +{
 +      switch (algo_id) {
 +      case SCBRR_ALGO_1:
 +              return ((freq + 16 * bps) / (16 * bps) - 1);
 +      case SCBRR_ALGO_2:
 +              return ((freq + 16 * bps) / (32 * bps) - 1);
 +      case SCBRR_ALGO_3:
 +              return (((freq * 2) + 16 * bps) / (16 * bps) - 1);
 +      case SCBRR_ALGO_4:
 +              return (((freq * 2) + 16 * bps) / (32 * bps) - 1);
 +      case SCBRR_ALGO_5:
 +              return (((freq * 1000 / 32) / bps) - 1);
 +      }
 +
 +      /* Warn, but use a safe default */
 +      WARN_ON(1);
 +      return ((freq + 16 * bps) / (32 * bps) - 1);
 +}
 +
  static void sci_set_termios(struct uart_port *port, struct ktermios *termios,
                            struct ktermios *old)
  {
 -#ifdef CONFIG_SERIAL_SH_SCI_DMA
        struct sci_port *s = to_sci_port(port);
-       unsigned int status, baud, smr_val;
 -#endif
+       unsigned int status, baud, smr_val, max_baud;
        int t = -1;
+       u16 scfcr = 0;
+       /*
+        * earlyprintk comes here early on with port->uartclk set to zero.
+        * the clock framework is not up and running at this point so here
+        * we assume that 115200 is the maximum baud rate. please note that
+        * the baud rate is not programmed during earlyprintk - it is assumed
+        * that the previous boot loader has enabled required clocks and
+        * setup the baud rate generator hardware for us already.
+        */
+       max_baud = port->uartclk ? port->uartclk / 16 : 115200;
  
-       baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk/16);
-       if (likely(baud))
+       baud = uart_get_baud_rate(port, termios, old, 0, max_baud);
+       if (likely(baud && port->uartclk))
 -              t = SCBRR_VALUE(baud, port->uartclk);
 +              t = sci_scbrr_calc(s->scbrr_algo_id, baud, port->uartclk);
  
        do {
                status = sci_in(port, SCxSR);
        sci_out(port, SCSCR, 0x00);     /* TE=0, RE=0, CKE1=0 */
  
        if (port->type != PORT_SCI)
-               sci_out(port, SCFCR, SCFCR_RFRST | SCFCR_TFRST);
+               sci_out(port, SCFCR, scfcr | SCFCR_RFRST | SCFCR_TFRST);
  
        smr_val = sci_in(port, SCSMR) & 3;
        if ((termios->c_cflag & CSIZE) == CS7)
  
        sci_out(port, SCSMR, smr_val);
  
+       dev_dbg(port->dev, "%s: SMR %x, t %x, SCSCR %x\n", __func__, smr_val, t,
+               SCSCR_INIT(port));
        if (t > 0) {
                if (t >= 256) {
                        sci_out(port, SCSMR, (sci_in(port, SCSMR) & ~3) | 1);
        }
  
        sci_init_pins(port, termios->c_cflag);
-       sci_out(port, SCFCR, (termios->c_cflag & CRTSCTS) ? SCFCR_MCE : 0);
+       sci_out(port, SCFCR, scfcr | ((termios->c_cflag & CRTSCTS) ? SCFCR_MCE : 0));
  
 -      sci_out(port, SCSCR, SCSCR_INIT(port));
 +      sci_out(port, SCSCR, s->scscr);
  
+ #ifdef CONFIG_SERIAL_SH_SCI_DMA
+       /*
+        * Calculate delay for 1.5 DMA buffers: see
+        * drivers/serial/serial_core.c::uart_update_timeout(). With 10 bits
+        * (CS8), 250Hz, 115200 baud and 64 bytes FIFO, the above function
+        * calculates 1 jiffie for the data plus 5 jiffies for the "slop(e)."
+        * Then below we calculate 3 jiffies (12ms) for 1.5 DMA buffers (3 FIFO
+        * sizes), but it has been found out experimentally, that this is not
+        * enough: the driver too often needlessly runs on a DMA timeout. 20ms
+        * as a minimum seem to work perfectly.
+        */
+       if (s->chan_rx) {
+               s->rx_timeout = (port->timeout - HZ / 50) * s->buf_len_rx * 3 /
+                       port->fifosize / 2;
+               dev_dbg(port->dev,
+                       "DMA Rx t-out %ums, tty t-out %u jiffies\n",
+                       s->rx_timeout * 1000 / HZ, port->timeout);
+               if (s->rx_timeout < msecs_to_jiffies(20))
+                       s->rx_timeout = msecs_to_jiffies(20);
+       }
+ #endif
        if ((termios->c_cflag & CREAD) != 0)
-               sci_start_rx(port, 0);
+               sci_start_rx(port);
  }
  
  static const char *sci_type(struct uart_port *port)
                return "scif";
        case PORT_SCIFA:
                return "scifa";
+       case PORT_SCIFB:
+               return "scifb";
        }
  
        return NULL;
@@@ -1093,45 -1623,77 +1673,79 @@@ static struct uart_ops sci_uart_ops = 
  #endif
  };
  
- static void __devinit sci_init_single(struct platform_device *dev,
-                                     struct sci_port *sci_port,
-                                     unsigned int index,
-                                     struct plat_sci_port *p)
+ static int __devinit sci_init_single(struct platform_device *dev,
+                                    struct sci_port *sci_port,
+                                    unsigned int index,
+                                    struct plat_sci_port *p)
  {
-       sci_port->port.ops      = &sci_uart_ops;
-       sci_port->port.iotype   = UPIO_MEM;
-       sci_port->port.line     = index;
-       sci_port->port.fifosize = 1;
+       struct uart_port *port = &sci_port->port;
  
- #if defined(__H8300H__) || defined(__H8300S__)
- #ifdef __H8300S__
-       sci_port->enable        = h8300_sci_enable;
-       sci_port->disable       = h8300_sci_disable;
- #endif
-       sci_port->port.uartclk  = CONFIG_CPU_CLOCK;
- #elif defined(CONFIG_HAVE_CLK)
-       sci_port->iclk          = p->clk ? clk_get(&dev->dev, p->clk) : NULL;
-       sci_port->dclk          = clk_get(&dev->dev, "peripheral_clk");
-       sci_port->enable        = sci_clk_enable;
-       sci_port->disable       = sci_clk_disable;
- #else
- #error "Need a valid uartclk"
- #endif
+       port->ops       = &sci_uart_ops;
+       port->iotype    = UPIO_MEM;
+       port->line      = index;
+       switch (p->type) {
+       case PORT_SCIFB:
+               port->fifosize = 256;
+               break;
+       case PORT_SCIFA:
+               port->fifosize = 64;
+               break;
+       case PORT_SCIF:
+               port->fifosize = 16;
+               break;
+       default:
+               port->fifosize = 1;
+               break;
+       }
+       if (dev) {
+               sci_port->iclk = clk_get(&dev->dev, "sci_ick");
+               if (IS_ERR(sci_port->iclk)) {
+                       sci_port->iclk = clk_get(&dev->dev, "peripheral_clk");
+                       if (IS_ERR(sci_port->iclk)) {
+                               dev_err(&dev->dev, "can't get iclk\n");
+                               return PTR_ERR(sci_port->iclk);
+                       }
+               }
+               /*
+                * The function clock is optional, ignore it if we can't
+                * find it.
+                */
+               sci_port->fclk = clk_get(&dev->dev, "sci_fck");
+               if (IS_ERR(sci_port->fclk))
+                       sci_port->fclk = NULL;
+               sci_port->enable = sci_clk_enable;
+               sci_port->disable = sci_clk_disable;
+               port->dev = &dev->dev;
+       }
  
        sci_port->break_timer.data = (unsigned long)sci_port;
        sci_port->break_timer.function = sci_break_timer;
        init_timer(&sci_port->break_timer);
  
-       sci_port->port.mapbase  = p->mapbase;
-       sci_port->port.membase  = p->membase;
+       port->mapbase   = p->mapbase;
+       port->membase   = p->membase;
  
 -      port->irq       = p->irqs[SCIx_TXI_IRQ];
 -      port->flags     = p->flags;
 -      sci_port->type  = port->type = p->type;
++      port->irq               = p->irqs[SCIx_TXI_IRQ];
++      port->flags             = p->flags;
++      sci_port->type          = port->type = p->type;
 +      sci_port->scscr         = p->scscr;
-       sci_port->port.irq      = p->irqs[SCIx_TXI_IRQ];
-       sci_port->port.flags    = p->flags;
-       sci_port->port.dev      = &dev->dev;
-       sci_port->type          = sci_port->port.type = p->type;
++      sci_port->scbrr_algo_id = p->scbrr_algo_id;
+ #ifdef CONFIG_SERIAL_SH_SCI_DMA
+       sci_port->dma_dev       = p->dma_dev;
+       sci_port->slave_tx      = p->dma_slave_tx;
+       sci_port->slave_rx      = p->dma_slave_rx;
+       dev_dbg(port->dev, "%s: DMA device %p, tx %d, rx %d\n", __func__,
+               p->dma_dev, p->dma_slave_tx, p->dma_slave_rx);
+ #endif
  
        memcpy(&sci_port->irqs, &p->irqs, sizeof(p->irqs));
+       return 0;
  }
  
  #ifdef CONFIG_SERIAL_SH_SCI_CONSOLE
@@@ -1168,11 -1730,11 +1782,11 @@@ static void serial_console_write(struc
        while ((sci_in(port, SCxSR) & bits) != bits)
                cpu_relax();
  
-       if (sci_port->disable);
+       if (sci_port->disable)
                sci_port->disable(port);
  }
  
- static int __init serial_console_setup(struct console *co, char *options)
+ static int __devinit serial_console_setup(struct console *co, char *options)
  {
        struct sci_port *sci_port;
        struct uart_port *port;
        if (co->index >= SCI_NPORTS)
                co->index = 0;
  
-       sci_port = &sci_ports[co->index];
-       port = &sci_port->port;
-       co->data = port;
+       if (co->data) {
+               port = co->data;
+               sci_port = to_sci_port(port);
+       } else {
+               sci_port = &sci_ports[co->index];
+               port = &sci_port->port;
+               co->data = port;
+       }
  
        /*
         * Also need to check port->type, we don't actually have any
@@@ -1236,6 -1803,15 +1855,15 @@@ static int __init sci_console_init(void
        return 0;
  }
  console_initcall(sci_console_init);
+ static struct sci_port early_serial_port;
+ static struct console early_serial_console = {
+       .name           = "early_ttySC",
+       .write          = serial_console_write,
+       .flags          = CON_PRINTBUFFER,
+ };
+ static char early_serial_buf[32];
  #endif /* CONFIG_SERIAL_SH_SCI_CONSOLE */
  
  #if defined(CONFIG_SERIAL_SH_SCI_CONSOLE)
@@@ -1264,14 -1840,14 +1892,14 @@@ static int sci_remove(struct platform_d
        struct sci_port *p;
        unsigned long flags;
  
- #ifdef CONFIG_HAVE_CLK
        cpufreq_unregister_notifier(&priv->clk_nb, CPUFREQ_TRANSITION_NOTIFIER);
- #endif
  
        spin_lock_irqsave(&priv->lock, flags);
-       list_for_each_entry(p, &priv->ports, node)
+       list_for_each_entry(p, &priv->ports, node) {
                uart_remove_one_port(&sci_uart_driver, &p->port);
+               clk_put(p->iclk);
+               clk_put(p->fclk);
+       }
        spin_unlock_irqrestore(&priv->lock, flags);
  
        kfree(priv);
@@@ -1297,7 -1873,9 +1925,9 @@@ static int __devinit sci_probe_single(s
                return 0;
        }
  
-       sci_init_single(dev, sciport, index, p);
+       ret = sci_init_single(dev, sciport, index, p);
+       if (ret)
+               return ret;
  
        ret = uart_add_one_port(&sci_uart_driver, &sciport->port);
        if (ret)
@@@ -1324,6 -1902,21 +1954,21 @@@ static int __devinit sci_probe(struct p
        struct sh_sci_priv *priv;
        int i, ret = -EINVAL;
  
+ #ifdef CONFIG_SERIAL_SH_SCI_CONSOLE
+       if (is_early_platform_device(dev)) {
+               if (dev->id == -1)
+                       return -ENOTSUPP;
+               early_serial_console.index = dev->id;
+               early_serial_console.data = &early_serial_port.port;
+               sci_init_single(NULL, &early_serial_port, dev->id, p);
+               serial_console_setup(&early_serial_console, early_serial_buf);
+               if (!strstr(early_serial_buf, "keep"))
+                       early_serial_console.flags |= CON_BOOT;
+               register_console(&early_serial_console);
+               return 0;
+       }
+ #endif
        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
        if (!priv)
                return -ENOMEM;
        spin_lock_init(&priv->lock);
        platform_set_drvdata(dev, priv);
  
- #ifdef CONFIG_HAVE_CLK
        priv->clk_nb.notifier_call = sci_notifier;
        cpufreq_register_notifier(&priv->clk_nb, CPUFREQ_TRANSITION_NOTIFIER);
- #endif
  
        if (dev->id != -1) {
                ret = sci_probe_single(dev, dev->id, p, &sci_ports[dev->id]);
@@@ -1388,14 -1979,14 +2031,14 @@@ static int sci_resume(struct device *de
        return 0;
  }
  
- static struct dev_pm_ops sci_dev_pm_ops = {
+ static const struct dev_pm_ops sci_dev_pm_ops = {
        .suspend        = sci_suspend,
        .resume         = sci_resume,
  };
  
  static struct platform_driver sci_driver = {
        .probe          = sci_probe,
-       .remove         = __devexit_p(sci_remove),
+       .remove         = sci_remove,
        .driver         = {
                .name   = "sh-sci",
                .owner  = THIS_MODULE,
@@@ -1425,6 -2016,10 +2068,10 @@@ static void __exit sci_exit(void
        uart_unregister_driver(&sci_uart_driver);
  }
  
+ #ifdef CONFIG_SERIAL_SH_SCI_CONSOLE
+ early_platform_init_buffer("earlyprintk", &sci_driver,
+                          early_serial_buf, ARRAY_SIZE(early_serial_buf));
+ #endif
  module_init(sci_init);
  module_exit(sci_exit);
  
diff --combined drivers/serial/sh-sci.h
@@@ -1,5 -1,5 +1,5 @@@
  #include <linux/serial_core.h>
- #include <asm/io.h>
+ #include <linux/io.h>
  #include <linux/gpio.h>
  
  #if defined(CONFIG_H83007) || defined(CONFIG_H83068)
      defined(CONFIG_CPU_SUBTYPE_SH7709)
  # define SCPCR  0xA4000116 /* 16 bit SCI and SCIF */
  # define SCPDR  0xA4000136 /* 8  bit SCI and SCIF */
 -# define SCSCR_INIT(port)          0x30 /* TIE=0,RIE=0,TE=1,RE=1 */
  #elif defined(CONFIG_CPU_SUBTYPE_SH7705)
  # define SCIF0                0xA4400000
  # define SCIF2                0xA4410000
 -# define SCSMR_Ir     0xA44A0000
 -# define IRDA_SCIF    SCIF0
  # define SCPCR 0xA4000116
  # define SCPDR 0xA4000136
 -
 -/* Set the clock source,
 - * SCIF2 (0xA4410000) -> External clock, SCK pin used as clock input
 - * SCIF0 (0xA4400000) -> Internal clock, SCK pin as serial clock output
 - */
 -# define SCSCR_INIT(port) (port->mapbase == SCIF2) ? 0xF3 : 0xF0
  #elif defined(CONFIG_CPU_SUBTYPE_SH7720) || \
-       defined(CONFIG_CPU_SUBTYPE_SH7721)
+       defined(CONFIG_CPU_SUBTYPE_SH7721) || \
+       defined(CONFIG_ARCH_SH73A0) || \
+       defined(CONFIG_ARCH_SH7367) || \
+       defined(CONFIG_ARCH_SH7377) || \
+       defined(CONFIG_ARCH_SH7372)
 -# define SCSCR_INIT(port)  0x0030 /* TIE=0,RIE=0,TE=1,RE=1 */
  # define PORT_PTCR       0xA405011EUL
  # define PORT_PVCR       0xA4050122UL
  # define SCIF_ORER       0x0200   /* overrun error bit */
@@@ -29,6 -43,7 +33,6 @@@
  # define SCSPTR1 0xFFE0001C /* 8 bit SCIF */
  # define SCSPTR2 0xFFE80020 /* 16 bit SCIF */
  # define SCIF_ORER 0x0001   /* overrun error bit */
 -# define SCSCR_INIT(port) 0x3a /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
  #elif defined(CONFIG_CPU_SUBTYPE_SH7750)  || \
        defined(CONFIG_CPU_SUBTYPE_SH7750R) || \
        defined(CONFIG_CPU_SUBTYPE_SH7750S) || \
  # define SCSPTR1 0xffe0001c /* 8  bit SCI */
  # define SCSPTR2 0xFFE80020 /* 16 bit SCIF */
  # define SCIF_ORER 0x0001   /* overrun error bit */
 -# define SCSCR_INIT(port) (((port)->type == PORT_SCI) ? \
 -      0x30 /* TIE=0,RIE=0,TE=1,RE=1 */ : \
 -      0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */ )
  #elif defined(CONFIG_CPU_SUBTYPE_SH7760)
  # define SCSPTR0 0xfe600024 /* 16 bit SCIF */
  # define SCSPTR1 0xfe610024 /* 16 bit SCIF */
  # define SCSPTR2 0xfe620024 /* 16 bit SCIF */
  # define SCIF_ORER 0x0001  /* overrun error bit */
 -# define SCSCR_INIT(port)          0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
  #elif defined(CONFIG_CPU_SUBTYPE_SH7710) || defined(CONFIG_CPU_SUBTYPE_SH7712)
  # define SCSPTR0 0xA4400000     /* 16 bit SCIF */
  # define SCIF_ORER 0x0001   /* overrun error bit */
  # define PACR 0xa4050100
  # define PBCR 0xa4050102
 -# define SCSCR_INIT(port)          0x3B
  #elif defined(CONFIG_CPU_SUBTYPE_SH7343)
  # define SCSPTR0 0xffe00010   /* 16 bit SCIF */
  # define SCSPTR1 0xffe10010   /* 16 bit SCIF */
  # define SCSPTR2 0xffe20010   /* 16 bit SCIF */
  # define SCSPTR3 0xffe30010   /* 16 bit SCIF */
 -# define SCSCR_INIT(port) 0x32        /* TIE=0,RIE=0,TE=1,RE=1,REIE=0,CKE=1 */
  #elif defined(CONFIG_CPU_SUBTYPE_SH7722)
  # define PADR                 0xA4050120
  # define PSDR                 0xA405013e
  # define PWDR                 0xA4050166
  # define PSCR                 0xA405011E
  # define SCIF_ORER            0x0001  /* overrun error bit */
 -# define SCSCR_INIT(port)     0x0038  /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
  #elif defined(CONFIG_CPU_SUBTYPE_SH7366)
  # define SCPDR0                       0xA405013E      /* 16 bit SCIF0 PSDR */
  # define SCSPTR0              SCPDR0
  # define SCIF_ORER            0x0001  /* overrun error bit */
 -# define SCSCR_INIT(port)     0x0038  /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
  #elif defined(CONFIG_CPU_SUBTYPE_SH7723)
  # define SCSPTR0                0xa4050160
  # define SCSPTR1                0xa405013e
  # define SCSPTR4                0xa4050128
  # define SCSPTR5                0xa4050128
  # define SCIF_ORER              0x0001  /* overrun error bit */
 -# define SCSCR_INIT(port)       0x0038  /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
  #elif defined(CONFIG_CPU_SUBTYPE_SH7724)
  # define SCIF_ORER              0x0001  /* overrun error bit */
 -# define SCSCR_INIT(port) ((port)->type == PORT_SCIFA ? \
 -      0x30 /* TIE=0,RIE=0,TE=1,RE=1 */ : \
 -      0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */ )
  #elif defined(CONFIG_CPU_SUBTYPE_SH4_202)
  # define SCSPTR2 0xffe80020 /* 16 bit SCIF */
  # define SCIF_ORER 0x0001   /* overrun error bit */
 -# define SCSCR_INIT(port) 0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
  #elif defined(CONFIG_CPU_SUBTYPE_SH5_101) || defined(CONFIG_CPU_SUBTYPE_SH5_103)
 -# define SCIF_BASE_ADDR    0x01030000
 -# define SCIF_ADDR_SH5     PHYS_PERIPHERAL_BLOCK+SCIF_BASE_ADDR
  # define SCIF_PTR2_OFFS    0x0000020
 -# define SCIF_LSR2_OFFS    0x0000024
  # define SCSPTR2           ((port->mapbase)+SCIF_PTR2_OFFS) /* 16 bit SCIF */
 -# define SCLSR2            ((port->mapbase)+SCIF_LSR2_OFFS) /* 16 bit SCIF */
 -# define SCSCR_INIT(port)  0x38               /* TIE=0,RIE=0, TE=1,RE=1,REIE=1 */
  #elif defined(CONFIG_H83007) || defined(CONFIG_H83068)
 -# define SCSCR_INIT(port)          0x30 /* TIE=0,RIE=0,TE=1,RE=1 */
  # define H8300_SCI_DR(ch) *(volatile char *)(P1DR + h8300_sci_pins[ch].port)
  #elif defined(CONFIG_H8S2678)
 -# define SCSCR_INIT(port)          0x30 /* TIE=0,RIE=0,TE=1,RE=1 */
  # define H8300_SCI_DR(ch) *(volatile char *)(P1DR + h8300_sci_pins[ch].port)
 -# define SCSCR_INIT(port)     0x38
+ #elif defined(CONFIG_CPU_SUBTYPE_SH7757)
+ # define SCSPTR0 0xfe4b0020
+ # define SCSPTR1 0xfe4b0020
+ # define SCSPTR2 0xfe4b0020
+ # define SCIF_ORER 0x0001
+ # define SCIF_ONLY
  #elif defined(CONFIG_CPU_SUBTYPE_SH7763)
  # define SCSPTR0 0xffe00024 /* 16 bit SCIF */
  # define SCSPTR1 0xffe08024 /* 16 bit SCIF */
  # define SCSPTR2 0xffe10020 /* 16 bit SCIF/IRDA */
  # define SCIF_ORER 0x0001  /* overrun error bit */
 -# define SCSCR_INIT(port)     0x38    /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
  #elif defined(CONFIG_CPU_SUBTYPE_SH7770)
  # define SCSPTR0 0xff923020 /* 16 bit SCIF */
  # define SCSPTR1 0xff924020 /* 16 bit SCIF */
  # define SCSPTR2 0xff925020 /* 16 bit SCIF */
  # define SCIF_ORER 0x0001  /* overrun error bit */
 -# define SCSCR_INIT(port)     0x3c /* TIE=0,RIE=0,TE=1,RE=1,REIE=1,cke=2 */
  #elif defined(CONFIG_CPU_SUBTYPE_SH7780)
  # define SCSPTR0      0xffe00024      /* 16 bit SCIF */
  # define SCSPTR1      0xffe10024      /* 16 bit SCIF */
  # define SCIF_ORER    0x0001          /* Overrun error bit */
 -
 -#if defined(CONFIG_SH_SH2007)
 -/* TIE=0,RIE=0,TE=1,RE=1,REIE=1,CKE1=0 */
 -# define SCSCR_INIT(port)     0x38
 -#else
 -/* TIE=0,RIE=0,TE=1,RE=1,REIE=1,CKE1=1 */
 -# define SCSCR_INIT(port)     0x3a
 -#endif
 -
  #elif defined(CONFIG_CPU_SUBTYPE_SH7785) || \
        defined(CONFIG_CPU_SUBTYPE_SH7786)
  # define SCSPTR0      0xffea0024      /* 16 bit SCIF */
  # define SCSPTR4      0xffee0024      /* 16 bit SCIF */
  # define SCSPTR5      0xffef0024      /* 16 bit SCIF */
  # define SCIF_ORER    0x0001          /* Overrun error bit */
 -# define SCSCR_INIT(port)     0x3a    /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
  #elif defined(CONFIG_CPU_SUBTYPE_SH7201) || \
        defined(CONFIG_CPU_SUBTYPE_SH7203) || \
        defined(CONFIG_CPU_SUBTYPE_SH7206) || \
  #  define SCSPTR6 0xfffeB020 /* 16 bit SCIF */
  #  define SCSPTR7 0xfffeB820 /* 16 bit SCIF */
  # endif
 -# define SCSCR_INIT(port)     0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
  #elif defined(CONFIG_CPU_SUBTYPE_SH7619)
  # define SCSPTR0 0xf8400020 /* 16 bit SCIF */
  # define SCSPTR1 0xf8410020 /* 16 bit SCIF */
  # define SCSPTR2 0xf8420020 /* 16 bit SCIF */
  # define SCIF_ORER 0x0001  /* overrun error bit */
 -# define SCSCR_INIT(port)     0x38 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
  #elif defined(CONFIG_CPU_SUBTYPE_SHX3)
  # define SCSPTR0 0xffc30020           /* 16 bit SCIF */
  # define SCSPTR1 0xffc40020           /* 16 bit SCIF */
  # define SCSPTR2 0xffc50020           /* 16 bit SCIF */
  # define SCSPTR3 0xffc60020           /* 16 bit SCIF */
  # define SCIF_ORER 0x0001             /* Overrun error bit */
 -# define SCSCR_INIT(port)     0x38    /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */
  #else
  # error CPU subtype not defined
  #endif
  
 -/* SCSCR */
 -#define SCI_CTRL_FLAGS_TIE  0x80 /* all */
 -#define SCI_CTRL_FLAGS_RIE  0x40 /* all */
 -#define SCI_CTRL_FLAGS_TE   0x20 /* all */
 -#define SCI_CTRL_FLAGS_RE   0x10 /* all */
 -#if defined(CONFIG_CPU_SUBTYPE_SH7750)  || \
 -    defined(CONFIG_CPU_SUBTYPE_SH7091)  || \
 -    defined(CONFIG_CPU_SUBTYPE_SH7750R) || \
 -    defined(CONFIG_CPU_SUBTYPE_SH7722)  || \
 -    defined(CONFIG_CPU_SUBTYPE_SH7750S) || \
 -    defined(CONFIG_CPU_SUBTYPE_SH7751)  || \
 -    defined(CONFIG_CPU_SUBTYPE_SH7751R) || \
 -    defined(CONFIG_CPU_SUBTYPE_SH7763)  || \
 -    defined(CONFIG_CPU_SUBTYPE_SH7780)  || \
 -    defined(CONFIG_CPU_SUBTYPE_SH7785)  || \
 -    defined(CONFIG_CPU_SUBTYPE_SH7786)  || \
 -    defined(CONFIG_CPU_SUBTYPE_SHX3)
 -#define SCI_CTRL_FLAGS_REIE 0x08 /* 7750 SCIF */
 -#elif defined(CONFIG_CPU_SUBTYPE_SH7724)
 -#define SCI_CTRL_FLAGS_REIE ((port)->type == PORT_SCIFA ? 0 : 8)
 -#else
 -#define SCI_CTRL_FLAGS_REIE 0
 -#endif
 -/*      SCI_CTRL_FLAGS_MPIE 0x08  * 7707 SCI, 7708 SCI, 7709 SCI, 7750 SCI */
 -/*      SCI_CTRL_FLAGS_TEIE 0x04  * 7707 SCI, 7708 SCI, 7709 SCI, 7750 SCI */
 -/*      SCI_CTRL_FLAGS_CKE1 0x02  * all */
 -/*      SCI_CTRL_FLAGS_CKE0 0x01  * 7707 SCI/SCIF, 7708 SCI, 7709 SCI/SCIF, 7750 SCI */
 -
  /* SCxSR SCI */
  #define SCI_TDRE  0x80 /* 7707 SCI, 7708 SCI, 7709 SCI, 7750 SCI */
  #define SCI_RDRF  0x40 /* 7707 SCI, 7708 SCI, 7709 SCI, 7750 SCI */
  
  #if defined(CONFIG_CPU_SUBTYPE_SH7705) || \
      defined(CONFIG_CPU_SUBTYPE_SH7720) || \
-     defined(CONFIG_CPU_SUBTYPE_SH7721)
+     defined(CONFIG_CPU_SUBTYPE_SH7721) || \
+     defined(CONFIG_ARCH_SH73A0) || \
+     defined(CONFIG_ARCH_SH7367) || \
+     defined(CONFIG_ARCH_SH7377) || \
+     defined(CONFIG_ARCH_SH7372)
  # define SCIF_ORER    0x0200
  # define SCIF_ERRORS ( SCIF_PER | SCIF_FER | SCIF_ER | SCIF_BRK | SCIF_ORER)
  # define SCIF_RFDC_MASK 0x007f
  
  #if defined(CONFIG_CPU_SUBTYPE_SH7705) || \
      defined(CONFIG_CPU_SUBTYPE_SH7720) || \
-     defined(CONFIG_CPU_SUBTYPE_SH7721)
+     defined(CONFIG_CPU_SUBTYPE_SH7721) || \
+     defined(CONFIG_ARCH_SH73A0) || \
+     defined(CONFIG_ARCH_SH7367) || \
+     defined(CONFIG_ARCH_SH7377) || \
+     defined(CONFIG_ARCH_SH7372)
  # define SCxSR_RDxF_CLEAR(port)        (sci_in(port, SCxSR) & 0xfffc)
  # define SCxSR_ERROR_CLEAR(port) (sci_in(port, SCxSR) & 0xfd73)
  # define SCxSR_TDxE_CLEAR(port)        (sci_in(port, SCxSR) & 0xffdf)
  /* SCFCR */
  #define SCFCR_RFRST 0x0002
  #define SCFCR_TFRST 0x0004
 -#define SCFCR_TCRST 0x4000
  #define SCFCR_MCE   0x0008
  
  #define SCI_MAJOR             204
  #define SCI_MINOR_START               8
  
 -/* Generic serial flags */
 -#define SCI_RX_THROTTLE               0x0000001
 -
 -#define SCI_MAGIC 0xbabeface
 -
 -/*
 - * Events are used to schedule things to happen at timer-interrupt
 - * time, instead of at rs interrupt time.
 - */
 -#define SCI_EVENT_WRITE_WAKEUP        0
 -
  #define SCI_IN(size, offset)                                  \
    if ((size) == 8) {                                          \
      return ioread8(port->membase + (offset));                 \
  #define CPU_SCIx_FNS(name, sci_offset, sci_size, scif_offset, scif_size)\
    static inline unsigned int sci_##name##_in(struct uart_port *port)  \
    {                                                                   \
-     if (port->type == PORT_SCIF) {                                    \
+     if (port->type == PORT_SCIF || port->type == PORT_SCIFB) {                \
        SCI_IN(scif_size, scif_offset)                                  \
      } else {  /* PORT_SCI or PORT_SCIFA */                            \
        SCI_IN(sci_size, sci_offset);                                   \
    }                                                                   \
    static inline void sci_##name##_out(struct uart_port *port, unsigned int value) \
    {                                                                   \
-     if (port->type == PORT_SCIF) {                                    \
+     if (port->type == PORT_SCIF || port->type == PORT_SCIFB) {                \
        SCI_OUT(scif_size, scif_offset, value)                          \
      } else {  /* PORT_SCI or PORT_SCIFA */                            \
        SCI_OUT(sci_size, sci_offset, value);                           \
      SCI_OUT(sci_size, sci_offset, value);                             \
    }
  
- #ifdef CONFIG_CPU_SH3
+ #if defined(CONFIG_CPU_SH3) || \
+     defined(CONFIG_ARCH_SH73A0) || \
+     defined(CONFIG_ARCH_SH7367) || \
+     defined(CONFIG_ARCH_SH7377) || \
+     defined(CONFIG_ARCH_SH7372)
  #if defined(CONFIG_CPU_SUBTYPE_SH7710) || defined(CONFIG_CPU_SUBTYPE_SH7712)
  #define SCIx_FNS(name, sh3_sci_offset, sh3_sci_size, sh4_sci_offset, sh4_sci_size, \
                                sh3_scif_offset, sh3_scif_size, sh4_scif_offset, sh4_scif_size, \
          CPU_SCIF_FNS(name, sh4_scif_offset, sh4_scif_size)
  #elif defined(CONFIG_CPU_SUBTYPE_SH7705) || \
        defined(CONFIG_CPU_SUBTYPE_SH7720) || \
-       defined(CONFIG_CPU_SUBTYPE_SH7721)
+       defined(CONFIG_CPU_SUBTYPE_SH7721) || \
+       defined(CONFIG_ARCH_SH73A0) || \
+       defined(CONFIG_ARCH_SH7367) || \
+       defined(CONFIG_ARCH_SH7377)
+ #define SCIF_FNS(name, scif_offset, scif_size) \
+   CPU_SCIF_FNS(name, scif_offset, scif_size)
+ #elif defined(CONFIG_ARCH_SH7372)
+ #define SCIx_FNS(name, sh4_scifa_offset, sh4_scifa_size, sh4_scifb_offset, sh4_scifb_size) \
+   CPU_SCIx_FNS(name, sh4_scifa_offset, sh4_scifa_size, sh4_scifb_offset, sh4_scifb_size)
  #define SCIF_FNS(name, scif_offset, scif_size) \
    CPU_SCIF_FNS(name, scif_offset, scif_size)
  #else
  
  #if defined(CONFIG_CPU_SUBTYPE_SH7705) || \
      defined(CONFIG_CPU_SUBTYPE_SH7720) || \
-     defined(CONFIG_CPU_SUBTYPE_SH7721)
+     defined(CONFIG_CPU_SUBTYPE_SH7721) || \
+     defined(CONFIG_ARCH_SH73A0) || \
+     defined(CONFIG_ARCH_SH7367) || \
+     defined(CONFIG_ARCH_SH7377)
  
  SCIF_FNS(SCSMR,  0x00, 16)
  SCIF_FNS(SCBRR,  0x04,  8)
  SCIF_FNS(SCSCR,  0x08, 16)
 -SCIF_FNS(SCTDSR, 0x0c,  8)
 -SCIF_FNS(SCFER,  0x10, 16)
  SCIF_FNS(SCxSR,  0x14, 16)
  SCIF_FNS(SCFCR,  0x18, 16)
  SCIF_FNS(SCFDR,  0x1c, 16)
  SCIF_FNS(SCxTDR, 0x20,  8)
  SCIF_FNS(SCxRDR, 0x24,  8)
- SCIF_FNS(SCLSR,  0x24, 16)
+ SCIF_FNS(SCLSR,  0x00,  0)
+ #elif defined(CONFIG_ARCH_SH7372)
+ SCIF_FNS(SCSMR,  0x00, 16)
+ SCIF_FNS(SCBRR,  0x04,  8)
+ SCIF_FNS(SCSCR,  0x08, 16)
+ SCIF_FNS(SCTDSR, 0x0c, 16)
+ SCIF_FNS(SCFER,  0x10, 16)
+ SCIF_FNS(SCxSR,  0x14, 16)
+ SCIF_FNS(SCFCR,  0x18, 16)
+ SCIF_FNS(SCFDR,  0x1c, 16)
+ SCIF_FNS(SCTFDR, 0x38, 16)
+ SCIF_FNS(SCRFDR, 0x3c, 16)
+ SCIx_FNS(SCxTDR, 0x20,  8, 0x40,  8)
+ SCIx_FNS(SCxRDR, 0x24,  8, 0x60,  8)
+ SCIF_FNS(SCLSR,  0x00,  0)
  #elif defined(CONFIG_CPU_SUBTYPE_SH7723) ||\
        defined(CONFIG_CPU_SUBTYPE_SH7724)
  SCIx_FNS(SCSMR,  0x00, 16, 0x00, 16)
@@@ -340,6 -476,8 +387,6 @@@ SCIx_FNS(SCxTDR, 0x20,  8, 0x0c,  8
  SCIx_FNS(SCxSR,  0x14, 16, 0x10, 16)
  SCIx_FNS(SCxRDR, 0x24,  8, 0x14,  8)
  SCIx_FNS(SCSPTR, 0,     0,    0,  0)
 -SCIF_FNS(SCTDSR, 0x0c,  8)
 -SCIF_FNS(SCFER,  0x10, 16)
  SCIF_FNS(SCFCR,  0x18, 16)
  SCIF_FNS(SCFDR,  0x1c, 16)
  SCIF_FNS(SCLSR,  0x24, 16)
@@@ -365,6 -503,7 +412,6 @@@ SCIF_FNS(SCLSR,                            0,  0, 0x28, 16
  #elif defined(CONFIG_CPU_SUBTYPE_SH7763)
  SCIF_FNS(SCFDR,                               0,  0, 0x1C, 16)
  SCIF_FNS(SCSPTR2,                     0,  0, 0x20, 16)
 -SCIF_FNS(SCLSR2,                      0,  0, 0x24, 16)
  SCIF_FNS(SCTFDR,                   0x0e, 16, 0x1C, 16)
  SCIF_FNS(SCRFDR,                   0x0e, 16, 0x20, 16)
  SCIF_FNS(SCSPTR,                      0,  0, 0x24, 16)
@@@ -431,35 -570,7 +478,7 @@@ static const struct __attribute__((pack
  static inline int sci_rxd_in(struct uart_port *port)
  {
        if (port->mapbase == 0xfffffe80)
-               return ctrl_inb(SCPDR)&0x01 ? 1 : 0; /* SCI */
-       if (port->mapbase == 0xa4000150)
-               return ctrl_inb(SCPDR)&0x10 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xa4000140)
-               return ctrl_inb(SCPDR)&0x04 ? 1 : 0; /* IRDA */
-       return 1;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7705)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-       if (port->mapbase == SCIF0)
-               return ctrl_inb(SCPDR)&0x04 ? 1 : 0; /* IRDA */
-       if (port->mapbase == SCIF2)
-               return ctrl_inb(SCPDR)&0x10 ? 1 : 0; /* SCIF */
-       return 1;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7710) || defined(CONFIG_CPU_SUBTYPE_SH7712)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-         return sci_in(port,SCxSR)&0x0010 ? 1 : 0;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7720) || \
-       defined(CONFIG_CPU_SUBTYPE_SH7721)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-       if (port->mapbase == 0xa4430000)
-               return sci_in(port, SCxSR) & 0x0003 ? 1 : 0;
-       else if (port->mapbase == 0xa4438000)
-               return sci_in(port, SCxSR) & 0x0003 ? 1 : 0;
+               return __raw_readb(SCPDR)&0x01 ? 1 : 0; /* SCI */
        return 1;
  }
  #elif defined(CONFIG_CPU_SUBTYPE_SH7750)  || \
  static inline int sci_rxd_in(struct uart_port *port)
  {
        if (port->mapbase == 0xffe00000)
-               return ctrl_inb(SCSPTR1)&0x01 ? 1 : 0; /* SCI */
-       if (port->mapbase == 0xffe80000)
-               return ctrl_inw(SCSPTR2)&0x0001 ? 1 : 0; /* SCIF */
-       return 1;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SH4_202)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-       if (port->mapbase == 0xffe80000)
-               return ctrl_inw(SCSPTR2)&0x0001 ? 1 : 0; /* SCIF */
-       return 1;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7760)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-       if (port->mapbase == 0xfe600000)
-               return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xfe610000)
-               return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xfe620000)
-               return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */
-       return 1;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7343)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-       if (port->mapbase == 0xffe00000)
-               return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xffe10000)
-               return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xffe20000)
-               return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xffe30000)
-               return ctrl_inw(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF */
-       return 1;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7366)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-       if (port->mapbase == 0xffe00000)
-               return ctrl_inb(SCPDR0) & 0x0001 ? 1 : 0; /* SCIF0 */
-       return 1;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7722)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-       if (port->mapbase == 0xffe00000)
-               return ctrl_inb(PSDR) & 0x02 ? 1 : 0; /* SCIF0 */
-       if (port->mapbase == 0xffe10000)
-               return ctrl_inb(PADR) & 0x40 ? 1 : 0; /* SCIF1 */
-       if (port->mapbase == 0xffe20000)
-               return ctrl_inb(PWDR) & 0x04 ? 1 : 0; /* SCIF2 */
+               return __raw_readb(SCSPTR1)&0x01 ? 1 : 0; /* SCI */
        return 1;
  }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7723)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-         if (port->mapbase == 0xffe00000)
-                 return ctrl_inb(SCSPTR0) & 0x0008 ? 1 : 0; /* SCIF0 */
-         if (port->mapbase == 0xffe10000)
-                 return ctrl_inb(SCSPTR1) & 0x0020 ? 1 : 0; /* SCIF1 */
-         if (port->mapbase == 0xffe20000)
-                 return ctrl_inb(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF2 */
-         if (port->mapbase == 0xa4e30000)
-                 return ctrl_inb(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF3 */
-         if (port->mapbase == 0xa4e40000)
-                 return ctrl_inb(SCSPTR4) & 0x0001 ? 1 : 0; /* SCIF4 */
-         if (port->mapbase == 0xa4e50000)
-                 return ctrl_inb(SCSPTR5) & 0x0008 ? 1 : 0; /* SCIF5 */
-         return 1;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7724)
- #  define SCFSR    0x0010
- #  define SCASSR   0x0014
- static inline int sci_rxd_in(struct uart_port *port)
- {
-       if (port->type == PORT_SCIF)
-               return ctrl_inw((port->mapbase + SCFSR))  & SCIF_BRK ? 1 : 0;
-       if (port->type == PORT_SCIFA)
-               return ctrl_inw((port->mapbase + SCASSR)) & SCIF_BRK ? 1 : 0;
-       return 1;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SH5_101) || defined(CONFIG_CPU_SUBTYPE_SH5_103)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-          return sci_in(port, SCSPTR)&0x0001 ? 1 : 0; /* SCIF */
- }
  #elif defined(__H8300H__) || defined(__H8300S__)
  static inline int sci_rxd_in(struct uart_port *port)
  {
        int ch = (port->mapbase - SMR0) >> 3;
        return (H8300_SCI_DR(ch) & h8300_sci_pins[ch].rx) ? 1 : 0;
  }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7763)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-       if (port->mapbase == 0xffe00000)
-               return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xffe08000)
-               return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xffe10000)
-               return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF/IRDA */
-       return 1;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7770)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-       if (port->mapbase == 0xff923000)
-               return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xff924000)
-               return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xff925000)
-               return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */
-       return 1;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7780)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-       if (port->mapbase == 0xffe00000)
-               return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xffe10000)
-               return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */
-       return 1;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7785) || \
-       defined(CONFIG_CPU_SUBTYPE_SH7786)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-       if (port->mapbase == 0xffea0000)
-               return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xffeb0000)
-               return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xffec0000)
-               return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xffed0000)
-               return ctrl_inw(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xffee0000)
-               return ctrl_inw(SCSPTR4) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xffef0000)
-               return ctrl_inw(SCSPTR5) & 0x0001 ? 1 : 0; /* SCIF */
-       return 1;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7201) || \
-       defined(CONFIG_CPU_SUBTYPE_SH7203) || \
-       defined(CONFIG_CPU_SUBTYPE_SH7206) || \
-       defined(CONFIG_CPU_SUBTYPE_SH7263)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-       if (port->mapbase == 0xfffe8000)
-               return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xfffe8800)
-               return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xfffe9000)
-               return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xfffe9800)
-               return ctrl_inw(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF */
- #if defined(CONFIG_CPU_SUBTYPE_SH7201)
-       if (port->mapbase == 0xfffeA000)
-               return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xfffeA800)
-               return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xfffeB000)
-               return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xfffeB800)
-               return ctrl_inw(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF */
- #endif
-       return 1;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SH7619)
- static inline int sci_rxd_in(struct uart_port *port)
- {
-       if (port->mapbase == 0xf8400000)
-               return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xf8410000)
-               return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xf8420000)
-               return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */
-       return 1;
- }
- #elif defined(CONFIG_CPU_SUBTYPE_SHX3)
+ #else /* default case for non-SCI processors */
  static inline int sci_rxd_in(struct uart_port *port)
  {
-       if (port->mapbase == 0xffc30000)
-               return ctrl_inw(SCSPTR0) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xffc40000)
-               return ctrl_inw(SCSPTR1) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xffc50000)
-               return ctrl_inw(SCSPTR2) & 0x0001 ? 1 : 0; /* SCIF */
-       if (port->mapbase == 0xffc60000)
-               return ctrl_inw(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF */
        return 1;
  }
  #endif
 -
 -/*
 - * Values for the BitRate Register (SCBRR)
 - *
 - * The values are actually divisors for a frequency which can
 - * be internal to the SH3 (14.7456MHz) or derived from an external
 - * clock source.  This driver assumes the internal clock is used;
 - * to support using an external clock source, config options or
 - * possibly command-line options would need to be added.
 - *
 - * Also, to support speeds below 2400 (why?) the lower 2 bits of
 - * the SCSMR register would also need to be set to non-zero values.
 - *
 - * -- Greg Banks 27Feb2000
 - *
 - * Answer: The SCBRR register is only eight bits, and the value in
 - * it gets larger with lower baud rates. At around 2400 (depending on
 - * the peripherial module clock) you run out of bits. However the
 - * lower two bits of SCSMR allow the module clock to be divided down,
 - * scaling the value which is needed in SCBRR.
 - *
 - * -- Stuart Menefy - 23 May 2000
 - *
 - * I meant, why would anyone bother with bitrates below 2400.
 - *
 - * -- Greg Banks - 7Jul2000
 - *
 - * You "speedist"!  How will I use my 110bps ASR-33 teletype with paper
 - * tape reader as a console!
 - *
 - * -- Mitch Davis - 15 Jul 2000
 - */
 -
 -#if (defined(CONFIG_CPU_SUBTYPE_SH7780)  || \
 -     defined(CONFIG_CPU_SUBTYPE_SH7785)  || \
 -     defined(CONFIG_CPU_SUBTYPE_SH7786)) && \
 -    !defined(CONFIG_SH_SH2007)
 -#define SCBRR_VALUE(bps, clk) ((clk+16*bps)/(16*bps)-1)
 -#elif defined(CONFIG_CPU_SUBTYPE_SH7705) || \
 -      defined(CONFIG_CPU_SUBTYPE_SH7720) || \
 -      defined(CONFIG_CPU_SUBTYPE_SH7721) || \
 -      defined(CONFIG_ARCH_SH73A0) || \
 -      defined(CONFIG_ARCH_SH7367) || \
 -      defined(CONFIG_ARCH_SH7377) || \
 -      defined(CONFIG_ARCH_SH7372)
 -#define SCBRR_VALUE(bps, clk) (((clk*2)+16*bps)/(32*bps)-1)
 -#elif defined(CONFIG_CPU_SUBTYPE_SH7723) ||\
 -      defined(CONFIG_CPU_SUBTYPE_SH7724)
 -static inline int scbrr_calc(struct uart_port *port, int bps, int clk)
 -{
 -      if (port->type == PORT_SCIF)
 -              return (clk+16*bps)/(32*bps)-1;
 -      else
 -              return ((clk*2)+16*bps)/(16*bps)-1;
 -}
 -#define SCBRR_VALUE(bps, clk) scbrr_calc(port, bps, clk)
 -#elif defined(__H8300H__) || defined(__H8300S__)
 -#define SCBRR_VALUE(bps, clk) (((clk*1000/32)/bps)-1)
 -#else /* Generic SH */
 -#define SCBRR_VALUE(bps, clk) ((clk+16*bps)/(32*bps)-1)
 -#endif
@@@ -2,28 -2,12 +2,29 @@@
  #define __LINUX_SERIAL_SCI_H
  
  #include <linux/serial_core.h>
+ #include <linux/sh_dma.h>
  
  /*
   * Generic header for SuperH SCI(F) (used by sh/sh64/h8300 and related parts)
   */
  
- #define SCSCR_REIE    (1 << 3)
 +enum {
 +      SCBRR_ALGO_1,           /* ((clk + 16 * bps) / (16 * bps) - 1) */
 +      SCBRR_ALGO_2,           /* ((clk + 16 * bps) / (32 * bps) - 1) */
 +      SCBRR_ALGO_3,           /* (((clk * 2) + 16 * bps) / (16 * bps) - 1) */
 +      SCBRR_ALGO_4,           /* (((clk * 2) + 16 * bps) / (32 * bps) - 1) */
 +      SCBRR_ALGO_5,           /* (((clk * 1000 / 32) / bps) - 1) */
 +};
 +
 +#define SCSCR_TIE     (1 << 7)
 +#define SCSCR_RIE     (1 << 6)
 +#define SCSCR_TE      (1 << 5)
 +#define SCSCR_RE      (1 << 4)
++#define SCSCR_REIE    (1 << 3)        /* not supported by all parts */
 +#define SCSCR_TOIE    (1 << 2)        /* not supported by all parts */
 +#define SCSCR_CKE1    (1 << 1)
 +#define SCSCR_CKE0    (1 << 0)
 +
  /* Offsets into the sci_port->irqs array */
  enum {
        SCIx_ERI_IRQ,
@@@ -33,6 -17,8 +34,8 @@@
        SCIx_NR_IRQS,
  };
  
+ struct device;
  /*
   * Platform device specific platform_data struct
   */
@@@ -43,9 -29,11 +46,16 @@@ struct plat_sci_port 
        unsigned int    type;                   /* SCI / SCIF / IRDA */
        upf_t           flags;                  /* UPF_* flags */
        char            *clk;                   /* clock string */
 +
 +      unsigned int    scbrr_algo_id;          /* SCBRR calculation algo */
 +      unsigned int    scscr;                  /* SCSCR initialization */
++
+       struct device   *dma_dev;
++
+ #ifdef CONFIG_SERIAL_SH_SCI_DMA
+       unsigned int dma_slave_tx;
+       unsigned int dma_slave_rx;
+ #endif
  };
  
  #endif /* __LINUX_SERIAL_SCI_H */