Merge branch 'next' of git://git.infradead.org/users/vkoul/slave-dma
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 5 Nov 2011 01:02:25 +0000 (18:02 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 5 Nov 2011 01:02:25 +0000 (18:02 -0700)
* 'next' of git://git.infradead.org/users/vkoul/slave-dma: (63 commits)
  dmaengine: mid_dma: mask_peripheral_interrupt only when dmac is idle
  dmaengine/ep93xx_dma: add module.h include
  pch_dma: Reduce wasting memory
  pch_dma: Fix suspend issue
  dma/timberdale: free_irq() on an error path
  dma: shdma: transfer based runtime PM
  dmaengine: shdma: protect against the IRQ handler
  dmaengine i.MX DMA/SDMA: add missing include of linux/module.h
  dmaengine: delete redundant chan_id and chancnt initialization in dma drivers
  dmaengine/amba-pl08x: Check txd->llis_va before freeing dma_pool
  dmaengine/amba-pl08x: Add support for sg len greater than one for slave transfers
  serial: sh-sci: don't filter on DMA device, use only channel ID
  ARM: SAMSUNG: Remove Samsung specific enum type for dma direction
  ASoC: Samsung: Update DMA interface
  spi/s3c64xx: Merge dma control code
  spi/s3c64xx: Add support DMA engine API
  ARM: SAMSUNG: Remove S3C-PL330-DMA driver
  ARM: S5P64X0: Use generic DMA PL330 driver
  ARM: S5PC100: Use generic DMA PL330 driver
  ARM: S5PV210: Use generic DMA PL330 driver
  ...

Fix up fairly trivial conflicts in
 - arch/arm/mach-exynos4/{Kconfig,clock.c}
 - arch/arm/mach-s5p64x0/dma.c

12 files changed:
1  2 
arch/arm/mach-exynos4/Kconfig
arch/arm/mach-exynos4/clock.c
arch/arm/mach-s3c2412/dma.c
arch/arm/mach-s5p64x0/dma.c
arch/arm/mach-s5pv210/Kconfig
arch/arm/mach-s5pv210/clock.c
arch/arm/plat-samsung/Kconfig
arch/arm/plat-samsung/Makefile
arch/arm/plat-samsung/include/plat/dma-s3c24xx.h
drivers/mmc/host/s3cmci.c
drivers/tty/serial/sh-sci.c
sound/soc/samsung/ac97.c

@@@ -11,21 -11,10 +11,21 @@@ if ARCH_EXYNOS
  
  config CPU_EXYNOS4210
        bool
-       select S3C_PL330_DMA
+       select SAMSUNG_DMADEV
 +      select ARM_CPU_SUSPEND if PM
        help
          Enable EXYNOS4210 CPU support
  
 +config SOC_EXYNOS4212
 +      bool
 +      help
 +        Enable EXYNOS4212 SoC support
 +
 +config SOC_EXYNOS4412
 +      bool
 +      help
 +        Enable EXYNOS4412 SoC support
 +
  config EXYNOS4_MCT
        bool
        default y
@@@ -122,11 -111,24 +122,11 @@@ config EXYNOS4_SETUP_USB_PH
  
  menu "EXYNOS4 Machines"
  
 +comment "EXYNOS4210 Boards"
 +
  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_HSMMC
 -      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
 +      select MACH_SMDKV310
        help
          Machine support for Samsung SMDKC210
  
@@@ -216,48 -218,6 +216,48 @@@ config MACH_NUR
        help
          Machine support for Samsung Mobile NURI Board.
  
 +config MACH_ORIGEN
 +      bool "ORIGEN"
 +      select CPU_EXYNOS4210
 +      select S3C_DEV_RTC
 +      select S3C_DEV_WDT
 +      select S3C_DEV_HSMMC2
 +      select EXYNOS4_SETUP_SDHCI
 +      help
 +        Machine support for ORIGEN based on Samsung EXYNOS4210
 +
 +comment "EXYNOS4212 Boards"
 +
 +config MACH_SMDK4212
 +      bool "SMDK4212"
 +      select SOC_EXYNOS4212
 +      select S3C_DEV_HSMMC2
 +      select S3C_DEV_HSMMC3
 +      select S3C_DEV_I2C1
 +      select S3C_DEV_I2C3
 +      select S3C_DEV_I2C7
 +      select S3C_DEV_RTC
 +      select S3C_DEV_WDT
 +      select SAMSUNG_DEV_BACKLIGHT
 +      select SAMSUNG_DEV_KEYPAD
 +      select SAMSUNG_DEV_PWM
 +      select EXYNOS4_SETUP_I2C1
 +      select EXYNOS4_SETUP_I2C3
 +      select EXYNOS4_SETUP_I2C7
 +      select EXYNOS4_SETUP_KEYPAD
 +      select EXYNOS4_SETUP_SDHCI
 +      help
 +        Machine support for Samsung SMDK4212
 +
 +comment "EXYNOS4412 Boards"
 +
 +config MACH_SMDK4412
 +      bool "SMDK4412"
 +      select SOC_EXYNOS4412
 +      select MACH_SMDK4212
 +      help
 +        Machine support for Samsung SMDK4412
 +
  endmenu
  
  comment "Configuration for HSMMC bus width"
@@@ -13,7 -13,6 +13,7 @@@
  #include <linux/kernel.h>
  #include <linux/err.h>
  #include <linux/io.h>
 +#include <linux/syscore_ops.h>
  
  #include <plat/cpu-freq.h>
  #include <plat/clock.h>
  #include <plat/pll.h>
  #include <plat/s5p-clock.h>
  #include <plat/clock-clksrc.h>
 +#include <plat/exynos4.h>
 +#include <plat/pm.h>
  
  #include <mach/map.h>
  #include <mach/regs-clock.h>
  #include <mach/sysmmu.h>
 -
 -static struct clk clk_sclk_hdmi27m = {
 +#include <mach/exynos4-clock.h>
 +
 +static struct sleep_save exynos4_clock_save[] = {
 +      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_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_LCD0),
 +      SAVE_ITEM(S5P_CLKSRC_MAUDIO),
 +      SAVE_ITEM(S5P_CLKSRC_FSYS),
 +      SAVE_ITEM(S5P_CLKSRC_PERIL0),
 +      SAVE_ITEM(S5P_CLKSRC_PERIL1),
 +      SAVE_ITEM(S5P_CLKDIV_CAM),
 +      SAVE_ITEM(S5P_CLKDIV_TV),
 +      SAVE_ITEM(S5P_CLKDIV_MFC),
 +      SAVE_ITEM(S5P_CLKDIV_G3D),
 +      SAVE_ITEM(S5P_CLKDIV_LCD0),
 +      SAVE_ITEM(S5P_CLKDIV_MAUDIO),
 +      SAVE_ITEM(S5P_CLKDIV_FSYS0),
 +      SAVE_ITEM(S5P_CLKDIV_FSYS1),
 +      SAVE_ITEM(S5P_CLKDIV_FSYS2),
 +      SAVE_ITEM(S5P_CLKDIV_FSYS3),
 +      SAVE_ITEM(S5P_CLKDIV_PERIL0),
 +      SAVE_ITEM(S5P_CLKDIV_PERIL1),
 +      SAVE_ITEM(S5P_CLKDIV_PERIL2),
 +      SAVE_ITEM(S5P_CLKDIV_PERIL3),
 +      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_MAUDIO),
 +      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_MFC),
 +      SAVE_ITEM(S5P_CLKGATE_IP_G3D),
 +      SAVE_ITEM(S5P_CLKGATE_IP_LCD0),
 +      SAVE_ITEM(S5P_CLKGATE_IP_FSYS),
 +      SAVE_ITEM(S5P_CLKGATE_IP_GPS),
 +      SAVE_ITEM(S5P_CLKGATE_IP_PERIL),
 +      SAVE_ITEM(S5P_CLKGATE_BLOCK),
 +      SAVE_ITEM(S5P_CLKSRC_MASK_DMC),
 +      SAVE_ITEM(S5P_CLKSRC_DMC),
 +      SAVE_ITEM(S5P_CLKDIV_DMC0),
 +      SAVE_ITEM(S5P_CLKDIV_DMC1),
 +      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),
 +};
 +
 +struct clk clk_sclk_hdmi27m = {
        .name           = "sclk_hdmi27m",
        .rate           = 27000000,
  };
  
 -static struct clk clk_sclk_hdmiphy = {
 +struct clk clk_sclk_hdmiphy = {
        .name           = "sclk_hdmiphy",
  };
  
 -static struct clk clk_sclk_usbphy0 = {
 +struct clk clk_sclk_usbphy0 = {
        .name           = "sclk_usbphy0",
        .rate           = 27000000,
  };
  
 -static struct clk clk_sclk_usbphy1 = {
 +struct clk clk_sclk_usbphy1 = {
        .name           = "sclk_usbphy1",
  };
  
+ static struct clk dummy_apb_pclk = {
+       .name           = "apb_pclk",
+       .id             = -1,
+ };
  static int exynos4_clksrc_mask_top_ctrl(struct clk *clk, int enable)
  {
        return s5p_gatectrl(S5P_CLKSRC_MASK_TOP, clk, enable);
@@@ -126,7 -63,12 +131,7 @@@ static int exynos4_clksrc_mask_lcd0_ctr
        return s5p_gatectrl(S5P_CLKSRC_MASK_LCD0, clk, enable);
  }
  
 -static int exynos4_clksrc_mask_lcd1_ctrl(struct clk *clk, int enable)
 -{
 -      return s5p_gatectrl(S5P_CLKSRC_MASK_LCD1, clk, enable);
 -}
 -
 -static int exynos4_clksrc_mask_fsys_ctrl(struct clk *clk, int enable)
 +int exynos4_clksrc_mask_fsys_ctrl(struct clk *clk, int enable)
  {
        return s5p_gatectrl(S5P_CLKSRC_MASK_FSYS, clk, enable);
  }
@@@ -166,12 -108,12 +171,12 @@@ static int exynos4_clk_ip_lcd0_ctrl(str
        return s5p_gatectrl(S5P_CLKGATE_IP_LCD0, clk, enable);
  }
  
 -static int exynos4_clk_ip_lcd1_ctrl(struct clk *clk, int enable)
 +int exynos4_clk_ip_lcd1_ctrl(struct clk *clk, int enable)
  {
        return s5p_gatectrl(S5P_CLKGATE_IP_LCD1, clk, enable);
  }
  
 -static int exynos4_clk_ip_fsys_ctrl(struct clk *clk, int enable)
 +int exynos4_clk_ip_fsys_ctrl(struct clk *clk, int enable)
  {
        return s5p_gatectrl(S5P_CLKGATE_IP_FSYS, clk, enable);
  }
@@@ -196,7 -138,7 +201,7 @@@ static struct clksrc_clk clk_mout_apll 
        .reg_src        = { .reg = S5P_CLKSRC_CPU, .shift = 0, .size = 1 },
  };
  
 -static struct clksrc_clk clk_sclk_apll = {
 +struct clksrc_clk clk_sclk_apll = {
        .clk    = {
                .name           = "sclk_apll",
                .parent         = &clk_mout_apll.clk,
        .reg_div        = { .reg = S5P_CLKDIV_CPU, .shift = 24, .size = 3 },
  };
  
 -static struct clksrc_clk clk_mout_epll = {
 +struct clksrc_clk clk_mout_epll = {
        .clk    = {
                .name           = "mout_epll",
        },
        .reg_src        = { .reg = S5P_CLKSRC_TOP0, .shift = 4, .size = 1 },
  };
  
 -static struct clksrc_clk clk_mout_mpll = {
 +struct clksrc_clk clk_mout_mpll = {
        .clk = {
                .name           = "mout_mpll",
        },
        .sources        = &clk_src_mpll,
 -      .reg_src        = { .reg = S5P_CLKSRC_CPU, .shift = 8, .size = 1 },
 +
 +      /* reg_src will be added in each SoCs' clock */
  };
  
  static struct clk *clkset_moutcore_list[] = {
@@@ -288,12 -229,12 +293,12 @@@ static struct clksrc_clk clk_periphclk 
  
  /* Core list of CMU_CORE side */
  
 -static struct clk *clkset_corebus_list[] = {
 +struct clk *clkset_corebus_list[] = {
        [0] = &clk_mout_mpll.clk,
        [1] = &clk_sclk_apll.clk,
  };
  
 -static struct clksrc_sources clkset_mout_corebus = {
 +struct clksrc_sources clkset_mout_corebus = {
        .sources        = clkset_corebus_list,
        .nr_sources     = ARRAY_SIZE(clkset_corebus_list),
  };
@@@ -348,12 -289,12 +353,12 @@@ static struct clksrc_clk clk_pclk_acp 
  
  /* Core list of CMU_TOP side */
  
 -static struct clk *clkset_aclk_top_list[] = {
 +struct clk *clkset_aclk_top_list[] = {
        [0] = &clk_mout_mpll.clk,
        [1] = &clk_sclk_apll.clk,
  };
  
 -static struct clksrc_sources clkset_aclk = {
 +struct clksrc_sources clkset_aclk = {
        .sources        = clkset_aclk_top_list,
        .nr_sources     = ARRAY_SIZE(clkset_aclk_top_list),
  };
@@@ -385,7 -326,7 +390,7 @@@ static struct clksrc_clk clk_aclk_160 
        .reg_div        = { .reg = S5P_CLKDIV_TOP, .shift = 8, .size = 3 },
  };
  
 -static struct clksrc_clk clk_aclk_133 = {
 +struct clksrc_clk clk_aclk_133 = {
        .clk    = {
                .name           = "aclk_133",
        },
@@@ -424,7 -365,7 +429,7 @@@ static struct clksrc_sources clkset_scl
        .nr_sources     = ARRAY_SIZE(clkset_sclk_vpll_list),
  };
  
 -static struct clksrc_clk clk_sclk_vpll = {
 +struct clksrc_clk clk_sclk_vpll = {
        .clk    = {
                .name           = "sclk_vpll",
        },
@@@ -473,6 -414,16 +478,6 @@@ static struct clk init_clocks_off[] = 
                .devname        = "exynos4-fb.0",
                .enable         = exynos4_clk_ip_lcd0_ctrl,
                .ctrlbit        = (1 << 0),
 -      }, {
 -              .name           = "fimd",
 -              .devname        = "exynos4-fb.1",
 -              .enable         = exynos4_clk_ip_lcd1_ctrl,
 -              .ctrlbit        = (1 << 0),
 -      }, {
 -              .name           = "sataphy",
 -              .parent         = &clk_aclk_133.clk,
 -              .enable         = exynos4_clk_ip_fsys_ctrl,
 -              .ctrlbit        = (1 << 3),
        }, {
                .name           = "hsmmc",
                .devname        = "s3c-sdhci.0",
                .parent         = &clk_aclk_133.clk,
                .enable         = exynos4_clk_ip_fsys_ctrl,
                .ctrlbit        = (1 << 9),
 -      }, {
 -              .name           = "sata",
 -              .parent         = &clk_aclk_133.clk,
 -              .enable         = exynos4_clk_ip_fsys_ctrl,
 -              .ctrlbit        = (1 << 10),
        }, {
-               .name           = "pdma",
+               .name           = "dma",
                .devname        = "s3c-pl330.0",
                .enable         = exynos4_clk_ip_fsys_ctrl,
                .ctrlbit        = (1 << 0),
        }, {
-               .name           = "pdma",
+               .name           = "dma",
                .devname        = "s3c-pl330.1",
                .enable         = exynos4_clk_ip_fsys_ctrl,
                .ctrlbit        = (1 << 1),
                .ctrlbit        = (1 << 21),
        }, {
                .name           = "ac97",
 -              .id             = -1,
 +              .devname        = "samsung-ac97",
                .enable         = exynos4_clk_ip_peril_ctrl,
                .ctrlbit        = (1 << 27),
        }, {
@@@ -722,7 -678,7 +727,7 @@@ static struct clk init_clocks[] = 
        }
  };
  
 -static struct clk *clkset_group_list[] = {
 +struct clk *clkset_group_list[] = {
        [0] = &clk_ext_xtal_mux,
        [1] = &clk_xusbxti,
        [2] = &clk_sclk_hdmi27m,
        [8] = &clk_sclk_vpll.clk,
  };
  
 -static struct clksrc_sources clkset_group = {
 +struct clksrc_sources clkset_group = {
        .sources        = clkset_group_list,
        .nr_sources     = ARRAY_SIZE(clkset_group_list),
  };
@@@ -948,7 -904,8 +953,7 @@@ static struct clksrc_clk clksrcs[] = 
                .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 28, .size = 4 },
        }, {
                .clk            = {
 -                      .name           = "sclk_cam",
 -                      .devname        = "exynos4-fimc.0",
 +                      .name           = "sclk_cam0",
                        .enable         = exynos4_clksrc_mask_cam_ctrl,
                        .ctrlbit        = (1 << 16),
                },
                .reg_div = { .reg = S5P_CLKDIV_CAM, .shift = 16, .size = 4 },
        }, {
                .clk            = {
 -                      .name           = "sclk_cam",
 -                      .devname        = "exynos4-fimc.1",
 +                      .name           = "sclk_cam1",
                        .enable         = exynos4_clksrc_mask_cam_ctrl,
                        .ctrlbit        = (1 << 20),
                },
                .sources = &clkset_group,
                .reg_src = { .reg = S5P_CLKSRC_LCD0, .shift = 0, .size = 4 },
                .reg_div = { .reg = S5P_CLKDIV_LCD0, .shift = 0, .size = 4 },
 -      }, {
 -              .clk            = {
 -                      .name           = "sclk_fimd",
 -                      .devname        = "exynos4-fb.1",
 -                      .enable         = exynos4_clksrc_mask_lcd1_ctrl,
 -                      .ctrlbit        = (1 << 0),
 -              },
 -              .sources = &clkset_group,
 -              .reg_src = { .reg = S5P_CLKSRC_LCD1, .shift = 0, .size = 4 },
 -              .reg_div = { .reg = S5P_CLKDIV_LCD1, .shift = 0, .size = 4 },
 -      }, {
 -              .clk            = {
 -                      .name           = "sclk_sata",
 -                      .enable         = exynos4_clksrc_mask_fsys_ctrl,
 -                      .ctrlbit        = (1 << 24),
 -              },
 -              .sources = &clkset_mout_corebus,
 -              .reg_src = { .reg = S5P_CLKSRC_FSYS, .shift = 24, .size = 1 },
 -              .reg_div = { .reg = S5P_CLKDIV_FSYS0, .shift = 20, .size = 4 },
        }, {
                .clk            = {
                        .name           = "sclk_spi",
@@@ -1144,13 -1121,7 +1149,13 @@@ static int xtal_rate
  
  static unsigned long exynos4_fout_apll_get_rate(struct clk *clk)
  {
 -      return s5p_get_pll45xx(xtal_rate, __raw_readl(S5P_APLL_CON0), pll_4508);
 +      if (soc_is_exynos4210())
 +              return s5p_get_pll45xx(xtal_rate, __raw_readl(S5P_APLL_CON0),
 +                                      pll_4508);
 +      else if (soc_is_exynos4212() || soc_is_exynos4412())
 +              return s5p_get_pll35xx(xtal_rate, __raw_readl(S5P_APLL_CON0));
 +      else
 +              return 0;
  }
  
  static struct clk_ops exynos4_fout_apll_ops = {
  void __init_or_cpufreq exynos4_setup_clocks(void)
  {
        struct clk *xtal_clk;
 -      unsigned long apll;
 -      unsigned long mpll;
 -      unsigned long epll;
 -      unsigned long vpll;
 +      unsigned long apll = 0;
 +      unsigned long mpll = 0;
 +      unsigned long epll = 0;
 +      unsigned long vpll = 0;
        unsigned long vpllsrc;
        unsigned long xtal;
        unsigned long armclk;
  
        printk(KERN_DEBUG "%s: xtal is %ld\n", __func__, xtal);
  
 -      apll = s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON0), pll_4508);
 -      mpll = s5p_get_pll45xx(xtal, __raw_readl(S5P_MPLL_CON0), pll_4508);
 -      epll = s5p_get_pll46xx(xtal, __raw_readl(S5P_EPLL_CON0),
 -                              __raw_readl(S5P_EPLL_CON1), pll_4600);
 -
 -      vpllsrc = clk_get_rate(&clk_vpllsrc.clk);
 -      vpll = s5p_get_pll46xx(vpllsrc, __raw_readl(S5P_VPLL_CON0),
 -                              __raw_readl(S5P_VPLL_CON1), pll_4650);
 +      if (soc_is_exynos4210()) {
 +              apll = s5p_get_pll45xx(xtal, __raw_readl(S5P_APLL_CON0),
 +                                      pll_4508);
 +              mpll = s5p_get_pll45xx(xtal, __raw_readl(S5P_MPLL_CON0),
 +                                      pll_4508);
 +              epll = s5p_get_pll46xx(xtal, __raw_readl(S5P_EPLL_CON0),
 +                                      __raw_readl(S5P_EPLL_CON1), pll_4600);
 +
 +              vpllsrc = clk_get_rate(&clk_vpllsrc.clk);
 +              vpll = s5p_get_pll46xx(vpllsrc, __raw_readl(S5P_VPLL_CON0),
 +                                      __raw_readl(S5P_VPLL_CON1), pll_4650c);
 +      } else if (soc_is_exynos4212() || soc_is_exynos4412()) {
 +              apll = s5p_get_pll35xx(xtal, __raw_readl(S5P_APLL_CON0));
 +              mpll = s5p_get_pll35xx(xtal, __raw_readl(S5P_MPLL_CON0));
 +              epll = s5p_get_pll36xx(xtal, __raw_readl(S5P_EPLL_CON0),
 +                                      __raw_readl(S5P_EPLL_CON1));
 +
 +              vpllsrc = clk_get_rate(&clk_vpllsrc.clk);
 +              vpll = s5p_get_pll36xx(vpllsrc, __raw_readl(S5P_VPLL_CON0),
 +                                      __raw_readl(S5P_VPLL_CON1));
 +      } else {
 +              /* nothing */
 +      }
  
        clk_fout_apll.ops = &exynos4_fout_apll_ops;
        clk_fout_mpll.rate = mpll;
@@@ -1244,28 -1200,6 +1249,28 @@@ static struct clk *clks[] __initdata = 
        /* Nothing here yet */
  };
  
 +#ifdef CONFIG_PM_SLEEP
 +static int exynos4_clock_suspend(void)
 +{
 +      s3c_pm_do_save(exynos4_clock_save, ARRAY_SIZE(exynos4_clock_save));
 +      return 0;
 +}
 +
 +static void exynos4_clock_resume(void)
 +{
 +      s3c_pm_do_restore_core(exynos4_clock_save, ARRAY_SIZE(exynos4_clock_save));
 +}
 +
 +#else
 +#define exynos4_clock_suspend NULL
 +#define exynos4_clock_resume NULL
 +#endif
 +
 +struct syscore_ops exynos4_clock_syscore_ops = {
 +      .suspend        = exynos4_clock_suspend,
 +      .resume         = exynos4_clock_resume,
 +};
 +
  void __init exynos4_register_clocks(void)
  {
        int ptr;
        s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
        s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
  
++<<<<<<< HEAD
 +      register_syscore_ops(&exynos4_clock_syscore_ops);
++=======
+       s3c24xx_register_clock(&dummy_apb_pclk);
++>>>>>>> 4598fc2c94b68740e0269db03c98a1e7ad5af773
        s3c_pwmclk_init();
  }
@@@ -50,46 -50,64 +50,46 @@@ static struct s3c24xx_dma_map __initdat
                .name           = "sdi",
                .channels       = MAP(S3C2412_DMAREQSEL_SDI),
                .channels_rx    = MAP(S3C2412_DMAREQSEL_SDI),
 -              .hw_addr.to     = S3C2410_PA_SDI + S3C2410_SDIDATA,
 -              .hw_addr.from   = S3C2410_PA_SDI + S3C2410_SDIDATA,
        },
        [DMACH_SPI0] = {
                .name           = "spi0",
                .channels       = MAP(S3C2412_DMAREQSEL_SPI0TX),
                .channels_rx    = MAP(S3C2412_DMAREQSEL_SPI0RX),
 -              .hw_addr.to     = S3C2410_PA_SPI + S3C2410_SPTDAT,
 -              .hw_addr.from   = S3C2410_PA_SPI + S3C2410_SPRDAT,
        },
        [DMACH_SPI1] = {
                .name           = "spi1",
                .channels       = MAP(S3C2412_DMAREQSEL_SPI1TX),
                .channels_rx    = MAP(S3C2412_DMAREQSEL_SPI1RX),
 -              .hw_addr.to     = S3C2410_PA_SPI + S3C2412_SPI1 + S3C2410_SPTDAT,
 -              .hw_addr.from   = S3C2410_PA_SPI + S3C2412_SPI1  + S3C2410_SPRDAT,
        },
        [DMACH_UART0] = {
                .name           = "uart0",
                .channels       = MAP(S3C2412_DMAREQSEL_UART0_0),
                .channels_rx    = MAP(S3C2412_DMAREQSEL_UART0_0),
 -              .hw_addr.to     = S3C2410_PA_UART0 + S3C2410_UTXH,
 -              .hw_addr.from   = S3C2410_PA_UART0 + S3C2410_URXH,
        },
        [DMACH_UART1] = {
                .name           = "uart1",
                .channels       = MAP(S3C2412_DMAREQSEL_UART1_0),
                .channels_rx    = MAP(S3C2412_DMAREQSEL_UART1_0),
 -              .hw_addr.to     = S3C2410_PA_UART1 + S3C2410_UTXH,
 -              .hw_addr.from   = S3C2410_PA_UART1 + S3C2410_URXH,
        },
                [DMACH_UART2] = {
                .name           = "uart2",
                .channels       = MAP(S3C2412_DMAREQSEL_UART2_0),
                .channels_rx    = MAP(S3C2412_DMAREQSEL_UART2_0),
 -              .hw_addr.to     = S3C2410_PA_UART2 + S3C2410_UTXH,
 -              .hw_addr.from   = S3C2410_PA_UART2 + S3C2410_URXH,
        },
        [DMACH_UART0_SRC2] = {
                .name           = "uart0",
                .channels       = MAP(S3C2412_DMAREQSEL_UART0_1),
                .channels_rx    = MAP(S3C2412_DMAREQSEL_UART0_1),
 -              .hw_addr.to     = S3C2410_PA_UART0 + S3C2410_UTXH,
 -              .hw_addr.from   = S3C2410_PA_UART0 + S3C2410_URXH,
        },
        [DMACH_UART1_SRC2] = {
                .name           = "uart1",
                .channels       = MAP(S3C2412_DMAREQSEL_UART1_1),
                .channels_rx    = MAP(S3C2412_DMAREQSEL_UART1_1),
 -              .hw_addr.to     = S3C2410_PA_UART1 + S3C2410_UTXH,
 -              .hw_addr.from   = S3C2410_PA_UART1 + S3C2410_URXH,
        },
                [DMACH_UART2_SRC2] = {
                .name           = "uart2",
                .channels       = MAP(S3C2412_DMAREQSEL_UART2_1),
                .channels_rx    = MAP(S3C2412_DMAREQSEL_UART2_1),
 -              .hw_addr.to     = S3C2410_PA_UART2 + S3C2410_UTXH,
 -              .hw_addr.from   = S3C2410_PA_UART2 + S3C2410_URXH,
        },
        [DMACH_TIMER] = {
                .name           = "timer",
  
  static void s3c2412_dma_direction(struct s3c2410_dma_chan *chan,
                                  struct s3c24xx_dma_map *map,
-                                 enum s3c2410_dmasrc dir)
+                                 enum dma_data_direction dir)
  {
        unsigned long chsel;
  
-       if (dir == S3C2410_DMASRC_HW)
+       if (dir == DMA_FROM_DEVICE)
                chsel = map->channels_rx[0];
        else
                chsel = map->channels[0];
   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
  
- #include <linux/platform_device.h>
  #include <linux/dma-mapping.h>
+ #include <linux/amba/bus.h>
+ #include <linux/amba/pl330.h>
+ #include <asm/irq.h>
  
  #include <mach/map.h>
  #include <mach/irqs.h>
  #include <mach/regs-clock.h>
+ #include <mach/dma.h>
  
 +#include <plat/cpu.h>
  #include <plat/devs.h>
- #include <plat/s3c-pl330-pdata.h>
+ #include <plat/irqs.h>
  
  static u64 dma_dmamask = DMA_BIT_MASK(32);
  
- static struct resource s5p64x0_pdma_resource[] = {
-       [0] = {
-               .start  = S5P64X0_PA_PDMA,
-               .end    = S5P64X0_PA_PDMA + SZ_4K,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = IRQ_DMA0,
-               .end    = IRQ_DMA0,
-               .flags  = IORESOURCE_IRQ,
+ struct dma_pl330_peri s5p6440_pdma_peri[22] = {
+       {
+               .peri_id = (u8)DMACH_UART0_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_UART0_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_UART1_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_UART1_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_UART2_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_UART2_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_UART3_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_UART3_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = DMACH_MAX,
+       }, {
+               .peri_id = DMACH_MAX,
+       }, {
+               .peri_id = (u8)DMACH_PCM0_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_PCM0_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_I2S0_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_I2S0_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_SPI0_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_SPI0_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_MAX,
+       }, {
+               .peri_id = (u8)DMACH_MAX,
+       }, {
+               .peri_id = (u8)DMACH_MAX,
+       }, {
+               .peri_id = (u8)DMACH_MAX,
+       }, {
+               .peri_id = (u8)DMACH_SPI1_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_SPI1_RX,
+               .rqtype = DEVTOMEM,
        },
  };
  
- static struct s3c_pl330_platdata s5p6440_pdma_pdata = {
-       .peri = {
-               [0] = DMACH_UART0_RX,
-               [1] = DMACH_UART0_TX,
-               [2] = DMACH_UART1_RX,
-               [3] = DMACH_UART1_TX,
-               [4] = DMACH_UART2_RX,
-               [5] = DMACH_UART2_TX,
-               [6] = DMACH_UART3_RX,
-               [7] = DMACH_UART3_TX,
-               [8] = DMACH_MAX,
-               [9] = DMACH_MAX,
-               [10] = DMACH_PCM0_TX,
-               [11] = DMACH_PCM0_RX,
-               [12] = DMACH_I2S0_TX,
-               [13] = DMACH_I2S0_RX,
-               [14] = DMACH_SPI0_TX,
-               [15] = DMACH_SPI0_RX,
-               [16] = DMACH_MAX,
-               [17] = DMACH_MAX,
-               [18] = DMACH_MAX,
-               [19] = DMACH_MAX,
-               [20] = DMACH_SPI1_TX,
-               [21] = DMACH_SPI1_RX,
-               [22] = DMACH_MAX,
-               [23] = DMACH_MAX,
-               [24] = DMACH_MAX,
-               [25] = DMACH_MAX,
-               [26] = DMACH_MAX,
-               [27] = DMACH_MAX,
-               [28] = DMACH_MAX,
-               [29] = DMACH_PWM,
-               [30] = DMACH_MAX,
-               [31] = DMACH_MAX,
-       },
+ struct dma_pl330_platdata s5p6440_pdma_pdata = {
+       .nr_valid_peri = ARRAY_SIZE(s5p6440_pdma_peri),
+       .peri = s5p6440_pdma_peri,
  };
  
- static struct s3c_pl330_platdata s5p6450_pdma_pdata = {
-       .peri = {
-               [0] = DMACH_UART0_RX,
-               [1] = DMACH_UART0_TX,
-               [2] = DMACH_UART1_RX,
-               [3] = DMACH_UART1_TX,
-               [4] = DMACH_UART2_RX,
-               [5] = DMACH_UART2_TX,
-               [6] = DMACH_UART3_RX,
-               [7] = DMACH_UART3_TX,
-               [8] = DMACH_UART4_RX,
-               [9] = DMACH_UART4_TX,
-               [10] = DMACH_PCM0_TX,
-               [11] = DMACH_PCM0_RX,
-               [12] = DMACH_I2S0_TX,
-               [13] = DMACH_I2S0_RX,
-               [14] = DMACH_SPI0_TX,
-               [15] = DMACH_SPI0_RX,
-               [16] = DMACH_PCM1_TX,
-               [17] = DMACH_PCM1_RX,
-               [18] = DMACH_PCM2_TX,
-               [19] = DMACH_PCM2_RX,
-               [20] = DMACH_SPI1_TX,
-               [21] = DMACH_SPI1_RX,
-               [22] = DMACH_USI_TX,
-               [23] = DMACH_USI_RX,
-               [24] = DMACH_MAX,
-               [25] = DMACH_I2S1_TX,
-               [26] = DMACH_I2S1_RX,
-               [27] = DMACH_I2S2_TX,
-               [28] = DMACH_I2S2_RX,
-               [29] = DMACH_PWM,
-               [30] = DMACH_UART5_RX,
-               [31] = DMACH_UART5_TX,
+ struct dma_pl330_peri s5p6450_pdma_peri[32] = {
+       {
+               .peri_id = (u8)DMACH_UART0_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_UART0_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_UART1_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_UART1_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_UART2_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_UART2_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_UART3_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_UART3_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_UART4_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_UART4_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_PCM0_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_PCM0_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_I2S0_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_I2S0_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_SPI0_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_SPI0_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_PCM1_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_PCM1_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_PCM2_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_PCM2_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_SPI1_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_SPI1_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_USI_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_USI_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_MAX,
+       }, {
+               .peri_id = (u8)DMACH_I2S1_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_I2S1_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_I2S2_TX,
+               .rqtype = MEMTODEV,
+       }, {
+               .peri_id = (u8)DMACH_I2S2_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_PWM,
+       }, {
+               .peri_id = (u8)DMACH_UART5_RX,
+               .rqtype = DEVTOMEM,
+       }, {
+               .peri_id = (u8)DMACH_UART5_TX,
+               .rqtype = MEMTODEV,
        },
  };
  
- static struct platform_device s5p64x0_device_pdma = {
-       .name           = "s3c-pl330",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(s5p64x0_pdma_resource),
-       .resource       = s5p64x0_pdma_resource,
-       .dev            = {
+ struct dma_pl330_platdata s5p6450_pdma_pdata = {
+       .nr_valid_peri = ARRAY_SIZE(s5p6450_pdma_peri),
+       .peri = s5p6450_pdma_peri,
+ };
+ struct amba_device s5p64x0_device_pdma = {
+       .dev = {
+               .init_name = "dma-pl330",
                .dma_mask = &dma_dmamask,
                .coherent_dma_mask = DMA_BIT_MASK(32),
        },
+       .res = {
+               .start = S5P64X0_PA_PDMA,
+               .end = S5P64X0_PA_PDMA + SZ_4K,
+               .flags = IORESOURCE_MEM,
+       },
+       .irq = {IRQ_DMA0, NO_IRQ},
+       .periphid = 0x00041330,
  };
  
  static int __init s5p64x0_dma_init(void)
  {
 -      unsigned int id = __raw_readl(S5P64X0_SYS_ID) & 0xFF000;
 -
 -      if (id == 0x50000)
 +      if (soc_is_s5p6450())
                s5p64x0_device_pdma.dev.platform_data = &s5p6450_pdma_pdata;
        else
                s5p64x0_device_pdma.dev.platform_data = &s5p6440_pdma_pdata;
  
-       platform_device_register(&s5p64x0_device_pdma);
+       amba_device_register(&s5p64x0_device_pdma, &iomem_resource);
  
        return 0;
  }
@@@ -11,9 -11,10 +11,9 @@@ if ARCH_S5PV21
  
  config CPU_S5PV210
        bool
-       select S3C_PL330_DMA
+       select SAMSUNG_DMADEV
        select S5P_EXT_INT
        select S5P_HRT
 -      select S5PV210_PM if PM
        help
          Enable S5PV210 CPU support
  
@@@ -168,4 -169,9 +168,4 @@@ config MACH_TORBREC
  
  endmenu
  
 -config S5PV210_PM
 -      bool
 -      help
 -        Power Management code common to S5PV210
 -
  endif
@@@ -203,6 -203,11 +203,11 @@@ static struct clk clk_pcmcdclk2 = 
        .name           = "pcmcdclk",
  };
  
+ static struct clk dummy_apb_pclk = {
+       .name           = "apb_pclk",
+       .id             = -1,
+ };
  static struct clk *clkset_vpllsrc_list[] = {
        [0] = &clk_fin_vpll,
        [1] = &clk_sclk_hdmi27m,
@@@ -289,13 -294,13 +294,13 @@@ static struct clk_ops clk_fout_apll_op
  
  static struct clk init_clocks_off[] = {
        {
-               .name           = "pdma",
+               .name           = "dma",
                .devname        = "s3c-pl330.0",
                .parent         = &clk_hclk_psys.clk,
                .enable         = s5pv210_clk_ip0_ctrl,
                .ctrlbit        = (1 << 3),
        }, {
-               .name           = "pdma",
+               .name           = "dma",
                .devname        = "s3c-pl330.1",
                .parent         = &clk_hclk_psys.clk,
                .enable         = s5pv210_clk_ip0_ctrl,
@@@ -815,7 -820,8 +820,7 @@@ static struct clksrc_clk clksrcs[] = 
                .reg_div = { .reg = S5P_CLK_DIV3, .shift = 20, .size = 4 },
        }, {
                .clk            = {
 -                      .name           = "sclk_cam",
 -                      .devname        = "s5pv210-fimc.0",
 +                      .name           = "sclk_cam0",
                        .enable         = s5pv210_clk_mask0_ctrl,
                        .ctrlbit        = (1 << 3),
                },
                .reg_div = { .reg = S5P_CLK_DIV1, .shift = 12, .size = 4 },
        }, {
                .clk            = {
 -                      .name           = "sclk_cam",
 -                      .devname        = "s5pv210-fimc.1",
 +                      .name           = "sclk_cam1",
                        .enable         = s5pv210_clk_mask0_ctrl,
                        .ctrlbit        = (1 << 4),
                },
@@@ -1159,5 -1166,6 +1164,6 @@@ void __init s5pv210_register_clocks(voi
        s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
        s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
  
+       s3c24xx_register_clock(&dummy_apb_pclk);
        s3c_pwmclk_init();
  }
@@@ -65,6 -65,11 +65,6 @@@ config SAMSUNG_IRQ_VIC_TIME
         help
           Internal configuration to build the VIC timer interrupt code.
  
 -config SAMSUNG_IRQ_UART
 -       bool
 -       help
 -         Internal configuration to build the IRQ UART demux code.
 -
  # options for gpio configuration support
  
  config SAMSUNG_GPIOLIB_4BIT
@@@ -295,11 -300,14 +295,14 @@@ config S3C_DM
        help
          Internal configuration for S3C DMA core
  
- config S3C_PL330_DMA
+ config SAMSUNG_DMADEV
        bool
-       select PL330
+       select DMADEVICES
+       select PL330_DMA if (CPU_EXYNOS4210 || CPU_S5PV210 || CPU_S5PC100 || \
+                                       CPU_S5P6450 || CPU_S5P6440)
+       select ARM_AMBA
        help
-         S3C DMA API Driver for PL330 DMAC.
+         Use DMA device engine for PL330 DMAC.
  
  comment "Power management"
  
@@@ -362,11 -370,4 +365,11 @@@ config SAMSUNG_P
        help
          Say Y here if you want to control Power Domain by Runtime PM.
  
 +config DEBUG_S3C_UART
 +      depends on PLAT_SAMSUNG
 +      int
 +      default "0" if DEBUG_S3C_UART0
 +      default "1" if DEBUG_S3C_UART1
 +      default "2" if DEBUG_S3C_UART2
 +
  endif
@@@ -11,7 -11,7 +11,7 @@@ obj-                          :
  
  # Objects we always build independent of SoC choice
  
 -obj-y                         += init.o
 +obj-y                         += init.o cpu.o
  obj-$(CONFIG_ARCH_USES_GETTIMEOFFSET)   += time.o
  obj-y                         += clock.o
  obj-y                         += pwm-clock.o
@@@ -21,6 -21,7 +21,6 @@@ obj-y                         += dev-asocdma.
  
  obj-$(CONFIG_SAMSUNG_CLKSRC)  += clock-clksrc.o
  
 -obj-$(CONFIG_SAMSUNG_IRQ_UART)        += irq-uart.o
  obj-$(CONFIG_SAMSUNG_IRQ_VIC_TIMER) += irq-vic-timer.o
  
  # ADC
@@@ -62,9 -63,9 +62,9 @@@ obj-$(CONFIG_SAMSUNG_DEV_BACKLIGHT)   += 
  
  # DMA support
  
- obj-$(CONFIG_S3C_DMA)         += dma.o
+ obj-$(CONFIG_S3C_DMA)         += dma.o s3c-dma-ops.o
  
- obj-$(CONFIG_S3C_PL330_DMA)   += s3c-pl330.o
+ obj-$(CONFIG_SAMSUNG_DMADEV)  += dma-ops.o
  
  # PM support
  
@@@ -18,6 -18,11 +18,6 @@@ extern struct s3c2410_dma_chan s3c2410_
  #define DMA_CH_VALID          (1<<31)
  #define DMA_CH_NEVER          (1<<30)
  
 -struct s3c24xx_dma_addr {
 -      unsigned long           from;
 -      unsigned long           to;
 -};
 -
  /* struct s3c24xx_dma_map
   *
   * this holds the mapping information for the channel selected
@@@ -26,6 -31,7 +26,6 @@@
  
  struct s3c24xx_dma_map {
        const char              *name;
 -      struct s3c24xx_dma_addr  hw_addr;
  
        unsigned long            channels[S3C_DMA_CHANNELS];
        unsigned long            channels_rx[S3C_DMA_CHANNELS];
@@@ -41,7 -47,7 +41,7 @@@ struct s3c24xx_dma_selection 
  
        void    (*direction)(struct s3c2410_dma_chan *chan,
                             struct s3c24xx_dma_map *map,
-                            enum s3c2410_dmasrc dir);
+                            enum dma_data_direction dir);
  };
  
  extern int s3c24xx_dma_init_map(struct s3c24xx_dma_selection *sel);
@@@ -247,7 -247,7 +247,7 @@@ static void s3cmci_check_sdio_irq(struc
  {
        if (host->sdio_irqen) {
                if (gpio_get_value(S3C2410_GPE(8)) == 0) {
 -                      printk(KERN_DEBUG "%s: signalling irq\n", __func__);
 +                      pr_debug("%s: signalling irq\n", __func__);
                        mmc_signal_sdio_irq(host->mmc);
                }
        }
@@@ -344,7 -344,7 +344,7 @@@ static void s3cmci_disable_irq(struct s
  
        local_irq_save(flags);
  
 -      //printk(KERN_DEBUG "%s: transfer %d\n", __func__, transfer);
 +      /* pr_debug("%s: transfer %d\n", __func__, transfer); */
  
        host->irq_disabled = transfer;
  
@@@ -913,9 -913,9 +913,9 @@@ request_done
  }
  
  static void s3cmci_dma_setup(struct s3cmci_host *host,
-                            enum s3c2410_dmasrc source)
+                            enum dma_data_direction source)
  {
-       static enum s3c2410_dmasrc last_source = -1;
+       static enum dma_data_direction last_source = -1;
        static int setup_ok;
  
        if (last_source == source)
@@@ -1087,7 -1087,7 +1087,7 @@@ static int s3cmci_prepare_dma(struct s3
  
        BUG_ON((data->flags & BOTH_DIR) == BOTH_DIR);
  
-       s3cmci_dma_setup(host, rw ? S3C2410_DMASRC_MEM : S3C2410_DMASRC_HW);
+       s3cmci_dma_setup(host, rw ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
        s3c2410_dma_ctrl(host->dma, S3C2410_DMAOP_FLUSH);
  
        dma_len = dma_map_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
@@@ -47,7 -47,6 +47,7 @@@
  #include <linux/ctype.h>
  #include <linux/err.h>
  #include <linux/dmaengine.h>
 +#include <linux/dma-mapping.h>
  #include <linux/scatterlist.h>
  #include <linux/slab.h>
  
@@@ -96,12 -95,6 +96,12 @@@ struct sci_port 
  #endif
  
        struct notifier_block           freq_transition;
 +
 +#ifdef CONFIG_SERIAL_SH_SCI_CONSOLE
 +      unsigned short saved_smr;
 +      unsigned short saved_fcr;
 +      unsigned char saved_brr;
 +#endif
  };
  
  /* Function prototypes */
@@@ -1083,7 -1076,7 +1083,7 @@@ static unsigned int sci_get_mctrl(struc
        /* This routine is used for getting signals of: DTR, DCD, DSR, RI,
           and CTS/RTS */
  
 -      return TIOCM_DTR | TIOCM_RTS | TIOCM_DSR;
 +      return TIOCM_DTR | TIOCM_RTS | TIOCM_CTS | TIOCM_DSR;
  }
  
  #ifdef CONFIG_SERIAL_SH_SCI_DMA
@@@ -1446,12 -1439,8 +1446,8 @@@ static bool filter(struct dma_chan *cha
        dev_dbg(chan->device->dev, "%s: slave ID %d\n", __func__,
                param->slave_id);
  
-       if (param->dma_dev == chan->device->dev) {
-               chan->private = param;
-               return true;
-       } else {
-               return false;
-       }
+       chan->private = param;
+       return true;
  }
  
  static void rx_timer_fn(unsigned long arg)
@@@ -1477,10 -1466,10 +1473,10 @@@ static void sci_request_dma(struct uart
        dma_cap_mask_t mask;
        int nent;
  
-       dev_dbg(port->dev, "%s: port %d DMA %p\n", __func__,
-               port->line, s->cfg->dma_dev);
+       dev_dbg(port->dev, "%s: port %d\n", __func__,
+               port->line);
  
-       if (!s->cfg->dma_dev)
+       if (s->cfg->dma_slave_tx <= 0 || s->cfg->dma_slave_rx <= 0)
                return;
  
        dma_cap_zero(mask);
  
        /* Slave ID, e.g., SHDMA_SLAVE_SCIF0_TX */
        param->slave_id = s->cfg->dma_slave_tx;
-       param->dma_dev = s->cfg->dma_dev;
  
        s->cookie_tx = -EINVAL;
        chan = dma_request_channel(mask, filter, param);
  
        /* Slave ID, e.g., SHDMA_SLAVE_SCIF0_RX */
        param->slave_id = s->cfg->dma_slave_rx;
-       param->dma_dev = s->cfg->dma_dev;
  
        chan = dma_request_channel(mask, filter, param);
        dev_dbg(port->dev, "%s: RX: got channel %p\n", __func__, chan);
@@@ -1564,9 -1551,6 +1558,6 @@@ static void sci_free_dma(struct uart_po
  {
        struct sci_port *s = to_sci_port(port);
  
-       if (!s->cfg->dma_dev)
-               return;
        if (s->chan_tx)
                sci_tx_dma_release(s, false);
        if (s->chan_rx)
@@@ -1640,25 -1624,11 +1631,25 @@@ static unsigned int sci_scbrr_calc(unsi
        return ((freq + 16 * bps) / (32 * bps) - 1);
  }
  
 +static void sci_reset(struct uart_port *port)
 +{
 +      unsigned int status;
 +
 +      do {
 +              status = sci_in(port, SCxSR);
 +      } while (!(status & SCxSR_TEND(port)));
 +
 +      sci_out(port, SCSCR, 0x00);     /* TE=0, RE=0, CKE1=0 */
 +
 +      if (port->type != PORT_SCI)
 +              sci_out(port, SCFCR, SCFCR_RFRST | SCFCR_TFRST);
 +}
 +
  static void sci_set_termios(struct uart_port *port, struct ktermios *termios,
                            struct ktermios *old)
  {
        struct sci_port *s = to_sci_port(port);
 -      unsigned int status, baud, smr_val, max_baud;
 +      unsigned int baud, smr_val, max_baud;
        int t = -1;
        u16 scfcr = 0;
  
  
        sci_port_enable(s);
  
 -      do {
 -              status = sci_in(port, SCxSR);
 -      } while (!(status & SCxSR_TEND(port)));
 -
 -      sci_out(port, SCSCR, 0x00);     /* TE=0, RE=0, CKE1=0 */
 -
 -      if (port->type != PORT_SCI)
 -              sci_out(port, SCFCR, scfcr | SCFCR_RFRST | SCFCR_TFRST);
 +      sci_reset(port);
  
        smr_val = sci_in(port, SCSMR) & 3;
  
@@@ -1976,14 -1953,14 +1967,14 @@@ static int __devinit sci_init_single(st
         * For the muxed case there's nothing more to do.
         */
        port->irq               = p->irqs[SCIx_RXI_IRQ];
 -      port->irqflags          = IRQF_DISABLED;
 +      port->irqflags          = 0;
  
        port->serial_in         = sci_serial_in;
        port->serial_out        = sci_serial_out;
  
-       if (p->dma_dev)
-               dev_dbg(port->dev, "DMA device %p, tx %d, rx %d\n",
-                       p->dma_dev, p->dma_slave_tx, p->dma_slave_rx);
+       if (p->dma_slave_tx > 0 && p->dma_slave_rx > 0)
+               dev_dbg(port->dev, "DMA tx %d, rx %d\n",
+                       p->dma_slave_tx, p->dma_slave_rx);
  
        return 0;
  }
@@@ -2051,8 -2028,7 +2042,8 @@@ static int __devinit serial_console_set
        if (options)
                uart_parse_options(options, &baud, &parity, &bits, &flow);
  
 -      /* TODO: disable clock */
 +      sci_port_disable(sci_port);
 +
        return uart_set_options(port, co, baud, parity, bits, flow);
  }
  
@@@ -2095,36 -2071,6 +2086,36 @@@ static int __devinit sci_probe_earlypri
        return 0;
  }
  
 +#define uart_console(port)    ((port)->cons->index == (port)->line)
 +
 +static int sci_runtime_suspend(struct device *dev)
 +{
 +      struct sci_port *sci_port = dev_get_drvdata(dev);
 +      struct uart_port *port = &sci_port->port;
 +
 +      if (uart_console(port)) {
 +              sci_port->saved_smr = sci_in(port, SCSMR);
 +              sci_port->saved_brr = sci_in(port, SCBRR);
 +              sci_port->saved_fcr = sci_in(port, SCFCR);
 +      }
 +      return 0;
 +}
 +
 +static int sci_runtime_resume(struct device *dev)
 +{
 +      struct sci_port *sci_port = dev_get_drvdata(dev);
 +      struct uart_port *port = &sci_port->port;
 +
 +      if (uart_console(port)) {
 +              sci_reset(port);
 +              sci_out(port, SCSMR, sci_port->saved_smr);
 +              sci_out(port, SCBRR, sci_port->saved_brr);
 +              sci_out(port, SCFCR, sci_port->saved_fcr);
 +              sci_out(port, SCSCR, sci_port->cfg->scscr);
 +      }
 +      return 0;
 +}
 +
  #define SCI_CONSOLE   (&serial_console)
  
  #else
@@@ -2134,8 -2080,6 +2125,8 @@@ static inline int __devinit sci_probe_e
  }
  
  #define SCI_CONSOLE   NULL
 +#define sci_runtime_suspend   NULL
 +#define sci_runtime_resume    NULL
  
  #endif /* CONFIG_SERIAL_SH_SCI_CONSOLE */
  
@@@ -2251,8 -2195,6 +2242,8 @@@ static int sci_resume(struct device *de
  }
  
  static const struct dev_pm_ops sci_dev_pm_ops = {
 +      .runtime_suspend = sci_runtime_suspend,
 +      .runtime_resume = sci_runtime_resume,
        .suspend        = sci_suspend,
        .resume         = sci_resume,
  };
diff --combined sound/soc/samsung/ac97.c
@@@ -271,7 -271,10 +271,10 @@@ static int s3c_ac97_trigger(struct snd_
  
        writel(ac_glbctrl, s3c_ac97.regs + S3C_AC97_GLBCTRL);
  
-       s3c2410_dma_ctrl(dma_data->channel, S3C2410_DMAOP_STARTED);
+       if (!dma_data->ops)
+               dma_data->ops = samsung_dma_get_ops();
+       dma_data->ops->started(dma_data->channel);
  
        return 0;
  }
@@@ -317,7 -320,10 +320,10 @@@ static int s3c_ac97_mic_trigger(struct 
  
        writel(ac_glbctrl, s3c_ac97.regs + S3C_AC97_GLBCTRL);
  
-       s3c2410_dma_ctrl(dma_data->channel, S3C2410_DMAOP_STARTED);
+       if (!dma_data->ops)
+               dma_data->ops = samsung_dma_get_ops();
+       dma_data->ops->started(dma_data->channel);
  
        return 0;
  }
@@@ -444,7 -450,7 +450,7 @@@ static __devinit int s3c_ac97_probe(str
        }
  
        ret = request_irq(irq_res->start, s3c_ac97_irq,
 -                                      IRQF_DISABLED, "AC97", NULL);
 +                                      0, "AC97", NULL);
        if (ret < 0) {
                dev_err(&pdev->dev, "ac97: interrupt request failed.\n");
                goto err4;
@@@ -495,7 -501,7 +501,7 @@@ static __devexit int s3c_ac97_remove(st
  
  static struct platform_driver s3c_ac97_driver = {
        .probe  = s3c_ac97_probe,
 -      .remove = s3c_ac97_remove,
 +      .remove = __devexit_p(s3c_ac97_remove),
        .driver = {
                .name = "samsung-ac97",
                .owner = THIS_MODULE,