Merge branch 'next-samsung-devel' into next-samsung-devel-2
authorKukjin Kim <kgene.kim@samsung.com>
Tue, 4 Oct 2011 11:18:36 +0000 (20:18 +0900)
committerKukjin Kim <kgene.kim@samsung.com>
Tue, 4 Oct 2011 11:18:36 +0000 (20:18 +0900)
Conflicts:
arch/arm/mach-exynos4/clock.c
arch/arm/mach-s3c2412/gpio.c
arch/arm/mach-s5p64x0/dma.c
arch/arm/mach-s5p64x0/gpiolib.c

15 files changed:
1  2 
arch/arm/mach-exynos4/Kconfig
arch/arm/mach-exynos4/clock.c
arch/arm/mach-exynos4/cpu.c
arch/arm/mach-exynos4/include/mach/map.h
arch/arm/mach-exynos4/mach-smdkv310.c
arch/arm/mach-exynos4/pm.c
arch/arm/mach-s3c2412/dma.c
arch/arm/mach-s3c64xx/mach-crag6410.c
arch/arm/mach-s5p64x0/dma.c
arch/arm/mach-s5p64x0/mach-smdk6440.c
arch/arm/mach-s5p64x0/mach-smdk6450.c
arch/arm/mach-s5pv210/Kconfig
arch/arm/plat-s5p/include/plat/pll.h
arch/arm/plat-samsung/Makefile
arch/arm/plat-samsung/include/plat/dma-s3c24xx.h

index c595bb03f417c376350bf646df049447917cfcd5,60b82e83a0846fb39acd9a3046d6490b956f1beb..b6722decff9d7c3c08d369175808a50db2a605d7
@@@ -11,15 -11,10 +11,15 @@@ if ARCH_EXYNOS
  
  config CPU_EXYNOS4210
        bool
-       select S3C_PL330_DMA
+       select SAMSUNG_DMADEV
        help
          Enable EXYNOS4210 CPU support
  
 +config SOC_EXYNOS4212
 +      bool
 +      help
 +        Enable EXYNOS4212 SoC support
 +
  config EXYNOS4_MCT
        bool
        default y
@@@ -116,11 -111,24 +116,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
  
@@@ -131,6 -139,14 +131,14 @@@ config MACH_SMDKV31
        select S3C_DEV_RTC
        select S3C_DEV_WDT
        select S3C_DEV_I2C1
+       select S5P_DEV_FIMC0
+       select S5P_DEV_FIMC1
+       select S5P_DEV_FIMC2
+       select S5P_DEV_FIMC3
+       select S5P_DEV_I2C_HDMIPHY
+       select S5P_DEV_MFC
+       select S5P_DEV_TV
+       select S5P_DEV_USB_EHCI
        select S3C_DEV_HSMMC
        select S3C_DEV_HSMMC1
        select S3C_DEV_HSMMC2
        select EXYNOS4_SETUP_I2C1
        select EXYNOS4_SETUP_KEYPAD
        select EXYNOS4_SETUP_SDHCI
+       select EXYNOS4_SETUP_USB_PHY
        help
          Machine support for Samsung SMDKV310
  
@@@ -170,19 -187,26 +179,26 @@@ config MACH_UNIVERSAL_C21
        select S5P_DEV_FIMC1
        select S5P_DEV_FIMC2
        select S5P_DEV_FIMC3
+       select S5P_DEV_CSIS0
+       select S5P_DEV_FIMD0
        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_I2C_HDMIPHY
        select S5P_DEV_MFC
        select S5P_DEV_ONENAND
+       select S5P_DEV_TV
        select EXYNOS4_DEV_PD
+       select EXYNOS4_SETUP_FIMD0
        select EXYNOS4_SETUP_I2C1
        select EXYNOS4_SETUP_I2C3
        select EXYNOS4_SETUP_I2C5
        select EXYNOS4_SETUP_SDHCI
+       select EXYNOS4_SETUP_FIMC
+       select S5P_SETUP_MIPIPHY
        help
          Machine support for Samsung Mobile Universal S5PC210 Reference
          Board.
@@@ -191,6 -215,8 +207,8 @@@ config MACH_NUR
        bool "Mobile NURI Board"
        select CPU_EXYNOS4210
        select S3C_DEV_WDT
+       select S3C_DEV_RTC
+       select S5P_DEV_FIMD0
        select S3C_DEV_HSMMC
        select S3C_DEV_HSMMC2
        select S3C_DEV_HSMMC3
        select S5P_DEV_MFC
        select S5P_DEV_USB_EHCI
        select EXYNOS4_DEV_PD
+       select EXYNOS4_SETUP_FIMD0
        select EXYNOS4_SETUP_I2C1
        select EXYNOS4_SETUP_I2C3
        select EXYNOS4_SETUP_I2C5
@@@ -215,34 -242,25 +234,48 @@@ config MACH_ORIGE
        select CPU_EXYNOS4210
        select S3C_DEV_RTC
        select S3C_DEV_WDT
+       select S3C_DEV_HSMMC
        select S3C_DEV_HSMMC2
+       select S5P_DEV_FIMC0
+       select S5P_DEV_FIMC1
+       select S5P_DEV_FIMC2
+       select S5P_DEV_FIMC3
+       select S5P_DEV_FIMD0
+       select S5P_DEV_I2C_HDMIPHY
+       select S5P_DEV_TV
+       select S5P_DEV_USB_EHCI
+       select EXYNOS4_DEV_PD
+       select SAMSUNG_DEV_BACKLIGHT
+       select SAMSUNG_DEV_PWM
+       select EXYNOS4_SETUP_FIMD0
        select EXYNOS4_SETUP_SDHCI
+       select EXYNOS4_SETUP_USB_PHY
        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
 +
  endmenu
  
  comment "Configuration for HSMMC bus width"
index 413c7cc81979f47ee6dcf0923063440effaa9f29,13e2421ba9e64d30d347d93cfce28a313a576664..a25c818367590dc7345c655567737f33b624f650
@@@ -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);
  }
@@@ -146,6 -88,11 +151,11 @@@ static int exynos4_clk_ip_mfc_ctrl(stru
        return s5p_gatectrl(S5P_CLKGATE_IP_MFC, clk, enable);
  }
  
+ static int exynos4_clksrc_mask_tv_ctrl(struct clk *clk, int enable)
+ {
+       return s5p_gatectrl(S5P_CLKSRC_MASK_TV, clk, enable);
+ }
  static int exynos4_clk_ip_cam_ctrl(struct clk *clk, int enable)
  {
        return s5p_gatectrl(S5P_CLKGATE_IP_CAM, clk, enable);
@@@ -166,12 -113,12 +176,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);
  }
@@@ -186,6 -133,16 +196,16 @@@ static int exynos4_clk_ip_perir_ctrl(st
        return s5p_gatectrl(S5P_CLKGATE_IP_PERIR, clk, enable);
  }
  
+ static int exynos4_clk_hdmiphy_ctrl(struct clk *clk, int enable)
+ {
+       return s5p_gatectrl(S5P_HDMI_PHY_CONTROL, clk, enable);
+ }
+ static int exynos4_clk_dac_ctrl(struct clk *clk, int enable)
+ {
+       return s5p_gatectrl(S5P_DAC_PHY_CONTROL, clk, enable);
+ }
  /* Core list of CMU_CPU side */
  
  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 -244,12 +308,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 -304,12 +368,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 -341,7 +405,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 -380,7 +444,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 -429,16 +493,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",
                .enable         = exynos4_clk_ip_fsys_ctrl,
                .ctrlbit        = (1 << 9),
        }, {
-               .name           = "pdma",
-               .devname        = "s3c-pl330.0",
+               .name           = "dac",
+               .devname        = "s5p-sdo",
+               .enable         = exynos4_clk_ip_tv_ctrl,
+               .ctrlbit        = (1 << 2),
+       }, {
+               .name           = "mixer",
+               .devname        = "s5p-mixer",
+               .enable         = exynos4_clk_ip_tv_ctrl,
+               .ctrlbit        = (1 << 1),
+       }, {
+               .name           = "vp",
+               .devname        = "s5p-mixer",
+               .enable         = exynos4_clk_ip_tv_ctrl,
+               .ctrlbit        = (1 << 0),
+       }, {
+               .name           = "hdmi",
+               .devname        = "exynos4-hdmi",
+               .enable         = exynos4_clk_ip_tv_ctrl,
+               .ctrlbit        = (1 << 3),
+       }, {
+               .name           = "hdmiphy",
+               .devname        = "exynos4-hdmi",
+               .enable         = exynos4_clk_hdmiphy_ctrl,
+               .ctrlbit        = (1 << 0),
+       }, {
+               .name           = "dacphy",
+               .devname        = "s5p-sdo",
+               .enable         = exynos4_clk_dac_ctrl,
+               .ctrlbit        = (1 << 0),
+       }, {
+               .name           = "sata",
+               .parent         = &clk_aclk_133.clk,
+               .enable         = exynos4_clk_ip_fsys_ctrl,
+               .ctrlbit        = (1 << 10),
+       }, {
+               .name           = "dma",
+               .devname        = "dma-pl330.0",
                .enable         = exynos4_clk_ip_fsys_ctrl,
                .ctrlbit        = (1 << 0),
        }, {
-               .name           = "pdma",
-               .devname        = "s3c-pl330.1",
+               .name           = "dma",
+               .devname        = "dma-pl330.1",
                .enable         = exynos4_clk_ip_fsys_ctrl,
                .ctrlbit        = (1 << 1),
        }, {
                .parent         = &clk_aclk_100.clk,
                .enable         = exynos4_clk_ip_peril_ctrl,
                .ctrlbit        = (1 << 13),
+       }, {
+               .name           = "i2c",
+               .devname        = "s3c2440-hdmiphy-i2c",
+               .parent         = &clk_aclk_100.clk,
+               .enable         = exynos4_clk_ip_peril_ctrl,
+               .ctrlbit        = (1 << 14),
        }, {
                .name           = "SYSMMU_MDMA",
                .enable         = exynos4_clk_ip_image_ctrl,
@@@ -722,7 -729,7 +783,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),
  };
@@@ -831,6 -838,81 +892,81 @@@ static struct clksrc_sources clkset_mou
        .nr_sources     = ARRAY_SIZE(clkset_mout_mfc_list),
  };
  
+ static struct clk *clkset_sclk_dac_list[] = {
+       [0] = &clk_sclk_vpll.clk,
+       [1] = &clk_sclk_hdmiphy,
+ };
+ static struct clksrc_sources clkset_sclk_dac = {
+       .sources        = clkset_sclk_dac_list,
+       .nr_sources     = ARRAY_SIZE(clkset_sclk_dac_list),
+ };
+ static struct clksrc_clk clk_sclk_dac = {
+       .clk            = {
+               .name           = "sclk_dac",
+               .enable         = exynos4_clksrc_mask_tv_ctrl,
+               .ctrlbit        = (1 << 8),
+       },
+       .sources = &clkset_sclk_dac,
+       .reg_src = { .reg = S5P_CLKSRC_TV, .shift = 8, .size = 1 },
+ };
+ static struct clksrc_clk clk_sclk_pixel = {
+       .clk            = {
+               .name           = "sclk_pixel",
+               .parent = &clk_sclk_vpll.clk,
+       },
+       .reg_div = { .reg = S5P_CLKDIV_TV, .shift = 0, .size = 4 },
+ };
+ static struct clk *clkset_sclk_hdmi_list[] = {
+       [0] = &clk_sclk_pixel.clk,
+       [1] = &clk_sclk_hdmiphy,
+ };
+ static struct clksrc_sources clkset_sclk_hdmi = {
+       .sources        = clkset_sclk_hdmi_list,
+       .nr_sources     = ARRAY_SIZE(clkset_sclk_hdmi_list),
+ };
+ static struct clksrc_clk clk_sclk_hdmi = {
+       .clk            = {
+               .name           = "sclk_hdmi",
+               .enable         = exynos4_clksrc_mask_tv_ctrl,
+               .ctrlbit        = (1 << 0),
+       },
+       .sources = &clkset_sclk_hdmi,
+       .reg_src = { .reg = S5P_CLKSRC_TV, .shift = 0, .size = 1 },
+ };
+ static struct clk *clkset_sclk_mixer_list[] = {
+       [0] = &clk_sclk_dac.clk,
+       [1] = &clk_sclk_hdmi.clk,
+ };
+ static struct clksrc_sources clkset_sclk_mixer = {
+       .sources        = clkset_sclk_mixer_list,
+       .nr_sources     = ARRAY_SIZE(clkset_sclk_mixer_list),
+ };
+ static struct clksrc_clk clk_sclk_mixer = {
+       .clk            = {
+               .name           = "sclk_mixer",
+               .enable         = exynos4_clksrc_mask_tv_ctrl,
+               .ctrlbit        = (1 << 4),
+       },
+       .sources = &clkset_sclk_mixer,
+       .reg_src = { .reg = S5P_CLKSRC_TV, .shift = 4, .size = 1 },
+ };
+ static struct clksrc_clk *sclk_tv[] = {
+       &clk_sclk_dac,
+       &clk_sclk_pixel,
+       &clk_sclk_hdmi,
+       &clk_sclk_mixer,
+ };
  static struct clksrc_clk clk_dout_mmc0 = {
        .clk            = {
                .name           = "dout_mmc0",
@@@ -1014,6 -1096,25 +1150,6 @@@ static struct clksrc_clk clksrcs[] = 
                .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,26 -1245,85 +1280,91 @@@ 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())
 +              return s5p_get_pll35xx(xtal_rate, __raw_readl(S5P_APLL_CON0));
 +      else
 +              return 0;
  }
  
  static struct clk_ops exynos4_fout_apll_ops = {
        .get_rate = exynos4_fout_apll_get_rate,
  };
  
+ static u32 vpll_div[][8] = {
+       {  54000000, 3, 53, 3, 1024, 0, 17, 0 },
+       { 108000000, 3, 53, 2, 1024, 0, 17, 0 },
+ };
+ static unsigned long exynos4_vpll_get_rate(struct clk *clk)
+ {
+       return clk->rate;
+ }
+ static int exynos4_vpll_set_rate(struct clk *clk, unsigned long rate)
+ {
+       unsigned int vpll_con0, vpll_con1 = 0;
+       unsigned int i;
+       /* Return if nothing changed */
+       if (clk->rate == rate)
+               return 0;
+       vpll_con0 = __raw_readl(S5P_VPLL_CON0);
+       vpll_con0 &= ~(0x1 << 27 |                                      \
+                       PLL90XX_MDIV_MASK << PLL46XX_MDIV_SHIFT |       \
+                       PLL90XX_PDIV_MASK << PLL46XX_PDIV_SHIFT |       \
+                       PLL90XX_SDIV_MASK << PLL46XX_SDIV_SHIFT);
+       vpll_con1 = __raw_readl(S5P_VPLL_CON1);
+       vpll_con1 &= ~(PLL46XX_MRR_MASK << PLL46XX_MRR_SHIFT |  \
+                       PLL46XX_MFR_MASK << PLL46XX_MFR_SHIFT | \
+                       PLL4650C_KDIV_MASK << PLL46XX_KDIV_SHIFT);
+       for (i = 0; i < ARRAY_SIZE(vpll_div); i++) {
+               if (vpll_div[i][0] == rate) {
+                       vpll_con0 |= vpll_div[i][1] << PLL46XX_PDIV_SHIFT;
+                       vpll_con0 |= vpll_div[i][2] << PLL46XX_MDIV_SHIFT;
+                       vpll_con0 |= vpll_div[i][3] << PLL46XX_SDIV_SHIFT;
+                       vpll_con1 |= vpll_div[i][4] << PLL46XX_KDIV_SHIFT;
+                       vpll_con1 |= vpll_div[i][5] << PLL46XX_MFR_SHIFT;
+                       vpll_con1 |= vpll_div[i][6] << PLL46XX_MRR_SHIFT;
+                       vpll_con0 |= vpll_div[i][7] << 27;
+                       break;
+               }
+       }
+       if (i == ARRAY_SIZE(vpll_div)) {
+               printk(KERN_ERR "%s: Invalid Clock VPLL Frequency\n",
+                               __func__);
+               return -EINVAL;
+       }
+       __raw_writel(vpll_con0, S5P_VPLL_CON0);
+       __raw_writel(vpll_con1, S5P_VPLL_CON1);
+       /* Wait for VPLL lock */
+       while (!(__raw_readl(S5P_VPLL_CON0) & (1 << PLL46XX_LOCKED_SHIFT)))
+               continue;
+       clk->rate = rate;
+       return 0;
+ }
+ static struct clk_ops exynos4_vpll_ops = {
+       .get_rate = exynos4_vpll_get_rate,
+       .set_rate = exynos4_vpll_set_rate,
+ };
  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_4650c);
 +      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()) {
 +              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;
        clk_fout_epll.rate = epll;
+       clk_fout_vpll.ops = &exynos4_vpll_ops;
        clk_fout_vpll.rate = vpll;
  
        printk(KERN_INFO "EXYNOS4: PLL settings, A=%ld, M=%ld, E=%ld V=%ld",
  }
  
  static struct clk *clks[] __initdata = {
-       /* Nothing here yet */
+       &clk_sclk_hdmi27m,
+       &clk_sclk_hdmiphy,
+       &clk_sclk_usbphy0,
+       &clk_sclk_usbphy1,
  };
  
 +#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;
        for (ptr = 0; ptr < ARRAY_SIZE(sysclks); ptr++)
                s3c_register_clksrc(sysclks[ptr], 1);
  
+       for (ptr = 0; ptr < ARRAY_SIZE(sclk_tv); ptr++)
+               s3c_register_clksrc(sclk_tv[ptr], 1);
        s3c_register_clksrc(clksrcs, ARRAY_SIZE(clksrcs));
        s3c_register_clocks(init_clocks, ARRAY_SIZE(init_clocks));
  
        s3c_register_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
        s3c_disable_clocks(init_clocks_off, ARRAY_SIZE(init_clocks_off));
  
 +      register_syscore_ops(&exynos4_clock_syscore_ops);
+       s3c24xx_register_clock(&dummy_apb_pclk);
        s3c_pwmclk_init();
  }
index 02ec52a99274eea7cdfcdd992ebab1869ce71749,62e46e1b0b82dee98bbad5337e5a49f4741a80f0..2aa3df00368391c1e94c6a114323322539af7bd5
@@@ -28,6 -28,7 +28,7 @@@
  #include <plat/fimc-core.h>
  #include <plat/iic-core.h>
  #include <plat/reset.h>
+ #include <plat/tv-core.h>
  
  #include <mach/regs-irq.h>
  #include <mach/regs-pmu.h>
@@@ -43,6 -44,11 +44,6 @@@ static struct map_desc exynos4_iodesc[
                .pfn            = __phys_to_pfn(EXYNOS4_PA_SYSTIMER),
                .length         = SZ_4K,
                .type           = MT_DEVICE,
 -      }, {
 -              .virtual        = (unsigned long)S5P_VA_SYSRAM,
 -              .pfn            = __phys_to_pfn(EXYNOS4_PA_SYSRAM),
 -              .length         = SZ_4K,
 -              .type           = MT_DEVICE,
        }, {
                .virtual        = (unsigned long)S5P_VA_CMU,
                .pfn            = __phys_to_pfn(EXYNOS4_PA_CMU),
        },
  };
  
 +static struct map_desc exynos4_iodesc0[] __initdata = {
 +      {
 +              .virtual        = (unsigned long)S5P_VA_SYSRAM,
 +              .pfn            = __phys_to_pfn(EXYNOS4_PA_SYSRAM0),
 +              .length         = SZ_4K,
 +              .type           = MT_DEVICE,
 +      },
 +};
 +
 +static struct map_desc exynos4_iodesc1[] __initdata = {
 +      {
 +              .virtual        = (unsigned long)S5P_VA_SYSRAM,
 +              .pfn            = __phys_to_pfn(EXYNOS4_PA_SYSRAM1),
 +              .length         = SZ_4K,
 +              .type           = MT_DEVICE,
 +      },
 +};
 +
  static void exynos4_idle(void)
  {
        if (!need_resched())
@@@ -156,11 -144,6 +157,11 @@@ void __init exynos4_map_io(void
  {
        iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc));
  
 +      if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_0)
 +              iotable_init(exynos4_iodesc0, ARRAY_SIZE(exynos4_iodesc0));
 +      else
 +              iotable_init(exynos4_iodesc1, ARRAY_SIZE(exynos4_iodesc1));
 +
        /* initialize device information early */
        exynos4_default_sdhci0();
        exynos4_default_sdhci1();
        s3c_i2c2_setname("s3c2440-i2c");
  
        s5p_fb_setname(0, "exynos4-fb");
+       s5p_hdmi_setname("exynos4-hdmi");
  }
  
  void __init exynos4_init_clocks(int xtal)
  
        s3c24xx_register_baseclocks(xtal);
        s5p_register_clocks(xtal);
 +
 +      if (soc_is_exynos4210())
 +              exynos4210_register_clocks();
 +      else if (soc_is_exynos4212())
 +              exynos4212_register_clocks();
 +
        exynos4_register_clocks();
        exynos4_setup_clocks();
  }
@@@ -247,11 -225,7 +249,11 @@@ static int __init exynos4_l2x0_cache_in
  {
        /* TAG, Data Latency Control: 2cycle */
        __raw_writel(0x110, S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL);
 -      __raw_writel(0x110, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL);
 +
 +      if (soc_is_exynos4210())
 +              __raw_writel(0x110, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL);
 +      else if (soc_is_exynos4212())
 +              __raw_writel(0x120, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL);
  
        /* L2X0 Prefetch Control */
        __raw_writel(0x30000007, S5P_VA_L2CC + L2X0_PREFETCH_CTRL);
index 7073ac7308554fe77672898468b690cd356c71a4,d1af8563d73a91b8a8a20af4a2ebbcca9ac7d123..1bea7d139bb0f3c0f38981658e78c7ccfdc009f0
@@@ -23,8 -23,7 +23,8 @@@
  
  #include <plat/map-s5p.h>
  
 -#define EXYNOS4_PA_SYSRAM             0x02020000
 +#define EXYNOS4_PA_SYSRAM0            0x02025000
 +#define EXYNOS4_PA_SYSRAM1            0x02020000
  
  #define EXYNOS4_PA_FIMC0              0x11800000
  #define EXYNOS4_PA_FIMC1              0x11810000
  
  #define EXYNOS4_PA_UART                       0x13800000
  
+ #define EXYNOS4_PA_VP                 0x12C00000
+ #define EXYNOS4_PA_MIXER              0x12C10000
+ #define EXYNOS4_PA_SDO                        0x12C20000
+ #define EXYNOS4_PA_HDMI                       0x12D00000
+ #define EXYNOS4_PA_IIC_HDMIPHY                0x138E0000
  #define EXYNOS4_PA_IIC(x)             (0x13860000 + ((x) * 0x10000))
  
  #define EXYNOS4_PA_ADC                        0x13910000
  #define S5P_PA_TIMER                  EXYNOS4_PA_TIMER
  #define S5P_PA_EHCI                   EXYNOS4_PA_EHCI
  
+ #define S5P_PA_SDO                    EXYNOS4_PA_SDO
+ #define S5P_PA_VP                     EXYNOS4_PA_VP
+ #define S5P_PA_MIXER                  EXYNOS4_PA_MIXER
+ #define S5P_PA_HDMI                   EXYNOS4_PA_HDMI
+ #define S5P_PA_IIC_HDMIPHY            EXYNOS4_PA_IIC_HDMIPHY
  #define SAMSUNG_PA_KEYPAD             EXYNOS4_PA_KEYPAD
  
  /* UART */
index a16eb569a3e69e06a161d57526629cf4ad66c69b,43738c086bc0c83dec17d07746d3f242abd0be2c..35a763e9a659b98c764dc2c6adfe2a4be0774349
@@@ -9,9 -9,7 +9,9 @@@
  */
  
  #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 <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/keypad.h>
  #include <plat/sdhci.h>
  #include <plat/iic.h>
  #include <plat/pd.h>
  #include <plat/gpio-cfg.h>
  #include <plat/backlight.h>
+ #include <plat/mfc.h>
+ #include <plat/ehci.h>
+ #include <plat/clock.h>
  
  #include <mach/map.h>
  
@@@ -117,67 -115,6 +120,67 @@@ static struct s3c_sdhci_platdata smdkv3
        .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 smdkv310_lcd_lte480wv_data = {
 +      .set_power              = lcd_lte480wv_set_power,
 +};
 +
 +static struct platform_device smdkv310_lcd_lte480wv = {
 +      .name                   = "platform-lcd",
 +      .dev.parent             = &s5p_device_fimd0.dev,
 +      .dev.platform_data      = &smdkv310_lcd_lte480wv_data,
 +};
 +
 +static struct s3c_fb_pd_win smdkv310_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 smdkv310_lcd0_pdata __initdata = {
 +      .win[0]         = &smdkv310_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 smdkv310_smsc911x_resources[] = {
        [0] = {
                .start  = EXYNOS4_PA_SROM_BANK(1),
@@@ -232,17 -169,36 +235,36 @@@ static struct i2c_board_info i2c_devs1[
        {I2C_BOARD_INFO("wm8994", 0x1a),},
  };
  
+ /* USB EHCI */
+ static struct s5p_ehci_platdata smdkv310_ehci_pdata;
+ static void __init smdkv310_ehci_init(void)
+ {
+       struct s5p_ehci_platdata *pdata = &smdkv310_ehci_pdata;
+       s5p_ehci_set_platdata(pdata);
+ }
  static struct platform_device *smdkv310_devices[] __initdata = {
        &s3c_device_hsmmc0,
        &s3c_device_hsmmc1,
        &s3c_device_hsmmc2,
        &s3c_device_hsmmc3,
        &s3c_device_i2c1,
+       &s5p_device_i2c_hdmiphy,
        &s3c_device_rtc,
        &s3c_device_wdt,
+       &s5p_device_ehci,
+       &s5p_device_fimc0,
+       &s5p_device_fimc1,
+       &s5p_device_fimc2,
+       &s5p_device_fimc3,
        &exynos4_device_ac97,
        &exynos4_device_i2s0,
        &samsung_device_keypad,
+       &s5p_device_mfc,
+       &s5p_device_mfc_l,
+       &s5p_device_mfc_r,
        &exynos4_device_pd[PD_MFC],
        &exynos4_device_pd[PD_G3D],
        &exynos4_device_pd[PD_LCD0],
        &exynos4_device_sysmmu,
        &samsung_asoc_dma,
        &samsung_asoc_idma,
 +      &s5p_device_fimd0,
 +      &smdkv310_lcd_lte480wv,
        &smdkv310_smsc911x,
        &exynos4_device_ahci,
+       &s5p_device_hdmi,
+       &s5p_device_mixer,
  };
  
  static void __init smdkv310_smsc911x_init(void)
@@@ -294,6 -250,18 +318,18 @@@ static struct platform_pwm_backlight_da
        .pwm_period_ns  = 1000,
  };
  
+ static void s5p_tv_setup(void)
+ {
+       /* direct HPD to HDMI chip */
+       WARN_ON(gpio_request_one(EXYNOS4_GPX3(7), GPIOF_IN, "hpd-plug"));
+       s3c_gpio_cfgpin(EXYNOS4_GPX3(7), S3C_GPIO_SFN(0x3));
+       s3c_gpio_setpull(EXYNOS4_GPX3(7), S3C_GPIO_PULL_NONE);
+       /* setup dependencies between TV devices */
+       s5p_device_hdmi.dev.parent = &exynos4_device_pd[PD_TV].dev;
+       s5p_device_mixer.dev.parent = &exynos4_device_pd[PD_TV].dev;
+ }
  static void __init smdkv310_map_io(void)
  {
        s5p_init_io(NULL, 0, S5P_VA_CHIPID);
        s3c24xx_init_uarts(smdkv310_uartcfgs, ARRAY_SIZE(smdkv310_uartcfgs));
  }
  
+ static void __init smdkv310_reserve(void)
+ {
+       s5p_mfc_reserve_mem(0x43000000, 8 << 20, 0x51000000, 8 << 20);
+ }
  static void __init smdkv310_machine_init(void)
  {
        s3c_i2c1_set_platdata(NULL);
        s3c_sdhci2_set_platdata(&smdkv310_hsmmc2_pdata);
        s3c_sdhci3_set_platdata(&smdkv310_hsmmc3_pdata);
  
+       s5p_tv_setup();
+       s5p_i2c_hdmiphy_set_platdata(NULL);
        samsung_keypad_set_platdata(&smdkv310_keypad_data);
  
        samsung_bl_set(&smdkv310_bl_gpio_info, &smdkv310_bl_data);
 +      s5p_fimd0_set_platdata(&smdkv310_lcd0_pdata);
  
+       smdkv310_ehci_init();
+       clk_xusbxti.rate = 24000000;
        platform_add_devices(smdkv310_devices, ARRAY_SIZE(smdkv310_devices));
+       s5p_device_mfc.dev.parent = &exynos4_device_pd[PD_MFC].dev;
  }
  
  MACHINE_START(SMDKV310, "SMDKV310")
        .map_io         = smdkv310_map_io,
        .init_machine   = smdkv310_machine_init,
        .timer          = &exynos4_timer,
+       .reserve        = &smdkv310_reserve,
  MACHINE_END
 +
 +MACHINE_START(SMDKC210, "SMDKC210")
 +      /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
 +      .boot_params    = S5P_PA_SDRAM + 0x100,
 +      .init_irq       = exynos4_init_irq,
 +      .map_io         = smdkv310_map_io,
 +      .init_machine   = smdkv310_machine_init,
 +      .timer          = &exynos4_timer,
 +MACHINE_END
index 62e4f43630068dc9aa852f1ab479f82880724d36,6e59c8398a49f417f0f31538a307ef46914cb2bd..509a435afd4bf85cf4636343b0cdd32bbf94a863
@@@ -41,6 -41,7 +41,6 @@@ static struct sleep_save exynos4_set_cl
        { .reg = S5P_CLKSRC_MASK_CAM                    , .val = 0x11111111, },
        { .reg = S5P_CLKSRC_MASK_TV                     , .val = 0x00000111, },
        { .reg = S5P_CLKSRC_MASK_LCD0                   , .val = 0x00001111, },
 -      { .reg = S5P_CLKSRC_MASK_LCD1                   , .val = 0x00001111, },
        { .reg = S5P_CLKSRC_MASK_MAUDIO                 , .val = 0x00000001, },
        { .reg = S5P_CLKSRC_MASK_FSYS                   , .val = 0x01011111, },
        { .reg = S5P_CLKSRC_MASK_PERIL0                 , .val = 0x01111111, },
        { .reg = S5P_CLKSRC_MASK_DMC                    , .val = 0x00010000, },
  };
  
 +static struct sleep_save exynos4210_set_clksrc[] = {
 +      { .reg = S5P_CLKSRC_MASK_LCD1                   , .val = 0x00001111, },
 +};
 +
  static struct sleep_save exynos4_epll_save[] = {
        SAVE_ITEM(S5P_EPLL_CON0),
        SAVE_ITEM(S5P_EPLL_CON1),
@@@ -63,6 -60,77 +63,6 @@@ static struct sleep_save exynos4_vpll_s
  };
  
  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_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_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_IMAGE),
 -      SAVE_ITEM(S5P_CLKDIV_LCD0),
 -      SAVE_ITEM(S5P_CLKDIV_LCD1),
 -      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_LCD1),
 -      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_IMAGE),
 -      SAVE_ITEM(S5P_CLKGATE_IP_LCD0),
 -      SAVE_ITEM(S5P_CLKGATE_IP_LCD1),
 -      SAVE_ITEM(S5P_CLKGATE_IP_FSYS),
 -      SAVE_ITEM(S5P_CLKGATE_IP_GPS),
 -      SAVE_ITEM(S5P_CLKGATE_IP_PERIL),
 -      SAVE_ITEM(S5P_CLKGATE_IP_PERIR),
 -      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),
 -
        /* GIC side */
        SAVE_ITEM(S5P_VA_GIC_CPU + 0x000),
        SAVE_ITEM(S5P_VA_GIC_CPU + 0x004),
@@@ -200,9 -268,6 +200,9 @@@ static void exynos4_pm_prepare(void
  
        s3c_pm_do_restore_core(exynos4_set_clksrc, ARRAY_SIZE(exynos4_set_clksrc));
  
 +      if (soc_is_exynos4210())
 +              s3c_pm_do_restore_core(exynos4210_set_clksrc, ARRAY_SIZE(exynos4210_set_clksrc));
 +
  }
  
  static int exynos4_pm_add(struct sys_device *sysdev)
@@@ -339,6 -404,13 +339,13 @@@ static int exynos4_pm_suspend(void
        tmp &= ~S5P_CENTRAL_LOWPWR_CFG;
        __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION);
  
+       if (soc_is_exynos4212()) {
+               tmp = __raw_readl(S5P_CENTRAL_SEQ_OPTION);
+               tmp &= ~(S5P_USE_STANDBYWFI_ISP_ARM |
+                        S5P_USE_STANDBYWFE_ISP_ARM);
+               __raw_writel(tmp, S5P_CENTRAL_SEQ_OPTION);
+       }
        /* Save Power control register */
        asm ("mrc p15, 0, %0, c15, c0, 0"
             : "=r" (tmp) : : "cc");
index c61e3261615d28be2444bf8c16f0833f9aefbb83,b4fc3ba367d6cedba7b257b22212c1f37679aeb8..d2a7d5ef3e67be0178fc66b6dd79f1338cf8f270
@@@ -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];
index f32ec68002efa9aab6070101e07d5724b36ee9d2,ed332dd7bf4fc68367ce4898495143081c7d663a..30afaa537fcfa2e6908ba9f7bf543e89f27c027b
@@@ -47,6 -47,7 +47,7 @@@
  #include <mach/regs-sys.h>
  #include <mach/regs-gpio.h>
  #include <mach/regs-modem.h>
+ #include <mach/crag6410.h>
  
  #include <mach/regs-gpio-memport.h>
  
  #include <plat/iic.h>
  #include <plat/pm.h>
  
- #include <sound/wm8996.h>
- #include <sound/wm8962.h>
- #include <sound/wm9081.h>
- #define BANFF_PMIC_IRQ_BASE           IRQ_BOARD_START
- #define GLENFARCLAS_PMIC_IRQ_BASE     (IRQ_BOARD_START + 64)
- #define PCA935X_GPIO_BASE             GPIO_BOARD_START
- #define CODEC_GPIO_BASE               (GPIO_BOARD_START + 8)
- #define GLENFARCLAS_PMIC_GPIO_BASE    (GPIO_BOARD_START + 16)
  /* serial port setup */
  
  #define UCON (S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK)
@@@ -287,6 -277,11 +277,11 @@@ static struct platform_device speyside_
        .id             = -1,
  };
  
+ static struct platform_device lowland_device = {
+       .name           = "lowland",
+       .id             = -1,
+ };
  static struct platform_device speyside_wm8962_device = {
        .name           = "speyside-wm8962",
        .id             = -1,
  static struct regulator_consumer_supply wallvdd_consumers[] = {
        REGULATOR_SUPPLY("SPKVDD1", "1-001a"),
        REGULATOR_SUPPLY("SPKVDD2", "1-001a"),
+       REGULATOR_SUPPLY("SPKVDDL", "1-001a"),
+       REGULATOR_SUPPLY("SPKVDDR", "1-001a"),
  };
  
  static struct regulator_init_data wallvdd_data = {
@@@ -329,6 -326,9 +326,6 @@@ static struct platform_device *crag6410
        &s3c_device_fb,
        &s3c_device_ohci,
        &s3c_device_usb_hsotg,
 -      &s3c_device_adc,
 -      &s3c_device_rtc,
 -      &s3c_device_ts,
        &s3c_device_timer[0],
        &s3c64xx_device_iis0,
        &s3c64xx_device_iis1,
        &crag6410_backlight_device,
        &speyside_device,
        &speyside_wm8962_device,
+       &lowland_device,
        &wallvdd_device,
  };
  
@@@ -350,6 -351,12 +348,12 @@@ static struct pca953x_platform_data cra
        .irq_base       = 0,
  };
  
+ /* VDDARM is controlled by DVS1 connected to GPK(0) */
+ static struct wm831x_buckv_pdata vddarm_pdata = {
+       .dvs_control_src = 1,
+       .dvs_gpio = S3C64XX_GPK(0),
+ };
  static struct regulator_consumer_supply vddarm_consumers[] __initdata = {
        REGULATOR_SUPPLY("vddarm", NULL),
  };
@@@ -365,6 -372,7 +369,7 @@@ static struct regulator_init_data vddar
        .num_consumer_supplies = ARRAY_SIZE(vddarm_consumers),
        .consumer_supplies = vddarm_consumers,
        .supply_regulator = "WALLVDD",
+       .driver_data = &vddarm_pdata,
  };
  
  static struct regulator_init_data vddint __initdata = {
@@@ -500,6 -508,8 +505,8 @@@ static struct wm831x_pdata crag_pmic_pd
        .backup = &banff_backup_pdata,
  
        .gpio_defaults = {
+               /* GPIO5: DVS1_REQ - CMOS, DBVDD, active high */
+               [4] = WM831X_GPN_DIR | WM831X_GPN_POL | WM831X_GPN_ENA | 0x8,
                /* GPIO11: Touchscreen data - CMOS, DBVDD, active high*/
                [10] = WM831X_GPN_POL | WM831X_GPN_ENA | 0x6,
                /* GPIO12: Touchscreen pen down - CMOS, DBVDD, active high*/
@@@ -557,8 -567,12 +564,12 @@@ static struct regulator_init_data pvdd_
  };
  
  static struct regulator_consumer_supply pvdd_1v8_consumers[] __initdata = {
+       REGULATOR_SUPPLY("LDOVDD", "1-001a"),
        REGULATOR_SUPPLY("PLLVDD", "1-001a"),
        REGULATOR_SUPPLY("DBVDD", "1-001a"),
+       REGULATOR_SUPPLY("DBVDD1", "1-001a"),
+       REGULATOR_SUPPLY("DBVDD2", "1-001a"),
+       REGULATOR_SUPPLY("DBVDD3", "1-001a"),
        REGULATOR_SUPPLY("CPVDD", "1-001a"),
        REGULATOR_SUPPLY("AVDD2", "1-001a"),
        REGULATOR_SUPPLY("DCVDD", "1-001a"),
@@@ -611,81 -625,16 +622,16 @@@ static struct wm831x_pdata glenfarclas_
        .disable_touch = true,
  };
  
- static struct wm8996_retune_mobile_config wm8996_retune[] = {
-       {
-               .name = "Sub LPF",
-               .rate = 48000,
-               .regs = {
-                       0x6318, 0x6300, 0x1000, 0x0000, 0x0004, 0x2000, 0xF000,
-                       0x0000, 0x0004, 0x2000, 0xF000, 0x0000, 0x0004, 0x2000,
-                       0xF000, 0x0000, 0x0004, 0x1000, 0x0800, 0x4000
-               },
-       },
-       {
-               .name = "Sub HPF",
-               .rate = 48000,
-               .regs = {
-                       0x000A, 0x6300, 0x1000, 0x0000, 0x0004, 0x2000, 0xF000,
-                       0x0000, 0x0004, 0x2000, 0xF000, 0x0000, 0x0004, 0x2000,
-                       0xF000, 0x0000, 0x0004, 0x1000, 0x0800, 0x4000
-               },
-       },
- };
- static struct wm8996_pdata wm8996_pdata __initdata = {
-       .ldo_ena = S3C64XX_GPN(7),
-       .gpio_base = CODEC_GPIO_BASE,
-       .micdet_def = 1,
-       .inl_mode = WM8996_DIFFERRENTIAL_1,
-       .inr_mode = WM8996_DIFFERRENTIAL_1,
-       .irq_flags = IRQF_TRIGGER_RISING,
-       .gpio_default = {
-               0x8001, /* GPIO1 == ADCLRCLK1 */
-               0x8001, /* GPIO2 == ADCLRCLK2, input due to CPU */
-               0x0141, /* GPIO3 == HP_SEL */
-               0x0002, /* GPIO4 == IRQ */
-               0x020e, /* GPIO5 == CLKOUT */
-       },
-       .retune_mobile_cfgs = wm8996_retune,
-       .num_retune_mobile_cfgs = ARRAY_SIZE(wm8996_retune),
- };
- static struct wm8962_pdata wm8962_pdata __initdata = {
-       .gpio_init = {
-               0,
-               WM8962_GPIO_FN_OPCLK,
-               WM8962_GPIO_FN_DMICCLK,
-               0,
-               0x8000 | WM8962_GPIO_FN_DMICDAT,
-               WM8962_GPIO_FN_IRQ,    /* Open drain mode */
-       },
-       .irq_active_low = true,
- };
- static struct wm9081_pdata wm9081_pdata __initdata = {
-       .irq_high = false,
-       .irq_cmos = false,
- };
  static struct i2c_board_info i2c_devs1[] __initdata = {
        { I2C_BOARD_INFO("wm8311", 0x34),
          .irq = S3C_EINT(0),
          .platform_data = &glenfarclas_pmic_pdata },
  
+       { I2C_BOARD_INFO("wlf-gf-module", 0x24) },
+       { I2C_BOARD_INFO("wlf-gf-module", 0x25) },
+       { I2C_BOARD_INFO("wlf-gf-module", 0x26) },
        { I2C_BOARD_INFO("wm1250-ev1", 0x27) },
-       { I2C_BOARD_INFO("wm8996", 0x1a),
-         .platform_data = &wm8996_pdata,
-         .irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2,
-       },
-       { I2C_BOARD_INFO("wm9081", 0x6c),
-         .platform_data = &wm9081_pdata, },
-       { I2C_BOARD_INFO("wm8962", 0x1a),
-         .platform_data = &wm8962_pdata,
-         .irq = GLENFARCLAS_PMIC_IRQ_BASE + WM831X_IRQ_GPIO_2,
-       },
  };
  
  static void __init crag6410_map_io(void)
index 0e5b3e63e5b3f388382dc54cb68b31e05677b8f4,aebf3fcb1ebe19244833fee86a0f7a5bafa9ce92..442dd4ad12da61a02694e97923ca53386a7854ad
   * 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;
  }
index 340f30f4a3da1ab54120c235792be436e089112c,39026e9d5f3c31789c5f5c4827e8f522cd98a774..b0465d4e84e7aac8e358db7541eb55e04ffa6956
@@@ -23,6 -23,9 +23,9 @@@
  #include <linux/clk.h>
  #include <linux/gpio.h>
  #include <linux/pwm_backlight.h>
+ #include <linux/fb.h>
+ #include <video/platform_lcd.h>
  
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
@@@ -47,6 -50,8 +50,8 @@@
  #include <plat/ts.h>
  #include <plat/s5p-time.h>
  #include <plat/backlight.h>
+ #include <plat/fb.h>
+ #include <plat/regs-fb.h>
  
  #define SMDK6440_UCON_DEFAULT (S3C2410_UCON_TXILEVEL |        \
                                S3C2410_UCON_RXILEVEL |         \
@@@ -92,6 -97,59 +97,59 @@@ static struct s3c2410_uartcfg smdk6440_
        },
  };
  
+ /* Frame Buffer */
+ static struct s3c_fb_pd_win smdk6440_fb_win0 = {
+       .win_mode = {
+               .left_margin    = 8,
+               .right_margin   = 13,
+               .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 smdk6440_lcd_pdata __initdata = {
+       .win[0]         = &smdk6440_fb_win0,
+       .vidcon0        = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
+       .vidcon1        = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
+       .setup_gpio     = s5p64x0_fb_gpio_setup_24bpp,
+ };
+ /* LCD power controller */
+ static void smdk6440_lte480_reset_power(struct plat_lcd_data *pd,
+                                        unsigned int power)
+ {
+       int err;
+       if (power) {
+               err = gpio_request(S5P6440_GPN(5), "GPN");
+               if (err) {
+                       printk(KERN_ERR "failed to request GPN for lcd reset\n");
+                       return;
+               }
+               gpio_direction_output(S5P6440_GPN(5), 1);
+               gpio_set_value(S5P6440_GPN(5), 0);
+               gpio_set_value(S5P6440_GPN(5), 1);
+               gpio_free(S5P6440_GPN(5));
+       }
+ }
+ static struct plat_lcd_data smdk6440_lcd_power_data = {
+       .set_power      = smdk6440_lte480_reset_power,
+ };
+ static struct platform_device smdk6440_lcd_lte480wv = {
+       .name                   = "platform-lcd",
+       .dev.parent             = &s3c_device_fb.dev,
+       .dev.platform_data      = &smdk6440_lcd_power_data,
+ };
  static struct platform_device *smdk6440_devices[] __initdata = {
        &s3c_device_adc,
        &s3c_device_rtc,
        &s3c_device_wdt,
        &samsung_asoc_dma,
        &s5p6440_device_iis,
+       &s3c_device_fb,
+       &smdk6440_lcd_lte480wv,
  };
  
  static struct s3c2410_platform_i2c s5p6440_i2c0_data __initdata = {
@@@ -129,6 -189,12 +189,6 @@@ static struct i2c_board_info smdk6440_i
        /* To be populated */
  };
  
 -static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = {
 -      .delay                  = 10000,
 -      .presc                  = 49,
 -      .oversampling_shift     = 2,
 -};
 -
  /* LCD Backlight data */
  static struct samsung_bl_gpio_info smdk6440_bl_gpio_info = {
        .no = S5P6440_GPF(15),
@@@ -147,9 -213,20 +207,20 @@@ static void __init smdk6440_map_io(void
        s5p_set_timer_source(S5P_PWM3, S5P_PWM4);
  }
  
+ static void s5p6440_set_lcd_interface(void)
+ {
+       unsigned int cfg;
+       /* select TFT LCD type (RGB I/F) */
+       cfg = __raw_readl(S5P64X0_SPCON0);
+       cfg &= ~S5P64X0_SPCON0_LCD_SEL_MASK;
+       cfg |= S5P64X0_SPCON0_LCD_SEL_RGB;
+       __raw_writel(cfg, S5P64X0_SPCON0);
+ }
  static void __init smdk6440_machine_init(void)
  {
 -      s3c24xx_ts_set_platdata(&s3c_ts_platform);
 +      s3c24xx_ts_set_platdata(NULL);
  
        s3c_i2c0_set_platdata(&s5p6440_i2c0_data);
        s3c_i2c1_set_platdata(&s5p6440_i2c1_data);
  
        samsung_bl_set(&smdk6440_bl_gpio_info, &smdk6440_bl_data);
  
+       s5p6440_set_lcd_interface();
+       s3c_fb_set_platdata(&smdk6440_lcd_pdata);
        platform_add_devices(smdk6440_devices, ARRAY_SIZE(smdk6440_devices));
  }
  
index ee0da14665b6d8d2c1481211402734b6e0a66e01,92b5de1465b7551ba0d50e72b84c88952f90aae4..2a69caa70afd648cd8b82ee035642394725286c5
@@@ -23,6 -23,9 +23,9 @@@
  #include <linux/clk.h>
  #include <linux/gpio.h>
  #include <linux/pwm_backlight.h>
+ #include <linux/fb.h>
+ #include <video/platform_lcd.h>
  
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
@@@ -47,6 -50,8 +50,8 @@@
  #include <plat/ts.h>
  #include <plat/s5p-time.h>
  #include <plat/backlight.h>
+ #include <plat/fb.h>
+ #include <plat/regs-fb.h>
  
  #define SMDK6450_UCON_DEFAULT (S3C2410_UCON_TXILEVEL |        \
                                S3C2410_UCON_RXILEVEL |         \
@@@ -110,6 -115,59 +115,59 @@@ static struct s3c2410_uartcfg smdk6450_
  #endif
  };
  
+ /* Frame Buffer */
+ static struct s3c_fb_pd_win smdk6450_fb_win0 = {
+       .win_mode       = {
+               .left_margin    = 8,
+               .right_margin   = 13,
+               .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 smdk6450_lcd_pdata __initdata = {
+       .win[0]         = &smdk6450_fb_win0,
+       .vidcon0        = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB,
+       .vidcon1        = VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
+       .setup_gpio     = s5p64x0_fb_gpio_setup_24bpp,
+ };
+ /* LCD power controller */
+ static void smdk6450_lte480_reset_power(struct plat_lcd_data *pd,
+                                        unsigned int power)
+ {
+       int err;
+       if (power) {
+               err = gpio_request(S5P6450_GPN(5), "GPN");
+               if (err) {
+                       printk(KERN_ERR "failed to request GPN for lcd reset\n");
+                       return;
+               }
+               gpio_direction_output(S5P6450_GPN(5), 1);
+               gpio_set_value(S5P6450_GPN(5), 0);
+               gpio_set_value(S5P6450_GPN(5), 1);
+               gpio_free(S5P6450_GPN(5));
+       }
+ }
+ static struct plat_lcd_data smdk6450_lcd_power_data = {
+       .set_power      = smdk6450_lte480_reset_power,
+ };
+ static struct platform_device smdk6450_lcd_lte480wv = {
+       .name                   = "platform-lcd",
+       .dev.parent             = &s3c_device_fb.dev,
+       .dev.platform_data      = &smdk6450_lcd_power_data,
+ };
  static struct platform_device *smdk6450_devices[] __initdata = {
        &s3c_device_adc,
        &s3c_device_rtc,
        &s3c_device_wdt,
        &samsung_asoc_dma,
        &s5p6450_device_iis0,
+       &s3c_device_fb,
+       &smdk6450_lcd_lte480wv,
        /* s5p6450_device_spi0 will be added */
  };
  
@@@ -148,6 -209,12 +209,6 @@@ static struct i2c_board_info smdk6450_i
        { I2C_BOARD_INFO("24c128", 0x57), },/* Samsung S524AD0XD1 EEPROM */
  };
  
 -static struct s3c2410_ts_mach_info s3c_ts_platform __initdata = {
 -      .delay                  = 10000,
 -      .presc                  = 49,
 -      .oversampling_shift     = 2,
 -};
 -
  /* LCD Backlight data */
  static struct samsung_bl_gpio_info smdk6450_bl_gpio_info = {
        .no = S5P6450_GPF(15),
@@@ -166,9 -233,20 +227,20 @@@ static void __init smdk6450_map_io(void
        s5p_set_timer_source(S5P_PWM3, S5P_PWM4);
  }
  
+ static void s5p6450_set_lcd_interface(void)
+ {
+       unsigned int cfg;
+       /* select TFT LCD type (RGB I/F) */
+       cfg = __raw_readl(S5P64X0_SPCON0);
+       cfg &= ~S5P64X0_SPCON0_LCD_SEL_MASK;
+       cfg |= S5P64X0_SPCON0_LCD_SEL_RGB;
+       __raw_writel(cfg, S5P64X0_SPCON0);
+ }
  static void __init smdk6450_machine_init(void)
  {
 -      s3c24xx_ts_set_platdata(&s3c_ts_platform);
 +      s3c24xx_ts_set_platdata(NULL);
  
        s3c_i2c0_set_platdata(&s5p6450_i2c0_data);
        s3c_i2c1_set_platdata(&s5p6450_i2c1_data);
  
        samsung_bl_set(&smdk6450_bl_gpio_info, &smdk6450_bl_data);
  
+       s5p6450_set_lcd_interface();
+       s3c_fb_set_platdata(&smdk6450_lcd_pdata);
        platform_add_devices(smdk6450_devices, ARRAY_SIZE(smdk6450_devices));
  }
  
index aaeb44a73716349f5fa3e18a165b229ced31f18f,e2d1d9e9a4985b69e2aba896628fa7f595599df1..f22c683272d3d48f19e7a40a00f8452b594646fb
@@@ -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
  
@@@ -93,11 -94,13 +93,13 @@@ config MACH_GON
        select S3C_DEV_USB_HSOTG
        select S5P_DEV_ONENAND
        select SAMSUNG_DEV_KEYPAD
+       select S5P_DEV_TV
        select S5PV210_SETUP_FB_24BPP
        select S5PV210_SETUP_I2C1
        select S5PV210_SETUP_I2C2
        select S5PV210_SETUP_KEYPAD
        select S5PV210_SETUP_SDHCI
+       select S5PV210_SETUP_FIMC
        help
          Machine support for Samsung GONI board
          S5PC110(MCP) is one of package option of S5PV210
@@@ -168,4 -171,9 +170,4 @@@ config MACH_TORBREC
  
  endmenu
  
 -config S5PV210_PM
 -      bool
 -      help
 -        Power Management code common to S5PV210
 -
  endif
index 3e21b9444cc5f130b600ea4474dd0f82fb108e45,8b24b366c65dace66eb28f6462610b4ffba0be30..002ec9f28f18b0c3e09ecee791d3e6891d92d08d
   * published by the Free Software Foundation.
  */
  
 +#include <asm/div64.h>
 +
 +#define PLL35XX_MDIV_MASK     (0x3FF)
 +#define PLL35XX_PDIV_MASK     (0x3F)
 +#define PLL35XX_SDIV_MASK     (0x7)
 +#define PLL35XX_MDIV_SHIFT    (16)
 +#define PLL35XX_PDIV_SHIFT    (8)
 +#define PLL35XX_SDIV_SHIFT    (0)
 +
 +static inline unsigned long s5p_get_pll35xx(unsigned long baseclk, u32 pll_con)
 +{
 +      u32 mdiv, pdiv, sdiv;
 +      u64 fvco = baseclk;
 +
 +      mdiv = (pll_con >> PLL35XX_MDIV_SHIFT) & PLL35XX_MDIV_MASK;
 +      pdiv = (pll_con >> PLL35XX_PDIV_SHIFT) & PLL35XX_PDIV_MASK;
 +      sdiv = (pll_con >> PLL35XX_SDIV_SHIFT) & PLL35XX_SDIV_MASK;
 +
 +      fvco *= mdiv;
 +      do_div(fvco, (pdiv << sdiv));
 +
 +      return (unsigned long)fvco;
 +}
 +
 +#define PLL36XX_KDIV_MASK     (0xFFFF)
 +#define PLL36XX_MDIV_MASK     (0x1FF)
 +#define PLL36XX_PDIV_MASK     (0x3F)
 +#define PLL36XX_SDIV_MASK     (0x7)
 +#define PLL36XX_MDIV_SHIFT    (16)
 +#define PLL36XX_PDIV_SHIFT    (8)
 +#define PLL36XX_SDIV_SHIFT    (0)
 +
 +static inline unsigned long s5p_get_pll36xx(unsigned long baseclk,
 +                                          u32 pll_con0, u32 pll_con1)
 +{
 +      unsigned long result;
 +      u32 mdiv, pdiv, sdiv, kdiv;
 +      u64 tmp;
 +
 +      mdiv = (pll_con0 >> PLL36XX_MDIV_SHIFT) & PLL36XX_MDIV_MASK;
 +      pdiv = (pll_con0 >> PLL36XX_PDIV_SHIFT) & PLL36XX_PDIV_MASK;
 +      sdiv = (pll_con0 >> PLL36XX_SDIV_SHIFT) & PLL36XX_SDIV_MASK;
 +      kdiv = pll_con1 & PLL36XX_KDIV_MASK;
 +
 +      tmp = baseclk;
 +
 +      tmp *= (mdiv << 16) + kdiv;
 +      do_div(tmp, (pdiv << sdiv));
 +      result = tmp >> 16;
 +
 +      return result;
 +}
 +
  #define PLL45XX_MDIV_MASK     (0x3FF)
  #define PLL45XX_PDIV_MASK     (0x3F)
  #define PLL45XX_SDIV_MASK     (0x7)
@@@ -72,6 -19,8 +72,6 @@@
  #define PLL45XX_PDIV_SHIFT    (8)
  #define PLL45XX_SDIV_SHIFT    (0)
  
 -#include <asm/div64.h>
 -
  enum pll45xx_type_t {
        pll_4500,
        pll_4502,
@@@ -97,15 -46,24 +97,24 @@@ static inline unsigned long s5p_get_pll
        return (unsigned long)fvco;
  }
  
- #define PLL46XX_KDIV_MASK     (0xFFFF)
- #define PLL4650C_KDIV_MASK    (0xFFF)
+ /* CON0 bit-fields */
  #define PLL46XX_MDIV_MASK     (0x1FF)
  #define PLL46XX_PDIV_MASK     (0x3F)
  #define PLL46XX_SDIV_MASK     (0x7)
+ #define PLL46XX_LOCKED_SHIFT  (29)
  #define PLL46XX_MDIV_SHIFT    (16)
  #define PLL46XX_PDIV_SHIFT    (8)
  #define PLL46XX_SDIV_SHIFT    (0)
  
+ /* CON1 bit-fields */
+ #define PLL46XX_MRR_MASK      (0x1F)
+ #define PLL46XX_MFR_MASK      (0x3F)
+ #define PLL46XX_KDIV_MASK     (0xFFFF)
+ #define PLL4650C_KDIV_MASK    (0xFFF)
+ #define PLL46XX_MRR_SHIFT     (24)
+ #define PLL46XX_MFR_SHIFT     (16)
+ #define PLL46XX_KDIV_SHIFT    (0)
  enum pll46xx_type_t {
        pll_4600,
        pll_4650,
@@@ -123,6 -81,7 +132,6 @@@ static inline unsigned long s5p_get_pll
        mdiv = (pll_con0 >> PLL46XX_MDIV_SHIFT) & PLL46XX_MDIV_MASK;
        pdiv = (pll_con0 >> PLL46XX_PDIV_SHIFT) & PLL46XX_PDIV_MASK;
        sdiv = (pll_con0 >> PLL46XX_SDIV_SHIFT) & PLL46XX_SDIV_MASK;
 -      kdiv = pll_con1 & PLL46XX_KDIV_MASK;
  
        if (pll_type == pll_4650c)
                kdiv = pll_con1 & PLL4650C_KDIV_MASK;
  #define PLL90XX_PDIV_MASK     (0x3F)
  #define PLL90XX_SDIV_MASK     (0x7)
  #define PLL90XX_KDIV_MASK     (0xffff)
+ #define PLL90XX_LOCKED_SHIFT  (29)
  #define PLL90XX_MDIV_SHIFT    (16)
  #define PLL90XX_PDIV_SHIFT    (8)
  #define PLL90XX_SDIV_SHIFT    (0)
index 3de756da5eaa7f582148370778c4bfe29ca7124f,5ed2b2be0c7e7343e21ab4357c3a50a155989acd..5a5435482595a0e94479c50416bc511413c1f2d1
@@@ -11,12 -11,10 +11,10 @@@ 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
- obj-y                         += gpio.o
- obj-y                         += gpio-config.o
  obj-y                         += dev-asocdma.o
  
  obj-$(CONFIG_SAMSUNG_CLKSRC)  += clock-clksrc.o
@@@ -63,9 -61,9 +61,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
  
index ab9bce637cbdfeb8de93e10014cd0f57b722b2ba,19828296a56288c86eca698efa6312f5a6cfbd9e..1c1ed5481253bd6c5c1d1cea89e5622c402485b7
@@@ -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);