Merge branch 'next/devel' of ssh://master.kernel.org/pub/scm/linux/kernel/git/arm...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 27 Jul 2011 00:41:04 +0000 (17:41 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 27 Jul 2011 00:41:04 +0000 (17:41 -0700)
* 'next/devel' of ssh://master.kernel.org/pub/scm/linux/kernel/git/arm/linux-arm-soc: (128 commits)
  ARM: S5P64X0: External Interrupt Support
  ARM: EXYNOS4: Enable MFC on Samsung NURI
  ARM: EXYNOS4: Enable MFC on universal_c210
  ARM: S5PV210: Enable MFC on Goni
  ARM: S5P: Add support for MFC device
  ARM: EXYNOS4: Add support FIMD on SMDKC210
  ARM: EXYNOS4: Add platform device and helper functions for FIMD
  ARM: EXYNOS4: Add resource definition for FIMD
  ARM: EXYNOS4: Change devname for FIMD clkdev
  ARM: SAMSUNG: Add IRQ_I2S0 definition
  ARM: SAMSUNG: Add platform device for idma
  ARM: EXYNOS4: Add more registers to be saved and restored for PM
  ARM: EXYNOS4: Add more register addresses of CMU
  ARM: EXYNOS4: Add platform device for dwmci driver
  ARM: EXYNOS4: configure rtc-s3c on NURI
  ARM: EXYNOS4: configure MAX8903 secondary charger on NURI
  ARM: EXYNOS4: configure ADC on NURI
  ARM: EXYNOS4: configure MAX17042 fuel gauge on NURI
  ARM: EXYNOS4: configure regulators and PMIC(MAX8997) on NURI
  ARM: EXYNOS4: Increase NR_IRQS for devices with more IRQs
  ...

Fix up tons of silly conflicts:
 - arch/arm/mach-davinci/include/mach/psc.h
 - arch/arm/mach-exynos4/Kconfig
 - arch/arm/mach-exynos4/mach-smdkc210.c
 - arch/arm/mach-exynos4/pm.c
 - arch/arm/mach-imx/mm-imx1.c
 - arch/arm/mach-imx/mm-imx21.c
 - arch/arm/mach-imx/mm-imx25.c
 - arch/arm/mach-imx/mm-imx27.c
 - arch/arm/mach-imx/mm-imx31.c
 - arch/arm/mach-imx/mm-imx35.c
 - arch/arm/mach-mx5/mm.c
 - arch/arm/mach-s5pv210/mach-goni.c
 - arch/arm/mm/Kconfig

45 files changed:
1  2 
arch/arm/Kconfig
arch/arm/common/gic.c
arch/arm/kernel/irq.c
arch/arm/mach-cns3xxx/cns3420vb.c
arch/arm/mach-davinci/board-da850-evm.c
arch/arm/mach-davinci/clock.c
arch/arm/mach-davinci/clock.h
arch/arm/mach-davinci/include/mach/psc.h
arch/arm/mach-exynos4/Kconfig
arch/arm/mach-exynos4/Makefile
arch/arm/mach-exynos4/mach-smdkc210.c
arch/arm/mach-exynos4/mach-smdkv310.c
arch/arm/mach-exynos4/platsmp.c
arch/arm/mach-exynos4/pm.c
arch/arm/mach-imx/mm-imx21.c
arch/arm/mach-imx/mm-imx25.c
arch/arm/mach-imx/mm-imx27.c
arch/arm/mach-imx/mm-imx31.c
arch/arm/mach-imx/mm-imx35.c
arch/arm/mach-mmp/pxa168.c
arch/arm/mach-mx5/clock-mx51-mx53.c
arch/arm/mach-mx5/mm.c
arch/arm/mach-pxa/cm-x2xx.c
arch/arm/mach-pxa/cm-x300.c
arch/arm/mach-pxa/hx4700.c
arch/arm/mach-pxa/magician.c
arch/arm/mach-pxa/mioa701.c
arch/arm/mach-pxa/palmz72.c
arch/arm/mach-pxa/pxa3xx.c
arch/arm/mach-pxa/raumfeld.c
arch/arm/mach-pxa/saarb.c
arch/arm/mach-pxa/zeus.c
arch/arm/mach-s3c64xx/include/mach/irqs.h
arch/arm/mach-s5pv210/Kconfig
arch/arm/mach-s5pv210/clock.c
arch/arm/mach-s5pv210/mach-goni.c
arch/arm/mach-s5pv210/mach-smdkv210.c
arch/arm/mach-tegra/board-seaboard.c
arch/arm/mach-tegra/board-trimslice-pinmux.c
arch/arm/mach-tegra/platsmp.c
arch/arm/mach-ux500/board-mop500-regulators.c
arch/arm/mach-ux500/clock.c
arch/arm/mm/Kconfig
arch/arm/plat-samsung/irq-uart.c
arch/arm/plat-samsung/pm.c

diff --combined arch/arm/Kconfig
index 5cdee4bc181d79c3555a33f1645882610628b66f,54d63f1e9a913fe1ba96d895ccb5a31ea3da6041..09ebf0ba64fa5699a5703c6677ebb5e0fd26cb5a
@@@ -10,7 -10,7 +10,7 @@@ config AR
        select GENERIC_ATOMIC64 if (CPU_V6 || !CPU_32v6K || !AEABI)
        select HAVE_OPROFILE if (HAVE_PERF_EVENTS)
        select HAVE_ARCH_KGDB
 -      select HAVE_KPROBES if (!XIP_KERNEL && !THUMB2_KERNEL)
 +      select HAVE_KPROBES if !XIP_KERNEL
        select HAVE_KRETPROBES if (HAVE_KPROBES)
        select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
        select HAVE_FTRACE_MCOUNT_RECORD if (!XIP_KERNEL)
@@@ -37,9 -37,6 +37,9 @@@
          Europe.  There is an ARM Linux project with a web page at
          <http://www.arm.linux.org.uk/>.
  
 +config ARM_HAS_SG_CHAIN
 +      bool
 +
  config HAVE_PWM
        bool
  
@@@ -242,7 -239,6 +242,7 @@@ config ARCH_INTEGRATO
        select ARM_AMBA
        select ARCH_HAS_CPUFREQ
        select CLKDEV_LOOKUP
 +      select HAVE_MACH_CLKDEV
        select ICST
        select GENERIC_CLOCKEVENTS
        select PLAT_VERSATILE
@@@ -254,7 -250,6 +254,7 @@@ config ARCH_REALVIE
        bool "ARM Ltd. RealView family"
        select ARM_AMBA
        select CLKDEV_LOOKUP
 +      select HAVE_MACH_CLKDEV
        select ICST
        select GENERIC_CLOCKEVENTS
        select ARCH_WANT_OPTIONAL_GPIOLIB
@@@ -270,7 -265,6 +270,7 @@@ config ARCH_VERSATIL
        select ARM_AMBA
        select ARM_VIC
        select CLKDEV_LOOKUP
 +      select HAVE_MACH_CLKDEV
        select ICST
        select GENERIC_CLOCKEVENTS
        select ARCH_WANT_OPTIONAL_GPIOLIB
@@@ -287,7 -281,6 +287,7 @@@ config ARCH_VEXPRES
        select ARM_AMBA
        select ARM_TIMER_SP804
        select CLKDEV_LOOKUP
 +      select HAVE_MACH_CLKDEV
        select GENERIC_CLOCKEVENTS
        select HAVE_CLK
        select HAVE_PATA_PLATFORM
@@@ -328,7 -321,7 +328,7 @@@ config ARCH_CLPS711
  
  config ARCH_CNS3XXX
        bool "Cavium Networks CNS3XXX family"
-       select CPU_V6
+       select CPU_V6K
        select GENERIC_CLOCKEVENTS
        select ARM_GIC
        select MIGHT_HAVE_PCI
@@@ -344,19 -337,6 +344,19 @@@ config ARCH_GEMIN
        help
          Support for the Cortina Systems Gemini family SoCs
  
 +config ARCH_PRIMA2
 +      bool "CSR SiRFSoC PRIMA2 ARM Cortex A9 Platform"
 +      select CPU_V7
 +      select GENERIC_TIME
 +      select NO_IOPORT
 +      select GENERIC_CLOCKEVENTS
 +      select CLKDEV_LOOKUP
 +      select GENERIC_IRQ_CHIP
 +      select USE_OF
 +      select ZONE_DMA
 +      help
 +          Support for CSR SiRFSoC ARM Cortex A9 Platform
 +
  config ARCH_EBSA110
        bool "EBSA-110"
        select CPU_SA110
@@@ -396,6 -376,7 +396,7 @@@ config ARCH_MX
        select ARCH_REQUIRE_GPIOLIB
        select CLKDEV_LOOKUP
        select CLKSRC_MMIO
+       select GENERIC_IRQ_CHIP
        select HAVE_SCHED_CLOCK
        help
          Support for Freescale MXC/iMX-based family of processors
@@@ -510,6 -491,14 +511,6 @@@ config ARCH_KIRKWOO
          Support for the following Marvell Kirkwood series SoCs:
          88F6180, 88F6192 and 88F6281.
  
 -config ARCH_LOKI
 -      bool "Marvell Loki (88RC8480)"
 -      select CPU_FEROCEON
 -      select GENERIC_CLOCKEVENTS
 -      select PLAT_ORION
 -      help
 -        Support for the Marvell Loki (88RC8480) SoC.
 -
  config ARCH_LPC32XX
        bool "NXP LPC32XX"
        select CLKSRC_MMIO
@@@ -603,7 -592,6 +604,6 @@@ config ARCH_TEGR
        select GENERIC_GPIO
        select HAVE_CLK
        select HAVE_SCHED_CLOCK
-       select ARCH_HAS_BARRIERS if CACHE_L2X0
        select ARCH_HAS_CPUFREQ
        help
          This enables support for NVIDIA Tegra based systems (Tegra APX,
@@@ -630,6 -618,8 +630,8 @@@ config ARCH_PX
        select TICK_ONESHOT
        select PLAT_PXA
        select SPARSE_IRQ
+       select AUTO_ZRELADDR
+       select MULTI_IRQ_HANDLER
        help
          Support for Intel/Marvell's PXA2xx/PXA3xx processor line.
  
@@@ -650,12 -640,10 +652,12 @@@ config ARCH_SHMOBIL
        bool "Renesas SH-Mobile / R-Mobile"
        select HAVE_CLK
        select CLKDEV_LOOKUP
 +      select HAVE_MACH_CLKDEV
        select GENERIC_CLOCKEVENTS
        select NO_IOPORT
        select SPARSE_IRQ
        select MULTI_IRQ_HANDLER
 +      select PM_GENERIC_DOMAINS if PM
        help
          Support for Renesas's SH-Mobile and R-Mobile ARM platforms.
  
@@@ -740,7 -728,6 +742,7 @@@ config ARCH_S5P64X
        select GENERIC_GPIO
        select HAVE_CLK
        select CLKDEV_LOOKUP
 +      select CLKSRC_MMIO
        select HAVE_S3C2410_WATCHDOG if WATCHDOG
        select GENERIC_CLOCKEVENTS
        select HAVE_SCHED_CLOCK
@@@ -768,10 -755,10 +770,11 @@@ config ARCH_S5PV21
        bool "Samsung S5PV210/S5PC110"
        select CPU_V7
        select ARCH_SPARSEMEM_ENABLE
+       select ARCH_HAS_HOLES_MEMORYMODEL
        select GENERIC_GPIO
        select HAVE_CLK
        select CLKDEV_LOOKUP
 +      select CLKSRC_MMIO
        select ARM_L1_CACHE_SHIFT_6
        select ARCH_HAS_CPUFREQ
        select GENERIC_CLOCKEVENTS
@@@ -786,6 -773,7 +789,7 @@@ config ARCH_EXYNOS
        bool "Samsung EXYNOS4"
        select CPU_V7
        select ARCH_SPARSEMEM_ENABLE
+       select ARCH_HAS_HOLES_MEMORYMODEL
        select GENERIC_GPIO
        select HAVE_CLK
        select CLKDEV_LOOKUP
@@@ -830,7 -818,6 +834,7 @@@ config ARCH_U30
        select ARM_VIC
        select GENERIC_CLOCKEVENTS
        select CLKDEV_LOOKUP
 +      select HAVE_MACH_CLKDEV
        select GENERIC_GPIO
        help
          Support for ST-Ericsson U300 series mobile platforms.
@@@ -875,7 -862,6 +879,7 @@@ config ARCH_OMA
        select HAVE_CLK
        select ARCH_REQUIRE_GPIOLIB
        select ARCH_HAS_CPUFREQ
 +      select CLKSRC_MMIO
        select GENERIC_CLOCKEVENTS
        select HAVE_SCHED_CLOCK
        select ARCH_HAS_HOLES_MEMORYMODEL
@@@ -903,19 -889,6 +907,19 @@@ config ARCH_VT850
        select HAVE_PWM
        help
          Support for VIA/WonderMedia VT8500/WM85xx System-on-Chip.
 +
 +config ARCH_ZYNQ
 +      bool "Xilinx Zynq ARM Cortex A9 Platform"
 +      select CPU_V7
 +      select GENERIC_TIME
 +      select GENERIC_CLOCKEVENTS
 +      select CLKDEV_LOOKUP
 +      select ARM_GIC
 +      select ARM_AMBA
 +      select ICST
 +      select USE_OF
 +      help
 +        Support for Xilinx Zynq ARM Cortex A9 Platform
  endchoice
  
  #
@@@ -961,6 -934,8 +965,6 @@@ source "arch/arm/mach-kirkwood/Kconfig
  
  source "arch/arm/mach-ks8695/Kconfig"
  
 -source "arch/arm/mach-loki/Kconfig"
 -
  source "arch/arm/mach-lpc32xx/Kconfig"
  
  source "arch/arm/mach-msm/Kconfig"
@@@ -1004,6 -979,7 +1008,6 @@@ source "arch/arm/plat-spear/Kconfig
  source "arch/arm/plat-tcc/Kconfig"
  
  if ARCH_S3C2410
 -source "arch/arm/mach-s3c2400/Kconfig"
  source "arch/arm/mach-s3c2410/Kconfig"
  source "arch/arm/mach-s3c2412/Kconfig"
  source "arch/arm/mach-s3c2416/Kconfig"
@@@ -1380,6 -1356,7 +1384,6 @@@ config SMP_ON_U
  
  config HAVE_ARM_SCU
        bool
 -      depends on SMP
        help
          This option enables support for the ARM system coherency unit
  
@@@ -1748,34 -1725,17 +1752,34 @@@ config ZBOOT_RO
          Say Y here if you intend to execute your compressed kernel image
          (zImage) directly from ROM or flash.  If unsure, say N.
  
 +choice
 +      prompt "Include SD/MMC loader in zImage (EXPERIMENTAL)"
 +      depends on ZBOOT_ROM && ARCH_SH7372 && EXPERIMENTAL
 +      default ZBOOT_ROM_NONE
 +      help
 +        Include experimental SD/MMC loading code in the ROM-able zImage.
 +        With this enabled it is possible to write the the ROM-able zImage
 +        kernel image to an MMC or SD card and boot the kernel straight
 +        from the reset vector. At reset the processor Mask ROM will load
 +        the first part of the the ROM-able zImage which in turn loads the
 +        rest the kernel image to RAM.
 +
 +config ZBOOT_ROM_NONE
 +      bool "No SD/MMC loader in zImage (EXPERIMENTAL)"
 +      help
 +        Do not load image from SD or MMC
 +
  config ZBOOT_ROM_MMCIF
        bool "Include MMCIF loader in zImage (EXPERIMENTAL)"
 -      depends on ZBOOT_ROM && ARCH_SH7372 && EXPERIMENTAL
        help
 -        Say Y here to include experimental MMCIF loading code in the
 -        ROM-able zImage. With this enabled it is possible to write the
 -        the ROM-able zImage kernel image to an MMC card and boot the
 -        kernel straight from the reset vector. At reset the processor
 -        Mask ROM will load the first part of the the ROM-able zImage
 -        which in turn loads the rest the kernel image to RAM using the
 -        MMCIF hardware block.
 +        Load image from MMCIF hardware block.
 +
 +config ZBOOT_ROM_SH_MOBILE_SDHI
 +      bool "Include SuperH Mobile SDHI loader in zImage (EXPERIMENTAL)"
 +      help
 +        Load image from SDHI hardware block
 +
 +endchoice
  
  config CMDLINE
        string "Default kernel command string"
@@@ -1925,6 -1885,10 +1929,6 @@@ config CPU_FREQ_PX
        default y
        select CPU_FREQ_DEFAULT_GOV_USERSPACE
  
 -config CPU_FREQ_S3C64XX
 -      bool "CPUfreq support for Samsung S3C64XX CPUs"
 -      depends on CPU_FREQ && CPU_S3C6410
 -
  config CPU_FREQ_S3C
        bool
        help
diff --combined arch/arm/common/gic.c
index 7bdd91766d65fd2d6d777e19a8838dfb5b361f61,23564edbd849f202a8ad06ee4e6fc1abe3bb57c4..3227ca952a12a16481175650689154ca83d4a602
@@@ -38,12 -38,6 +38,6 @@@ static DEFINE_SPINLOCK(irq_controller_l
  /* Address of GIC 0 CPU interface */
  void __iomem *gic_cpu_base_addr __read_mostly;
  
- struct gic_chip_data {
-       unsigned int irq_offset;
-       void __iomem *dist_base;
-       void __iomem *cpu_base;
- };
  /*
   * Supported arch specific GIC irq extension.
   * Default make them NULL.
@@@ -179,21 -173,22 +173,21 @@@ static int gic_set_affinity(struct irq_
  {
        void __iomem *reg = gic_dist_base(d) + GIC_DIST_TARGET + (gic_irq(d) & ~3);
        unsigned int shift = (d->irq % 4) * 8;
 -      unsigned int cpu = cpumask_first(mask_val);
 +      unsigned int cpu = cpumask_any_and(mask_val, cpu_online_mask);
        u32 val, mask, bit;
  
 -      if (cpu >= 8)
 +      if (cpu >= 8 || cpu >= nr_cpu_ids)
                return -EINVAL;
  
        mask = 0xff << shift;
        bit = 1 << (cpu + shift);
  
        spin_lock(&irq_controller_lock);
 -      d->node = cpu;
        val = readl_relaxed(reg) & ~mask;
        writel_relaxed(val | bit, reg);
        spin_unlock(&irq_controller_lock);
  
 -      return 0;
 +      return IRQ_SET_MASK_OK;
  }
  #endif
  
diff --combined arch/arm/kernel/irq.c
index 0f928a131af83ab8c1fa4370bab691a7f092534d,dbc1f41575b2c1d87db293290dbbf18b04ecfe42..de3dcab8610bbbf6776d1406e3cb90cdb85d574f
@@@ -67,12 -67,12 +67,12 @@@ int arch_show_interrupts(struct seq_fil
  }
  
  /*
-  * do_IRQ handles all hardware IRQ's.  Decoded IRQs should not
-  * come via this function.  Instead, they should provide their
-  * own 'handler'
+  * handle_IRQ handles all hardware IRQ's.  Decoded IRQs should
+  * not come via this function.  Instead, they should provide their
+  * own 'handler'.  Used by platform code implementing C-based 1st
+  * level decoding.
   */
- asmlinkage void __exception_irq_entry
- asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
+ void handle_IRQ(unsigned int irq, struct pt_regs *regs)
  {
        struct pt_regs *old_regs = set_irq_regs(regs);
  
        set_irq_regs(old_regs);
  }
  
+ /*
+  * asm_do_IRQ is the interface to be used from assembly code.
+  */
+ asmlinkage void __exception_irq_entry
+ asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
+ {
+       handle_IRQ(irq, regs);
+ }
  void set_irq_flags(unsigned int irq, unsigned int iflags)
  {
        unsigned long clr = 0, set = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN;
@@@ -131,63 -140,54 +140,63 @@@ int __init arch_probe_nr_irqs(void
  
  #ifdef CONFIG_HOTPLUG_CPU
  
 -static bool migrate_one_irq(struct irq_data *d)
 +static bool migrate_one_irq(struct irq_desc *desc)
  {
 -      unsigned int cpu = cpumask_any_and(d->affinity, cpu_online_mask);
 +      struct irq_data *d = irq_desc_get_irq_data(desc);
 +      const struct cpumask *affinity = d->affinity;
 +      struct irq_chip *c;
        bool ret = false;
  
 -      if (cpu >= nr_cpu_ids) {
 -              cpu = cpumask_any(cpu_online_mask);
 +      /*
 +       * If this is a per-CPU interrupt, or the affinity does not
 +       * include this CPU, then we have nothing to do.
 +       */
 +      if (irqd_is_per_cpu(d) || !cpumask_test_cpu(smp_processor_id(), affinity))
 +              return false;
 +
 +      if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) {
 +              affinity = cpu_online_mask;
                ret = true;
        }
  
 -      pr_debug("IRQ%u: moving from cpu%u to cpu%u\n", d->irq, d->node, cpu);
 -
 -      d->chip->irq_set_affinity(d, cpumask_of(cpu), true);
 +      c = irq_data_get_irq_chip(d);
 +      if (c->irq_set_affinity)
 +              c->irq_set_affinity(d, affinity, true);
 +      else
 +              pr_debug("IRQ%u: unable to set affinity\n", d->irq);
  
        return ret;
  }
  
  /*
 - * The CPU has been marked offline.  Migrate IRQs off this CPU.  If
 - * the affinity settings do not allow other CPUs, force them onto any
 + * The current CPU has been marked offline.  Migrate IRQs off this CPU.
 + * If the affinity settings do not allow other CPUs, force them onto any
   * available CPU.
 + *
 + * Note: we must iterate over all IRQs, whether they have an attached
 + * action structure or not, as we need to get chained interrupts too.
   */
  void migrate_irqs(void)
  {
 -      unsigned int i, cpu = smp_processor_id();
 +      unsigned int i;
        struct irq_desc *desc;
        unsigned long flags;
  
        local_irq_save(flags);
  
        for_each_irq_desc(i, desc) {
 -              struct irq_data *d = &desc->irq_data;
                bool affinity_broken = false;
  
 -              raw_spin_lock(&desc->lock);
 -              do {
 -                      if (desc->action == NULL)
 -                              break;
 -
 -                      if (d->node != cpu)
 -                              break;
 +              if (!desc)
 +                      continue;
  
 -                      affinity_broken = migrate_one_irq(d);
 -              } while (0);
 +              raw_spin_lock(&desc->lock);
 +              affinity_broken = migrate_one_irq(desc);
                raw_spin_unlock(&desc->lock);
  
                if (affinity_broken && printk_ratelimit())
 -                      pr_warning("IRQ%u no longer affine to CPU%u\n", i, cpu);
 +                      pr_warning("IRQ%u no longer affine to CPU%u\n", i,
 +                              smp_processor_id());
        }
  
        local_irq_restore(flags);
index 85e6390795ac8eb6577c0ddf2f19859be8bc83da,4b804baa5f80f8ecf8131ee0a596be92831b16bc..3e7d1496cb470e23cbf10caf059f588d1727bdcb
@@@ -29,6 -29,7 +29,6 @@@
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  #include <asm/mach/time.h>
 -#include <mach/hardware.h>
  #include <mach/cns3xxx.h>
  #include <mach/irqs.h>
  #include "core.h"
@@@ -169,6 -170,8 +169,8 @@@ static struct platform_device *cns3420_
  
  static void __init cns3420_init(void)
  {
+       cns3xxx_l2x0_init();
        platform_add_devices(cns3420_pdevs, ARRAY_SIZE(cns3420_pdevs));
  
        cns3xxx_ahci_init();
index 29671ef0715296a8c380dba425911f9bff33f529,3d2c0d7d129fb4c2c3e6cbd67301e8a74d9ed573..bd5394537c88d8f305c9bda5a00cf57214263c12
@@@ -1117,6 -1117,8 +1117,8 @@@ static __init int da850_evm_init_cpufre
  static __init int da850_evm_init_cpufreq(void) { return 0; }
  #endif
  
+ #define DA850EVM_SATA_REFCLKPN_RATE   (100 * 1000 * 1000)
  static __init void da850_evm_init(void)
  {
        int ret;
        if (ret)
                pr_warning("da850_evm_init: spi 1 registration failed: %d\n",
                                ret);
+       ret = da850_register_sata(DA850EVM_SATA_REFCLKPN_RATE);
+       if (ret)
+               pr_warning("da850_evm_init: sata registration failed: %d\n",
+                               ret);
  }
  
  #ifdef CONFIG_SERIAL_8250_CONSOLE
@@@ -1261,5 -1268,4 +1268,5 @@@ MACHINE_START(DAVINCI_DA850_EVM, "DaVin
        .init_irq       = cp_intc_init,
        .timer          = &davinci_timer,
        .init_machine   = da850_evm_init,
 +      .dma_zone_size  = SZ_128M,
  MACHINE_END
index ae653194b64551a4051f2e05e23f823e2cfdb970,d0450ac2c00eafb8ca24f42a36dac4ba5408a15e..00861139101dfad13806f6a9af3e8c3acffd39ed
@@@ -44,7 -44,7 +44,7 @@@ static void __clk_enable(struct clk *cl
                __clk_enable(clk->parent);
        if (clk->usecount++ == 0 && (clk->flags & CLK_PSC))
                davinci_psc_config(psc_domain(clk), clk->gpsc, clk->lpsc,
-                               PSC_STATE_ENABLE);
+                               true, clk->flags);
  }
  
  static void __clk_disable(struct clk *clk)
@@@ -54,8 -54,7 +54,7 @@@
        if (--clk->usecount == 0 && !(clk->flags & CLK_PLL) &&
            (clk->flags & CLK_PSC))
                davinci_psc_config(psc_domain(clk), clk->gpsc, clk->lpsc,
-                               (clk->flags & PSC_SWRSTDISABLE) ?
-                               PSC_STATE_SWRSTDISABLE : PSC_STATE_DISABLE);
+                               false, clk->flags);
        if (clk->parent)
                __clk_disable(clk->parent);
  }
@@@ -239,8 -238,7 +238,7 @@@ static int __init clk_disable_unused(vo
                pr_debug("Clocks: disable unused %s\n", ck->name);
  
                davinci_psc_config(psc_domain(ck), ck->gpsc, ck->lpsc,
-                               (ck->flags & PSC_SWRSTDISABLE) ?
-                               PSC_STATE_SWRSTDISABLE : PSC_STATE_DISABLE);
+                               false, ck->flags);
        }
        spin_unlock_irq(&clockfw_lock);
  
@@@ -368,12 -366,6 +366,12 @@@ static unsigned long clk_leafclk_recalc
        return clk->parent->rate;
  }
  
 +int davinci_simple_set_rate(struct clk *clk, unsigned long rate)
 +{
 +      clk->rate = rate;
 +      return 0;
 +}
 +
  static unsigned long clk_pllclk_recalc(struct clk *clk)
  {
        u32 ctrl, mult = 1, prediv = 1, postdiv = 1;
@@@ -512,38 -504,6 +510,38 @@@ int davinci_set_pllrate(struct pll_dat
  }
  EXPORT_SYMBOL(davinci_set_pllrate);
  
 +/**
 + * davinci_set_refclk_rate() - Set the reference clock rate
 + * @rate:     The new rate.
 + *
 + * Sets the reference clock rate to a given value. This will most likely
 + * result in the entire clock tree getting updated.
 + *
 + * This is used to support boards which use a reference clock different
 + * than that used by default in <soc>.c file. The reference clock rate
 + * should be updated early in the boot process; ideally soon after the
 + * clock tree has been initialized once with the default reference clock
 + * rate (davinci_common_init()).
 + *
 + * Returns 0 on success, error otherwise.
 + */
 +int davinci_set_refclk_rate(unsigned long rate)
 +{
 +      struct clk *refclk;
 +
 +      refclk = clk_get(NULL, "ref");
 +      if (IS_ERR(refclk)) {
 +              pr_err("%s: failed to get reference clock.\n", __func__);
 +              return PTR_ERR(refclk);
 +      }
 +
 +      clk_set_rate(refclk, rate);
 +
 +      clk_put(refclk);
 +
 +      return 0;
 +}
 +
  int __init davinci_clk_init(struct clk_lookup *clocks)
    {
        struct clk_lookup *c;
index 50b2482e0ba23e090e603f86ad64f0592007a886,48ee4627e18814a44aa93d4ee7764cecd9632b55..a705f367a84d00ee47724719dc9d9df99d11e376
@@@ -111,6 -111,7 +111,7 @@@ struct clk 
  #define CLK_PLL                       BIT(4) /* PLL-derived clock */
  #define PRE_PLL                       BIT(5) /* source is before PLL mult/div */
  #define PSC_SWRSTDISABLE      BIT(6) /* Disable state is SwRstDisable */
+ #define PSC_FORCE             BIT(7) /* Force module state transtition */
  
  #define CLK(dev, con, ck)     \
        {                       \
@@@ -123,8 -124,6 +124,8 @@@ int davinci_clk_init(struct clk_lookup 
  int davinci_set_pllrate(struct pll_data *pll, unsigned int prediv,
                                unsigned int mult, unsigned int postdiv);
  int davinci_set_sysclk_rate(struct clk *clk, unsigned long rate);
 +int davinci_set_refclk_rate(unsigned long rate);
 +int davinci_simple_set_rate(struct clk *clk, unsigned long rate);
  
  extern struct platform_device davinci_wdt_device;
  extern void davinci_watchdog_reset(struct platform_device *);
index 1110fdd77ba42fd88b15a7f288b3cab4e97bf3dd,6213f0d4211d91055516882d66e6e237dfa1d7da..47fd0bc3d3e7bd03fafd8102ec93d3db343ee220
  #define       DAVINCI_PWR_SLEEP_CNTRL_BASE    0x01C41000
  
  /* Power and Sleep Controller (PSC) Domains */
 -#define DAVINCI_GPSC_ARMDOMAIN      0
 -#define DAVINCI_GPSC_DSPDOMAIN      1
 +#define DAVINCI_GPSC_ARMDOMAIN                0
 +#define DAVINCI_GPSC_DSPDOMAIN                1
  
 -#define DAVINCI_LPSC_VPSSMSTR       0
 -#define DAVINCI_LPSC_VPSSSLV        1
 -#define DAVINCI_LPSC_TPCC           2
 -#define DAVINCI_LPSC_TPTC0          3
 -#define DAVINCI_LPSC_TPTC1          4
 -#define DAVINCI_LPSC_EMAC           5
 -#define DAVINCI_LPSC_EMAC_WRAPPER   6
 -#define DAVINCI_LPSC_USB            9
 -#define DAVINCI_LPSC_ATA            10
 -#define DAVINCI_LPSC_VLYNQ          11
 -#define DAVINCI_LPSC_UHPI           12
 -#define DAVINCI_LPSC_DDR_EMIF       13
 -#define DAVINCI_LPSC_AEMIF          14
 -#define DAVINCI_LPSC_MMC_SD         15
 -#define DAVINCI_LPSC_McBSP          17
 -#define DAVINCI_LPSC_I2C            18
 -#define DAVINCI_LPSC_UART0          19
 -#define DAVINCI_LPSC_UART1          20
 -#define DAVINCI_LPSC_UART2          21
 -#define DAVINCI_LPSC_SPI            22
 -#define DAVINCI_LPSC_PWM0           23
 -#define DAVINCI_LPSC_PWM1           24
 -#define DAVINCI_LPSC_PWM2           25
 -#define DAVINCI_LPSC_GPIO           26
 -#define DAVINCI_LPSC_TIMER0         27
 -#define DAVINCI_LPSC_TIMER1         28
 -#define DAVINCI_LPSC_TIMER2         29
 -#define DAVINCI_LPSC_SYSTEM_SUBSYS  30
 -#define DAVINCI_LPSC_ARM            31
 -#define DAVINCI_LPSC_SCR2           32
 -#define DAVINCI_LPSC_SCR3           33
 -#define DAVINCI_LPSC_SCR4           34
 -#define DAVINCI_LPSC_CROSSBAR       35
 -#define DAVINCI_LPSC_CFG27          36
 -#define DAVINCI_LPSC_CFG3           37
 -#define DAVINCI_LPSC_CFG5           38
 -#define DAVINCI_LPSC_GEM            39
 -#define DAVINCI_LPSC_IMCOP          40
 +#define DAVINCI_LPSC_VPSSMSTR         0
 +#define DAVINCI_LPSC_VPSSSLV          1
 +#define DAVINCI_LPSC_TPCC             2
 +#define DAVINCI_LPSC_TPTC0            3
 +#define DAVINCI_LPSC_TPTC1            4
 +#define DAVINCI_LPSC_EMAC             5
 +#define DAVINCI_LPSC_EMAC_WRAPPER     6
 +#define DAVINCI_LPSC_USB              9
 +#define DAVINCI_LPSC_ATA              10
 +#define DAVINCI_LPSC_VLYNQ            11
 +#define DAVINCI_LPSC_UHPI             12
 +#define DAVINCI_LPSC_DDR_EMIF         13
 +#define DAVINCI_LPSC_AEMIF            14
 +#define DAVINCI_LPSC_MMC_SD           15
 +#define DAVINCI_LPSC_McBSP            17
 +#define DAVINCI_LPSC_I2C              18
 +#define DAVINCI_LPSC_UART0            19
 +#define DAVINCI_LPSC_UART1            20
 +#define DAVINCI_LPSC_UART2            21
 +#define DAVINCI_LPSC_SPI              22
 +#define DAVINCI_LPSC_PWM0             23
 +#define DAVINCI_LPSC_PWM1             24
 +#define DAVINCI_LPSC_PWM2             25
 +#define DAVINCI_LPSC_GPIO             26
 +#define DAVINCI_LPSC_TIMER0           27
 +#define DAVINCI_LPSC_TIMER1           28
 +#define DAVINCI_LPSC_TIMER2           29
 +#define DAVINCI_LPSC_SYSTEM_SUBSYS    30
 +#define DAVINCI_LPSC_ARM              31
 +#define DAVINCI_LPSC_SCR2             32
 +#define DAVINCI_LPSC_SCR3             33
 +#define DAVINCI_LPSC_SCR4             34
 +#define DAVINCI_LPSC_CROSSBAR         35
 +#define DAVINCI_LPSC_CFG27            36
 +#define DAVINCI_LPSC_CFG3             37
 +#define DAVINCI_LPSC_CFG5             38
 +#define DAVINCI_LPSC_GEM              39
 +#define DAVINCI_LPSC_IMCOP            40
  
  #define DM355_LPSC_TIMER3             5
  #define DM355_LPSC_SPI1                       6
  /*
   * LPSC Assignments
   */
 -#define DM646X_LPSC_ARM            0
 -#define DM646X_LPSC_C64X_CPU       1
 -#define DM646X_LPSC_HDVICP0        2
 -#define DM646X_LPSC_HDVICP1        3
 -#define DM646X_LPSC_TPCC           4
 -#define DM646X_LPSC_TPTC0          5
 -#define DM646X_LPSC_TPTC1          6
 -#define DM646X_LPSC_TPTC2          7
 -#define DM646X_LPSC_TPTC3          8
 -#define DM646X_LPSC_PCI            13
 -#define DM646X_LPSC_EMAC           14
 -#define DM646X_LPSC_VDCE           15
 -#define DM646X_LPSC_VPSSMSTR       16
 -#define DM646X_LPSC_VPSSSLV        17
 -#define DM646X_LPSC_TSIF0          18
 -#define DM646X_LPSC_TSIF1          19
 -#define DM646X_LPSC_DDR_EMIF       20
 -#define DM646X_LPSC_AEMIF          21
 -#define DM646X_LPSC_McASP0         22
 -#define DM646X_LPSC_McASP1         23
 -#define DM646X_LPSC_CRGEN0         24
 -#define DM646X_LPSC_CRGEN1         25
 -#define DM646X_LPSC_UART0          26
 -#define DM646X_LPSC_UART1          27
 -#define DM646X_LPSC_UART2          28
 -#define DM646X_LPSC_PWM0           29
 -#define DM646X_LPSC_PWM1           30
 -#define DM646X_LPSC_I2C            31
 -#define DM646X_LPSC_SPI            32
 -#define DM646X_LPSC_GPIO           33
 -#define DM646X_LPSC_TIMER0         34
 -#define DM646X_LPSC_TIMER1         35
 -#define DM646X_LPSC_ARM_INTC       45
 +#define DM646X_LPSC_ARM               0
 +#define DM646X_LPSC_C64X_CPU  1
 +#define DM646X_LPSC_HDVICP0   2
 +#define DM646X_LPSC_HDVICP1   3
 +#define DM646X_LPSC_TPCC      4
 +#define DM646X_LPSC_TPTC0     5
 +#define DM646X_LPSC_TPTC1     6
 +#define DM646X_LPSC_TPTC2     7
 +#define DM646X_LPSC_TPTC3     8
 +#define DM646X_LPSC_PCI               13
 +#define DM646X_LPSC_EMAC      14
 +#define DM646X_LPSC_VDCE      15
 +#define DM646X_LPSC_VPSSMSTR  16
 +#define DM646X_LPSC_VPSSSLV   17
 +#define DM646X_LPSC_TSIF0     18
 +#define DM646X_LPSC_TSIF1     19
 +#define DM646X_LPSC_DDR_EMIF  20
 +#define DM646X_LPSC_AEMIF     21
 +#define DM646X_LPSC_McASP0    22
 +#define DM646X_LPSC_McASP1    23
 +#define DM646X_LPSC_CRGEN0    24
 +#define DM646X_LPSC_CRGEN1    25
 +#define DM646X_LPSC_UART0     26
 +#define DM646X_LPSC_UART1     27
 +#define DM646X_LPSC_UART2     28
 +#define DM646X_LPSC_PWM0      29
 +#define DM646X_LPSC_PWM1      30
 +#define DM646X_LPSC_I2C               31
 +#define DM646X_LPSC_SPI               32
 +#define DM646X_LPSC_GPIO      33
 +#define DM646X_LPSC_TIMER0    34
 +#define DM646X_LPSC_TIMER1    35
 +#define DM646X_LPSC_ARM_INTC  45
  
  /* PSC0 defines */
  #define DA8XX_LPSC0_TPCC              0
  #define PSC_STATE_DISABLE     2
  #define PSC_STATE_ENABLE      3
  
 -#define MDSTAT_STATE_MASK 0x1f
 +#define MDSTAT_STATE_MASK     0x1f
+ #define MDCTL_FORCE           BIT(31)
  
  #ifndef __ASSEMBLER__
  
  extern int davinci_psc_is_clk_active(unsigned int ctlr, unsigned int id);
  extern void davinci_psc_config(unsigned int domain, unsigned int ctlr,
-               unsigned int id, u32 next_state);
+               unsigned int id, bool enable, u32 flags);
  
  #endif
  
index ae433a052df6da9b15f051416235386df9a7f0e7,dd8ae586ac568f1a1739d7fb7e4537d16dfa12d3..0c77ab99fa16a754794ece0407b4dae95ee114da
@@@ -16,7 -16,8 +16,8 @@@ config CPU_EXYNOS421
          Enable EXYNOS4210 CPU support
  
  config EXYNOS4_MCT
-       bool "Kernel timer support by MCT"
+       bool
+       default y
        help
          Use MCT (Multi Core Timer) as kernel timers
  
@@@ -25,6 -26,11 +26,11 @@@ config EXYNOS4_DEV_AHC
        help
          Compile in platform device definitions for AHCI
  
+ config EXYNOS4_SETUP_FIMD0
+       bool
+       help
+         Common setup code for FIMD0.
  config EXYNOS4_DEV_PD
        bool
        help
@@@ -35,6 -41,11 +41,11 @@@ config EXYNOS4_DEV_SYSMM
        help
          Common setup code for SYSTEM MMU in EXYNOS4
  
+ config EXYNOS4_DEV_DWMCI
+       bool
+       help
+         Compile in platform device definitions for DWMCI
  config EXYNOS4_SETUP_I2C1
        bool
        help
@@@ -103,6 -114,7 +114,7 @@@ menu "EXYNOS4 Machines
  config MACH_SMDKC210
        bool "SMDKC210"
        select CPU_EXYNOS4210
+       select S5P_DEV_FIMD0
        select S3C_DEV_RTC
        select S3C_DEV_WDT
        select S3C_DEV_I2C1
        select S3C_DEV_HSMMC1
        select S3C_DEV_HSMMC2
        select S3C_DEV_HSMMC3
 +      select SAMSUNG_DEV_PWM
 +      select SAMSUNG_DEV_BACKLIGHT
        select EXYNOS4_DEV_PD
        select EXYNOS4_DEV_SYSMMU
+       select EXYNOS4_SETUP_FIMD0
        select EXYNOS4_SETUP_I2C1
        select EXYNOS4_SETUP_SDHCI
        help
  config MACH_SMDKV310
        bool "SMDKV310"
        select CPU_EXYNOS4210
+       select S5P_DEV_FIMD0
        select S3C_DEV_RTC
        select S3C_DEV_WDT
        select S3C_DEV_I2C1
        select S3C_DEV_HSMMC1
        select S3C_DEV_HSMMC2
        select S3C_DEV_HSMMC3
 +      select SAMSUNG_DEV_BACKLIGHT
+       select EXYNOS4_DEV_AHCI
        select SAMSUNG_DEV_KEYPAD
        select EXYNOS4_DEV_PD
 +      select SAMSUNG_DEV_PWM
        select EXYNOS4_DEV_SYSMMU
+       select EXYNOS4_SETUP_FIMD0
        select EXYNOS4_SETUP_I2C1
        select EXYNOS4_SETUP_KEYPAD
        select EXYNOS4_SETUP_SDHCI
@@@ -157,13 -169,22 +173,22 @@@ config MACH_ARMLEX421
  config MACH_UNIVERSAL_C210
        bool "Mobile UNIVERSAL_C210 Board"
        select CPU_EXYNOS4210
+       select S5P_GPIO_INT
+       select S5P_DEV_FIMC0
+       select S5P_DEV_FIMC1
+       select S5P_DEV_FIMC2
+       select S5P_DEV_FIMC3
        select S3C_DEV_HSMMC
        select S3C_DEV_HSMMC2
        select S3C_DEV_HSMMC3
        select S3C_DEV_I2C1
+       select S3C_DEV_I2C3
        select S3C_DEV_I2C5
+       select S5P_DEV_MFC
        select S5P_DEV_ONENAND
+       select EXYNOS4_DEV_PD
        select EXYNOS4_SETUP_I2C1
+       select EXYNOS4_SETUP_I2C3
        select EXYNOS4_SETUP_I2C5
        select EXYNOS4_SETUP_SDHCI
        help
@@@ -180,13 -201,16 +205,16 @@@ config MACH_NUR
        select S3C_DEV_I2C1
        select S3C_DEV_I2C3
        select S3C_DEV_I2C5
+       select S5P_DEV_MFC
        select S5P_DEV_USB_EHCI
+       select EXYNOS4_DEV_PD
        select EXYNOS4_SETUP_I2C1
        select EXYNOS4_SETUP_I2C3
        select EXYNOS4_SETUP_I2C5
        select EXYNOS4_SETUP_SDHCI
        select EXYNOS4_SETUP_USB_PHY
        select SAMSUNG_DEV_PWM
+       select SAMSUNG_DEV_ADC
        help
          Machine support for Samsung Mobile NURI Board.
  
index 1366995d8c2ce6d870ae4d941b4c15e22b4b5eb1,e8b33aba14d8ce3ab74bb8f2db69fe0d9266d86a..b7fe1d7b0b1fb087f8813cbd8a4ba7cc0156686d
@@@ -13,18 -13,14 +13,13 @@@ obj-                               :
  # Core support for EXYNOS4 system
  
  obj-$(CONFIG_CPU_EXYNOS4210)  += cpu.o init.o clock.o irq-combiner.o
- obj-$(CONFIG_CPU_EXYNOS4210)  += setup-i2c0.o irq-eint.o dma.o
+ obj-$(CONFIG_CPU_EXYNOS4210)  += setup-i2c0.o irq-eint.o dma.o pmu.o
  obj-$(CONFIG_PM)              += pm.o sleep.o
 -obj-$(CONFIG_CPU_FREQ)                += cpufreq.o
  obj-$(CONFIG_CPU_IDLE)                += cpuidle.o
  
  obj-$(CONFIG_SMP)             += platsmp.o headsmp.o
  
- ifeq ($(CONFIG_EXYNOS4_MCT),y)
- obj-y                         += mct.o
- else
- obj-y                         += time.o
- obj-$(CONFIG_LOCAL_TIMERS)    += localtimer.o
- endif
+ obj-$(CONFIG_EXYNOS4_MCT)     += mct.o
  
  obj-$(CONFIG_HOTPLUG_CPU)     += hotplug.o
  
@@@ -42,8 -38,10 +37,10 @@@ obj-y                                       += dev-audio.
  obj-$(CONFIG_EXYNOS4_DEV_AHCI)                += dev-ahci.o
  obj-$(CONFIG_EXYNOS4_DEV_PD)          += dev-pd.o
  obj-$(CONFIG_EXYNOS4_DEV_SYSMMU)      += dev-sysmmu.o
+ obj-$(CONFIG_EXYNOS4_DEV_DWMCI)       += dev-dwmci.o
  
  obj-$(CONFIG_EXYNOS4_SETUP_FIMC)      += setup-fimc.o
+ obj-$(CONFIG_EXYNOS4_SETUP_FIMD0)     += setup-fimd0.o
  obj-$(CONFIG_EXYNOS4_SETUP_I2C1)      += setup-i2c1.o
  obj-$(CONFIG_EXYNOS4_SETUP_I2C2)      += setup-i2c2.o
  obj-$(CONFIG_EXYNOS4_SETUP_I2C3)      += setup-i2c3.o
index f606ea75bf439a8b58e6aadbc34ae7cbb6df6403,31cfcd64a20a26cdee03c78fda8954c8fab25d05..a7c65e05c1ebd433ff6a17a42fa3d1dfa8b99d80
@@@ -9,27 -9,30 +9,33 @@@
  */
  
  #include <linux/serial_core.h>
+ #include <linux/delay.h>
  #include <linux/gpio.h>
+ #include <linux/lcd.h>
  #include <linux/mmc/host.h>
  #include <linux/platform_device.h>
  #include <linux/smsc911x.h>
  #include <linux/io.h>
  #include <linux/i2c.h>
 +#include <linux/pwm_backlight.h>
  
  #include <asm/mach/arch.h>
  #include <asm/mach-types.h>
  
+ #include <video/platform_lcd.h>
  #include <plat/regs-serial.h>
  #include <plat/regs-srom.h>
+ #include <plat/regs-fb-v4.h>
  #include <plat/exynos4.h>
  #include <plat/cpu.h>
  #include <plat/devs.h>
+ #include <plat/fb.h>
  #include <plat/sdhci.h>
  #include <plat/iic.h>
  #include <plat/pd.h>
 +#include <plat/gpio-cfg.h>
 +#include <plat/backlight.h>
  
  #include <mach/map.h>
  
@@@ -114,6 -117,67 +120,67 @@@ static struct s3c_sdhci_platdata smdkc2
        .clk_type               = S3C_SDHCI_CLK_DIV_EXTERNAL,
  };
  
+ static void lcd_lte480wv_set_power(struct plat_lcd_data *pd,
+                                  unsigned int power)
+ {
+       if (power) {
+ #if !defined(CONFIG_BACKLIGHT_PWM)
+               gpio_request_one(EXYNOS4_GPD0(1), GPIOF_OUT_INIT_HIGH, "GPD0");
+               gpio_free(EXYNOS4_GPD0(1));
+ #endif
+               /* fire nRESET on power up */
+               gpio_request(EXYNOS4_GPX0(6), "GPX0");
+               gpio_direction_output(EXYNOS4_GPX0(6), 1);
+               mdelay(100);
+               gpio_set_value(EXYNOS4_GPX0(6), 0);
+               mdelay(10);
+               gpio_set_value(EXYNOS4_GPX0(6), 1);
+               mdelay(10);
+               gpio_free(EXYNOS4_GPX0(6));
+       } else {
+ #if !defined(CONFIG_BACKLIGHT_PWM)
+               gpio_request_one(EXYNOS4_GPD0(1), GPIOF_OUT_INIT_LOW, "GPD0");
+               gpio_free(EXYNOS4_GPD0(1));
+ #endif
+       }
+ }
+ static struct plat_lcd_data smdkc210_lcd_lte480wv_data = {
+       .set_power              = lcd_lte480wv_set_power,
+ };
+ static struct platform_device smdkc210_lcd_lte480wv = {
+       .name                   = "platform-lcd",
+       .dev.parent             = &s5p_device_fimd0.dev,
+       .dev.platform_data      = &smdkc210_lcd_lte480wv_data,
+ };
+ static struct s3c_fb_pd_win smdkc210_fb_win0 = {
+       .win_mode = {
+               .left_margin    = 13,
+               .right_margin   = 8,
+               .upper_margin   = 7,
+               .lower_margin   = 5,
+               .hsync_len      = 3,
+               .vsync_len      = 1,
+               .xres           = 800,
+               .yres           = 480,
+       },
+       .max_bpp                = 32,
+       .default_bpp            = 24,
+ };
+ static struct s3c_fb_platdata smdkc210_lcd0_pdata __initdata = {
+       .win[0]         = &smdkc210_fb_win0,
+       .vidcon0        = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
+       .vidcon1        = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
+       .setup_gpio     = exynos4_fimd0_gpio_setup_24bpp,
+ };
  static struct resource smdkc210_smsc911x_resources[] = {
        [0] = {
                .start  = EXYNOS4_PA_SROM_BANK(1),
@@@ -168,6 -232,8 +235,8 @@@ static struct platform_device *smdkc210
        &exynos4_device_pd[PD_GPS],
        &exynos4_device_sysmmu,
        &samsung_asoc_dma,
+       &s5p_device_fimd0,
+       &smdkc210_lcd_lte480wv,
        &smdkc210_smsc911x,
  };
  
@@@ -194,17 -260,6 +263,17 @@@ static void __init smdkc210_smsc911x_in
                     (0x1 << S5P_SROM_BCX__TACS__SHIFT), S5P_SROM_BC1);
  }
  
 +/* LCD Backlight data */
 +static struct samsung_bl_gpio_info smdkc210_bl_gpio_info = {
 +      .no = EXYNOS4_GPD0(1),
 +      .func = S3C_GPIO_SFN(2),
 +};
 +
 +static struct platform_pwm_backlight_data smdkc210_bl_data = {
 +      .pwm_id = 1,
 +      .pwm_period_ns  = 1000,
 +};
 +
  static void __init smdkc210_map_io(void)
  {
        s5p_init_io(NULL, 0, S5P_VA_CHIPID);
@@@ -224,7 -279,7 +293,8 @@@ static void __init smdkc210_machine_ini
        s3c_sdhci2_set_platdata(&smdkc210_hsmmc2_pdata);
        s3c_sdhci3_set_platdata(&smdkc210_hsmmc3_pdata);
  
 +      samsung_bl_set(&smdkc210_bl_gpio_info, &smdkc210_bl_data);
+       s5p_fimd0_set_platdata(&smdkc210_lcd0_pdata);
  
        platform_add_devices(smdkc210_devices, ARRAY_SIZE(smdkc210_devices));
  }
index df1107828abda612015fb0365736e7145d9d69c4,ccc8fa11b54124c886513ae94e4780bcf97955ef..ea4149556860f45c471cff55891cf7fc051a6980
@@@ -16,7 -16,6 +16,7 @@@
  #include <linux/io.h>
  #include <linux/i2c.h>
  #include <linux/input.h>
 +#include <linux/pwm_backlight.h>
  
  #include <asm/mach/arch.h>
  #include <asm/mach-types.h>
@@@ -30,8 -29,6 +30,8 @@@
  #include <plat/sdhci.h>
  #include <plat/iic.h>
  #include <plat/pd.h>
 +#include <plat/gpio-cfg.h>
 +#include <plat/backlight.h>
  
  #include <mach/map.h>
  
@@@ -184,9 -181,12 +184,12 @@@ static struct platform_device *smdkv310
        &exynos4_device_pd[PD_CAM],
        &exynos4_device_pd[PD_TV],
        &exynos4_device_pd[PD_GPS],
+       &exynos4_device_spdif,
        &exynos4_device_sysmmu,
        &samsung_asoc_dma,
+       &samsung_asoc_idma,
        &smdkv310_smsc911x,
+       &exynos4_device_ahci,
  };
  
  static void __init smdkv310_smsc911x_init(void)
                     (0x1 << S5P_SROM_BCX__TACS__SHIFT), S5P_SROM_BC1);
  }
  
 +/* LCD Backlight data */
 +static struct samsung_bl_gpio_info smdkv310_bl_gpio_info = {
 +      .no = EXYNOS4_GPD0(1),
 +      .func = S3C_GPIO_SFN(2),
 +};
 +
 +static struct platform_pwm_backlight_data smdkv310_bl_data = {
 +      .pwm_id = 1,
 +      .pwm_period_ns  = 1000,
 +};
 +
  static void __init smdkv310_map_io(void)
  {
        s5p_init_io(NULL, 0, S5P_VA_CHIPID);
@@@ -244,8 -233,6 +247,8 @@@ static void __init smdkv310_machine_ini
  
        samsung_keypad_set_platdata(&smdkv310_keypad_data);
  
 +      samsung_bl_set(&smdkv310_bl_gpio_info, &smdkv310_bl_data);
 +
        platform_add_devices(smdkv310_devices, ARRAY_SIZE(smdkv310_devices));
  }
  
index b68d5bdf04cf57e52691dd0778a9bf6f664662a0,a7f312c12893da47f5be6c0416cd32a23cf7bf76..7c2282c6ba812496b0637e871427ed22bae81316
  
  #include <mach/hardware.h>
  #include <mach/regs-clock.h>
+ #include <mach/regs-pmu.h>
  
  extern void exynos4_secondary_startup(void);
  
+ #define CPU1_BOOT_REG S5P_VA_SYSRAM
  /*
   * control for which core is the next to come out of the secondary
   * boot "holding pen"
@@@ -58,6 -61,31 +61,31 @@@ static void __iomem *scu_base_addr(void
  
  static DEFINE_SPINLOCK(boot_lock);
  
+ static void __cpuinit exynos4_gic_secondary_init(void)
+ {
+       void __iomem *dist_base = S5P_VA_GIC_DIST +
+                                (EXYNOS4_GIC_BANK_OFFSET * smp_processor_id());
+       void __iomem *cpu_base = S5P_VA_GIC_CPU +
+                               (EXYNOS4_GIC_BANK_OFFSET * smp_processor_id());
+       int i;
+       /*
+        * Deal with the banked PPI and SGI interrupts - disable all
+        * PPI interrupts, ensure all SGI interrupts are enabled.
+        */
+       __raw_writel(0xffff0000, dist_base + GIC_DIST_ENABLE_CLEAR);
+       __raw_writel(0x0000ffff, dist_base + GIC_DIST_ENABLE_SET);
+       /*
+        * Set priority on PPI and SGI interrupts
+        */
+       for (i = 0; i < 32; i += 4)
+               __raw_writel(0xa0a0a0a0, dist_base + GIC_DIST_PRI + i * 4 / 4);
+       __raw_writel(0xf0, cpu_base + GIC_CPU_PRIMASK);
+       __raw_writel(1, cpu_base + GIC_CPU_CTRL);
+ }
  void __cpuinit platform_secondary_init(unsigned int cpu)
  {
        /*
@@@ -65,7 -93,7 +93,7 @@@
         * core (e.g. timer irq), then they will not have been enabled
         * for us: do so
         */
-       gic_secondary_init(0);
+       exynos4_gic_secondary_init();
  
        /*
         * let the primary processor know we're out of the
@@@ -100,16 -128,41 +128,41 @@@ int __cpuinit boot_secondary(unsigned i
         */
        write_pen_release(cpu);
  
+       if (!(__raw_readl(S5P_ARM_CORE1_STATUS) & S5P_CORE_LOCAL_PWR_EN)) {
+               __raw_writel(S5P_CORE_LOCAL_PWR_EN,
+                            S5P_ARM_CORE1_CONFIGURATION);
+               timeout = 10;
+               /* wait max 10 ms until cpu1 is on */
+               while ((__raw_readl(S5P_ARM_CORE1_STATUS)
+                       & S5P_CORE_LOCAL_PWR_EN) != S5P_CORE_LOCAL_PWR_EN) {
+                       if (timeout-- == 0)
+                               break;
+                       mdelay(1);
+               }
+               if (timeout == 0) {
+                       printk(KERN_ERR "cpu1 power enable failed");
+                       spin_unlock(&boot_lock);
+                       return -ETIMEDOUT;
+               }
+       }
        /*
         * Send the secondary CPU a soft interrupt, thereby causing
         * the boot monitor to read the system wide flags register,
         * and branch to the address found there.
         */
-       gic_raise_softirq(cpumask_of(cpu), 1);
  
        timeout = jiffies + (1 * HZ);
        while (time_before(jiffies, timeout)) {
                smp_rmb();
+               __raw_writel(BSYM(virt_to_phys(exynos4_secondary_startup)),
+                       CPU1_BOOT_REG);
+               gic_raise_softirq(cpumask_of(cpu), 1);
                if (pen_release == -1)
                        break;
  
@@@ -154,6 -207,14 +207,6 @@@ void __init smp_init_cpus(void
  
  void __init platform_smp_prepare_cpus(unsigned int max_cpus)
  {
 -      int i;
 -
 -      /*
 -       * Initialise the present map, which describes the set of CPUs
 -       * actually populated at the present time.
 -       */
 -      for (i = 0; i < max_cpus; i++)
 -              set_cpu_present(i, true);
  
        scu_enable(scu_base_addr());
  
index 533c28f758ca437ba8f6ca2570a4ba006dca6e45,9ef2e99fb8b6fb5ff2add3aa638b097772cc49d3..bc6ca9482de197f210a57b85a3a4852f4f5c54fe
  #include <linux/suspend.h>
  #include <linux/syscore_ops.h>
  #include <linux/io.h>
+ #include <linux/err.h>
+ #include <linux/clk.h>
  
  #include <asm/cacheflush.h>
  #include <asm/hardware/cache-l2x0.h>
  
  #include <plat/cpu.h>
  #include <plat/pm.h>
+ #include <plat/pll.h>
+ #include <plat/regs-srom.h>
  
  #include <mach/regs-irq.h>
  #include <mach/regs-gpio.h>
  #include <mach/regs-clock.h>
  #include <mach/regs-pmu.h>
  #include <mach/pm-core.h>
- static struct sleep_save exynos4_sleep[] = {
-       { .reg = S5P_ARM_CORE0_LOWPWR                   , .val = 0x2, },
-       { .reg = S5P_DIS_IRQ_CORE0                      , .val = 0x0, },
-       { .reg = S5P_DIS_IRQ_CENTRAL0                   , .val = 0x0, },
-       { .reg = S5P_ARM_CORE1_LOWPWR                   , .val = 0x2, },
-       { .reg = S5P_DIS_IRQ_CORE1                      , .val = 0x0, },
-       { .reg = S5P_DIS_IRQ_CENTRAL1                   , .val = 0x0, },
-       { .reg = S5P_ARM_COMMON_LOWPWR                  , .val = 0x2, },
-       { .reg = S5P_L2_0_LOWPWR                        , .val = 0x3, },
-       { .reg = S5P_L2_1_LOWPWR                        , .val = 0x3, },
-       { .reg = S5P_CMU_ACLKSTOP_LOWPWR                , .val = 0x0, },
-       { .reg = S5P_CMU_SCLKSTOP_LOWPWR                , .val = 0x0, },
-       { .reg = S5P_CMU_RESET_LOWPWR                   , .val = 0x0, },
-       { .reg = S5P_APLL_SYSCLK_LOWPWR                 , .val = 0x0, },
-       { .reg = S5P_MPLL_SYSCLK_LOWPWR                 , .val = 0x0, },
-       { .reg = S5P_VPLL_SYSCLK_LOWPWR                 , .val = 0x0, },
-       { .reg = S5P_EPLL_SYSCLK_LOWPWR                 , .val = 0x0, },
-       { .reg = S5P_CMU_CLKSTOP_GPS_ALIVE_LOWPWR       , .val = 0x0, },
-       { .reg = S5P_CMU_RESET_GPSALIVE_LOWPWR          , .val = 0x0, },
-       { .reg = S5P_CMU_CLKSTOP_CAM_LOWPWR             , .val = 0x0, },
-       { .reg = S5P_CMU_CLKSTOP_TV_LOWPWR              , .val = 0x0, },
-       { .reg = S5P_CMU_CLKSTOP_MFC_LOWPWR             , .val = 0x0, },
-       { .reg = S5P_CMU_CLKSTOP_G3D_LOWPWR             , .val = 0x0, },
-       { .reg = S5P_CMU_CLKSTOP_LCD0_LOWPWR            , .val = 0x0, },
-       { .reg = S5P_CMU_CLKSTOP_LCD1_LOWPWR            , .val = 0x0, },
-       { .reg = S5P_CMU_CLKSTOP_MAUDIO_LOWPWR          , .val = 0x0, },
-       { .reg = S5P_CMU_CLKSTOP_GPS_LOWPWR             , .val = 0x0, },
-       { .reg = S5P_CMU_RESET_CAM_LOWPWR               , .val = 0x0, },
-       { .reg = S5P_CMU_RESET_TV_LOWPWR                , .val = 0x0, },
-       { .reg = S5P_CMU_RESET_MFC_LOWPWR               , .val = 0x0, },
-       { .reg = S5P_CMU_RESET_G3D_LOWPWR               , .val = 0x0, },
-       { .reg = S5P_CMU_RESET_LCD0_LOWPWR              , .val = 0x0, },
-       { .reg = S5P_CMU_RESET_LCD1_LOWPWR              , .val = 0x0, },
-       { .reg = S5P_CMU_RESET_MAUDIO_LOWPWR            , .val = 0x0, },
-       { .reg = S5P_CMU_RESET_GPS_LOWPWR               , .val = 0x0, },
-       { .reg = S5P_TOP_BUS_LOWPWR                     , .val = 0x0, },
-       { .reg = S5P_TOP_RETENTION_LOWPWR               , .val = 0x1, },
-       { .reg = S5P_TOP_PWR_LOWPWR                     , .val = 0x3, },
-       { .reg = S5P_LOGIC_RESET_LOWPWR                 , .val = 0x0, },
-       { .reg = S5P_ONENAND_MEM_LOWPWR                 , .val = 0x0, },
-       { .reg = S5P_MODIMIF_MEM_LOWPWR                 , .val = 0x0, },
-       { .reg = S5P_G2D_ACP_MEM_LOWPWR                 , .val = 0x0, },
-       { .reg = S5P_USBOTG_MEM_LOWPWR                  , .val = 0x0, },
-       { .reg = S5P_HSMMC_MEM_LOWPWR                   , .val = 0x0, },
-       { .reg = S5P_CSSYS_MEM_LOWPWR                   , .val = 0x0, },
-       { .reg = S5P_SECSS_MEM_LOWPWR                   , .val = 0x0, },
-       { .reg = S5P_PCIE_MEM_LOWPWR                    , .val = 0x0, },
-       { .reg = S5P_SATA_MEM_LOWPWR                    , .val = 0x0, },
-       { .reg = S5P_PAD_RETENTION_DRAM_LOWPWR          , .val = 0x0, },
-       { .reg = S5P_PAD_RETENTION_MAUDIO_LOWPWR        , .val = 0x0, },
-       { .reg = S5P_PAD_RETENTION_GPIO_LOWPWR          , .val = 0x0, },
-       { .reg = S5P_PAD_RETENTION_UART_LOWPWR          , .val = 0x0, },
-       { .reg = S5P_PAD_RETENTION_MMCA_LOWPWR          , .val = 0x0, },
-       { .reg = S5P_PAD_RETENTION_MMCB_LOWPWR          , .val = 0x0, },
-       { .reg = S5P_PAD_RETENTION_EBIA_LOWPWR          , .val = 0x0, },
-       { .reg = S5P_PAD_RETENTION_EBIB_LOWPWR          , .val = 0x0, },
-       { .reg = S5P_PAD_RETENTION_ISOLATION_LOWPWR     , .val = 0x0, },
-       { .reg = S5P_PAD_RETENTION_ALV_SEL_LOWPWR       , .val = 0x0, },
-       { .reg = S5P_XUSBXTI_LOWPWR                     , .val = 0x0, },
-       { .reg = S5P_XXTI_LOWPWR                        , .val = 0x0, },
-       { .reg = S5P_EXT_REGULATOR_LOWPWR               , .val = 0x0, },
-       { .reg = S5P_GPIO_MODE_LOWPWR                   , .val = 0x0, },
-       { .reg = S5P_GPIO_MODE_MAUDIO_LOWPWR            , .val = 0x0, },
-       { .reg = S5P_CAM_LOWPWR                         , .val = 0x0, },
-       { .reg = S5P_TV_LOWPWR                          , .val = 0x0, },
-       { .reg = S5P_MFC_LOWPWR                         , .val = 0x0, },
-       { .reg = S5P_G3D_LOWPWR                         , .val = 0x0, },
-       { .reg = S5P_LCD0_LOWPWR                        , .val = 0x0, },
-       { .reg = S5P_LCD1_LOWPWR                        , .val = 0x0, },
-       { .reg = S5P_MAUDIO_LOWPWR                      , .val = 0x0, },
-       { .reg = S5P_GPS_LOWPWR                         , .val = 0x0, },
-       { .reg = S5P_GPS_ALIVE_LOWPWR                   , .val = 0x0, },
- };
+ #include <mach/pmu.h>
  
  static struct sleep_save exynos4_set_clksrc[] = {
        { .reg = S5P_CLKSRC_MASK_TOP                    , .val = 0x00000001, },
        { .reg = S5P_CLKSRC_MASK_DMC                    , .val = 0x00010000, },
  };
  
+ static struct sleep_save exynos4_epll_save[] = {
+       SAVE_ITEM(S5P_EPLL_CON0),
+       SAVE_ITEM(S5P_EPLL_CON1),
+ };
+ static struct sleep_save exynos4_vpll_save[] = {
+       SAVE_ITEM(S5P_VPLL_CON0),
+       SAVE_ITEM(S5P_VPLL_CON1),
+ };
  static struct sleep_save exynos4_core_save[] = {
        /* CMU side */
        SAVE_ITEM(S5P_CLKDIV_LEFTBUS),
        SAVE_ITEM(S5P_CLKGATE_IP_LEFTBUS),
        SAVE_ITEM(S5P_CLKDIV_RIGHTBUS),
        SAVE_ITEM(S5P_CLKGATE_IP_RIGHTBUS),
-       SAVE_ITEM(S5P_EPLL_CON0),
-       SAVE_ITEM(S5P_EPLL_CON1),
-       SAVE_ITEM(S5P_VPLL_CON0),
-       SAVE_ITEM(S5P_VPLL_CON1),
        SAVE_ITEM(S5P_CLKSRC_TOP0),
        SAVE_ITEM(S5P_CLKSRC_TOP1),
        SAVE_ITEM(S5P_CLKSRC_CAM),
+       SAVE_ITEM(S5P_CLKSRC_TV),
        SAVE_ITEM(S5P_CLKSRC_MFC),
+       SAVE_ITEM(S5P_CLKSRC_G3D),
        SAVE_ITEM(S5P_CLKSRC_IMAGE),
        SAVE_ITEM(S5P_CLKSRC_LCD0),
        SAVE_ITEM(S5P_CLKSRC_LCD1),
        SAVE_ITEM(S5P_CLKDIV_PERIL4),
        SAVE_ITEM(S5P_CLKDIV_PERIL5),
        SAVE_ITEM(S5P_CLKDIV_TOP),
+       SAVE_ITEM(S5P_CLKSRC_MASK_TOP),
        SAVE_ITEM(S5P_CLKSRC_MASK_CAM),
        SAVE_ITEM(S5P_CLKSRC_MASK_TV),
        SAVE_ITEM(S5P_CLKSRC_MASK_LCD0),
        SAVE_ITEM(S5P_CLKSRC_MASK_FSYS),
        SAVE_ITEM(S5P_CLKSRC_MASK_PERIL0),
        SAVE_ITEM(S5P_CLKSRC_MASK_PERIL1),
+       SAVE_ITEM(S5P_CLKDIV2_RATIO),
        SAVE_ITEM(S5P_CLKGATE_SCLKCAM),
        SAVE_ITEM(S5P_CLKGATE_IP_CAM),
        SAVE_ITEM(S5P_CLKGATE_IP_TV),
        SAVE_ITEM(S5P_CLKGATE_IP_DMC),
        SAVE_ITEM(S5P_CLKSRC_CPU),
        SAVE_ITEM(S5P_CLKDIV_CPU),
+       SAVE_ITEM(S5P_CLKDIV_CPU + 0x4),
        SAVE_ITEM(S5P_CLKGATE_SCLKCPU),
        SAVE_ITEM(S5P_CLKGATE_IP_CPU),
        /* GIC side */
        SAVE_ITEM(S5P_VA_GIC_CPU + 0x000),
        SAVE_ITEM(S5P_VA_GIC_CPU + 0x004),
        SAVE_ITEM(S5P_VA_COMBINER_BASE + 0x070),
        SAVE_ITEM(S5P_VA_COMBINER_BASE + 0x080),
        SAVE_ITEM(S5P_VA_COMBINER_BASE + 0x090),
+       /* SROM side */
+       SAVE_ITEM(S5P_SROM_BW),
+       SAVE_ITEM(S5P_SROM_BC0),
+       SAVE_ITEM(S5P_SROM_BC1),
+       SAVE_ITEM(S5P_SROM_BC2),
+       SAVE_ITEM(S5P_SROM_BC3),
  };
  
  static struct sleep_save exynos4_l2cc_save[] = {
        SAVE_ITEM(S5P_VA_L2CC + L2X0_AUX_CTRL),
  };
  
 -void exynos4_cpu_suspend(unsigned long arg)
+ /* For Cortex-A9 Diagnostic and Power control register */
+ static unsigned int save_arm_register[2];
 +static int exynos4_cpu_suspend(unsigned long arg)
  {
-       unsigned long tmp;
-       unsigned long mask = 0xFFFFFFFF;
-       /* Setting Central Sequence Register for power down mode */
-       tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION);
-       tmp &= ~(S5P_CENTRAL_LOWPWR_CFG);
-       __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
-       /* Setting Central Sequence option Register */
-       tmp = __raw_readl(S5P_CENTRAL_SEQ_OPTION);
-       tmp &= ~(S5P_USE_MASK);
-       tmp |= S5P_USE_STANDBY_WFI0;
-       __raw_writel(tmp, S5P_CENTRAL_SEQ_OPTION);
-       /* Clear all interrupt pending to avoid early wakeup */
-       __raw_writel(mask, (S5P_VA_GIC_DIST + 0x280));
-       __raw_writel(mask, (S5P_VA_GIC_DIST + 0x284));
-       __raw_writel(mask, (S5P_VA_GIC_DIST + 0x288));
-       /* Disable all interrupt */
-       __raw_writel(0x0, (S5P_VA_GIC_CPU + 0x000));
-       __raw_writel(0x0, (S5P_VA_GIC_DIST + 0x000));
-       __raw_writel(mask, (S5P_VA_GIC_DIST + 0x184));
-       __raw_writel(mask, (S5P_VA_GIC_DIST + 0x188));
        outer_flush_all();
  
        /* issue the standby signal into the pm unit. */
@@@ -326,12 -250,14 +250,14 @@@ static void exynos4_pm_prepare(void
  
        s3c_pm_do_save(exynos4_core_save, ARRAY_SIZE(exynos4_core_save));
        s3c_pm_do_save(exynos4_l2cc_save, ARRAY_SIZE(exynos4_l2cc_save));
+       s3c_pm_do_save(exynos4_epll_save, ARRAY_SIZE(exynos4_epll_save));
+       s3c_pm_do_save(exynos4_vpll_save, ARRAY_SIZE(exynos4_vpll_save));
  
        tmp = __raw_readl(S5P_INFORM1);
  
        /* Set value of power down register for sleep mode */
  
-       s3c_pm_do_restore_core(exynos4_sleep, ARRAY_SIZE(exynos4_sleep));
+       exynos4_sys_powerdown_conf(SYS_SLEEP);
        __raw_writel(S5P_CHECK_SLEEP, S5P_INFORM1);
  
        /* ensure at least INFORM0 has the resume address */
@@@ -373,12 -299,80 +299,80 @@@ void exynos4_scu_enable(void __iomem *s
        flush_cache_all();
  }
  
+ static unsigned long pll_base_rate;
+ static void exynos4_restore_pll(void)
+ {
+       unsigned long pll_con, locktime, lockcnt;
+       unsigned long pll_in_rate;
+       unsigned int p_div, epll_wait = 0, vpll_wait = 0;
+       if (pll_base_rate == 0)
+               return;
+       pll_in_rate = pll_base_rate;
+       /* EPLL */
+       pll_con = exynos4_epll_save[0].val;
+       if (pll_con & (1 << 31)) {
+               pll_con &= (PLL46XX_PDIV_MASK << PLL46XX_PDIV_SHIFT);
+               p_div = (pll_con >> PLL46XX_PDIV_SHIFT);
+               pll_in_rate /= 1000000;
+               locktime = (3000 / pll_in_rate) * p_div;
+               lockcnt = locktime * 10000 / (10000 / pll_in_rate);
+               __raw_writel(lockcnt, S5P_EPLL_LOCK);
+               s3c_pm_do_restore_core(exynos4_epll_save,
+                                       ARRAY_SIZE(exynos4_epll_save));
+               epll_wait = 1;
+       }
+       pll_in_rate = pll_base_rate;
+       /* VPLL */
+       pll_con = exynos4_vpll_save[0].val;
+       if (pll_con & (1 << 31)) {
+               pll_in_rate /= 1000000;
+               /* 750us */
+               locktime = 750;
+               lockcnt = locktime * 10000 / (10000 / pll_in_rate);
+               __raw_writel(lockcnt, S5P_VPLL_LOCK);
+               s3c_pm_do_restore_core(exynos4_vpll_save,
+                                       ARRAY_SIZE(exynos4_vpll_save));
+               vpll_wait = 1;
+       }
+       /* Wait PLL locking */
+       do {
+               if (epll_wait) {
+                       pll_con = __raw_readl(S5P_EPLL_CON0);
+                       if (pll_con & (1 << S5P_EPLLCON0_LOCKED_SHIFT))
+                               epll_wait = 0;
+               }
+               if (vpll_wait) {
+                       pll_con = __raw_readl(S5P_VPLL_CON0);
+                       if (pll_con & (1 << S5P_VPLLCON0_LOCKED_SHIFT))
+                               vpll_wait = 0;
+               }
+       } while (epll_wait || vpll_wait);
+ }
  static struct sysdev_driver exynos4_pm_driver = {
        .add            = exynos4_pm_add,
  };
  
  static __init int exynos4_pm_drvinit(void)
  {
+       struct clk *pll_base;
        unsigned int tmp;
  
        s3c_pm_init();
        tmp |= ((0xFF << 8) | (0x1F << 1));
        __raw_writel(tmp, S5P_WAKEUP_MASK);
  
+       pll_base = clk_get(NULL, "xtal");
+       if (!IS_ERR(pll_base)) {
+               pll_base_rate = clk_get_rate(pll_base);
+               clk_put(pll_base);
+       }
        return sysdev_driver_register(&exynos4_sysclass, &exynos4_pm_driver);
  }
  arch_initcall(exynos4_pm_drvinit);
  
+ static int exynos4_pm_suspend(void)
+ {
+       unsigned long tmp;
+       /* Setting Central Sequence Register for power down mode */
+       tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION);
+       tmp &= ~S5P_CENTRAL_LOWPWR_CFG;
+       __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
+       /* Save Power control register */
+       asm ("mrc p15, 0, %0, c15, c0, 0"
+            : "=r" (tmp) : : "cc");
+       save_arm_register[0] = tmp;
+       /* Save Diagnostic register */
+       asm ("mrc p15, 0, %0, c15, c0, 1"
+            : "=r" (tmp) : : "cc");
+       save_arm_register[1] = tmp;
+       return 0;
+ }
  static void exynos4_pm_resume(void)
  {
+       unsigned long tmp;
+       /*
+        * If PMU failed while entering sleep mode, WFI will be
+        * ignored by PMU and then exiting cpu_do_idle().
+        * S5P_CENTRAL_LOWPWR_CFG bit will not be set automatically
+        * in this situation.
+        */
+       tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION);
+       if (!(tmp & S5P_CENTRAL_LOWPWR_CFG)) {
+               tmp |= S5P_CENTRAL_LOWPWR_CFG;
+               __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
+               /* No need to perform below restore code */
+               goto early_wakeup;
+       }
+       /* Restore Power control register */
+       tmp = save_arm_register[0];
+       asm volatile ("mcr p15, 0, %0, c15, c0, 0"
+                     : : "r" (tmp)
+                     : "cc");
+       /* Restore Diagnostic register */
+       tmp = save_arm_register[1];
+       asm volatile ("mcr p15, 0, %0, c15, c0, 1"
+                     : : "r" (tmp)
+                     : "cc");
        /* For release retention */
  
        __raw_writel((1 << 28), S5P_PAD_RET_MAUDIO_OPTION);
  
        s3c_pm_do_restore_core(exynos4_core_save, ARRAY_SIZE(exynos4_core_save));
  
+       exynos4_restore_pll();
        exynos4_scu_enable(S5P_VA_SCU);
  
  #ifdef CONFIG_CACHE_L2X0
        /* enable L2X0*/
        writel_relaxed(1, S5P_VA_L2CC + L2X0_CTRL);
  #endif
+ early_wakeup:
+       return;
  }
  
  static struct syscore_ops exynos4_pm_syscore_ops = {
+       .suspend        = exynos4_pm_suspend,
        .resume         = exynos4_pm_resume,
  };
  
index 6d7d518686a5334aaff4044fcf899bd028b63cbf,4f32a8a9aeed2780a27a320d7e8c84411063beae..3f05dfebacc9f7c2bb7df18c0646b7a775100097
@@@ -22,6 -22,7 +22,7 @@@
  #include <linux/init.h>
  #include <mach/hardware.h>
  #include <mach/common.h>
+ #include <mach/devices-common.h>
  #include <asm/pgtable.h>
  #include <asm/mach/map.h>
  #include <mach/irqs.h>
@@@ -76,10 -77,12 +77,12 @@@ void __init mx21_init_irq(void
  
  void __init imx21_soc_init(void)
  {
 -      mxc_register_gpio(0, MX21_GPIO1_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
 -      mxc_register_gpio(1, MX21_GPIO2_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
 -      mxc_register_gpio(2, MX21_GPIO3_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
 -      mxc_register_gpio(3, MX21_GPIO4_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
 -      mxc_register_gpio(4, MX21_GPIO5_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
 -      mxc_register_gpio(5, MX21_GPIO6_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
 +      mxc_register_gpio("imx21-gpio", 0, MX21_GPIO1_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
 +      mxc_register_gpio("imx21-gpio", 1, MX21_GPIO2_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
 +      mxc_register_gpio("imx21-gpio", 2, MX21_GPIO3_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
 +      mxc_register_gpio("imx21-gpio", 3, MX21_GPIO4_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
 +      mxc_register_gpio("imx21-gpio", 4, MX21_GPIO5_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
 +      mxc_register_gpio("imx21-gpio", 5, MX21_GPIO6_BASE_ADDR, SZ_256, MX21_INT_GPIO, 0);
+       imx_add_imx_dma();
  }
index 9a1591c2508d64907d673825e7ce167baa3149f3,1e0c95651c2315a5c7a113e27f5b71572cd80c6b..8bf0291646528d935020b112f39a957faf3ab096
@@@ -24,6 -24,7 +24,7 @@@
  #include <asm/mach/map.h>
  
  #include <mach/common.h>
+ #include <mach/devices-common.h>
  #include <mach/hardware.h>
  #include <mach/mx25.h>
  #include <mach/iomux-v3.h>
@@@ -61,11 -62,34 +62,35 @@@ void __init mx25_init_irq(void
        mxc_init_irq(MX25_IO_ADDRESS(MX25_AVIC_BASE_ADDR));
  }
  
+ static struct sdma_script_start_addrs imx25_sdma_script __initdata = {
+       .ap_2_ap_addr = 729,
+       .uart_2_mcu_addr = 904,
+       .per_2_app_addr = 1255,
+       .mcu_2_app_addr = 834,
+       .uartsh_2_mcu_addr = 1120,
+       .per_2_shp_addr = 1329,
+       .mcu_2_shp_addr = 1048,
+       .ata_2_mcu_addr = 1560,
+       .mcu_2_ata_addr = 1479,
+       .app_2_per_addr = 1189,
+       .app_2_mcu_addr = 770,
+       .shp_2_per_addr = 1407,
+       .shp_2_mcu_addr = 979,
+ };
+ static struct sdma_platform_data imx25_sdma_pdata __initdata = {
+       .sdma_version = 2,
+       .fw_name = "sdma-imx25.bin",
+       .script_addrs = &imx25_sdma_script,
+ };
  void __init imx25_soc_init(void)
  {
 -      mxc_register_gpio(0, MX25_GPIO1_BASE_ADDR, SZ_16K, MX25_INT_GPIO1, 0);
 -      mxc_register_gpio(1, MX25_GPIO2_BASE_ADDR, SZ_16K, MX25_INT_GPIO2, 0);
 -      mxc_register_gpio(2, MX25_GPIO3_BASE_ADDR, SZ_16K, MX25_INT_GPIO3, 0);
 -      mxc_register_gpio(3, MX25_GPIO4_BASE_ADDR, SZ_16K, MX25_INT_GPIO4, 0);
 +      /* i.mx25 has the i.mx31 type gpio */
 +      mxc_register_gpio("imx31-gpio", 0, MX25_GPIO1_BASE_ADDR, SZ_16K, MX25_INT_GPIO1, 0);
 +      mxc_register_gpio("imx31-gpio", 1, MX25_GPIO2_BASE_ADDR, SZ_16K, MX25_INT_GPIO2, 0);
 +      mxc_register_gpio("imx31-gpio", 2, MX25_GPIO3_BASE_ADDR, SZ_16K, MX25_INT_GPIO3, 0);
 +      mxc_register_gpio("imx31-gpio", 3, MX25_GPIO4_BASE_ADDR, SZ_16K, MX25_INT_GPIO4, 0);
+       imx_add_imx_sdma(MX25_SDMA_BASE_ADDR, MX25_INT_SDMA, &imx25_sdma_pdata);
  }
index 133b30003ddbbb3a0100fe82d4b05f091a324f9b,944e02d3ccc23776c1bf7d00ceef712fe9d06374..96dd1f5ea7bddc32d8745b7447b56cf20402640e
@@@ -22,6 -22,7 +22,7 @@@
  #include <linux/init.h>
  #include <mach/hardware.h>
  #include <mach/common.h>
+ #include <mach/devices-common.h>
  #include <asm/pgtable.h>
  #include <asm/mach/map.h>
  #include <mach/irqs.h>
@@@ -76,11 -77,12 +77,13 @@@ void __init mx27_init_irq(void
  
  void __init imx27_soc_init(void)
  {
 -      mxc_register_gpio(0, MX27_GPIO1_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
 -      mxc_register_gpio(1, MX27_GPIO2_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
 -      mxc_register_gpio(2, MX27_GPIO3_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
 -      mxc_register_gpio(3, MX27_GPIO4_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
 -      mxc_register_gpio(4, MX27_GPIO5_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
 -      mxc_register_gpio(5, MX27_GPIO6_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
 +      /* i.mx27 has the i.mx21 type gpio */
 +      mxc_register_gpio("imx21-gpio", 0, MX27_GPIO1_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
 +      mxc_register_gpio("imx21-gpio", 1, MX27_GPIO2_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
 +      mxc_register_gpio("imx21-gpio", 2, MX27_GPIO3_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
 +      mxc_register_gpio("imx21-gpio", 3, MX27_GPIO4_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
 +      mxc_register_gpio("imx21-gpio", 4, MX27_GPIO5_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
 +      mxc_register_gpio("imx21-gpio", 5, MX27_GPIO6_BASE_ADDR, SZ_256, MX27_INT_GPIO, 0);
+       imx_add_imx_dma();
  }
index 6d103c01b8b949c433348f7929abb2b7074121a1,a1ff96f249d1b90f2689909a47d06d0cc259c402..61bff38cb9552efa7648ce6a811c748f174b50e9
@@@ -24,6 -24,7 +24,7 @@@
  #include <asm/mach/map.h>
  
  #include <mach/common.h>
+ #include <mach/devices-common.h>
  #include <mach/hardware.h>
  #include <mach/iomux-v3.h>
  #include <mach/irqs.h>
@@@ -57,9 -58,35 +58,35 @@@ void __init mx31_init_irq(void
        mxc_init_irq(MX31_IO_ADDRESS(MX31_AVIC_BASE_ADDR));
  }
  
+ static struct sdma_script_start_addrs imx31_to1_sdma_script __initdata = {
+       .per_2_per_addr = 1677,
+ };
+ static struct sdma_script_start_addrs imx31_to2_sdma_script __initdata = {
+       .ap_2_ap_addr = 423,
+       .ap_2_bp_addr = 829,
+       .bp_2_ap_addr = 1029,
+ };
+ static struct sdma_platform_data imx31_sdma_pdata __initdata = {
+       .sdma_version = 1,
+       .fw_name = "sdma-imx31-to2.bin",
+       .script_addrs = &imx31_to2_sdma_script,
+ };
  void __init imx31_soc_init(void)
  {
 -      mxc_register_gpio(0, MX31_GPIO1_BASE_ADDR, SZ_16K, MX31_INT_GPIO1, 0);
 -      mxc_register_gpio(1, MX31_GPIO2_BASE_ADDR, SZ_16K, MX31_INT_GPIO2, 0);
 -      mxc_register_gpio(2, MX31_GPIO3_BASE_ADDR, SZ_16K, MX31_INT_GPIO3, 0);
+       int to_version = mx31_revision() >> 4;
 +      mxc_register_gpio("imx31-gpio", 0, MX31_GPIO1_BASE_ADDR, SZ_16K, MX31_INT_GPIO1, 0);
 +      mxc_register_gpio("imx31-gpio", 1, MX31_GPIO2_BASE_ADDR, SZ_16K, MX31_INT_GPIO2, 0);
 +      mxc_register_gpio("imx31-gpio", 2, MX31_GPIO3_BASE_ADDR, SZ_16K, MX31_INT_GPIO3, 0);
+       if (to_version == 1) {
+               strncpy(imx31_sdma_pdata.fw_name, "sdma-imx31-to1.bin",
+                       strlen(imx31_sdma_pdata.fw_name));
+               imx31_sdma_pdata.script_addrs = &imx31_to1_sdma_script;
+       }
+       imx_add_imx_sdma(MX31_SDMA_BASE_ADDR, MX31_INT_SDMA, &imx31_sdma_pdata);
  }
index bb068bc8dab7f8091cb3804ef85a1f169e350cfa,da530ca48aeadd6c757af71973b22f4e037cad0a..98769ae34377ddb46afd2ad56958ee853e23ba47
@@@ -25,6 -25,7 +25,7 @@@
  #include <asm/hardware/cache-l2x0.h>
  
  #include <mach/common.h>
+ #include <mach/devices-common.h>
  #include <mach/hardware.h>
  #include <mach/iomux-v3.h>
  #include <mach/irqs.h>
@@@ -54,10 -55,55 +55,56 @@@ void __init mx35_init_irq(void
        mxc_init_irq(MX35_IO_ADDRESS(MX35_AVIC_BASE_ADDR));
  }
  
+ static struct sdma_script_start_addrs imx35_to1_sdma_script __initdata = {
+       .ap_2_ap_addr = 642,
+       .uart_2_mcu_addr = 817,
+       .mcu_2_app_addr = 747,
+       .uartsh_2_mcu_addr = 1183,
+       .per_2_shp_addr = 1033,
+       .mcu_2_shp_addr = 961,
+       .ata_2_mcu_addr = 1333,
+       .mcu_2_ata_addr = 1252,
+       .app_2_mcu_addr = 683,
+       .shp_2_per_addr = 1111,
+       .shp_2_mcu_addr = 892,
+ };
+ static struct sdma_script_start_addrs imx35_to2_sdma_script __initdata = {
+       .ap_2_ap_addr = 729,
+       .uart_2_mcu_addr = 904,
+       .per_2_app_addr = 1597,
+       .mcu_2_app_addr = 834,
+       .uartsh_2_mcu_addr = 1270,
+       .per_2_shp_addr = 1120,
+       .mcu_2_shp_addr = 1048,
+       .ata_2_mcu_addr = 1429,
+       .mcu_2_ata_addr = 1339,
+       .app_2_per_addr = 1531,
+       .app_2_mcu_addr = 770,
+       .shp_2_per_addr = 1198,
+       .shp_2_mcu_addr = 979,
+ };
+ static struct sdma_platform_data imx35_sdma_pdata __initdata = {
+       .sdma_version = 2,
+       .fw_name = "sdma-imx35-to2.bin",
+       .script_addrs = &imx35_to2_sdma_script,
+ };
  void __init imx35_soc_init(void)
  {
 -      mxc_register_gpio(0, MX35_GPIO1_BASE_ADDR, SZ_16K, MX35_INT_GPIO1, 0);
 -      mxc_register_gpio(1, MX35_GPIO2_BASE_ADDR, SZ_16K, MX35_INT_GPIO2, 0);
 -      mxc_register_gpio(2, MX35_GPIO3_BASE_ADDR, SZ_16K, MX35_INT_GPIO3, 0);
+       int to_version = mx35_revision() >> 4;
 +      /* i.mx35 has the i.mx31 type gpio */
 +      mxc_register_gpio("imx31-gpio", 0, MX35_GPIO1_BASE_ADDR, SZ_16K, MX35_INT_GPIO1, 0);
 +      mxc_register_gpio("imx31-gpio", 1, MX35_GPIO2_BASE_ADDR, SZ_16K, MX35_INT_GPIO2, 0);
 +      mxc_register_gpio("imx31-gpio", 2, MX35_GPIO3_BASE_ADDR, SZ_16K, MX35_INT_GPIO3, 0);
+       if (to_version == 1) {
+               strncpy(imx35_sdma_pdata.fw_name, "sdma-imx35-to1.bin",
+                       strlen(imx35_sdma_pdata.fw_name));
+               imx35_sdma_pdata.script_addrs = &imx35_to1_sdma_script;
+       }
+       imx_add_imx_sdma(MX35_SDMA_BASE_ADDR, MX35_INT_SDMA, &imx35_sdma_pdata);
  }
index ab9f999106c765131d00421f22fa8e16cc75ab7f,96d451dc305c5daf7ba8e6288507a9bee39885b7..0156f535dae76facab7e23bd5eb58580e208a207
@@@ -66,6 -66,7 +66,7 @@@ void __init pxa168_init_irq(void
  /* APB peripheral clocks */
  static APBC_CLK(uart1, PXA168_UART1, 1, 14745600);
  static APBC_CLK(uart2, PXA168_UART2, 1, 14745600);
+ static APBC_CLK(uart3, PXA168_UART3, 1, 14745600);
  static APBC_CLK(twsi0, PXA168_TWSI0, 1, 33000000);
  static APBC_CLK(twsi1, PXA168_TWSI1, 1, 33000000);
  static APBC_CLK(pwm1, PXA168_PWM1, 1, 13000000);
@@@ -79,13 -80,15 +80,15 @@@ static APBC_CLK(ssp4, PXA168_SSP4, 4, 0
  static APBC_CLK(ssp5, PXA168_SSP5, 4, 0);
  static APBC_CLK(keypad, PXA168_KPC, 0, 32000);
  
 -static APMU_CLK(nand, NAND, 0x01db, 208000000);
 +static APMU_CLK(nand, NAND, 0x19b, 156000000);
  static APMU_CLK(lcd, LCD, 0x7f, 312000000);
+ static APMU_CLK(eth, ETH, 0x09, 0);
  
  /* device and clock bindings */
  static struct clk_lookup pxa168_clkregs[] = {
        INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL),
        INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL),
+       INIT_CLKREG(&clk_uart3, "pxa2xx-uart.2", NULL),
        INIT_CLKREG(&clk_twsi0, "pxa2xx-i2c.0", NULL),
        INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.1", NULL),
        INIT_CLKREG(&clk_pwm1, "pxa168-pwm.0", NULL),
        INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL),
        INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL),
        INIT_CLKREG(&clk_keypad, "pxa27x-keypad", NULL),
+       INIT_CLKREG(&clk_eth, "pxa168-eth", "MFUCLK"),
  };
  
  static int __init pxa168_init(void)
@@@ -149,6 -153,7 +153,7 @@@ void pxa168_clear_keypad_wakeup(void
  /* on-chip devices */
  PXA168_DEVICE(uart1, "pxa2xx-uart", 0, UART1, 0xd4017000, 0x30, 21, 22);
  PXA168_DEVICE(uart2, "pxa2xx-uart", 1, UART2, 0xd4018000, 0x30, 23, 24);
+ PXA168_DEVICE(uart3, "pxa2xx-uart", 2, UART3, 0xd4026000, 0x30, 23, 24);
  PXA168_DEVICE(twsi0, "pxa2xx-i2c", 0, TWSI0, 0xd4011000, 0x28);
  PXA168_DEVICE(twsi1, "pxa2xx-i2c", 1, TWSI1, 0xd4025000, 0x28);
  PXA168_DEVICE(pwm1, "pxa168-pwm", 0, NONE, 0xd401a000, 0x10);
@@@ -163,3 -168,4 +168,4 @@@ PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SS
  PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, 0xd4021000, 0x40, 60, 61);
  PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, 0xd420b000, 0x1c8);
  PXA168_DEVICE(keypad, "pxa27x-keypad", -1, KEYPAD, 0xd4012000, 0x4c);
+ PXA168_DEVICE(eth, "pxa168-eth", -1, MFU, 0xc0800000, 0x0fff);
index 0adeea17d123c1ddf44a5525d2b33f58128d908d,ff16d86ff59744aaa39a7010b9a174058c1852d9..23cd809fa8b8dab1f02c7d36e3f9e74effc0ec82
@@@ -1254,12 -1254,20 +1254,20 @@@ DEFINE_CLOCK(uart2_ipg_clk, 1, MXC_CCM_
        NULL,  NULL, &ipg_clk, &aips_tz1_clk);
  DEFINE_CLOCK(uart3_ipg_clk, 2, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG7_OFFSET,
        NULL,  NULL, &ipg_clk, &spba_clk);
+ DEFINE_CLOCK(uart4_ipg_clk, 3, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG4_OFFSET,
+       NULL,  NULL, &ipg_clk, &spba_clk);
+ DEFINE_CLOCK(uart5_ipg_clk, 4, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG6_OFFSET,
+       NULL,  NULL, &ipg_clk, &spba_clk);
  DEFINE_CLOCK(uart1_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG4_OFFSET,
        NULL,  NULL, &uart_root_clk, &uart1_ipg_clk);
  DEFINE_CLOCK(uart2_clk, 1, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG6_OFFSET,
        NULL,  NULL, &uart_root_clk, &uart2_ipg_clk);
  DEFINE_CLOCK(uart3_clk, 2, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG8_OFFSET,
        NULL,  NULL, &uart_root_clk, &uart3_ipg_clk);
+ DEFINE_CLOCK(uart4_clk, 3, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG5_OFFSET,
+       NULL,  NULL, &uart_root_clk, &uart4_ipg_clk);
+ DEFINE_CLOCK(uart5_clk, 4, MXC_CCM_CCGR7, MXC_CCM_CCGRx_CG7_OFFSET,
+       NULL,  NULL, &uart_root_clk, &uart5_ipg_clk);
  
  /* GPT */
  DEFINE_CLOCK(gpt_ipg_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG10_OFFSET,
@@@ -1279,6 -1287,8 +1287,8 @@@ DEFINE_CLOCK(i2c2_clk, 1, MXC_CCM_CCGR1
        NULL, NULL, &ipg_perclk, NULL);
  DEFINE_CLOCK(hsi2c_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG11_OFFSET,
        NULL, NULL, &ipg_clk, NULL);
+ DEFINE_CLOCK(i2c3_mx53_clk, 0, MXC_CCM_CCGR1, MXC_CCM_CCGRx_CG11_OFFSET,
+       NULL, NULL, &ipg_perclk, NULL);
  
  /* FEC */
  DEFINE_CLOCK(fec_clk, 0, MXC_CCM_CCGR2, MXC_CCM_CCGRx_CG12_OFFSET,
@@@ -1442,8 -1452,7 +1452,8 @@@ static struct clk_lookup mx51_lookups[
        _REGISTER_CLOCK(NULL, "gpt_32k", gpt_32k_clk)
        _REGISTER_CLOCK("imx51-ecspi.0", NULL, ecspi1_clk)
        _REGISTER_CLOCK("imx51-ecspi.1", NULL, ecspi2_clk)
 -      _REGISTER_CLOCK("imx51-cspi.0", NULL, cspi_clk)
 +      /* i.mx51 has the i.mx35 type cspi */
 +      _REGISTER_CLOCK("imx35-cspi.0", NULL, cspi_clk)
        _REGISTER_CLOCK("sdhci-esdhc-imx.0", NULL, esdhc1_clk)
        _REGISTER_CLOCK("sdhci-esdhc-imx.1", NULL, esdhc2_clk)
        _REGISTER_CLOCK("sdhci-esdhc-imx.2", NULL, esdhc3_clk)
@@@ -1463,22 -1472,28 +1473,30 @@@ static struct clk_lookup mx53_lookups[
        _REGISTER_CLOCK("imx-uart.0", NULL, uart1_clk)
        _REGISTER_CLOCK("imx-uart.1", NULL, uart2_clk)
        _REGISTER_CLOCK("imx-uart.2", NULL, uart3_clk)
+       _REGISTER_CLOCK("imx-uart.3", NULL, uart4_clk)
+       _REGISTER_CLOCK("imx-uart.4", NULL, uart5_clk)
        _REGISTER_CLOCK(NULL, "gpt", gpt_clk)
        _REGISTER_CLOCK("fec.0", NULL, fec_clk)
        _REGISTER_CLOCK(NULL, "iim_clk", iim_clk)
        _REGISTER_CLOCK("imx-i2c.0", NULL, i2c1_clk)
        _REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk)
+       _REGISTER_CLOCK("imx-i2c.2", NULL, i2c3_mx53_clk)
        _REGISTER_CLOCK("sdhci-esdhc-imx.0", NULL, esdhc1_clk)
        _REGISTER_CLOCK("sdhci-esdhc-imx.1", NULL, esdhc2_mx53_clk)
        _REGISTER_CLOCK("sdhci-esdhc-imx.2", NULL, esdhc3_mx53_clk)
        _REGISTER_CLOCK("sdhci-esdhc-imx.3", NULL, esdhc4_mx53_clk)
 -      _REGISTER_CLOCK("imx53-ecspi.0", NULL, ecspi1_clk)
 -      _REGISTER_CLOCK("imx53-ecspi.1", NULL, ecspi2_clk)
 -      _REGISTER_CLOCK("imx53-cspi.0", NULL, cspi_clk)
 +      /* i.mx53 has the i.mx51 type ecspi */
 +      _REGISTER_CLOCK("imx51-ecspi.0", NULL, ecspi1_clk)
 +      _REGISTER_CLOCK("imx51-ecspi.1", NULL, ecspi2_clk)
 +      /* i.mx53 has the i.mx25 type cspi */
 +      _REGISTER_CLOCK("imx35-cspi.0", NULL, cspi_clk)
        _REGISTER_CLOCK("imx2-wdt.0", NULL, dummy_clk)
        _REGISTER_CLOCK("imx2-wdt.1", NULL, dummy_clk)
+       _REGISTER_CLOCK("imx-sdma", NULL, sdma_clk)
+       _REGISTER_CLOCK("imx-ssi.0", NULL, ssi1_clk)
+       _REGISTER_CLOCK("imx-ssi.1", NULL, ssi2_clk)
+       _REGISTER_CLOCK("imx-ssi.2", NULL, ssi3_clk)
+       _REGISTER_CLOCK("imx-keypad", NULL, dummy_clk)
  };
  
  static void clk_tree_init(void)
diff --combined arch/arm/mach-mx5/mm.c
index 665843d6c2b2431c18a855e32432474c6c708bd0,1b7059f1ac7645c42eb305ffd30270ee0986cf9b..ef8aec9319b63e45fa7adcbcd3b267dda62aac1c
@@@ -18,6 -18,7 +18,7 @@@
  
  #include <mach/hardware.h>
  #include <mach/common.h>
+ #include <mach/devices-common.h>
  #include <mach/iomux-v3.h>
  
  /*
@@@ -100,23 -101,64 +101,66 @@@ void __init mx53_init_irq(void
        tzic_init_irq(tzic_virt);
  }
  
+ static struct sdma_script_start_addrs imx51_sdma_script __initdata = {
+       .ap_2_ap_addr = 642,
+       .uart_2_mcu_addr = 817,
+       .mcu_2_app_addr = 747,
+       .mcu_2_shp_addr = 961,
+       .ata_2_mcu_addr = 1473,
+       .mcu_2_ata_addr = 1392,
+       .app_2_per_addr = 1033,
+       .app_2_mcu_addr = 683,
+       .shp_2_per_addr = 1251,
+       .shp_2_mcu_addr = 892,
+ };
+ static struct sdma_platform_data imx51_sdma_pdata __initdata = {
+       .sdma_version = 2,
+       .fw_name = "sdma-imx51.bin",
+       .script_addrs = &imx51_sdma_script,
+ };
+ static struct sdma_script_start_addrs imx53_sdma_script __initdata = {
+       .ap_2_ap_addr = 642,
+       .app_2_mcu_addr = 683,
+       .mcu_2_app_addr = 747,
+       .uart_2_mcu_addr = 817,
+       .shp_2_mcu_addr = 891,
+       .mcu_2_shp_addr = 960,
+       .uartsh_2_mcu_addr = 1032,
+       .spdif_2_mcu_addr = 1100,
+       .mcu_2_spdif_addr = 1134,
+       .firi_2_mcu_addr = 1193,
+       .mcu_2_firi_addr = 1290,
+ };
+ static struct sdma_platform_data imx53_sdma_pdata __initdata = {
+       .sdma_version = 2,
+       .fw_name = "sdma-imx53.bin",
+       .script_addrs = &imx53_sdma_script,
+ };
  void __init imx51_soc_init(void)
  {
 -      mxc_register_gpio(0, MX51_GPIO1_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO1_LOW, MX51_MXC_INT_GPIO1_HIGH);
 -      mxc_register_gpio(1, MX51_GPIO2_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO2_LOW, MX51_MXC_INT_GPIO2_HIGH);
 -      mxc_register_gpio(2, MX51_GPIO3_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO3_LOW, MX51_MXC_INT_GPIO3_HIGH);
 -      mxc_register_gpio(3, MX51_GPIO4_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO4_LOW, MX51_MXC_INT_GPIO4_HIGH);
 +      /* i.mx51 has the i.mx31 type gpio */
 +      mxc_register_gpio("imx31-gpio", 0, MX51_GPIO1_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO1_LOW, MX51_MXC_INT_GPIO1_HIGH);
 +      mxc_register_gpio("imx31-gpio", 1, MX51_GPIO2_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO2_LOW, MX51_MXC_INT_GPIO2_HIGH);
 +      mxc_register_gpio("imx31-gpio", 2, MX51_GPIO3_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO3_LOW, MX51_MXC_INT_GPIO3_HIGH);
 +      mxc_register_gpio("imx31-gpio", 3, MX51_GPIO4_BASE_ADDR, SZ_16K, MX51_MXC_INT_GPIO4_LOW, MX51_MXC_INT_GPIO4_HIGH);
+       imx_add_imx_sdma(MX51_SDMA_BASE_ADDR, MX51_INT_SDMA, &imx51_sdma_pdata);
  }
  
  void __init imx53_soc_init(void)
  {
 -      mxc_register_gpio(0, MX53_GPIO1_BASE_ADDR, SZ_16K, MX53_INT_GPIO1_LOW, MX53_INT_GPIO1_HIGH);
 -      mxc_register_gpio(1, MX53_GPIO2_BASE_ADDR, SZ_16K, MX53_INT_GPIO2_LOW, MX53_INT_GPIO2_HIGH);
 -      mxc_register_gpio(2, MX53_GPIO3_BASE_ADDR, SZ_16K, MX53_INT_GPIO3_LOW, MX53_INT_GPIO3_HIGH);
 -      mxc_register_gpio(3, MX53_GPIO4_BASE_ADDR, SZ_16K, MX53_INT_GPIO4_LOW, MX53_INT_GPIO4_HIGH);
 -      mxc_register_gpio(4, MX53_GPIO5_BASE_ADDR, SZ_16K, MX53_INT_GPIO5_LOW, MX53_INT_GPIO5_HIGH);
 -      mxc_register_gpio(5, MX53_GPIO6_BASE_ADDR, SZ_16K, MX53_INT_GPIO6_LOW, MX53_INT_GPIO6_HIGH);
 -      mxc_register_gpio(6, MX53_GPIO7_BASE_ADDR, SZ_16K, MX53_INT_GPIO7_LOW, MX53_INT_GPIO7_HIGH);
 +      /* i.mx53 has the i.mx31 type gpio */
 +      mxc_register_gpio("imx31-gpio", 0, MX53_GPIO1_BASE_ADDR, SZ_16K, MX53_INT_GPIO1_LOW, MX53_INT_GPIO1_HIGH);
 +      mxc_register_gpio("imx31-gpio", 1, MX53_GPIO2_BASE_ADDR, SZ_16K, MX53_INT_GPIO2_LOW, MX53_INT_GPIO2_HIGH);
 +      mxc_register_gpio("imx31-gpio", 2, MX53_GPIO3_BASE_ADDR, SZ_16K, MX53_INT_GPIO3_LOW, MX53_INT_GPIO3_HIGH);
 +      mxc_register_gpio("imx31-gpio", 3, MX53_GPIO4_BASE_ADDR, SZ_16K, MX53_INT_GPIO4_LOW, MX53_INT_GPIO4_HIGH);
 +      mxc_register_gpio("imx31-gpio", 4, MX53_GPIO5_BASE_ADDR, SZ_16K, MX53_INT_GPIO5_LOW, MX53_INT_GPIO5_HIGH);
 +      mxc_register_gpio("imx31-gpio", 5, MX53_GPIO6_BASE_ADDR, SZ_16K, MX53_INT_GPIO6_LOW, MX53_INT_GPIO6_HIGH);
 +      mxc_register_gpio("imx31-gpio", 6, MX53_GPIO7_BASE_ADDR, SZ_16K, MX53_INT_GPIO7_LOW, MX53_INT_GPIO7_HIGH);
+       imx_add_imx_sdma(MX53_SDMA_BASE_ADDR, MX53_INT_SDMA, &imx53_sdma_pdata);
  }
index bc55d07566ca78900eb4a56cbc38113900c90023,1719927c24d63b575a50beed30746f922004ea24..13cf518bbbf85d253676dc6c3c72fef9b66c16e4
@@@ -21,7 -21,8 +21,8 @@@
  #include <asm/mach-types.h>
  #include <asm/mach/map.h>
  
- #include <mach/pxa2xx-regs.h>
+ #include <mach/pxa25x.h>
+ #include <mach/pxa27x.h>
  #include <mach/audio.h>
  #include <mach/pxafb.h>
  #include <mach/smemc.h>
@@@ -516,9 -517,8 +517,11 @@@ MACHINE_START(ARMCORE, "Compulab CM-X2X
        .map_io         = cmx2xx_map_io,
        .nr_irqs        = CMX2XX_NR_IRQS,
        .init_irq       = cmx2xx_init_irq,
+       /* NOTE: pxa25x_handle_irq() works on PXA27x w/o camera support */
+       .handle_irq     = pxa25x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = cmx2xx_init,
 +#ifdef CONFIG_PCI
 +      .dma_zone_size  = SZ_64M,
 +#endif
  MACHINE_END
index b199596f9c3daeda69dea75dbf5d16bddf6216ab,de577c7e3acec015a747e70d85eed45276b47546..b6a51340270b9a433c0fbce5335793237c30ee18
@@@ -12,7 -12,6 +12,7 @@@
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
 +#define pr_fmt(fmt) "%s: " fmt, __func__
  
  #include <linux/module.h>
  #include <linux/kernel.h>
@@@ -162,10 -161,10 +162,10 @@@ static mfp_cfg_t cm_x3xx_mfp_cfg[] __in
        GPIO99_GPIO,                    /* Ethernet IRQ */
  
        /* RTC GPIOs */
 -      GPIO95_GPIO,                    /* RTC CS */
 -      GPIO96_GPIO,                    /* RTC WR */
 -      GPIO97_GPIO,                    /* RTC RD */
 -      GPIO98_GPIO,                    /* RTC IO */
 +      GPIO95_GPIO | MFP_LPM_DRIVE_HIGH,       /* RTC CS */
 +      GPIO96_GPIO | MFP_LPM_DRIVE_HIGH,       /* RTC WR */
 +      GPIO97_GPIO | MFP_LPM_DRIVE_HIGH,       /* RTC RD */
 +      GPIO98_GPIO,                            /* RTC IO */
  
        /* Standard I2C */
        GPIO21_I2C_SCL,
@@@ -485,13 -484,14 +485,13 @@@ static int cm_x300_ulpi_phy_reset(void
        int err;
  
        /* reset the PHY */
 -      err = gpio_request(GPIO_ULPI_PHY_RST, "ulpi reset");
 +      err = gpio_request_one(GPIO_ULPI_PHY_RST, GPIOF_OUT_INIT_LOW,
 +                             "ulpi reset");
        if (err) {
 -              pr_err("%s: failed to request ULPI reset GPIO: %d\n",
 -                     __func__, err);
 +              pr_err("failed to request ULPI reset GPIO: %d\n", err);
                return err;
        }
  
 -      gpio_direction_output(GPIO_ULPI_PHY_RST, 0);
        msleep(10);
        gpio_set_value(GPIO_ULPI_PHY_RST, 1);
        msleep(10);
@@@ -510,7 -510,8 +510,7 @@@ static inline int cm_x300_u2d_init(stru
                pout_clk = clk_get(NULL, "CLK_POUT");
                if (IS_ERR(pout_clk)) {
                        err = PTR_ERR(pout_clk);
 -                      pr_err("%s: failed to get CLK_POUT: %d\n",
 -                             __func__, err);
 +                      pr_err("failed to get CLK_POUT: %d\n", err);
                        return err;
                }
                clk_enable(pout_clk);
@@@ -767,36 -768,39 +767,36 @@@ static void __init cm_x300_init_da9030(
        irq_set_irq_wake(IRQ_WAKEUP0, 1);
  }
  
 +/* wi2wi gpio setting for system_rev >= 130 */
 +static struct gpio cm_x300_wi2wi_gpios[] __initdata = {
 +      { 71, GPIOF_OUT_INIT_HIGH, "wlan en" },
 +      { 70, GPIOF_OUT_INIT_HIGH, "bt reset" },
 +};
 +
  static void __init cm_x300_init_wi2wi(void)
  {
        int bt_reset, wlan_en;
        int err;
  
        if (system_rev < 130) {
 -              wlan_en = 77;
 -              bt_reset = 78;
 -      } else {
 -              wlan_en = 71;
 -              bt_reset = 70;
 +              cm_x300_wi2wi_gpios[0].gpio = 77;       /* wlan en */
 +              cm_x300_wi2wi_gpios[1].gpio = 78;       /* bt reset */
        }
  
        /* Libertas and CSR reset */
 -      err = gpio_request(wlan_en, "wlan en");
 +      err = gpio_request_array(ARRAY_AND_SIZE(cm_x300_wi2wi_gpios));
        if (err) {
 -              pr_err("CM-X300: failed to request wlan en gpio: %d\n", err);
 -      } else {
 -              gpio_direction_output(wlan_en, 1);
 -              gpio_free(wlan_en);
 +              pr_err("failed to request wifi/bt gpios: %d\n", err);
 +              return;
        }
  
 -      err = gpio_request(bt_reset, "bt reset");
 -      if (err) {
 -              pr_err("CM-X300: failed to request bt reset gpio: %d\n", err);
 -      } else {
 -              gpio_direction_output(bt_reset, 1);
 -              udelay(10);
 -              gpio_set_value(bt_reset, 0);
 -              udelay(10);
 -              gpio_set_value(bt_reset, 1);
 -              gpio_free(bt_reset);
 -      }
 +      udelay(10);
 +      gpio_set_value(bt_reset, 0);
 +      udelay(10);
 +      gpio_set_value(bt_reset, 1);
 +
 +      gpio_free(wlan_en);
 +      gpio_free(bt_reset);
  }
  
  /* MFP */
@@@ -855,6 -859,7 +855,7 @@@ MACHINE_START(CM_X300, "CM-X300 module"
        .boot_params    = 0xa0000100,
        .map_io         = pxa3xx_map_io,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = cm_x300_init,
        .fixup          = cm_x300_fixup,
index 99960a1814e0c32313c6f8d073094fbdf5958b00,9a734cb7236e412b5acf27aa30fcdf35dbebcee0..c748a473a2ffb383f2c79a681a0c3e2aea80fc85
@@@ -135,6 -135,42 +135,6 @@@ static unsigned long hx4700_pin_config[
        GPIO66_GPIO,    /* nSDIO_IRQ */
  };
  
 -#define HX4700_GPIO_IN(num, _desc) \
 -      { .gpio = (num), .dir = 0, .desc = (_desc) }
 -#define HX4700_GPIO_OUT(num, _init, _desc) \
 -      { .gpio = (num), .dir = 1, .init = (_init), .desc = (_desc) }
 -struct gpio_ress {
 -      unsigned gpio : 8;
 -      unsigned dir : 1;
 -      unsigned init : 1;
 -      char *desc;
 -};
 -
 -static int hx4700_gpio_request(struct gpio_ress *gpios, int size)
 -{
 -      int i, rc = 0;
 -      int gpio;
 -      int dir;
 -
 -      for (i = 0; (!rc) && (i < size); i++) {
 -              gpio = gpios[i].gpio;
 -              dir = gpios[i].dir;
 -              rc = gpio_request(gpio, gpios[i].desc);
 -              if (rc) {
 -                      pr_err("Error requesting GPIO %d(%s) : %d\n",
 -                             gpio, gpios[i].desc, rc);
 -                      continue;
 -              }
 -              if (dir)
 -                      gpio_direction_output(gpio, gpios[i].init);
 -              else
 -                      gpio_direction_input(gpio);
 -      }
 -      while ((rc) && (--i >= 0))
 -              gpio_free(gpios[i].gpio);
 -      return rc;
 -}
 -
  /*
   * IRDA
   */
@@@ -793,30 -829,26 +793,30 @@@ static struct platform_device *devices[
        &pcmcia,
  };
  
 -static struct gpio_ress global_gpios[] = {
 -      HX4700_GPIO_IN(GPIO12_HX4700_ASIC3_IRQ, "ASIC3_IRQ"),
 -      HX4700_GPIO_IN(GPIO13_HX4700_W3220_IRQ, "W3220_IRQ"),
 -      HX4700_GPIO_IN(GPIO14_HX4700_nWLAN_IRQ, "WLAN_IRQ"),
 -      HX4700_GPIO_OUT(GPIO59_HX4700_LCD_PC1,          1, "LCD_PC1"),
 -      HX4700_GPIO_OUT(GPIO62_HX4700_LCD_nRESET,       1, "LCD_RESET"),
 -      HX4700_GPIO_OUT(GPIO70_HX4700_LCD_SLIN1,        1, "LCD_SLIN1"),
 -      HX4700_GPIO_OUT(GPIO84_HX4700_LCD_SQN,          1, "LCD_SQN"),
 -      HX4700_GPIO_OUT(GPIO110_HX4700_LCD_LVDD_3V3_ON, 1, "LCD_LVDD"),
 -      HX4700_GPIO_OUT(GPIO111_HX4700_LCD_AVDD_3V3_ON, 1, "LCD_AVDD"),
 -      HX4700_GPIO_OUT(GPIO32_HX4700_RS232_ON,         1, "RS232_ON"),
 -      HX4700_GPIO_OUT(GPIO71_HX4700_ASIC3_nRESET,     1, "ASIC3_nRESET"),
 -      HX4700_GPIO_OUT(GPIO82_HX4700_EUART_RESET,      1, "EUART_RESET"),
 -      HX4700_GPIO_OUT(GPIO105_HX4700_nIR_ON,          1, "nIR_EN"),
 +static struct gpio global_gpios[] = {
 +      { GPIO12_HX4700_ASIC3_IRQ, GPIOF_IN, "ASIC3_IRQ" },
 +      { GPIO13_HX4700_W3220_IRQ, GPIOF_IN, "W3220_IRQ" },
 +      { GPIO14_HX4700_nWLAN_IRQ, GPIOF_IN, "WLAN_IRQ" },
 +      { GPIO59_HX4700_LCD_PC1,          GPIOF_OUT_INIT_HIGH, "LCD_PC1" },
 +      { GPIO62_HX4700_LCD_nRESET,       GPIOF_OUT_INIT_HIGH, "LCD_RESET" },
 +      { GPIO70_HX4700_LCD_SLIN1,        GPIOF_OUT_INIT_HIGH, "LCD_SLIN1" },
 +      { GPIO84_HX4700_LCD_SQN,          GPIOF_OUT_INIT_HIGH, "LCD_SQN" },
 +      { GPIO110_HX4700_LCD_LVDD_3V3_ON, GPIOF_OUT_INIT_HIGH, "LCD_LVDD" },
 +      { GPIO111_HX4700_LCD_AVDD_3V3_ON, GPIOF_OUT_INIT_HIGH, "LCD_AVDD" },
 +      { GPIO32_HX4700_RS232_ON,         GPIOF_OUT_INIT_HIGH, "RS232_ON" },
 +      { GPIO71_HX4700_ASIC3_nRESET,     GPIOF_OUT_INIT_HIGH, "ASIC3_nRESET" },
 +      { GPIO82_HX4700_EUART_RESET,      GPIOF_OUT_INIT_HIGH, "EUART_RESET" },
 +      { GPIO105_HX4700_nIR_ON,          GPIOF_OUT_INIT_HIGH, "nIR_EN" },
  };
  
  static void __init hx4700_init(void)
  {
 +      int ret;
 +
        pxa2xx_mfp_config(ARRAY_AND_SIZE(hx4700_pin_config));
 -      hx4700_gpio_request(ARRAY_AND_SIZE(global_gpios));
 +      ret = gpio_request_array(ARRAY_AND_SIZE(global_gpios));
 +      if (ret)
 +              pr_err ("hx4700: Failed to request GPIOs.\n");
  
        pxa_set_ffuart_info(NULL);
        pxa_set_btuart_info(NULL);
@@@ -842,6 -874,7 +842,7 @@@ MACHINE_START(H4700, "HP iPAQ HX4700"
        .map_io       = pxa27x_map_io,
        .nr_irqs      = HX4700_NR_IRQS,
        .init_irq     = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .init_machine = hx4700_init,
        .timer        = &pxa_timer,
  MACHINE_END
index 0e42798942f79f01ac160831f422d399cc633f34,cb3509ee1fe2309b8ece28c3d44241531fd6c83f..5fe5bcd7c0a138cb9018f48956ad98e727c30965
@@@ -344,14 -344,22 +344,14 @@@ static struct pxafb_mach_info samsung_i
   * Backlight
   */
  
 +static struct gpio magician_bl_gpios[] = {
 +      { EGPIO_MAGICIAN_BL_POWER,  GPIOF_DIR_OUT, "Backlight power" },
 +      { EGPIO_MAGICIAN_BL_POWER2, GPIOF_DIR_OUT, "Backlight power 2" },
 +};
 +
  static int magician_backlight_init(struct device *dev)
  {
 -      int ret;
 -
 -      ret = gpio_request(EGPIO_MAGICIAN_BL_POWER, "BL_POWER");
 -      if (ret)
 -              goto err;
 -      ret = gpio_request(EGPIO_MAGICIAN_BL_POWER2, "BL_POWER2");
 -      if (ret)
 -              goto err2;
 -      return 0;
 -
 -err2:
 -      gpio_free(EGPIO_MAGICIAN_BL_POWER);
 -err:
 -      return ret;
 +      return gpio_request_array(ARRAY_AND_SIZE(magician_bl_gpios));
  }
  
  static int magician_backlight_notify(struct device *dev, int brightness)
  
  static void magician_backlight_exit(struct device *dev)
  {
 -      gpio_free(EGPIO_MAGICIAN_BL_POWER);
 -      gpio_free(EGPIO_MAGICIAN_BL_POWER2);
 +      gpio_free_array(ARRAY_AND_SIZE(magician_bl_gpios));
  }
  
  static struct platform_pwm_backlight_data backlight_data = {
@@@ -703,25 -712,16 +703,25 @@@ static struct platform_device *devices[
        &leds_gpio,
  };
  
 +static struct gpio magician_global_gpios[] = {
 +      { GPIO13_MAGICIAN_CPLD_IRQ,   GPIOF_IN, "CPLD_IRQ" },
 +      { GPIO107_MAGICIAN_DS1WM_IRQ, GPIOF_IN, "DS1WM_IRQ" },
 +      { GPIO104_MAGICIAN_LCD_POWER_1, GPIOF_OUT_INIT_LOW, "LCD power 1" },
 +      { GPIO105_MAGICIAN_LCD_POWER_2, GPIOF_OUT_INIT_LOW, "LCD power 2" },
 +      { GPIO106_MAGICIAN_LCD_POWER_3, GPIOF_OUT_INIT_LOW, "LCD power 3" },
 +      { GPIO83_MAGICIAN_nIR_EN, GPIOF_OUT_INIT_HIGH, "nIR_EN" },
 +};
 +
  static void __init magician_init(void)
  {
        void __iomem *cpld;
        int lcd_select;
        int err;
  
 -      gpio_request(GPIO13_MAGICIAN_CPLD_IRQ, "CPLD_IRQ");
 -      gpio_request(GPIO107_MAGICIAN_DS1WM_IRQ, "DS1WM_IRQ");
 -
        pxa2xx_mfp_config(ARRAY_AND_SIZE(magician_pin_config));
 +      err = gpio_request_array(ARRAY_AND_SIZE(magician_global_gpios));
 +      if (err)
 +              pr_err("magician: Failed to request GPIOs: %d\n", err);
  
        pxa_set_ffuart_info(NULL);
        pxa_set_btuart_info(NULL);
  
        platform_add_devices(ARRAY_AND_SIZE(devices));
  
 -      err = gpio_request(GPIO83_MAGICIAN_nIR_EN, "nIR_EN");
 -      if (!err) {
 -              gpio_direction_output(GPIO83_MAGICIAN_nIR_EN, 1);
 -              pxa_set_ficp_info(&magician_ficp_info);
 -      }
 +      pxa_set_ficp_info(&magician_ficp_info);
        pxa27x_set_i2c_power_info(NULL);
        pxa_set_i2c_info(&i2c_info);
        pxa_set_mci_info(&magician_mci_info);
                system_rev = board_id & 0x7;
                lcd_select = board_id & 0x8;
                pr_info("LCD type: %s\n", lcd_select ? "Samsung" : "Toppoly");
 -              if (lcd_select && (system_rev < 3)) {
 -                      gpio_request(GPIO75_MAGICIAN_SAMSUNG_POWER, "SAMSUNG_POWER");
 -                      gpio_direction_output(GPIO75_MAGICIAN_SAMSUNG_POWER, 0);
 -              }
 -              gpio_request(GPIO104_MAGICIAN_LCD_POWER_1, "LCD_POWER_1");
 -              gpio_request(GPIO105_MAGICIAN_LCD_POWER_2, "LCD_POWER_2");
 -              gpio_request(GPIO106_MAGICIAN_LCD_POWER_3, "LCD_POWER_3");
 -              gpio_direction_output(GPIO104_MAGICIAN_LCD_POWER_1, 0);
 -              gpio_direction_output(GPIO105_MAGICIAN_LCD_POWER_2, 0);
 -              gpio_direction_output(GPIO106_MAGICIAN_LCD_POWER_3, 0);
 +              if (lcd_select && (system_rev < 3))
 +                      gpio_request_one(GPIO75_MAGICIAN_SAMSUNG_POWER,
 +                                       GPIOF_OUT_INIT_LOW, "SAMSUNG_POWER");
                pxa_set_fb_info(NULL, lcd_select ? &samsung_info : &toppoly_info);
        } else
                pr_err("LCD detection: CPLD mapping failed\n");
@@@ -757,6 -768,7 +757,7 @@@ MACHINE_START(MAGICIAN, "HTC Magician"
        .map_io = pxa27x_map_io,
        .nr_irqs = MAGICIAN_NR_IRQS,
        .init_irq = pxa27x_init_irq,
+       .handle_irq = pxa27x_handle_irq,
        .init_machine = magician_init,
        .timer = &pxa_timer,
  MACHINE_END
index aa67637ae41dfa859bb5f2567bf282e1d671f8f1,ff92efd65a53221aeac32a1170f85960ea3715cc..64810f908e5be5ec0e8d52afea14d96273706694
@@@ -177,6 -177,50 +177,6 @@@ static unsigned long mioa701_pin_config
        MFP_CFG_OUT(GPIO116, AF0, DRIVE_HIGH),
  };
  
 -#define MIO_GPIO_IN(num, _desc) \
 -      { .gpio = (num), .dir = 0, .desc = (_desc) }
 -#define MIO_GPIO_OUT(num, _init, _desc) \
 -      { .gpio = (num), .dir = 1, .init = (_init), .desc = (_desc) }
 -struct gpio_ress {
 -      unsigned gpio : 8;
 -      unsigned dir : 1;
 -      unsigned init : 1;
 -      char *desc;
 -};
 -
 -static int mio_gpio_request(struct gpio_ress *gpios, int size)
 -{
 -      int i, rc = 0;
 -      int gpio;
 -      int dir;
 -
 -      for (i = 0; (!rc) && (i < size); i++) {
 -              gpio = gpios[i].gpio;
 -              dir = gpios[i].dir;
 -              rc = gpio_request(gpio, gpios[i].desc);
 -              if (rc) {
 -                      printk(KERN_ERR "Error requesting GPIO %d(%s) : %d\n",
 -                             gpio, gpios[i].desc, rc);
 -                      continue;
 -              }
 -              if (dir)
 -                      gpio_direction_output(gpio, gpios[i].init);
 -              else
 -                      gpio_direction_input(gpio);
 -      }
 -      while ((rc) && (--i >= 0))
 -              gpio_free(gpios[i].gpio);
 -      return rc;
 -}
 -
 -static void mio_gpio_free(struct gpio_ress *gpios, int size)
 -{
 -      int i;
 -
 -      for (i = 0; i < size; i++)
 -              gpio_free(gpios[i].gpio);
 -}
 -
  /* LCD Screen and Backlight */
  static struct platform_pwm_backlight_data mioa701_backlight_data = {
        .pwm_id         = 0,
@@@ -302,16 -346,16 +302,16 @@@ irqreturn_t gsm_on_irq(int irq, void *p
        return IRQ_HANDLED;
  }
  
 -struct gpio_ress gsm_gpios[] = {
 -      MIO_GPIO_IN(GPIO25_GSM_MOD_ON_STATE, "GSM state"),
 -      MIO_GPIO_IN(GPIO113_GSM_EVENT, "GSM event"),
 +static struct gpio gsm_gpios[] = {
 +      { GPIO25_GSM_MOD_ON_STATE, GPIOF_IN, "GSM state" },
 +      { GPIO113_GSM_EVENT, GPIOF_IN, "GSM event" },
  };
  
  static int __init gsm_init(void)
  {
        int rc;
  
 -      rc = mio_gpio_request(ARRAY_AND_SIZE(gsm_gpios));
 +      rc = gpio_request_array(ARRAY_AND_SIZE(gsm_gpios));
        if (rc)
                goto err_gpio;
        rc = request_irq(gpio_to_irq(GPIO25_GSM_MOD_ON_STATE), gsm_on_irq,
  
  err_irq:
        printk(KERN_ERR "Mioa701: Can't request GSM_ON irq\n");
 -      mio_gpio_free(ARRAY_AND_SIZE(gsm_gpios));
 +      gpio_free_array(ARRAY_AND_SIZE(gsm_gpios));
  err_gpio:
        printk(KERN_ERR "Mioa701: gsm not available\n");
        return rc;
  static void gsm_exit(void)
  {
        free_irq(gpio_to_irq(GPIO25_GSM_MOD_ON_STATE), NULL);
 -      mio_gpio_free(ARRAY_AND_SIZE(gsm_gpios));
 +      gpio_free_array(ARRAY_AND_SIZE(gsm_gpios));
  }
  
  /*
@@@ -705,16 -749,14 +705,16 @@@ static void mioa701_restart(char c, con
        arm_machine_restart('s', cmd);
  }
  
 -static struct gpio_ress global_gpios[] = {
 -      MIO_GPIO_OUT(GPIO9_CHARGE_EN, 1, "Charger enable"),
 -      MIO_GPIO_OUT(GPIO18_POWEROFF, 0, "Power Off"),
 -      MIO_GPIO_OUT(GPIO87_LCD_POWER, 0, "LCD Power"),
 +static struct gpio global_gpios[] = {
 +      { GPIO9_CHARGE_EN, GPIOF_OUT_INIT_HIGH, "Charger enable" },
 +      { GPIO18_POWEROFF, GPIOF_OUT_INIT_LOW, "Power Off" },
 +      { GPIO87_LCD_POWER, GPIOF_OUT_INIT_LOW, "LCD Power" },
  };
  
  static void __init mioa701_machine_init(void)
  {
 +      int rc;
 +
        PSLR  = 0xff100000; /* SYSDEL=125ms, PWRDEL=125ms, PSLR_SL_ROD=1 */
        PCFR = PCFR_DC_EN | PCFR_GPR_EN | PCFR_OPDE;
        RTTR = 32768 - 1; /* Reset crazy WinCE value */
        pxa_set_ffuart_info(NULL);
        pxa_set_btuart_info(NULL);
        pxa_set_stuart_info(NULL);
 -      mio_gpio_request(ARRAY_AND_SIZE(global_gpios));
 +      rc = gpio_request_array(ARRAY_AND_SIZE(global_gpios));
 +      if (rc)
 +              pr_err("MioA701: Failed to request GPIOs: %d", rc);
        bootstrap_init();
        pxa_set_fb_info(NULL, &mioa701_pxafb_info);
        pxa_set_mci_info(&mioa701_mci_info);
@@@ -754,6 -794,7 +754,7 @@@ MACHINE_START(MIOA701, "MIO A701"
        .boot_params    = 0xa0000100,
        .map_io         = &pxa27x_map_io,
        .init_irq       = &pxa27x_init_irq,
+       .handle_irq     = &pxa27x_handle_irq,
        .init_machine   = mioa701_machine_init,
        .timer          = &pxa_timer,
  MACHINE_END
index 5a5329bc33f1dda89db167d669be1d2ec554ecd8,95d71c3a5bae88c3e096fd2fad533eb938336ac3..e61c1cc055199466ebf72d42a51ead8576de0a7c
@@@ -33,7 -33,6 +33,7 @@@
  #include <linux/i2c-gpio.h>
  
  #include <asm/mach-types.h>
 +#include <asm/suspend.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  
@@@ -402,6 -401,7 +402,7 @@@ MACHINE_START(PALMZ72, "Palm Zire72"
        .boot_params    = 0xa0000100,
        .map_io         = pxa27x_map_io,
        .init_irq       = pxa27x_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = palmz72_init
  MACHINE_END
index ef1c56a67afcbd0ebcdfc70ab7c078e7b256ea11,e66dc1562cdadafbd9c5bfd5773cc2ff3d3c88d9..b5cd9e5aba31bcf4eaee282879bd5891c93c26cd
@@@ -24,7 -24,6 +24,7 @@@
  #include <linux/i2c/pxa-i2c.h>
  
  #include <asm/mach/map.h>
 +#include <asm/suspend.h>
  #include <mach/hardware.h>
  #include <mach/gpio.h>
  #include <mach/pxa3xx-regs.h>
@@@ -32,7 -31,6 +32,6 @@@
  #include <mach/ohci.h>
  #include <mach/pm.h>
  #include <mach/dma.h>
- #include <mach/regs-intc.h>
  #include <mach/smemc.h>
  
  #include "generic.h"
@@@ -142,13 -140,8 +141,13 @@@ static void pxa3xx_cpu_pm_suspend(void
  {
        volatile unsigned long *p = (volatile void *)0xc0000000;
        unsigned long saved_data = *p;
 +#ifndef CONFIG_IWMMXT
 +      u64 acc0;
  
 -      extern void pxa3xx_cpu_suspend(long);
 +      asm volatile("mra %Q0, %R0, acc0" : "=r" (acc0));
 +#endif
 +
 +      extern int pxa3xx_finish_suspend(unsigned long);
  
        /* resuming from D2 requires the HSIO2/BOOT/TPM clocks enabled */
        CKENA |= (1 << CKEN_BOOT) | (1 << CKEN_TPM);
        /* overwrite with the resume address */
        *p = virt_to_phys(cpu_resume);
  
 -      pxa3xx_cpu_suspend(PLAT_PHYS_OFFSET - PAGE_OFFSET);
 +      cpu_suspend(0, pxa3xx_finish_suspend);
  
        *p = saved_data;
  
        AD3ER = 0;
 +
 +#ifndef CONFIG_IWMMXT
 +      asm volatile("mar acc0, %Q0, %R0" : "=r" (acc0));
 +#endif
  }
  
  static void pxa3xx_cpu_pm_enter(suspend_state_t state)
@@@ -338,13 -327,13 +337,13 @@@ static void pxa_ack_ext_wakeup(struct i
  
  static void pxa_mask_ext_wakeup(struct irq_data *d)
  {
-       ICMR2 &= ~(1 << ((d->irq - PXA_IRQ(0)) & 0x1f));
+       pxa_mask_irq(d);
        PECR &= ~PECR_IE(d->irq - IRQ_WAKEUP0);
  }
  
  static void pxa_unmask_ext_wakeup(struct irq_data *d)
  {
-       ICMR2 |= 1 << ((d->irq - PXA_IRQ(0)) & 0x1f);
+       pxa_unmask_irq(d);
        PECR |= PECR_IE(d->irq - IRQ_WAKEUP0);
  }
  
index 2f37d43f51b66519f2492f444e7607938d3bc404,8b8cff6a962073adb0fd79f21b841c9a586a73db..bbcd90562ebec2c70e6b662621a3b7c2e4004103
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
  
- #include <mach/hardware.h>
- #include <mach/pxa3xx-regs.h>
- #include <mach/mfp-pxa3xx.h>
- #include <mach/mfp-pxa300.h>
+ #include <mach/pxa300.h>
  #include <mach/ohci.h>
  #include <mach/pxafb.h>
  #include <mach/mmc.h>
@@@ -573,10 -570,10 +570,10 @@@ static struct pxafb_mode_info sharp_lq0
        .xres           = 480,
        .yres           = 272,
        .bpp            = 16,
 -      .hsync_len      = 4,
 +      .hsync_len      = 41,
        .left_margin    = 2,
        .right_margin   = 1,
 -      .vsync_len      = 1,
 +      .vsync_len      = 10,
        .upper_margin   = 3,
        .lower_margin   = 1,
        .sync           = 0,
@@@ -596,31 -593,29 +593,31 @@@ static void __init raumfeld_lcd_init(vo
  {
        int ret;
  
 -      pxa_set_fb_info(NULL, &raumfeld_sharp_lcd_info);
 -
 -      /* Earlier devices had the backlight regulator controlled
 -       * via PWM, later versions use another controller for that */
 -      if ((system_rev & 0xff) < 2) {
 -              mfp_cfg_t raumfeld_pwm_pin_config = GPIO17_PWM0_OUT;
 -              pxa3xx_mfp_config(&raumfeld_pwm_pin_config, 1);
 -              platform_device_register(&raumfeld_pwm_backlight_device);
 -      } else
 -              platform_device_register(&raumfeld_lt3593_device);
 -
        ret = gpio_request(GPIO_TFT_VA_EN, "display VA enable");
        if (ret < 0)
                pr_warning("Unable to request GPIO_TFT_VA_EN\n");
        else
                gpio_direction_output(GPIO_TFT_VA_EN, 1);
  
 +      msleep(100);
 +
        ret = gpio_request(GPIO_DISPLAY_ENABLE, "display enable");
        if (ret < 0)
                pr_warning("Unable to request GPIO_DISPLAY_ENABLE\n");
        else
                gpio_direction_output(GPIO_DISPLAY_ENABLE, 1);
  
 +      /* Hardware revision 2 has the backlight regulator controlled
 +       * by an LT3593, earlier and later devices use PWM for that. */
 +      if ((system_rev & 0xff) == 2) {
 +              platform_device_register(&raumfeld_lt3593_device);
 +      } else {
 +              mfp_cfg_t raumfeld_pwm_pin_config = GPIO17_PWM0_OUT;
 +              pxa3xx_mfp_config(&raumfeld_pwm_pin_config, 1);
 +              platform_device_register(&raumfeld_pwm_backlight_device);
 +      }
 +
 +      pxa_set_fb_info(NULL, &raumfeld_sharp_lcd_info);
        platform_device_register(&pxa3xx_device_gcu);
  }
  
@@@ -659,10 -654,10 +656,10 @@@ static struct lis3lv02d_platform_data l
  
  #define SPI_AK4104    \
  {                     \
 -      .modalias       = "ak4104",     \
 -      .max_speed_hz   = 10000,        \
 -      .bus_num        = 0,            \
 -      .chip_select    = 0,            \
 +      .modalias       = "ak4104-codec",       \
 +      .max_speed_hz   = 10000,                \
 +      .bus_num        = 0,                    \
 +      .chip_select    = 0,                    \
        .controller_data = (void *) GPIO_SPDIF_CS,      \
  }
  
@@@ -1093,6 -1088,7 +1090,7 @@@ MACHINE_START(RAUMFELD_RC, "Raumfeld Co
        .init_machine   = raumfeld_controller_init,
        .map_io         = pxa3xx_map_io,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
  MACHINE_END
  #endif
@@@ -1103,6 -1099,7 +1101,7 @@@ MACHINE_START(RAUMFELD_CONNECTOR, "Raum
        .init_machine   = raumfeld_connector_init,
        .map_io         = pxa3xx_map_io,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
  MACHINE_END
  #endif
@@@ -1113,6 -1110,7 +1112,7 @@@ MACHINE_START(RAUMFELD_SPEAKER, "Raumfe
        .init_machine   = raumfeld_speaker_init,
        .map_io         = pxa3xx_map_io,
        .init_irq       = pxa3xx_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
  MACHINE_END
  #endif
index e53a3334c944027629423c5ce8526ffaae7302a2,3b582d691cc6d4ea54858997ee7932476bccd75b..ebd6379c49692f8f03f47bcf870d878fd5dc2e22
@@@ -104,9 -104,10 +104,10 @@@ static void __init saarb_init(void
  
  MACHINE_START(SAARB, "PXA955 Handheld Platform (aka SAARB)")
        .boot_params    = 0xa0000100,
 -      .map_io         = pxa_map_io,
 +      .map_io         = pxa3xx_map_io,
        .nr_irqs        = SAARB_NR_IRQS,
        .init_irq       = pxa95x_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = saarb_init,
  MACHINE_END
diff --combined arch/arm/mach-pxa/zeus.c
index 9b99cc164de533b8c7d209765275fd36d4a891ba,667e0956a5677883ef12db463ab0e035615c3281..99c49bcd9f704f31067df73b4bd71a8a0eb04348
  #include <linux/can/platform/mcp251x.h>
  
  #include <asm/mach-types.h>
 +#include <asm/suspend.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  
- #include <mach/pxa2xx-regs.h>
+ #include <mach/pxa27x.h>
  #include <mach/regs-uart.h>
  #include <mach/ohci.h>
  #include <mach/mmc.h>
  #include <mach/pxa27x-udc.h>
  #include <mach/udc.h>
  #include <mach/pxafb.h>
- #include <mach/mfp-pxa27x.h>
  #include <mach/pm.h>
  #include <mach/audio.h>
  #include <mach/arcom-pcmcia.h>
@@@ -677,7 -675,7 +676,7 @@@ static struct pxa2xx_udc_mach_info zeus
  static void zeus_power_off(void)
  {
        local_irq_disable();
 -      pxa27x_cpu_suspend(PWRMODE_DEEPSLEEP, PLAT_PHYS_OFFSET - PAGE_OFFSET);
 +      cpu_suspend(PWRMODE_DEEPSLEEP, pxa27x_finish_suspend);
  }
  #else
  #define zeus_power_off   NULL
@@@ -909,6 -907,7 +908,7 @@@ MACHINE_START(ARCOM_ZEUS, "Arcom/Eurote
        .map_io         = zeus_map_io,
        .nr_irqs        = ZEUS_NR_IRQS,
        .init_irq       = zeus_init_irq,
+       .handle_irq     = pxa27x_handle_irq,
        .timer          = &pxa_timer,
        .init_machine   = zeus_init,
  MACHINE_END
index ddb63a1863ab116431feeeafed418352be0090b6,bf7cc82ea6d0caa25435a0dc87f7914fa5985b1b..c026f67a80def1968d0f8e5bb376d276677e328d
   * interrupt controllers). */
  #define IRQ_BOARD_START (IRQ_EINT_GROUP9_BASE + IRQ_EINT_GROUP9_NR + 1)
  
 -#ifdef CONFIG_SMDK6410_WM1190_EV1
 +#ifdef CONFIG_MACH_WLF_CRAGG_6410
 +#define IRQ_BOARD_NR 128
 +#elif defined(CONFIG_SMDK6410_WM1190_EV1)
  #define IRQ_BOARD_NR 64
  #elif defined(CONFIG_SMDK6410_WM1192_EV1)
  #define IRQ_BOARD_NR 64
  /* Compatibility */
  
  #define IRQ_ONENAND   IRQ_ONENAND0
+ #define IRQ_I2S0      IRQ_S3C6410_IIS
  
  #endif /* __ASM_MACH_S3C64XX_IRQS_H */
  
index 79bb3a0314efe1ba159b20bda4f93d0adaed1fe0,a06acce7b731d6538da2c6d25b81dc4b38f31da0..69dd87cd8e225fce669648c7a94cba81e2ccbe80
@@@ -90,6 -90,7 +90,7 @@@ config MACH_GON
        select S3C_DEV_HSMMC2
        select S3C_DEV_I2C1
        select S3C_DEV_I2C2
+       select S5P_DEV_MFC
        select S3C_DEV_USB_HSOTG
        select S5P_DEV_ONENAND
        select SAMSUNG_DEV_KEYPAD
@@@ -134,7 -135,6 +135,7 @@@ config MACH_SMDKV21
        select S3C_DEV_RTC
        select S3C_DEV_WDT
        select SAMSUNG_DEV_ADC
 +      select SAMSUNG_DEV_BACKLIGHT
        select SAMSUNG_DEV_IDE
        select SAMSUNG_DEV_KEYPAD
        select SAMSUNG_DEV_PWM
index ae72f87eab15795a7e95f17184c46f57d04f64a4,1404a4c4377072e76b3bf991e18ab86b7d6f313e..52a8e607bcc23cfdc100a0f4c3413c8e8625c904
@@@ -323,6 -323,12 +323,12 @@@ static struct clk init_clocks_off[] = 
                .parent         = &clk_hclk_dsys.clk,
                .enable         = s5pv210_clk_ip0_ctrl,
                .ctrlbit        = (1 << 26),
+       }, {
+               .name           = "mfc",
+               .devname        = "s5p-mfc",
+               .parent         = &clk_pclk_psys.clk,
+               .enable         = s5pv210_clk_ip0_ctrl,
+               .ctrlbit        = (1 << 16),
        }, {
                .name           = "otg",
                .parent         = &clk_hclk_psys.clk,
@@@ -686,12 -692,47 +692,12 @@@ static struct clksrc_sources clkset_scl
        .nr_sources     = ARRAY_SIZE(clkset_sclk_spdif_list),
  };
  
 -static int s5pv210_spdif_set_rate(struct clk *clk, unsigned long rate)
 -{
 -      struct clk *pclk;
 -      int ret;
 -
 -      pclk = clk_get_parent(clk);
 -      if (IS_ERR(pclk))
 -              return -EINVAL;
 -
 -      ret = pclk->ops->set_rate(pclk, rate);
 -      clk_put(pclk);
 -
 -      return ret;
 -}
 -
 -static unsigned long s5pv210_spdif_get_rate(struct clk *clk)
 -{
 -      struct clk *pclk;
 -      int rate;
 -
 -      pclk = clk_get_parent(clk);
 -      if (IS_ERR(pclk))
 -              return -EINVAL;
 -
 -      rate = pclk->ops->get_rate(clk);
 -      clk_put(pclk);
 -
 -      return rate;
 -}
 -
 -static struct clk_ops s5pv210_sclk_spdif_ops = {
 -      .set_rate       = s5pv210_spdif_set_rate,
 -      .get_rate       = s5pv210_spdif_get_rate,
 -};
 -
  static struct clksrc_clk clk_sclk_spdif = {
        .clk            = {
                .name           = "sclk_spdif",
                .enable         = s5pv210_clk_mask0_ctrl,
                .ctrlbit        = (1 << 27),
 -              .ops            = &s5pv210_sclk_spdif_ops,
 +              .ops            = &s5p_sclk_spdif_ops,
        },
        .sources = &clkset_sclk_spdif,
        .reg_src = { .reg = S5P_CLK_SRC6, .shift = 12, .size = 2 },
@@@ -879,6 -920,7 +885,7 @@@ static struct clksrc_clk clksrcs[] = 
        }, {
                .clk            = {
                        .name           = "sclk_mfc",
+                       .devname        = "s5p-mfc",
                        .enable         = s5pv210_clk_ip0_ctrl,
                        .ctrlbit        = (1 << 16),
                },
index e0c4d06b9db62d6f310f6f4055b4fe0edaad42d9,e9b1406cb56692fa7919df485d7adaec008c9297..85c2d51a095687660d005402aa362d83e3c75e8d
@@@ -34,6 -34,7 +34,6 @@@
  
  #include <mach/map.h>
  #include <mach/regs-clock.h>
 -#include <mach/regs-fb.h>
  
  #include <plat/gpio-cfg.h>
  #include <plat/regs-serial.h>
@@@ -46,6 -47,7 +46,7 @@@
  #include <plat/sdhci.h>
  #include <plat/clock.h>
  #include <plat/s5p-time.h>
+ #include <plat/mfc.h>
  #include <plat/regs-fb-v4.h>
  
  /* Following are default values for UCON, ULCON and UFCON UART registers */
@@@ -808,6 -810,9 +809,9 @@@ static struct platform_device *goni_dev
        &goni_i2c_gpio5,
        &mmc2_fixed_voltage,
        &goni_device_gpiokeys,
+       &s5p_device_mfc,
+       &s5p_device_mfc_l,
+       &s5p_device_mfc_r,
        &s3c_device_i2c0,
        &s5p_device_fimc0,
        &s5p_device_fimc1,
@@@ -841,6 -846,11 +845,11 @@@ static void __init goni_map_io(void
        s5p_set_timer_source(S5P_PWM3, S5P_PWM4);
  }
  
+ static void __init goni_reserve(void)
+ {
+       s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20);
+ }
  static void __init goni_machine_init(void)
  {
        /* Radio: call before I2C 1 registeration */
@@@ -893,4 -903,5 +902,5 @@@ MACHINE_START(GONI, "GONI"
        .map_io         = goni_map_io,
        .init_machine   = goni_machine_init,
        .timer          = &s5p_timer,
+       .reserve        = &goni_reserve,
  MACHINE_END
index ef20f922249d109961461fd21a3b37475d5b1dbc,c6900f8bf3ce778478f2e114bd70b3293c76f70b..5e011fc6720d6373d2f48fdc8298dda046f84481
@@@ -29,6 -29,7 +29,6 @@@
  
  #include <mach/map.h>
  #include <mach/regs-clock.h>
 -#include <mach/regs-fb.h>
  
  #include <plat/regs-serial.h>
  #include <plat/regs-srom.h>
@@@ -44,8 -45,6 +44,8 @@@
  #include <plat/pm.h>
  #include <plat/fb.h>
  #include <plat/s5p-time.h>
 +#include <plat/backlight.h>
 +#include <plat/regs-fb-v4.h>
  
  /* Following are default values for UCON, ULCON and UFCON UART registers */
  #define SMDKV210_UCON_DEFAULT (S3C2410_UCON_TXILEVEL |        \
@@@ -211,6 -210,45 +211,6 @@@ static struct s3c_fb_platdata smdkv210_
        .setup_gpio     = s5pv210_fb_gpio_setup_24bpp,
  };
  
 -static int smdkv210_backlight_init(struct device *dev)
 -{
 -      int ret;
 -
 -      ret = gpio_request(S5PV210_GPD0(3), "Backlight");
 -      if (ret) {
 -              printk(KERN_ERR "failed to request GPD for PWM-OUT 3\n");
 -              return ret;
 -      }
 -
 -      /* Configure GPIO pin with S5PV210_GPD_0_3_TOUT_3 */
 -      s3c_gpio_cfgpin(S5PV210_GPD0(3), S3C_GPIO_SFN(2));
 -
 -      return 0;
 -}
 -
 -static void smdkv210_backlight_exit(struct device *dev)
 -{
 -      s3c_gpio_cfgpin(S5PV210_GPD0(3), S3C_GPIO_OUTPUT);
 -      gpio_free(S5PV210_GPD0(3));
 -}
 -
 -static struct platform_pwm_backlight_data smdkv210_backlight_data = {
 -      .pwm_id         = 3,
 -      .max_brightness = 255,
 -      .dft_brightness = 255,
 -      .pwm_period_ns  = 78770,
 -      .init           = smdkv210_backlight_init,
 -      .exit           = smdkv210_backlight_exit,
 -};
 -
 -static struct platform_device smdkv210_backlight_device = {
 -      .name           = "pwm-backlight",
 -      .dev            = {
 -              .parent         = &s3c_device_timer[3].dev,
 -              .platform_data  = &smdkv210_backlight_data,
 -      },
 -};
 -
  static struct platform_device *smdkv210_devices[] __initdata = {
        &s3c_device_adc,
        &s3c_device_cfcon,
        &s5pv210_device_iis0,
        &s5pv210_device_spdif,
        &samsung_asoc_dma,
+       &samsung_asoc_idma,
        &samsung_device_keypad,
        &smdkv210_dm9000,
        &smdkv210_lcd_lte480wv,
 -      &s3c_device_timer[3],
 -      &smdkv210_backlight_device,
  };
  
  static void __init smdkv210_dm9000_init(void)
@@@ -270,16 -311,6 +271,16 @@@ static struct s3c2410_ts_mach_info s3c_
        .oversampling_shift     = 2,
  };
  
 +/* LCD Backlight data */
 +static struct samsung_bl_gpio_info smdkv210_bl_gpio_info = {
 +      .no = S5PV210_GPD0(3),
 +      .func = S3C_GPIO_SFN(2),
 +};
 +
 +static struct platform_pwm_backlight_data smdkv210_bl_data = {
 +      .pwm_id = 3,
 +};
 +
  static void __init smdkv210_map_io(void)
  {
        s5p_init_io(NULL, 0, S5P_VA_CHIPID);
@@@ -311,8 -342,6 +312,8 @@@ static void __init smdkv210_machine_ini
  
        s3c_fb_set_platdata(&smdkv210_lcd0_pdata);
  
 +      samsung_bl_set(&smdkv210_bl_gpio_info, &smdkv210_bl_data);
 +
        platform_add_devices(smdkv210_devices, ARRAY_SIZE(smdkv210_devices));
  }
  
index 10fbbdc8699a2c6a3442e03673de8d2ca7f086dd,46d5df90c79ece38fd57c9171b11d5713f2c88fb..56cbabf6aa68cd58ff690f14a009d74aec29122c
@@@ -19,7 -19,6 +19,6 @@@
  #include <linux/platform_device.h>
  #include <linux/serial_8250.h>
  #include <linux/i2c.h>
- #include <linux/i2c-tegra.h>
  #include <linux/delay.h>
  #include <linux/input.h>
  #include <linux/io.h>
@@@ -66,22 -65,6 +65,6 @@@ static __initdata struct tegra_clk_init
        { NULL,         NULL,           0,              0},
  };
  
- static struct tegra_i2c_platform_data seaboard_i2c1_platform_data = {
-       .bus_clk_rate   = 400000.
- };
- static struct tegra_i2c_platform_data seaboard_i2c2_platform_data = {
-       .bus_clk_rate   = 400000,
- };
- static struct tegra_i2c_platform_data seaboard_i2c3_platform_data = {
-       .bus_clk_rate   = 400000,
- };
- static struct tegra_i2c_platform_data seaboard_dvc_platform_data = {
-       .bus_clk_rate   = 400000,
- };
  static struct gpio_keys_button seaboard_gpio_keys_buttons[] = {
        {
                .code           = SW_LID,
@@@ -137,9 -120,9 +120,9 @@@ static struct tegra_sdhci_platform_dat
  static struct platform_device *seaboard_devices[] __initdata = {
        &debug_uart,
        &tegra_pmu_device,
-       &tegra_sdhci_device1,
-       &tegra_sdhci_device3,
        &tegra_sdhci_device4,
+       &tegra_sdhci_device3,
+       &tegra_sdhci_device1,
        &seaboard_gpio_keys_device,
  };
  
@@@ -159,13 -142,8 +142,8 @@@ static void __init seaboard_i2c_init(vo
  
        i2c_register_board_info(0, &isl29018_device, 1);
  
 -      i2c_register_board_info(4, &adt7461_device, 1);
 +      i2c_register_board_info(3, &adt7461_device, 1);
  
-       tegra_i2c_device1.dev.platform_data = &seaboard_i2c1_platform_data;
-       tegra_i2c_device2.dev.platform_data = &seaboard_i2c2_platform_data;
-       tegra_i2c_device3.dev.platform_data = &seaboard_i2c3_platform_data;
-       tegra_i2c_device4.dev.platform_data = &seaboard_dvc_platform_data;
        platform_device_register(&tegra_i2c_device1);
        platform_device_register(&tegra_i2c_device2);
        platform_device_register(&tegra_i2c_device3);
index d9dc5d297edd4efa306f88555ac19f16a90c34b0,82646a411ecdea7f6921d61433f12bce48c06766..47c596cdbf32e4012d003574388cd935099c54a0
@@@ -29,13 -29,13 +29,13 @@@ static __initdata struct tegra_pingroup
        {TEGRA_PINGROUP_ATC,   TEGRA_MUX_NAND,          TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_ATD,   TEGRA_MUX_GMI,           TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_ATE,   TEGRA_MUX_GMI,           TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
-       {TEGRA_PINGROUP_CDEV1, TEGRA_MUX_OSC,           TEGRA_PUPD_NORMAL,      TEGRA_TRI_NORMAL},
+       {TEGRA_PINGROUP_CDEV1, TEGRA_MUX_PLLA_OUT,      TEGRA_PUPD_NORMAL,      TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_CDEV2, TEGRA_MUX_PLLP_OUT4,     TEGRA_PUPD_PULL_DOWN,   TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_CRTP,  TEGRA_MUX_CRT,           TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_CSUS,  TEGRA_MUX_VI_SENSOR_CLK, TEGRA_PUPD_PULL_DOWN,   TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_DAP1,  TEGRA_MUX_DAP1,          TEGRA_PUPD_NORMAL,      TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_DAP2,  TEGRA_MUX_DAP2,          TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
 -      {TEGRA_PINGROUP_DAP3,  TEGRA_MUX_DAP3,          TEGRA_PUPD_NORMAL,      TEGRA_TRI_NORMAL},
 +      {TEGRA_PINGROUP_DAP3,  TEGRA_MUX_DAP3,          TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_DAP4,  TEGRA_MUX_DAP4,          TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_DDC,   TEGRA_MUX_I2C2,          TEGRA_PUPD_PULL_UP,     TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_DTA,   TEGRA_MUX_VI,            TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_SPIH,  TEGRA_MUX_SPI2_ALT,      TEGRA_PUPD_PULL_UP,     TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_UAA,   TEGRA_MUX_ULPI,          TEGRA_PUPD_PULL_UP,     TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_UAB,   TEGRA_MUX_ULPI,          TEGRA_PUPD_PULL_UP,     TEGRA_TRI_TRISTATE},
-       {TEGRA_PINGROUP_UAC,   TEGRA_MUX_RSVD2,         TEGRA_PUPD_NORMAL,      TEGRA_TRI_TRISTATE},
+       {TEGRA_PINGROUP_UAC,   TEGRA_MUX_RSVD2,         TEGRA_PUPD_NORMAL,      TEGRA_TRI_NORMAL},
        {TEGRA_PINGROUP_UAD,   TEGRA_MUX_IRDA,          TEGRA_PUPD_PULL_UP,     TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_UCA,   TEGRA_MUX_UARTC,         TEGRA_PUPD_PULL_UP,     TEGRA_TRI_TRISTATE},
        {TEGRA_PINGROUP_UCB,   TEGRA_MUX_UARTC,         TEGRA_PUPD_PULL_UP,     TEGRA_TRI_TRISTATE},
  static struct tegra_gpio_table gpio_table[] = {
        { .gpio = TRIMSLICE_GPIO_SD4_CD, .enable = true }, /* mmc4 cd */
        { .gpio = TRIMSLICE_GPIO_SD4_WP, .enable = true }, /* mmc4 wp */
+       { .gpio = TRIMSLICE_GPIO_USB1_MODE, .enable = true }, /* USB1 mode */
+       { .gpio = TRIMSLICE_GPIO_USB2_RST,  .enable = true }, /* USB2 PHY rst */
  };
  
  void __init trimslice_pinmux_init(void)
index 32ca6267b9ff4b1424ef692007608ed2d84b65ef,468523c72b431523ef6cc87c8aa3135a89289d06..0886cbccddee4ed475fb122d997ac9b7c80d037e
@@@ -21,6 -21,7 +21,6 @@@
  
  #include <asm/cacheflush.h>
  #include <asm/hardware/gic.h>
 -#include <mach/hardware.h>
  #include <asm/mach-types.h>
  #include <asm/smp_scu.h>
  
@@@ -121,13 -122,21 +121,13 @@@ void __init smp_init_cpus(void
        }
  
        for (i = 0; i < ncores; i++)
-               cpu_set(i, cpu_possible_map);
+               set_cpu_possible(i, true);
  
        set_smp_cross_call(gic_raise_softirq);
  }
  
  void __init platform_smp_prepare_cpus(unsigned int max_cpus)
  {
 -      int i;
 -
 -      /*
 -       * Initialise the present map, which describes the set of CPUs
 -       * actually populated at the present time.
 -       */
 -      for (i = 0; i < max_cpus; i++)
 -              set_cpu_present(i, true);
  
        scu_enable(scu_base);
  }
index 0f2e522f387dc92677e18d501ec97bdc01a1bdc6,c0bc833df9032c60efdada89bfa4c64d0685ff7c..2735d03996cf46a9cdfc7da67378902130dd2aec
@@@ -77,7 -77,7 +77,7 @@@ static struct regulator_consumer_suppl
  static struct regulator_consumer_supply ab8500_vintcore_consumers[] = {
        /* SoC core supply, no device */
        REGULATOR_SUPPLY("v-intcore", NULL),
 -      /* USB Transciever */
 +      /* USB Transceiver */
        REGULATOR_SUPPLY("vddulpivio18", "ab8500-usb.0"),
  };
  
@@@ -272,7 -272,14 +272,14 @@@ struct regulator_init_data ab8500_regul
                        .max_uV = 2900000,
                        .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
                                          REGULATOR_CHANGE_STATUS,
-                       .boot_on = 1, /* must be on for display */
+                       .boot_on = 1, /* display is on at boot */
+                       /*
+                        * This voltage cannot be disabled right now because
+                        * it is somehow affecting the external MMC
+                        * functionality, though that typically will use
+                        * AUX3.
+                        */
+                       .always_on = 1,
                },
                .num_consumer_supplies = ARRAY_SIZE(ab8500_vaux1_consumers),
                .consumer_supplies = ab8500_vaux1_consumers,
index 7d107be63eb4cbcaf1635df01f15049cbdc53f59,b4e786a0fa4f9db597a8b20e0e7f6bfd7b4779c1..e832664d1bd944687c2db0533cec879bb93ee011
@@@ -14,6 -14,7 +14,7 @@@
  #include <linux/clk.h>
  #include <linux/io.h>
  #include <linux/clkdev.h>
+ #include <linux/cpufreq.h>
  
  #include <plat/mtu.h>
  #include <mach/hardware.h>
@@@ -635,13 -636,16 +636,13 @@@ static const struct file_operations set
  static struct dentry *clk_debugfs_register_dir(struct clk *c,
                                                struct dentry *p_dentry)
  {
 -      struct dentry *d, *clk_d, *child, *child_tmp;
 -      char s[255];
 -      char *p = s;
 +      struct dentry *d, *clk_d;
 +      const char *p = c->name;
  
 -      if (c->name == NULL)
 -              p += sprintf(p, "BUG");
 -      else
 -              p += sprintf(p, "%s", c->name);
 +      if (!p)
 +              p = "BUG";
  
 -      clk_d = debugfs_create_dir(s, p_dentry);
 +      clk_d = debugfs_create_dir(p, p_dentry);
        if (!clk_d)
                return NULL;
  
        return clk_d;
  
  err_out:
 -      d = clk_d;
 -      list_for_each_entry_safe(child, child_tmp, &d->d_subdirs, d_u.d_child)
 -              debugfs_remove(child);
 -      debugfs_remove(clk_d);
 +      debugfs_remove_recursive(clk_d);
        return NULL;
  }
  
 -static void clk_debugfs_remove_dir(struct dentry *cdentry)
 -{
 -      struct dentry *d, *child, *child_tmp;
 -
 -      d = cdentry;
 -      list_for_each_entry_safe(child, child_tmp, &d->d_subdirs, d_u.d_child)
 -              debugfs_remove(child);
 -      debugfs_remove(cdentry);
 -      return ;
 -}
 -
  static int clk_debugfs_register_one(struct clk *c)
  {
        struct clk *pa = c->parent_periph;
                c->dent_bus = clk_debugfs_register_dir(c,
                                bpa->dent_bus ? bpa->dent_bus : bpa->dent);
                if ((!c->dent_bus) &&  (c->dent)) {
 -                      clk_debugfs_remove_dir(c->dent);
 +                      debugfs_remove_recursive(c->dent);
                        c->dent = NULL;
                        return -ENOMEM;
                }
@@@ -742,6 -760,51 +743,51 @@@ err_out
  late_initcall(clk_debugfs_init);
  #endif /* defined(CONFIG_DEBUG_FS) */
  
+ unsigned long clk_smp_twd_rate = 400000000;
+ unsigned long clk_smp_twd_get_rate(struct clk *clk)
+ {
+       return clk_smp_twd_rate;
+ }
+ static struct clk clk_smp_twd = {
+       .get_rate = clk_smp_twd_get_rate,
+       .name =  "smp_twd",
+ };
+ static struct clk_lookup clk_smp_twd_lookup = {
+       .dev_id = "smp_twd",
+       .clk = &clk_smp_twd,
+ };
+ #ifdef CONFIG_CPU_FREQ
+ static int clk_twd_cpufreq_transition(struct notifier_block *nb,
+                                     unsigned long state, void *data)
+ {
+       struct cpufreq_freqs *f = data;
+       if (state == CPUFREQ_PRECHANGE) {
+               /* Save frequency in simple Hz */
+               clk_smp_twd_rate = f->new * 1000;
+       }
+       return NOTIFY_OK;
+ }
+ static struct notifier_block clk_twd_cpufreq_nb = {
+       .notifier_call = clk_twd_cpufreq_transition,
+ };
+ static int clk_init_smp_twd_cpufreq(void)
+ {
+       return cpufreq_register_notifier(&clk_twd_cpufreq_nb,
+                                 CPUFREQ_TRANSITION_NOTIFIER);
+ }
+ late_initcall(clk_init_smp_twd_cpufreq);
+ #endif
  int __init clk_init(void)
  {
        if (cpu_is_u8500ed()) {
        else
                clkdev_add_table(u8500_v1_clks, ARRAY_SIZE(u8500_v1_clks));
  
+       clkdev_add(&clk_smp_twd_lookup);
  #ifdef CONFIG_DEBUG_FS
        clk_debugfs_add_table(u8500_common_clks, ARRAY_SIZE(u8500_common_clks));
        if (cpu_is_u8500ed())
diff --combined arch/arm/mm/Kconfig
index a0ea5848d40d01a46ea68d25553edab5ee54364c,cb26d49a8cd671266ec585b8bf2a6672470cbde7..88633fe01a5dcdc2641afdd3d5010948a3263b73
@@@ -821,8 -821,7 +821,8 @@@ config CACHE_L2X
        depends on REALVIEW_EB_ARM11MP || MACH_REALVIEW_PB11MP || MACH_REALVIEW_PB1176 || \
                   REALVIEW_EB_A9MP || SOC_IMX35 || SOC_IMX31 || MACH_REALVIEW_PBX || \
                   ARCH_NOMADIK || ARCH_OMAP4 || ARCH_EXYNOS4 || ARCH_TEGRA || \
 -                 ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || ARCH_SHMOBILE || ARCH_CNS3XXX
 +                 ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || ARCH_SHMOBILE || \
-                  ARCH_PRIMA2 || ARCH_ZYNQ
++                 ARCH_PRIMA2 || ARCH_ZYNQ || ARCH_CNS3XXX
        default y
        select OUTER_CACHE
        select OUTER_CACHE_SYNC
index 657405c481d04bed1dc310e245c182192b25e83d,8960eaf8bb222ff19de920d802a805d81aedf752..3014c7226bd1af9a98e949f888993afe5a0ca16e
@@@ -19,6 -19,8 +19,8 @@@
  #include <linux/irq.h>
  #include <linux/io.h>
  
+ #include <asm/mach/irq.h>
  #include <mach/map.h>
  #include <plat/irq-uart.h>
  #include <plat/regs-serial.h>
  static void s3c_irq_demux_uart(unsigned int irq, struct irq_desc *desc)
  {
        struct s3c_uart_irq *uirq = desc->irq_data.handler_data;
+       struct irq_chip *chip = irq_get_chip(irq);
        u32 pend = __raw_readl(uirq->regs + S3C64XX_UINTP);
        int base = uirq->base_irq;
  
+       chained_irq_enter(chip, desc);
        if (pend & (1 << 0))
                generic_handle_irq(base);
        if (pend & (1 << 1))
@@@ -41,6 -46,8 +46,8 @@@
                generic_handle_irq(base + 2);
        if (pend & (1 << 3))
                generic_handle_irq(base + 3);
+       chained_irq_exit(chip, desc);
  }
  
  static void __init s3c_init_uart_irq(struct s3c_uart_irq *uirq)
  
        gc = irq_alloc_generic_chip("s3c-uart", 1, uirq->base_irq, reg_base,
                                    handle_level_irq);
 +
 +      if (!gc) {
 +              pr_err("%s: irq_alloc_generic_chip for IRQ %u failed\n",
 +                     __func__, uirq->base_irq);
 +              return;
 +      }
 +
        ct = gc->chip_types;
 -      ct->chip.irq_ack = irq_gc_ack;
 +      ct->chip.irq_ack = irq_gc_ack_set_bit;
        ct->chip.irq_mask = irq_gc_mask_set_bit;
        ct->chip.irq_unmask = irq_gc_mask_clr_bit;
        ct->regs.ack = S3C64XX_UINTP;
index 5fa1742d019bed872067426b1e1a16452eb32217,4f9a9515beae3af9e37e95706e33ff585cf898c9..ae6f99834cddb01ea69b471b22fa823f7c7f0aa8
@@@ -20,7 -20,6 +20,7 @@@
  #include <linux/io.h>
  
  #include <asm/cacheflush.h>
 +#include <asm/suspend.h>
  #include <mach/hardware.h>
  #include <mach/map.h>
  
@@@ -232,7 -231,7 +232,7 @@@ static void __maybe_unused s3c_pm_show_
  
  
  void (*pm_cpu_prep)(void);
 -void (*pm_cpu_sleep)(void);
 +int (*pm_cpu_sleep)(unsigned long);
  
  #define any_allowed(mask, allow) (((mask) & (allow)) != (allow))
  
@@@ -269,6 -268,7 +269,7 @@@ static int s3c_pm_enter(suspend_state_
        /* save all necessary core registers not covered by the drivers */
  
        s3c_pm_save_gpios();
+       s3c_pm_saved_gpios();
        s3c_pm_save_uarts();
        s3c_pm_save_core();
  
  
        s3c_pm_arch_stop_clocks();
  
 -      /* s3c_cpu_save will also act as our return point from when
 +      /* this will also act as our return point from when
         * we resume as it saves its own register state and restores it
         * during the resume.  */
  
 -      s3c_cpu_save(0, PLAT_PHYS_OFFSET - PAGE_OFFSET);
 -
 -      /* restore the cpu state using the kernel's cpu init code. */
 -
 -      cpu_init();
 +      cpu_suspend(0, pm_cpu_sleep);
  
        /* restore the system state */
  
        s3c_pm_restore_core();
        s3c_pm_restore_uarts();
        s3c_pm_restore_gpios();
+       s3c_pm_restored_gpios();
  
        s3c_pm_debug_init();