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,
        },
  };
  
@@@ -207,24 -198,18 +198,20 @@@ 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,
        },
  };
  
@@@ -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,
        },
  };
  
@@@ -173,45 -173,63 +173,71 @@@ 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,
        },
  };
  
@@@ -133,45 -133,63 +133,71 @@@ 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,
        },
  };
  
@@@ -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,
        },
  };
  
@@@ -106,56 -106,59 +106,65 @@@ 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,
  };
  
@@@ -96,34 -96,33 +96,39 @@@ 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,
        },
  };
  
@@@ -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,
        },
  };
  
  #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,
        },
  };
  
@@@ -36,19 -35,18 +36,20 @@@ 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,
        },
  };
  
@@@ -61,10 -57,11 +62,11 @@@ static struct plat_sci_port scif_platfo
        .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,
        },
  };
  
@@@ -242,20 -226,14 +229,19 @@@ static struct platform_device *sh7750_d
  
  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));
  }
@@@ -126,45 -126,63 +126,71 @@@ 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,
        },
  };
  
  #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",
  #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",
   * 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] = {
  #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",
@@@ -78,11 -143,204 +143,216 @@@ static const struct sh_dmae_channel sh7
        }
  };
  
- 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,
        },
  };
  
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,
  #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,
        },
  };
  
  #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,
  };
  
@@@ -260,9 -378,10 +382,11 @@@ static int __init sh7780_devices_setup(
        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));
  }
  #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,
  };
  
  #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,
        },
  };
  
  #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,
        },
  };
  
  #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,
        },
  };
  
@@@ -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:
@@@ -79,19 -81,34 +81,42 @@@ 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 {
@@@ -654,8 -693,34 +701,34 @@@ static inline int sci_handle_breaks(str
        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?
@@@ -711,26 -777,33 +785,48 @@@ 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;
@@@ -855,14 -923,306 +946,308 @@@ static unsigned int sci_get_mctrl(struc
        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,6 -1270,142 +1301,142 @@@ 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);
@@@ -955,13 -1445,26 +1497,24 @@@ static unsigned int sci_scbrr_calc(unsi
  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_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)
@@@ -1122,16 -1676,24 +1726,26 @@@ static int __devinit sci_init_single(st
        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
  #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 */
  #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 */
@@@ -7,23 -8,6 +8,23 @@@
   * 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,
@@@ -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 */