Merge branch 'samsung/soc' into next/soc2
authorArnd Bergmann <arnd@arndb.de>
Thu, 15 Mar 2012 21:22:00 +0000 (21:22 +0000)
committerArnd Bergmann <arnd@arndb.de>
Thu, 15 Mar 2012 21:22:00 +0000 (21:22 +0000)
* samsung/soc:
  ARM: EXYNOS: fix cycle count for periodic mode of clock event timers
  ARM: EXYNOS: add support JPEG
  ARM: EXYNOS: Add DMC1, allow PPMU access for DMC
  ARM: SAMSUNG: Correct MIPI-CSIS io memory resource definition
  ARM: SAMSUNG: fix __init attribute on regarding s3c_set_platdata()
  ARM: SAMSUNG: Add __init attribute to samsung_bl_set()
  ARM: S5PV210: Add usb otg phy control
  ARM: S3C64XX: Add usb otg phy control
  ARM: EXYNOS: Enable l2 configuration through device tree
  ARM: EXYNOS: remove useless code to save/restore L2
  ARM: EXYNOS: save L2 settings during bootup
  ARM: S5P: add L2 early resume code
  ARM: EXYNOS: Add support AFTR mode on EXYNOS4210
  ARM: SAMSUNG: use spin_lock_irqsave() in clk_{enable,disable}
  ARM: S3C64XX: Define some additional always off clocks
  ARM: S3C64XX: Reduce residency requirement for cpuidle WFI mode
  ARM: SAMSUNG: Add a callback 'notify_after' for PWM backlight control
  ARM: SAMSUNG: add G2D to plat-s5p and mach-exynos
  ARM: S3C64XX: Gate some more clocks by default
  ARM: S3C64XX: Add basic cpuidle driver

Conflicts:
arch/arm/mach-exynos/clock.c
arch/arm/mach-exynos/common.c

This merges the earlier samsung support into the next/soc2 branch to
resolve conflicts between commits in the earlier work and the exynos5
branch.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
1  2 
arch/arm/mach-exynos/clock-exynos4.c
arch/arm/mach-exynos/common.c
arch/arm/mach-exynos/include/mach/map.h
arch/arm/mach-exynos/mct.c
arch/arm/mach-exynos/pm.c
arch/arm/mach-s3c64xx/clock.c
arch/arm/plat-s5p/Kconfig
arch/arm/plat-samsung/devs.c
arch/arm/plat-samsung/include/plat/devs.h

index 6504d8b1f8e58359486cce0efa31773778faf07c,0000000000000000000000000000000000000000..df54c2a922252826b6b2f837134da025ca2a6994
mode 100644,000000..100644
--- /dev/null
@@@ -1,1576 -1,0 +1,1581 @@@
 +/*
 + * Copyright (c) 2010-2012 Samsung Electronics Co., Ltd.
 + *            http://www.samsung.com
 + *
 + * EXYNOS4 - Clock support
 + *
 + * This program is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License version 2 as
 + * published by the Free Software Foundation.
 +*/
 +
 +#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/cpu.h>
 +#include <plat/pll.h>
 +#include <plat/s5p-clock.h>
 +#include <plat/clock-clksrc.h>
 +#include <plat/pm.h>
 +
 +#include <mach/map.h>
 +#include <mach/regs-clock.h>
 +#include <mach/sysmmu.h>
 +
 +#include "common.h"
 +#include "clock-exynos4.h"
 +
 +#ifdef CONFIG_PM_SLEEP
 +static struct sleep_save exynos4_clock_save[] = {
 +      SAVE_ITEM(EXYNOS4_CLKDIV_LEFTBUS),
 +      SAVE_ITEM(EXYNOS4_CLKGATE_IP_LEFTBUS),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_RIGHTBUS),
 +      SAVE_ITEM(EXYNOS4_CLKGATE_IP_RIGHTBUS),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_TOP0),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_TOP1),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_CAM),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_TV),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_MFC),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_G3D),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_LCD0),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_MAUDIO),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_FSYS),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_PERIL0),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_PERIL1),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_CAM),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_TV),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_MFC),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_G3D),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_LCD0),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_MAUDIO),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_FSYS0),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_FSYS1),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_FSYS2),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_FSYS3),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_PERIL0),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_PERIL1),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_PERIL2),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_PERIL3),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_PERIL4),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_PERIL5),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_TOP),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_MASK_TOP),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_MASK_CAM),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_MASK_TV),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_MASK_LCD0),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_MASK_MAUDIO),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_MASK_FSYS),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_MASK_PERIL0),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_MASK_PERIL1),
 +      SAVE_ITEM(EXYNOS4_CLKDIV2_RATIO),
 +      SAVE_ITEM(EXYNOS4_CLKGATE_SCLKCAM),
 +      SAVE_ITEM(EXYNOS4_CLKGATE_IP_CAM),
 +      SAVE_ITEM(EXYNOS4_CLKGATE_IP_TV),
 +      SAVE_ITEM(EXYNOS4_CLKGATE_IP_MFC),
 +      SAVE_ITEM(EXYNOS4_CLKGATE_IP_G3D),
 +      SAVE_ITEM(EXYNOS4_CLKGATE_IP_LCD0),
 +      SAVE_ITEM(EXYNOS4_CLKGATE_IP_FSYS),
 +      SAVE_ITEM(EXYNOS4_CLKGATE_IP_GPS),
 +      SAVE_ITEM(EXYNOS4_CLKGATE_IP_PERIL),
 +      SAVE_ITEM(EXYNOS4_CLKGATE_BLOCK),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_MASK_DMC),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_DMC),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_DMC0),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_DMC1),
 +      SAVE_ITEM(EXYNOS4_CLKGATE_IP_DMC),
 +      SAVE_ITEM(EXYNOS4_CLKSRC_CPU),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_CPU),
 +      SAVE_ITEM(EXYNOS4_CLKDIV_CPU + 0x4),
 +      SAVE_ITEM(EXYNOS4_CLKGATE_SCLKCPU),
 +      SAVE_ITEM(EXYNOS4_CLKGATE_IP_CPU),
 +};
 +#endif
 +
 +static struct clk exynos4_clk_sclk_hdmi27m = {
 +      .name           = "sclk_hdmi27m",
 +      .rate           = 27000000,
 +};
 +
 +static struct clk exynos4_clk_sclk_hdmiphy = {
 +      .name           = "sclk_hdmiphy",
 +};
 +
 +static struct clk exynos4_clk_sclk_usbphy0 = {
 +      .name           = "sclk_usbphy0",
 +      .rate           = 27000000,
 +};
 +
 +static struct clk exynos4_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(EXYNOS4_CLKSRC_MASK_TOP, clk, enable);
 +}
 +
 +static int exynos4_clksrc_mask_cam_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS4_CLKSRC_MASK_CAM, clk, enable);
 +}
 +
 +static int exynos4_clksrc_mask_lcd0_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS4_CLKSRC_MASK_LCD0, clk, enable);
 +}
 +
 +int exynos4_clksrc_mask_fsys_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS4_CLKSRC_MASK_FSYS, clk, enable);
 +}
 +
 +static int exynos4_clksrc_mask_peril0_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS4_CLKSRC_MASK_PERIL0, clk, enable);
 +}
 +
 +static int exynos4_clksrc_mask_peril1_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS4_CLKSRC_MASK_PERIL1, clk, enable);
 +}
 +
 +static int exynos4_clk_ip_mfc_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS4_CLKGATE_IP_MFC, clk, enable);
 +}
 +
 +static int exynos4_clksrc_mask_tv_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS4_CLKSRC_MASK_TV, clk, enable);
 +}
 +
 +static int exynos4_clk_ip_cam_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS4_CLKGATE_IP_CAM, clk, enable);
 +}
 +
 +static int exynos4_clk_ip_tv_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS4_CLKGATE_IP_TV, clk, enable);
 +}
 +
 +static int exynos4_clk_ip_image_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS4_CLKGATE_IP_IMAGE, clk, enable);
 +}
 +
 +static int exynos4_clk_ip_lcd0_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS4_CLKGATE_IP_LCD0, clk, enable);
 +}
 +
 +int exynos4_clk_ip_lcd1_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS4210_CLKGATE_IP_LCD1, clk, enable);
 +}
 +
 +int exynos4_clk_ip_fsys_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS4_CLKGATE_IP_FSYS, clk, enable);
 +}
 +
 +static int exynos4_clk_ip_peril_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS4_CLKGATE_IP_PERIL, clk, enable);
 +}
 +
 +static int exynos4_clk_ip_perir_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS4_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 exynos4_clk_mout_apll = {
 +      .clk    = {
 +              .name           = "mout_apll",
 +      },
 +      .sources = &clk_src_apll,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_CPU, .shift = 0, .size = 1 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_apll = {
 +      .clk    = {
 +              .name           = "sclk_apll",
 +              .parent         = &exynos4_clk_mout_apll.clk,
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_CPU, .shift = 24, .size = 3 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_mout_epll = {
 +      .clk    = {
 +              .name           = "mout_epll",
 +      },
 +      .sources = &clk_src_epll,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_TOP0, .shift = 4, .size = 1 },
 +};
 +
 +struct clksrc_clk exynos4_clk_mout_mpll = {
 +      .clk    = {
 +              .name           = "mout_mpll",
 +      },
 +      .sources = &clk_src_mpll,
 +
 +      /* reg_src will be added in each SoCs' clock */
 +};
 +
 +static struct clk *exynos4_clkset_moutcore_list[] = {
 +      [0] = &exynos4_clk_mout_apll.clk,
 +      [1] = &exynos4_clk_mout_mpll.clk,
 +};
 +
 +static struct clksrc_sources exynos4_clkset_moutcore = {
 +      .sources        = exynos4_clkset_moutcore_list,
 +      .nr_sources     = ARRAY_SIZE(exynos4_clkset_moutcore_list),
 +};
 +
 +static struct clksrc_clk exynos4_clk_moutcore = {
 +      .clk    = {
 +              .name           = "moutcore",
 +      },
 +      .sources = &exynos4_clkset_moutcore,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_CPU, .shift = 16, .size = 1 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_coreclk = {
 +      .clk    = {
 +              .name           = "core_clk",
 +              .parent         = &exynos4_clk_moutcore.clk,
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_CPU, .shift = 0, .size = 3 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_armclk = {
 +      .clk    = {
 +              .name           = "armclk",
 +              .parent         = &exynos4_clk_coreclk.clk,
 +      },
 +};
 +
 +static struct clksrc_clk exynos4_clk_aclk_corem0 = {
 +      .clk    = {
 +              .name           = "aclk_corem0",
 +              .parent         = &exynos4_clk_coreclk.clk,
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_CPU, .shift = 4, .size = 3 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_aclk_cores = {
 +      .clk    = {
 +              .name           = "aclk_cores",
 +              .parent         = &exynos4_clk_coreclk.clk,
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_CPU, .shift = 4, .size = 3 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_aclk_corem1 = {
 +      .clk    = {
 +              .name           = "aclk_corem1",
 +              .parent         = &exynos4_clk_coreclk.clk,
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_CPU, .shift = 8, .size = 3 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_periphclk = {
 +      .clk    = {
 +              .name           = "periphclk",
 +              .parent         = &exynos4_clk_coreclk.clk,
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_CPU, .shift = 12, .size = 3 },
 +};
 +
 +/* Core list of CMU_CORE side */
 +
 +static struct clk *exynos4_clkset_corebus_list[] = {
 +      [0] = &exynos4_clk_mout_mpll.clk,
 +      [1] = &exynos4_clk_sclk_apll.clk,
 +};
 +
 +struct clksrc_sources exynos4_clkset_mout_corebus = {
 +      .sources        = exynos4_clkset_corebus_list,
 +      .nr_sources     = ARRAY_SIZE(exynos4_clkset_corebus_list),
 +};
 +
 +static struct clksrc_clk exynos4_clk_mout_corebus = {
 +      .clk    = {
 +              .name           = "mout_corebus",
 +      },
 +      .sources = &exynos4_clkset_mout_corebus,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_DMC, .shift = 4, .size = 1 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_dmc = {
 +      .clk    = {
 +              .name           = "sclk_dmc",
 +              .parent         = &exynos4_clk_mout_corebus.clk,
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_DMC0, .shift = 12, .size = 3 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_aclk_cored = {
 +      .clk    = {
 +              .name           = "aclk_cored",
 +              .parent         = &exynos4_clk_sclk_dmc.clk,
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_DMC0, .shift = 16, .size = 3 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_aclk_corep = {
 +      .clk    = {
 +              .name           = "aclk_corep",
 +              .parent         = &exynos4_clk_aclk_cored.clk,
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_DMC0, .shift = 20, .size = 3 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_aclk_acp = {
 +      .clk    = {
 +              .name           = "aclk_acp",
 +              .parent         = &exynos4_clk_mout_corebus.clk,
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_DMC0, .shift = 0, .size = 3 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_pclk_acp = {
 +      .clk    = {
 +              .name           = "pclk_acp",
 +              .parent         = &exynos4_clk_aclk_acp.clk,
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_DMC0, .shift = 4, .size = 3 },
 +};
 +
 +/* Core list of CMU_TOP side */
 +
 +struct clk *exynos4_clkset_aclk_top_list[] = {
 +      [0] = &exynos4_clk_mout_mpll.clk,
 +      [1] = &exynos4_clk_sclk_apll.clk,
 +};
 +
 +static struct clksrc_sources exynos4_clkset_aclk = {
 +      .sources        = exynos4_clkset_aclk_top_list,
 +      .nr_sources     = ARRAY_SIZE(exynos4_clkset_aclk_top_list),
 +};
 +
 +static struct clksrc_clk exynos4_clk_aclk_200 = {
 +      .clk    = {
 +              .name           = "aclk_200",
 +      },
 +      .sources = &exynos4_clkset_aclk,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_TOP0, .shift = 12, .size = 1 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_TOP, .shift = 0, .size = 3 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_aclk_100 = {
 +      .clk    = {
 +              .name           = "aclk_100",
 +      },
 +      .sources = &exynos4_clkset_aclk,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_TOP0, .shift = 16, .size = 1 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_TOP, .shift = 4, .size = 4 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_aclk_160 = {
 +      .clk    = {
 +              .name           = "aclk_160",
 +      },
 +      .sources = &exynos4_clkset_aclk,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_TOP0, .shift = 20, .size = 1 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_TOP, .shift = 8, .size = 3 },
 +};
 +
 +struct clksrc_clk exynos4_clk_aclk_133 = {
 +      .clk    = {
 +              .name           = "aclk_133",
 +      },
 +      .sources = &exynos4_clkset_aclk,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_TOP0, .shift = 24, .size = 1 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_TOP, .shift = 12, .size = 3 },
 +};
 +
 +static struct clk *exynos4_clkset_vpllsrc_list[] = {
 +      [0] = &clk_fin_vpll,
 +      [1] = &exynos4_clk_sclk_hdmi27m,
 +};
 +
 +static struct clksrc_sources exynos4_clkset_vpllsrc = {
 +      .sources        = exynos4_clkset_vpllsrc_list,
 +      .nr_sources     = ARRAY_SIZE(exynos4_clkset_vpllsrc_list),
 +};
 +
 +static struct clksrc_clk exynos4_clk_vpllsrc = {
 +      .clk    = {
 +              .name           = "vpll_src",
 +              .enable         = exynos4_clksrc_mask_top_ctrl,
 +              .ctrlbit        = (1 << 0),
 +      },
 +      .sources = &exynos4_clkset_vpllsrc,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_TOP1, .shift = 0, .size = 1 },
 +};
 +
 +static struct clk *exynos4_clkset_sclk_vpll_list[] = {
 +      [0] = &exynos4_clk_vpllsrc.clk,
 +      [1] = &clk_fout_vpll,
 +};
 +
 +static struct clksrc_sources exynos4_clkset_sclk_vpll = {
 +      .sources        = exynos4_clkset_sclk_vpll_list,
 +      .nr_sources     = ARRAY_SIZE(exynos4_clkset_sclk_vpll_list),
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_vpll = {
 +      .clk    = {
 +              .name           = "sclk_vpll",
 +      },
 +      .sources = &exynos4_clkset_sclk_vpll,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_TOP0, .shift = 8, .size = 1 },
 +};
 +
 +static struct clk exynos4_init_clocks_off[] = {
 +      {
 +              .name           = "timers",
 +              .parent         = &exynos4_clk_aclk_100.clk,
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1<<24),
 +      }, {
 +              .name           = "csis",
 +              .devname        = "s5p-mipi-csis.0",
 +              .enable         = exynos4_clk_ip_cam_ctrl,
 +              .ctrlbit        = (1 << 4),
 +      }, {
 +              .name           = "csis",
 +              .devname        = "s5p-mipi-csis.1",
 +              .enable         = exynos4_clk_ip_cam_ctrl,
 +              .ctrlbit        = (1 << 5),
++      }, {
++              .name           = "jpeg",
++              .id             = 0,
++              .enable         = exynos4_clk_ip_cam_ctrl,
++              .ctrlbit        = (1 << 6),
 +      }, {
 +              .name           = "fimc",
 +              .devname        = "exynos4-fimc.0",
 +              .enable         = exynos4_clk_ip_cam_ctrl,
 +              .ctrlbit        = (1 << 0),
 +      }, {
 +              .name           = "fimc",
 +              .devname        = "exynos4-fimc.1",
 +              .enable         = exynos4_clk_ip_cam_ctrl,
 +              .ctrlbit        = (1 << 1),
 +      }, {
 +              .name           = "fimc",
 +              .devname        = "exynos4-fimc.2",
 +              .enable         = exynos4_clk_ip_cam_ctrl,
 +              .ctrlbit        = (1 << 2),
 +      }, {
 +              .name           = "fimc",
 +              .devname        = "exynos4-fimc.3",
 +              .enable         = exynos4_clk_ip_cam_ctrl,
 +              .ctrlbit        = (1 << 3),
 +      }, {
 +              .name           = "hsmmc",
 +              .devname        = "s3c-sdhci.0",
 +              .parent         = &exynos4_clk_aclk_133.clk,
 +              .enable         = exynos4_clk_ip_fsys_ctrl,
 +              .ctrlbit        = (1 << 5),
 +      }, {
 +              .name           = "hsmmc",
 +              .devname        = "s3c-sdhci.1",
 +              .parent         = &exynos4_clk_aclk_133.clk,
 +              .enable         = exynos4_clk_ip_fsys_ctrl,
 +              .ctrlbit        = (1 << 6),
 +      }, {
 +              .name           = "hsmmc",
 +              .devname        = "s3c-sdhci.2",
 +              .parent         = &exynos4_clk_aclk_133.clk,
 +              .enable         = exynos4_clk_ip_fsys_ctrl,
 +              .ctrlbit        = (1 << 7),
 +      }, {
 +              .name           = "hsmmc",
 +              .devname        = "s3c-sdhci.3",
 +              .parent         = &exynos4_clk_aclk_133.clk,
 +              .enable         = exynos4_clk_ip_fsys_ctrl,
 +              .ctrlbit        = (1 << 8),
 +      }, {
 +              .name           = "dwmmc",
 +              .parent         = &exynos4_clk_aclk_133.clk,
 +              .enable         = exynos4_clk_ip_fsys_ctrl,
 +              .ctrlbit        = (1 << 9),
 +      }, {
 +              .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           = "adc",
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 15),
 +      }, {
 +              .name           = "keypad",
 +              .enable         = exynos4_clk_ip_perir_ctrl,
 +              .ctrlbit        = (1 << 16),
 +      }, {
 +              .name           = "rtc",
 +              .enable         = exynos4_clk_ip_perir_ctrl,
 +              .ctrlbit        = (1 << 15),
 +      }, {
 +              .name           = "watchdog",
 +              .parent         = &exynos4_clk_aclk_100.clk,
 +              .enable         = exynos4_clk_ip_perir_ctrl,
 +              .ctrlbit        = (1 << 14),
 +      }, {
 +              .name           = "usbhost",
 +              .enable         = exynos4_clk_ip_fsys_ctrl ,
 +              .ctrlbit        = (1 << 12),
 +      }, {
 +              .name           = "otg",
 +              .enable         = exynos4_clk_ip_fsys_ctrl,
 +              .ctrlbit        = (1 << 13),
 +      }, {
 +              .name           = "spi",
 +              .devname        = "s3c64xx-spi.0",
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 16),
 +      }, {
 +              .name           = "spi",
 +              .devname        = "s3c64xx-spi.1",
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 17),
 +      }, {
 +              .name           = "spi",
 +              .devname        = "s3c64xx-spi.2",
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 18),
 +      }, {
 +              .name           = "iis",
 +              .devname        = "samsung-i2s.0",
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 19),
 +      }, {
 +              .name           = "iis",
 +              .devname        = "samsung-i2s.1",
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 20),
 +      }, {
 +              .name           = "iis",
 +              .devname        = "samsung-i2s.2",
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 21),
 +      }, {
 +              .name           = "ac97",
 +              .devname        = "samsung-ac97",
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 27),
 +      }, {
 +              .name           = "fimg2d",
 +              .enable         = exynos4_clk_ip_image_ctrl,
 +              .ctrlbit        = (1 << 0),
 +      }, {
 +              .name           = "mfc",
 +              .devname        = "s5p-mfc",
 +              .enable         = exynos4_clk_ip_mfc_ctrl,
 +              .ctrlbit        = (1 << 0),
 +      }, {
 +              .name           = "i2c",
 +              .devname        = "s3c2440-i2c.0",
 +              .parent         = &exynos4_clk_aclk_100.clk,
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 6),
 +      }, {
 +              .name           = "i2c",
 +              .devname        = "s3c2440-i2c.1",
 +              .parent         = &exynos4_clk_aclk_100.clk,
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 7),
 +      }, {
 +              .name           = "i2c",
 +              .devname        = "s3c2440-i2c.2",
 +              .parent         = &exynos4_clk_aclk_100.clk,
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 8),
 +      }, {
 +              .name           = "i2c",
 +              .devname        = "s3c2440-i2c.3",
 +              .parent         = &exynos4_clk_aclk_100.clk,
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 9),
 +      }, {
 +              .name           = "i2c",
 +              .devname        = "s3c2440-i2c.4",
 +              .parent         = &exynos4_clk_aclk_100.clk,
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 10),
 +      }, {
 +              .name           = "i2c",
 +              .devname        = "s3c2440-i2c.5",
 +              .parent         = &exynos4_clk_aclk_100.clk,
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 11),
 +      }, {
 +              .name           = "i2c",
 +              .devname        = "s3c2440-i2c.6",
 +              .parent         = &exynos4_clk_aclk_100.clk,
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 12),
 +      }, {
 +              .name           = "i2c",
 +              .devname        = "s3c2440-i2c.7",
 +              .parent         = &exynos4_clk_aclk_100.clk,
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 13),
 +      }, {
 +              .name           = "i2c",
 +              .devname        = "s3c2440-hdmiphy-i2c",
 +              .parent         = &exynos4_clk_aclk_100.clk,
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 14),
 +      }, {
 +              .name           = "SYSMMU_MDMA",
 +              .enable         = exynos4_clk_ip_image_ctrl,
 +              .ctrlbit        = (1 << 5),
 +      }, {
 +              .name           = "SYSMMU_FIMC0",
 +              .enable         = exynos4_clk_ip_cam_ctrl,
 +              .ctrlbit        = (1 << 7),
 +      }, {
 +              .name           = "SYSMMU_FIMC1",
 +              .enable         = exynos4_clk_ip_cam_ctrl,
 +              .ctrlbit        = (1 << 8),
 +      }, {
 +              .name           = "SYSMMU_FIMC2",
 +              .enable         = exynos4_clk_ip_cam_ctrl,
 +              .ctrlbit        = (1 << 9),
 +      }, {
 +              .name           = "SYSMMU_FIMC3",
 +              .enable         = exynos4_clk_ip_cam_ctrl,
 +              .ctrlbit        = (1 << 10),
 +      }, {
 +              .name           = "SYSMMU_JPEG",
 +              .enable         = exynos4_clk_ip_cam_ctrl,
 +              .ctrlbit        = (1 << 11),
 +      }, {
 +              .name           = "SYSMMU_FIMD0",
 +              .enable         = exynos4_clk_ip_lcd0_ctrl,
 +              .ctrlbit        = (1 << 4),
 +      }, {
 +              .name           = "SYSMMU_FIMD1",
 +              .enable         = exynos4_clk_ip_lcd1_ctrl,
 +              .ctrlbit        = (1 << 4),
 +      }, {
 +              .name           = "SYSMMU_PCIe",
 +              .enable         = exynos4_clk_ip_fsys_ctrl,
 +              .ctrlbit        = (1 << 18),
 +      }, {
 +              .name           = "SYSMMU_G2D",
 +              .enable         = exynos4_clk_ip_image_ctrl,
 +              .ctrlbit        = (1 << 3),
 +      }, {
 +              .name           = "SYSMMU_ROTATOR",
 +              .enable         = exynos4_clk_ip_image_ctrl,
 +              .ctrlbit        = (1 << 4),
 +      }, {
 +              .name           = "SYSMMU_TV",
 +              .enable         = exynos4_clk_ip_tv_ctrl,
 +              .ctrlbit        = (1 << 4),
 +      }, {
 +              .name           = "SYSMMU_MFC_L",
 +              .enable         = exynos4_clk_ip_mfc_ctrl,
 +              .ctrlbit        = (1 << 1),
 +      }, {
 +              .name           = "SYSMMU_MFC_R",
 +              .enable         = exynos4_clk_ip_mfc_ctrl,
 +              .ctrlbit        = (1 << 2),
 +      }
 +};
 +
 +static struct clk exynos4_init_clocks_on[] = {
 +      {
 +              .name           = "uart",
 +              .devname        = "s5pv210-uart.0",
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 0),
 +      }, {
 +              .name           = "uart",
 +              .devname        = "s5pv210-uart.1",
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 1),
 +      }, {
 +              .name           = "uart",
 +              .devname        = "s5pv210-uart.2",
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 2),
 +      }, {
 +              .name           = "uart",
 +              .devname        = "s5pv210-uart.3",
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 3),
 +      }, {
 +              .name           = "uart",
 +              .devname        = "s5pv210-uart.4",
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 4),
 +      }, {
 +              .name           = "uart",
 +              .devname        = "s5pv210-uart.5",
 +              .enable         = exynos4_clk_ip_peril_ctrl,
 +              .ctrlbit        = (1 << 5),
 +      }
 +};
 +
 +static struct clk exynos4_clk_pdma0 = {
 +      .name           = "dma",
 +      .devname        = "dma-pl330.0",
 +      .enable         = exynos4_clk_ip_fsys_ctrl,
 +      .ctrlbit        = (1 << 0),
 +};
 +
 +static struct clk exynos4_clk_pdma1 = {
 +      .name           = "dma",
 +      .devname        = "dma-pl330.1",
 +      .enable         = exynos4_clk_ip_fsys_ctrl,
 +      .ctrlbit        = (1 << 1),
 +};
 +
 +static struct clk exynos4_clk_mdma1 = {
 +      .name           = "dma",
 +      .devname        = "dma-pl330.2",
 +      .enable         = exynos4_clk_ip_image_ctrl,
 +      .ctrlbit        = ((1 << 8) | (1 << 5) | (1 << 2)),
 +};
 +
 +static struct clk exynos4_clk_fimd0 = {
 +      .name           = "fimd",
 +      .devname        = "exynos4-fb.0",
 +      .enable         = exynos4_clk_ip_lcd0_ctrl,
 +      .ctrlbit        = (1 << 0),
 +};
 +
 +struct clk *exynos4_clkset_group_list[] = {
 +      [0] = &clk_ext_xtal_mux,
 +      [1] = &clk_xusbxti,
 +      [2] = &exynos4_clk_sclk_hdmi27m,
 +      [3] = &exynos4_clk_sclk_usbphy0,
 +      [4] = &exynos4_clk_sclk_usbphy1,
 +      [5] = &exynos4_clk_sclk_hdmiphy,
 +      [6] = &exynos4_clk_mout_mpll.clk,
 +      [7] = &exynos4_clk_mout_epll.clk,
 +      [8] = &exynos4_clk_sclk_vpll.clk,
 +};
 +
 +struct clksrc_sources exynos4_clkset_group = {
 +      .sources        = exynos4_clkset_group_list,
 +      .nr_sources     = ARRAY_SIZE(exynos4_clkset_group_list),
 +};
 +
 +static struct clk *exynos4_clkset_mout_g2d0_list[] = {
 +      [0] = &exynos4_clk_mout_mpll.clk,
 +      [1] = &exynos4_clk_sclk_apll.clk,
 +};
 +
 +static struct clksrc_sources exynos4_clkset_mout_g2d0 = {
 +      .sources        = exynos4_clkset_mout_g2d0_list,
 +      .nr_sources     = ARRAY_SIZE(exynos4_clkset_mout_g2d0_list),
 +};
 +
 +static struct clksrc_clk exynos4_clk_mout_g2d0 = {
 +      .clk    = {
 +              .name           = "mout_g2d0",
 +      },
 +      .sources = &exynos4_clkset_mout_g2d0,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_IMAGE, .shift = 0, .size = 1 },
 +};
 +
 +static struct clk *exynos4_clkset_mout_g2d1_list[] = {
 +      [0] = &exynos4_clk_mout_epll.clk,
 +      [1] = &exynos4_clk_sclk_vpll.clk,
 +};
 +
 +static struct clksrc_sources exynos4_clkset_mout_g2d1 = {
 +      .sources        = exynos4_clkset_mout_g2d1_list,
 +      .nr_sources     = ARRAY_SIZE(exynos4_clkset_mout_g2d1_list),
 +};
 +
 +static struct clksrc_clk exynos4_clk_mout_g2d1 = {
 +      .clk    = {
 +              .name           = "mout_g2d1",
 +      },
 +      .sources = &exynos4_clkset_mout_g2d1,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_IMAGE, .shift = 4, .size = 1 },
 +};
 +
 +static struct clk *exynos4_clkset_mout_g2d_list[] = {
 +      [0] = &exynos4_clk_mout_g2d0.clk,
 +      [1] = &exynos4_clk_mout_g2d1.clk,
 +};
 +
 +static struct clksrc_sources exynos4_clkset_mout_g2d = {
 +      .sources        = exynos4_clkset_mout_g2d_list,
 +      .nr_sources     = ARRAY_SIZE(exynos4_clkset_mout_g2d_list),
 +};
 +
 +static struct clk *exynos4_clkset_mout_mfc0_list[] = {
 +      [0] = &exynos4_clk_mout_mpll.clk,
 +      [1] = &exynos4_clk_sclk_apll.clk,
 +};
 +
 +static struct clksrc_sources exynos4_clkset_mout_mfc0 = {
 +      .sources        = exynos4_clkset_mout_mfc0_list,
 +      .nr_sources     = ARRAY_SIZE(exynos4_clkset_mout_mfc0_list),
 +};
 +
 +static struct clksrc_clk exynos4_clk_mout_mfc0 = {
 +      .clk    = {
 +              .name           = "mout_mfc0",
 +      },
 +      .sources = &exynos4_clkset_mout_mfc0,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_MFC, .shift = 0, .size = 1 },
 +};
 +
 +static struct clk *exynos4_clkset_mout_mfc1_list[] = {
 +      [0] = &exynos4_clk_mout_epll.clk,
 +      [1] = &exynos4_clk_sclk_vpll.clk,
 +};
 +
 +static struct clksrc_sources exynos4_clkset_mout_mfc1 = {
 +      .sources        = exynos4_clkset_mout_mfc1_list,
 +      .nr_sources     = ARRAY_SIZE(exynos4_clkset_mout_mfc1_list),
 +};
 +
 +static struct clksrc_clk exynos4_clk_mout_mfc1 = {
 +      .clk    = {
 +              .name           = "mout_mfc1",
 +      },
 +      .sources = &exynos4_clkset_mout_mfc1,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_MFC, .shift = 4, .size = 1 },
 +};
 +
 +static struct clk *exynos4_clkset_mout_mfc_list[] = {
 +      [0] = &exynos4_clk_mout_mfc0.clk,
 +      [1] = &exynos4_clk_mout_mfc1.clk,
 +};
 +
 +static struct clksrc_sources exynos4_clkset_mout_mfc = {
 +      .sources        = exynos4_clkset_mout_mfc_list,
 +      .nr_sources     = ARRAY_SIZE(exynos4_clkset_mout_mfc_list),
 +};
 +
 +static struct clk *exynos4_clkset_sclk_dac_list[] = {
 +      [0] = &exynos4_clk_sclk_vpll.clk,
 +      [1] = &exynos4_clk_sclk_hdmiphy,
 +};
 +
 +static struct clksrc_sources exynos4_clkset_sclk_dac = {
 +      .sources        = exynos4_clkset_sclk_dac_list,
 +      .nr_sources     = ARRAY_SIZE(exynos4_clkset_sclk_dac_list),
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_dac = {
 +      .clk            = {
 +              .name           = "sclk_dac",
 +              .enable         = exynos4_clksrc_mask_tv_ctrl,
 +              .ctrlbit        = (1 << 8),
 +      },
 +      .sources = &exynos4_clkset_sclk_dac,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_TV, .shift = 8, .size = 1 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_pixel = {
 +      .clk            = {
 +              .name           = "sclk_pixel",
 +              .parent         = &exynos4_clk_sclk_vpll.clk,
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_TV, .shift = 0, .size = 4 },
 +};
 +
 +static struct clk *exynos4_clkset_sclk_hdmi_list[] = {
 +      [0] = &exynos4_clk_sclk_pixel.clk,
 +      [1] = &exynos4_clk_sclk_hdmiphy,
 +};
 +
 +static struct clksrc_sources exynos4_clkset_sclk_hdmi = {
 +      .sources        = exynos4_clkset_sclk_hdmi_list,
 +      .nr_sources     = ARRAY_SIZE(exynos4_clkset_sclk_hdmi_list),
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_hdmi = {
 +      .clk            = {
 +              .name           = "sclk_hdmi",
 +              .enable         = exynos4_clksrc_mask_tv_ctrl,
 +              .ctrlbit        = (1 << 0),
 +      },
 +      .sources = &exynos4_clkset_sclk_hdmi,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_TV, .shift = 0, .size = 1 },
 +};
 +
 +static struct clk *exynos4_clkset_sclk_mixer_list[] = {
 +      [0] = &exynos4_clk_sclk_dac.clk,
 +      [1] = &exynos4_clk_sclk_hdmi.clk,
 +};
 +
 +static struct clksrc_sources exynos4_clkset_sclk_mixer = {
 +      .sources        = exynos4_clkset_sclk_mixer_list,
 +      .nr_sources     = ARRAY_SIZE(exynos4_clkset_sclk_mixer_list),
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_mixer = {
 +      .clk    = {
 +              .name           = "sclk_mixer",
 +              .enable         = exynos4_clksrc_mask_tv_ctrl,
 +              .ctrlbit        = (1 << 4),
 +      },
 +      .sources = &exynos4_clkset_sclk_mixer,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_TV, .shift = 4, .size = 1 },
 +};
 +
 +static struct clksrc_clk *exynos4_sclk_tv[] = {
 +      &exynos4_clk_sclk_dac,
 +      &exynos4_clk_sclk_pixel,
 +      &exynos4_clk_sclk_hdmi,
 +      &exynos4_clk_sclk_mixer,
 +};
 +
 +static struct clksrc_clk exynos4_clk_dout_mmc0 = {
 +      .clk    = {
 +              .name           = "dout_mmc0",
 +      },
 +      .sources = &exynos4_clkset_group,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_FSYS, .shift = 0, .size = 4 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_FSYS1, .shift = 0, .size = 4 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_dout_mmc1 = {
 +      .clk    = {
 +              .name           = "dout_mmc1",
 +      },
 +      .sources = &exynos4_clkset_group,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_FSYS, .shift = 4, .size = 4 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_FSYS1, .shift = 16, .size = 4 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_dout_mmc2 = {
 +      .clk    = {
 +              .name           = "dout_mmc2",
 +      },
 +      .sources = &exynos4_clkset_group,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_FSYS, .shift = 8, .size = 4 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_FSYS2, .shift = 0, .size = 4 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_dout_mmc3 = {
 +      .clk    = {
 +              .name           = "dout_mmc3",
 +      },
 +      .sources = &exynos4_clkset_group,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_FSYS, .shift = 12, .size = 4 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_FSYS2, .shift = 16, .size = 4 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_dout_mmc4 = {
 +      .clk            = {
 +              .name           = "dout_mmc4",
 +      },
 +      .sources = &exynos4_clkset_group,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_FSYS, .shift = 16, .size = 4 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_FSYS3, .shift = 0, .size = 4 },
 +};
 +
 +static struct clksrc_clk exynos4_clksrcs[] = {
 +      {
 +              .clk    = {
 +                      .name           = "sclk_pwm",
 +                      .enable         = exynos4_clksrc_mask_peril0_ctrl,
 +                      .ctrlbit        = (1 << 24),
 +              },
 +              .sources = &exynos4_clkset_group,
 +              .reg_src = { .reg = EXYNOS4_CLKSRC_PERIL0, .shift = 24, .size = 4 },
 +              .reg_div = { .reg = EXYNOS4_CLKDIV_PERIL3, .shift = 0, .size = 4 },
 +      }, {
 +              .clk    = {
 +                      .name           = "sclk_csis",
 +                      .devname        = "s5p-mipi-csis.0",
 +                      .enable         = exynos4_clksrc_mask_cam_ctrl,
 +                      .ctrlbit        = (1 << 24),
 +              },
 +              .sources = &exynos4_clkset_group,
 +              .reg_src = { .reg = EXYNOS4_CLKSRC_CAM, .shift = 24, .size = 4 },
 +              .reg_div = { .reg = EXYNOS4_CLKDIV_CAM, .shift = 24, .size = 4 },
 +      }, {
 +              .clk    = {
 +                      .name           = "sclk_csis",
 +                      .devname        = "s5p-mipi-csis.1",
 +                      .enable         = exynos4_clksrc_mask_cam_ctrl,
 +                      .ctrlbit        = (1 << 28),
 +              },
 +              .sources = &exynos4_clkset_group,
 +              .reg_src = { .reg = EXYNOS4_CLKSRC_CAM, .shift = 28, .size = 4 },
 +              .reg_div = { .reg = EXYNOS4_CLKDIV_CAM, .shift = 28, .size = 4 },
 +      }, {
 +              .clk    = {
 +                      .name           = "sclk_cam0",
 +                      .enable         = exynos4_clksrc_mask_cam_ctrl,
 +                      .ctrlbit        = (1 << 16),
 +              },
 +              .sources = &exynos4_clkset_group,
 +              .reg_src = { .reg = EXYNOS4_CLKSRC_CAM, .shift = 16, .size = 4 },
 +              .reg_div = { .reg = EXYNOS4_CLKDIV_CAM, .shift = 16, .size = 4 },
 +      }, {
 +              .clk    = {
 +                      .name           = "sclk_cam1",
 +                      .enable         = exynos4_clksrc_mask_cam_ctrl,
 +                      .ctrlbit        = (1 << 20),
 +              },
 +              .sources = &exynos4_clkset_group,
 +              .reg_src = { .reg = EXYNOS4_CLKSRC_CAM, .shift = 20, .size = 4 },
 +              .reg_div = { .reg = EXYNOS4_CLKDIV_CAM, .shift = 20, .size = 4 },
 +      }, {
 +              .clk    = {
 +                      .name           = "sclk_fimc",
 +                      .devname        = "exynos4-fimc.0",
 +                      .enable         = exynos4_clksrc_mask_cam_ctrl,
 +                      .ctrlbit        = (1 << 0),
 +              },
 +              .sources = &exynos4_clkset_group,
 +              .reg_src = { .reg = EXYNOS4_CLKSRC_CAM, .shift = 0, .size = 4 },
 +              .reg_div = { .reg = EXYNOS4_CLKDIV_CAM, .shift = 0, .size = 4 },
 +      }, {
 +              .clk    = {
 +                      .name           = "sclk_fimc",
 +                      .devname        = "exynos4-fimc.1",
 +                      .enable         = exynos4_clksrc_mask_cam_ctrl,
 +                      .ctrlbit        = (1 << 4),
 +              },
 +              .sources = &exynos4_clkset_group,
 +              .reg_src = { .reg = EXYNOS4_CLKSRC_CAM, .shift = 4, .size = 4 },
 +              .reg_div = { .reg = EXYNOS4_CLKDIV_CAM, .shift = 4, .size = 4 },
 +      }, {
 +              .clk    = {
 +                      .name           = "sclk_fimc",
 +                      .devname        = "exynos4-fimc.2",
 +                      .enable         = exynos4_clksrc_mask_cam_ctrl,
 +                      .ctrlbit        = (1 << 8),
 +              },
 +              .sources = &exynos4_clkset_group,
 +              .reg_src = { .reg = EXYNOS4_CLKSRC_CAM, .shift = 8, .size = 4 },
 +              .reg_div = { .reg = EXYNOS4_CLKDIV_CAM, .shift = 8, .size = 4 },
 +      }, {
 +              .clk    = {
 +                      .name           = "sclk_fimc",
 +                      .devname        = "exynos4-fimc.3",
 +                      .enable         = exynos4_clksrc_mask_cam_ctrl,
 +                      .ctrlbit        = (1 << 12),
 +              },
 +              .sources = &exynos4_clkset_group,
 +              .reg_src = { .reg = EXYNOS4_CLKSRC_CAM, .shift = 12, .size = 4 },
 +              .reg_div = { .reg = EXYNOS4_CLKDIV_CAM, .shift = 12, .size = 4 },
 +      }, {
 +              .clk    = {
 +                      .name           = "sclk_fimd",
 +                      .devname        = "exynos4-fb.0",
 +                      .enable         = exynos4_clksrc_mask_lcd0_ctrl,
 +                      .ctrlbit        = (1 << 0),
 +              },
 +              .sources = &exynos4_clkset_group,
 +              .reg_src = { .reg = EXYNOS4_CLKSRC_LCD0, .shift = 0, .size = 4 },
 +              .reg_div = { .reg = EXYNOS4_CLKDIV_LCD0, .shift = 0, .size = 4 },
 +      }, {
 +              .clk    = {
 +                      .name           = "sclk_fimg2d",
 +              },
 +              .sources = &exynos4_clkset_mout_g2d,
 +              .reg_src = { .reg = EXYNOS4_CLKSRC_IMAGE, .shift = 8, .size = 1 },
 +              .reg_div = { .reg = EXYNOS4_CLKDIV_IMAGE, .shift = 0, .size = 4 },
 +      }, {
 +              .clk    = {
 +                      .name           = "sclk_mfc",
 +                      .devname        = "s5p-mfc",
 +              },
 +              .sources = &exynos4_clkset_mout_mfc,
 +              .reg_src = { .reg = EXYNOS4_CLKSRC_MFC, .shift = 8, .size = 1 },
 +              .reg_div = { .reg = EXYNOS4_CLKDIV_MFC, .shift = 0, .size = 4 },
 +      }, {
 +              .clk    = {
 +                      .name           = "sclk_dwmmc",
 +                      .parent         = &exynos4_clk_dout_mmc4.clk,
 +                      .enable         = exynos4_clksrc_mask_fsys_ctrl,
 +                      .ctrlbit        = (1 << 16),
 +              },
 +              .reg_div = { .reg = EXYNOS4_CLKDIV_FSYS3, .shift = 8, .size = 8 },
 +      }
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_uart0 = {
 +      .clk    = {
 +              .name           = "uclk1",
 +              .devname        = "exynos4210-uart.0",
 +              .enable         = exynos4_clksrc_mask_peril0_ctrl,
 +              .ctrlbit        = (1 << 0),
 +      },
 +      .sources = &exynos4_clkset_group,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_PERIL0, .shift = 0, .size = 4 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_PERIL0, .shift = 0, .size = 4 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_uart1 = {
 +      .clk    = {
 +              .name           = "uclk1",
 +              .devname        = "exynos4210-uart.1",
 +              .enable         = exynos4_clksrc_mask_peril0_ctrl,
 +              .ctrlbit        = (1 << 4),
 +      },
 +      .sources = &exynos4_clkset_group,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_PERIL0, .shift = 4, .size = 4 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_PERIL0, .shift = 4, .size = 4 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_uart2 = {
 +      .clk    = {
 +              .name           = "uclk1",
 +              .devname        = "exynos4210-uart.2",
 +              .enable         = exynos4_clksrc_mask_peril0_ctrl,
 +              .ctrlbit        = (1 << 8),
 +      },
 +      .sources = &exynos4_clkset_group,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_PERIL0, .shift = 8, .size = 4 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_PERIL0, .shift = 8, .size = 4 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_uart3 = {
 +      .clk    = {
 +              .name           = "uclk1",
 +              .devname        = "exynos4210-uart.3",
 +              .enable         = exynos4_clksrc_mask_peril0_ctrl,
 +              .ctrlbit        = (1 << 12),
 +      },
 +      .sources = &exynos4_clkset_group,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_PERIL0, .shift = 12, .size = 4 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_PERIL0, .shift = 12, .size = 4 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_mmc0 = {
 +      .clk    = {
 +              .name           = "sclk_mmc",
 +              .devname        = "s3c-sdhci.0",
 +              .parent         = &exynos4_clk_dout_mmc0.clk,
 +              .enable         = exynos4_clksrc_mask_fsys_ctrl,
 +              .ctrlbit        = (1 << 0),
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_FSYS1, .shift = 8, .size = 8 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_mmc1 = {
 +      .clk    = {
 +              .name           = "sclk_mmc",
 +              .devname        = "s3c-sdhci.1",
 +              .parent         = &exynos4_clk_dout_mmc1.clk,
 +              .enable         = exynos4_clksrc_mask_fsys_ctrl,
 +              .ctrlbit        = (1 << 4),
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_FSYS1, .shift = 24, .size = 8 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_mmc2 = {
 +      .clk    = {
 +              .name           = "sclk_mmc",
 +              .devname        = "s3c-sdhci.2",
 +              .parent         = &exynos4_clk_dout_mmc2.clk,
 +              .enable         = exynos4_clksrc_mask_fsys_ctrl,
 +              .ctrlbit        = (1 << 8),
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_FSYS2, .shift = 8, .size = 8 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_mmc3 = {
 +      .clk    = {
 +              .name           = "sclk_mmc",
 +              .devname        = "s3c-sdhci.3",
 +              .parent         = &exynos4_clk_dout_mmc3.clk,
 +              .enable         = exynos4_clksrc_mask_fsys_ctrl,
 +              .ctrlbit        = (1 << 12),
 +      },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_FSYS2, .shift = 24, .size = 8 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_spi0 = {
 +      .clk    = {
 +              .name           = "sclk_spi",
 +              .devname        = "s3c64xx-spi.0",
 +              .enable         = exynos4_clksrc_mask_peril1_ctrl,
 +              .ctrlbit        = (1 << 16),
 +      },
 +      .sources = &exynos4_clkset_group,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_PERIL1, .shift = 16, .size = 4 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_PERIL1, .shift = 0, .size = 4 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_spi1 = {
 +      .clk    = {
 +              .name           = "sclk_spi",
 +              .devname        = "s3c64xx-spi.1",
 +              .enable         = exynos4_clksrc_mask_peril1_ctrl,
 +              .ctrlbit        = (1 << 20),
 +      },
 +      .sources = &exynos4_clkset_group,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_PERIL1, .shift = 20, .size = 4 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_PERIL1, .shift = 16, .size = 4 },
 +};
 +
 +static struct clksrc_clk exynos4_clk_sclk_spi2 = {
 +      .clk    = {
 +              .name           = "sclk_spi",
 +              .devname        = "s3c64xx-spi.2",
 +              .enable         = exynos4_clksrc_mask_peril1_ctrl,
 +              .ctrlbit        = (1 << 24),
 +      },
 +      .sources = &exynos4_clkset_group,
 +      .reg_src = { .reg = EXYNOS4_CLKSRC_PERIL1, .shift = 24, .size = 4 },
 +      .reg_div = { .reg = EXYNOS4_CLKDIV_PERIL2, .shift = 0, .size = 4 },
 +};
 +
 +/* Clock initialization code */
 +static struct clksrc_clk *exynos4_sysclks[] = {
 +      &exynos4_clk_mout_apll,
 +      &exynos4_clk_sclk_apll,
 +      &exynos4_clk_mout_epll,
 +      &exynos4_clk_mout_mpll,
 +      &exynos4_clk_moutcore,
 +      &exynos4_clk_coreclk,
 +      &exynos4_clk_armclk,
 +      &exynos4_clk_aclk_corem0,
 +      &exynos4_clk_aclk_cores,
 +      &exynos4_clk_aclk_corem1,
 +      &exynos4_clk_periphclk,
 +      &exynos4_clk_mout_corebus,
 +      &exynos4_clk_sclk_dmc,
 +      &exynos4_clk_aclk_cored,
 +      &exynos4_clk_aclk_corep,
 +      &exynos4_clk_aclk_acp,
 +      &exynos4_clk_pclk_acp,
 +      &exynos4_clk_vpllsrc,
 +      &exynos4_clk_sclk_vpll,
 +      &exynos4_clk_aclk_200,
 +      &exynos4_clk_aclk_100,
 +      &exynos4_clk_aclk_160,
 +      &exynos4_clk_aclk_133,
 +      &exynos4_clk_dout_mmc0,
 +      &exynos4_clk_dout_mmc1,
 +      &exynos4_clk_dout_mmc2,
 +      &exynos4_clk_dout_mmc3,
 +      &exynos4_clk_dout_mmc4,
 +      &exynos4_clk_mout_mfc0,
 +      &exynos4_clk_mout_mfc1,
 +};
 +
 +static struct clk *exynos4_clk_cdev[] = {
 +      &exynos4_clk_pdma0,
 +      &exynos4_clk_pdma1,
 +      &exynos4_clk_mdma1,
 +      &exynos4_clk_fimd0,
 +};
 +
 +static struct clksrc_clk *exynos4_clksrc_cdev[] = {
 +      &exynos4_clk_sclk_uart0,
 +      &exynos4_clk_sclk_uart1,
 +      &exynos4_clk_sclk_uart2,
 +      &exynos4_clk_sclk_uart3,
 +      &exynos4_clk_sclk_mmc0,
 +      &exynos4_clk_sclk_mmc1,
 +      &exynos4_clk_sclk_mmc2,
 +      &exynos4_clk_sclk_mmc3,
 +      &exynos4_clk_sclk_spi0,
 +      &exynos4_clk_sclk_spi1,
 +      &exynos4_clk_sclk_spi2,
 +
 +};
 +
 +static struct clk_lookup exynos4_clk_lookup[] = {
 +      CLKDEV_INIT("exynos4210-uart.0", "clk_uart_baud0", &exynos4_clk_sclk_uart0.clk),
 +      CLKDEV_INIT("exynos4210-uart.1", "clk_uart_baud0", &exynos4_clk_sclk_uart1.clk),
 +      CLKDEV_INIT("exynos4210-uart.2", "clk_uart_baud0", &exynos4_clk_sclk_uart2.clk),
 +      CLKDEV_INIT("exynos4210-uart.3", "clk_uart_baud0", &exynos4_clk_sclk_uart3.clk),
 +      CLKDEV_INIT("s3c-sdhci.0", "mmc_busclk.2", &exynos4_clk_sclk_mmc0.clk),
 +      CLKDEV_INIT("s3c-sdhci.1", "mmc_busclk.2", &exynos4_clk_sclk_mmc1.clk),
 +      CLKDEV_INIT("s3c-sdhci.2", "mmc_busclk.2", &exynos4_clk_sclk_mmc2.clk),
 +      CLKDEV_INIT("s3c-sdhci.3", "mmc_busclk.2", &exynos4_clk_sclk_mmc3.clk),
 +      CLKDEV_INIT("exynos4-fb.0", "lcd", &exynos4_clk_fimd0),
 +      CLKDEV_INIT("dma-pl330.0", "apb_pclk", &exynos4_clk_pdma0),
 +      CLKDEV_INIT("dma-pl330.1", "apb_pclk", &exynos4_clk_pdma1),
 +      CLKDEV_INIT("dma-pl330.2", "apb_pclk", &exynos4_clk_mdma1),
 +      CLKDEV_INIT("s3c64xx-spi.0", "spi_busclk0", &exynos4_clk_sclk_spi0.clk),
 +      CLKDEV_INIT("s3c64xx-spi.1", "spi_busclk0", &exynos4_clk_sclk_spi1.clk),
 +      CLKDEV_INIT("s3c64xx-spi.2", "spi_busclk0", &exynos4_clk_sclk_spi2.clk),
 +};
 +
 +static int xtal_rate;
 +
 +static unsigned long exynos4_fout_apll_get_rate(struct clk *clk)
 +{
 +      if (soc_is_exynos4210())
 +              return s5p_get_pll45xx(xtal_rate, __raw_readl(EXYNOS4_APLL_CON0),
 +                                      pll_4508);
 +      else if (soc_is_exynos4212() || soc_is_exynos4412())
 +              return s5p_get_pll35xx(xtal_rate, __raw_readl(EXYNOS4_APLL_CON0));
 +      else
 +              return 0;
 +}
 +
 +static struct clk_ops exynos4_fout_apll_ops = {
 +      .get_rate = exynos4_fout_apll_get_rate,
 +};
 +
 +static u32 exynos4_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(EXYNOS4_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(EXYNOS4_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(exynos4_vpll_div); i++) {
 +              if (exynos4_vpll_div[i][0] == rate) {
 +                      vpll_con0 |= exynos4_vpll_div[i][1] << PLL46XX_PDIV_SHIFT;
 +                      vpll_con0 |= exynos4_vpll_div[i][2] << PLL46XX_MDIV_SHIFT;
 +                      vpll_con0 |= exynos4_vpll_div[i][3] << PLL46XX_SDIV_SHIFT;
 +                      vpll_con1 |= exynos4_vpll_div[i][4] << PLL46XX_KDIV_SHIFT;
 +                      vpll_con1 |= exynos4_vpll_div[i][5] << PLL46XX_MFR_SHIFT;
 +                      vpll_con1 |= exynos4_vpll_div[i][6] << PLL46XX_MRR_SHIFT;
 +                      vpll_con0 |= exynos4_vpll_div[i][7] << 27;
 +                      break;
 +              }
 +      }
 +
 +      if (i == ARRAY_SIZE(exynos4_vpll_div)) {
 +              printk(KERN_ERR "%s: Invalid Clock VPLL Frequency\n",
 +                              __func__);
 +              return -EINVAL;
 +      }
 +
 +      __raw_writel(vpll_con0, EXYNOS4_VPLL_CON0);
 +      __raw_writel(vpll_con1, EXYNOS4_VPLL_CON1);
 +
 +      /* Wait for VPLL lock */
 +      while (!(__raw_readl(EXYNOS4_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 = 0;
 +      unsigned long mpll = 0;
 +      unsigned long epll = 0;
 +      unsigned long vpll = 0;
 +      unsigned long vpllsrc;
 +      unsigned long xtal;
 +      unsigned long armclk;
 +      unsigned long sclk_dmc;
 +      unsigned long aclk_200;
 +      unsigned long aclk_100;
 +      unsigned long aclk_160;
 +      unsigned long aclk_133;
 +      unsigned int ptr;
 +
 +      printk(KERN_DEBUG "%s: registering clocks\n", __func__);
 +
 +      xtal_clk = clk_get(NULL, "xtal");
 +      BUG_ON(IS_ERR(xtal_clk));
 +
 +      xtal = clk_get_rate(xtal_clk);
 +
 +      xtal_rate = xtal;
 +
 +      clk_put(xtal_clk);
 +
 +      printk(KERN_DEBUG "%s: xtal is %ld\n", __func__, xtal);
 +
 +      if (soc_is_exynos4210()) {
 +              apll = s5p_get_pll45xx(xtal, __raw_readl(EXYNOS4_APLL_CON0),
 +                                      pll_4508);
 +              mpll = s5p_get_pll45xx(xtal, __raw_readl(EXYNOS4_MPLL_CON0),
 +                                      pll_4508);
 +              epll = s5p_get_pll46xx(xtal, __raw_readl(EXYNOS4_EPLL_CON0),
 +                                      __raw_readl(EXYNOS4_EPLL_CON1), pll_4600);
 +
 +              vpllsrc = clk_get_rate(&exynos4_clk_vpllsrc.clk);
 +              vpll = s5p_get_pll46xx(vpllsrc, __raw_readl(EXYNOS4_VPLL_CON0),
 +                                      __raw_readl(EXYNOS4_VPLL_CON1), pll_4650c);
 +      } else if (soc_is_exynos4212() || soc_is_exynos4412()) {
 +              apll = s5p_get_pll35xx(xtal, __raw_readl(EXYNOS4_APLL_CON0));
 +              mpll = s5p_get_pll35xx(xtal, __raw_readl(EXYNOS4_MPLL_CON0));
 +              epll = s5p_get_pll36xx(xtal, __raw_readl(EXYNOS4_EPLL_CON0),
 +                                      __raw_readl(EXYNOS4_EPLL_CON1));
 +
 +              vpllsrc = clk_get_rate(&exynos4_clk_vpllsrc.clk);
 +              vpll = s5p_get_pll36xx(vpllsrc, __raw_readl(EXYNOS4_VPLL_CON0),
 +                                      __raw_readl(EXYNOS4_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",
 +                      apll, mpll, epll, vpll);
 +
 +      armclk = clk_get_rate(&exynos4_clk_armclk.clk);
 +      sclk_dmc = clk_get_rate(&exynos4_clk_sclk_dmc.clk);
 +
 +      aclk_200 = clk_get_rate(&exynos4_clk_aclk_200.clk);
 +      aclk_100 = clk_get_rate(&exynos4_clk_aclk_100.clk);
 +      aclk_160 = clk_get_rate(&exynos4_clk_aclk_160.clk);
 +      aclk_133 = clk_get_rate(&exynos4_clk_aclk_133.clk);
 +
 +      printk(KERN_INFO "EXYNOS4: ARMCLK=%ld, DMC=%ld, ACLK200=%ld\n"
 +                       "ACLK100=%ld, ACLK160=%ld, ACLK133=%ld\n",
 +                      armclk, sclk_dmc, aclk_200,
 +                      aclk_100, aclk_160, aclk_133);
 +
 +      clk_f.rate = armclk;
 +      clk_h.rate = sclk_dmc;
 +      clk_p.rate = aclk_100;
 +
 +      for (ptr = 0; ptr < ARRAY_SIZE(exynos4_clksrcs); ptr++)
 +              s3c_set_clksrc(&exynos4_clksrcs[ptr], true);
 +}
 +
 +static struct clk *exynos4_clks[] __initdata = {
 +      &exynos4_clk_sclk_hdmi27m,
 +      &exynos4_clk_sclk_hdmiphy,
 +      &exynos4_clk_sclk_usbphy0,
 +      &exynos4_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
 +
 +static struct syscore_ops exynos4_clock_syscore_ops = {
 +      .suspend        = exynos4_clock_suspend,
 +      .resume         = exynos4_clock_resume,
 +};
 +
 +void __init exynos4_register_clocks(void)
 +{
 +      int ptr;
 +
 +      s3c24xx_register_clocks(exynos4_clks, ARRAY_SIZE(exynos4_clks));
 +
 +      for (ptr = 0; ptr < ARRAY_SIZE(exynos4_sysclks); ptr++)
 +              s3c_register_clksrc(exynos4_sysclks[ptr], 1);
 +
 +      for (ptr = 0; ptr < ARRAY_SIZE(exynos4_sclk_tv); ptr++)
 +              s3c_register_clksrc(exynos4_sclk_tv[ptr], 1);
 +
 +      for (ptr = 0; ptr < ARRAY_SIZE(exynos4_clksrc_cdev); ptr++)
 +              s3c_register_clksrc(exynos4_clksrc_cdev[ptr], 1);
 +
 +      s3c_register_clksrc(exynos4_clksrcs, ARRAY_SIZE(exynos4_clksrcs));
 +      s3c_register_clocks(exynos4_init_clocks_on, ARRAY_SIZE(exynos4_init_clocks_on));
 +
 +      s3c24xx_register_clocks(exynos4_clk_cdev, ARRAY_SIZE(exynos4_clk_cdev));
 +      for (ptr = 0; ptr < ARRAY_SIZE(exynos4_clk_cdev); ptr++)
 +              s3c_disable_clocks(exynos4_clk_cdev[ptr], 1);
 +
 +      s3c_register_clocks(exynos4_init_clocks_off, ARRAY_SIZE(exynos4_init_clocks_off));
 +      s3c_disable_clocks(exynos4_init_clocks_off, ARRAY_SIZE(exynos4_init_clocks_off));
 +      clkdev_add_table(exynos4_clk_lookup, ARRAY_SIZE(exynos4_clk_lookup));
 +
 +      register_syscore_ops(&exynos4_clock_syscore_ops);
 +      s3c24xx_register_clock(&dummy_apb_pclk);
 +
 +      s3c_pwmclk_init();
 +}
index cbbaca54966acce01f768d460586b1cb58e12237,02696ac143bd0ccfe5350b3ebffe7294291e2396..66742e914641733fe456aad9a54d8616bd22017c
  #include <asm/hardware/gic.h>
  #include <asm/mach/map.h>
  #include <asm/mach/irq.h>
+ #include <asm/cacheflush.h>
  
  #include <mach/regs-irq.h>
  #include <mach/regs-pmu.h>
  #include <mach/regs-gpio.h>
+ #include <mach/pmu.h>
  
  #include <plat/cpu.h>
  #include <plat/clock.h>
  #include <plat/regs-serial.h>
  
  #include "common.h"
+ #define L2_AUX_VAL 0x7C470001
+ #define L2_AUX_MASK 0xC200ffff
  
  static const char name_exynos4210[] = "EXYNOS4210";
  static const char name_exynos4212[] = "EXYNOS4212";
  static const char name_exynos4412[] = "EXYNOS4412";
 +static const char name_exynos5250[] = "EXYNOS5250";
 +
 +static void exynos4_map_io(void);
 +static void exynos5_map_io(void);
 +static void exynos4_init_clocks(int xtal);
 +static void exynos5_init_clocks(int xtal);
 +static void exynos_init_uarts(struct s3c2410_uartcfg *cfg, int no);
 +static int exynos_init(void);
  
  static struct cpu_table cpu_ids[] __initdata = {
        {
@@@ -64,7 -60,7 +68,7 @@@
                .idmask         = EXYNOS4_CPU_MASK,
                .map_io         = exynos4_map_io,
                .init_clocks    = exynos4_init_clocks,
 -              .init_uarts     = exynos4_init_uarts,
 +              .init_uarts     = exynos_init_uarts,
                .init           = exynos_init,
                .name           = name_exynos4210,
        }, {
@@@ -72,7 -68,7 +76,7 @@@
                .idmask         = EXYNOS4_CPU_MASK,
                .map_io         = exynos4_map_io,
                .init_clocks    = exynos4_init_clocks,
 -              .init_uarts     = exynos4_init_uarts,
 +              .init_uarts     = exynos_init_uarts,
                .init           = exynos_init,
                .name           = name_exynos4212,
        }, {
                .idmask         = EXYNOS4_CPU_MASK,
                .map_io         = exynos4_map_io,
                .init_clocks    = exynos4_init_clocks,
 -              .init_uarts     = exynos4_init_uarts,
 +              .init_uarts     = exynos_init_uarts,
                .init           = exynos_init,
                .name           = name_exynos4412,
 +      }, {
 +              .idcode         = EXYNOS5250_SOC_ID,
 +              .idmask         = EXYNOS5_SOC_MASK,
 +              .map_io         = exynos5_map_io,
 +              .init_clocks    = exynos5_init_clocks,
 +              .init_uarts     = exynos_init_uarts,
 +              .init           = exynos_init,
 +              .name           = name_exynos5250,
        },
  };
  
  static struct map_desc exynos_iodesc[] __initdata = {
        {
                .virtual        = (unsigned long)S5P_VA_CHIPID,
 -              .pfn            = __phys_to_pfn(EXYNOS4_PA_CHIPID),
 +              .pfn            = __phys_to_pfn(EXYNOS_PA_CHIPID),
                .length         = SZ_4K,
                .type           = MT_DEVICE,
 -      }, {
 +      },
 +};
 +
 +static struct map_desc exynos4_iodesc[] __initdata = {
 +      {
                .virtual        = (unsigned long)S3C_VA_SYS,
                .pfn            = __phys_to_pfn(EXYNOS4_PA_SYSCON),
                .length         = SZ_64K,
                .pfn            = __phys_to_pfn(EXYNOS4_PA_UART),
                .length         = SZ_512K,
                .type           = MT_DEVICE,
 -      },
 -};
 -
 -static struct map_desc exynos4_iodesc[] __initdata = {
 -      {
 +      }, {
                .virtual        = (unsigned long)S5P_VA_CMU,
                .pfn            = __phys_to_pfn(EXYNOS4_PA_CMU),
                .length         = SZ_128K,
        }, {
                .virtual        = (unsigned long)S5P_VA_DMC0,
                .pfn            = __phys_to_pfn(EXYNOS4_PA_DMC0),
-               .length         = SZ_4K,
+               .length         = SZ_64K,
+               .type           = MT_DEVICE,
+       }, {
+               .virtual        = (unsigned long)S5P_VA_DMC1,
+               .pfn            = __phys_to_pfn(EXYNOS4_PA_DMC1),
+               .length         = SZ_64K,
                .type           = MT_DEVICE,
        }, {
                .virtual        = (unsigned long)S3C_VA_USB_HSPHY,
@@@ -217,80 -210,19 +226,80 @@@ static struct map_desc exynos4_iodesc1[
        },
  };
  
 -static void exynos_idle(void)
 -{
 -      if (!need_resched())
 -              cpu_do_idle();
 -
 -      local_irq_enable();
 -}
 +static struct map_desc exynos5_iodesc[] __initdata = {
 +      {
 +              .virtual        = (unsigned long)S3C_VA_SYS,
 +              .pfn            = __phys_to_pfn(EXYNOS5_PA_SYSCON),
 +              .length         = SZ_64K,
 +              .type           = MT_DEVICE,
 +      }, {
 +              .virtual        = (unsigned long)S3C_VA_TIMER,
 +              .pfn            = __phys_to_pfn(EXYNOS5_PA_TIMER),
 +              .length         = SZ_16K,
 +              .type           = MT_DEVICE,
 +      }, {
 +              .virtual        = (unsigned long)S3C_VA_WATCHDOG,
 +              .pfn            = __phys_to_pfn(EXYNOS5_PA_WATCHDOG),
 +              .length         = SZ_4K,
 +              .type           = MT_DEVICE,
 +      }, {
 +              .virtual        = (unsigned long)S5P_VA_SROMC,
 +              .pfn            = __phys_to_pfn(EXYNOS5_PA_SROMC),
 +              .length         = SZ_4K,
 +              .type           = MT_DEVICE,
 +      }, {
 +              .virtual        = (unsigned long)S5P_VA_SYSTIMER,
 +              .pfn            = __phys_to_pfn(EXYNOS5_PA_SYSTIMER),
 +              .length         = SZ_4K,
 +              .type           = MT_DEVICE,
 +      }, {
 +              .virtual        = (unsigned long)S5P_VA_SYSRAM,
 +              .pfn            = __phys_to_pfn(EXYNOS5_PA_SYSRAM),
 +              .length         = SZ_4K,
 +              .type           = MT_DEVICE,
 +      }, {
 +              .virtual        = (unsigned long)S5P_VA_CMU,
 +              .pfn            = __phys_to_pfn(EXYNOS5_PA_CMU),
 +              .length         = 144 * SZ_1K,
 +              .type           = MT_DEVICE,
 +      }, {
 +              .virtual        = (unsigned long)S5P_VA_PMU,
 +              .pfn            = __phys_to_pfn(EXYNOS5_PA_PMU),
 +              .length         = SZ_64K,
 +              .type           = MT_DEVICE,
 +      }, {
 +              .virtual        = (unsigned long)S5P_VA_COMBINER_BASE,
 +              .pfn            = __phys_to_pfn(EXYNOS5_PA_COMBINER),
 +              .length         = SZ_4K,
 +              .type           = MT_DEVICE,
 +      }, {
 +              .virtual        = (unsigned long)S3C_VA_UART,
 +              .pfn            = __phys_to_pfn(EXYNOS5_PA_UART),
 +              .length         = SZ_512K,
 +              .type           = MT_DEVICE,
 +      }, {
 +              .virtual        = (unsigned long)S5P_VA_GIC_CPU,
 +              .pfn            = __phys_to_pfn(EXYNOS5_PA_GIC_CPU),
 +              .length         = SZ_64K,
 +              .type           = MT_DEVICE,
 +      }, {
 +              .virtual        = (unsigned long)S5P_VA_GIC_DIST,
 +              .pfn            = __phys_to_pfn(EXYNOS5_PA_GIC_DIST),
 +              .length         = SZ_64K,
 +              .type           = MT_DEVICE,
 +      },
 +};
  
  void exynos4_restart(char mode, const char *cmd)
  {
        __raw_writel(0x1, S5P_SWRESET);
  }
  
 +void exynos5_restart(char mode, const char *cmd)
 +{
 +      __raw_writel(0x1, EXYNOS_SWRESET);
 +}
 +
  /*
   * exynos_map_io
   *
@@@ -310,7 -242,7 +319,7 @@@ void __init exynos_init_io(struct map_d
        s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
  }
  
 -void __init exynos4_map_io(void)
 +static void __init exynos4_map_io(void)
  {
        iotable_init(exynos4_iodesc, ARRAY_SIZE(exynos4_iodesc));
  
        s5p_hdmi_setname("exynos4-hdmi");
  }
  
 -void __init exynos4_init_clocks(int xtal)
 +static void __init exynos5_map_io(void)
 +{
 +      iotable_init(exynos5_iodesc, ARRAY_SIZE(exynos5_iodesc));
 +
 +      s3c_device_i2c0.resource[0].start = EXYNOS5_PA_IIC(0);
 +      s3c_device_i2c0.resource[0].end   = EXYNOS5_PA_IIC(0) + SZ_4K - 1;
 +      s3c_device_i2c0.resource[1].start = EXYNOS5_IRQ_IIC;
 +      s3c_device_i2c0.resource[1].end   = EXYNOS5_IRQ_IIC;
 +
 +      /* The I2C bus controllers are directly compatible with s3c2440 */
 +      s3c_i2c0_setname("s3c2440-i2c");
 +      s3c_i2c1_setname("s3c2440-i2c");
 +      s3c_i2c2_setname("s3c2440-i2c");
 +}
 +
 +static void __init exynos4_init_clocks(int xtal)
  {
        printk(KERN_DEBUG "%s: initializing clocks\n", __func__);
  
        exynos4_setup_clocks();
  }
  
 +static void __init exynos5_init_clocks(int xtal)
 +{
 +      printk(KERN_DEBUG "%s: initializing clocks\n", __func__);
 +
 +      s3c24xx_register_baseclocks(xtal);
 +      s5p_register_clocks(xtal);
 +
 +      exynos5_register_clocks();
 +      exynos5_setup_clocks();
 +}
 +
  #define COMBINER_ENABLE_SET   0x0
  #define COMBINER_ENABLE_CLEAR 0x4
  #define COMBINER_INT_STATUS   0xC
@@@ -456,14 -362,7 +465,14 @@@ static struct irq_chip combiner_chip = 
  
  static void __init combiner_cascade_irq(unsigned int combiner_nr, unsigned int irq)
  {
 -      if (combiner_nr >= MAX_COMBINER_NR)
 +      unsigned int max_nr;
 +
 +      if (soc_is_exynos5250())
 +              max_nr = EXYNOS5_MAX_COMBINER_NR;
 +      else
 +              max_nr = EXYNOS4_MAX_COMBINER_NR;
 +
 +      if (combiner_nr >= max_nr)
                BUG();
        if (irq_set_handler_data(irq, &combiner_data[combiner_nr]) != 0)
                BUG();
@@@ -474,14 -373,8 +483,14 @@@ static void __init combiner_init(unsign
                          unsigned int irq_start)
  {
        unsigned int i;
 +      unsigned int max_nr;
  
 -      if (combiner_nr >= MAX_COMBINER_NR)
 +      if (soc_is_exynos5250())
 +              max_nr = EXYNOS5_MAX_COMBINER_NR;
 +      else
 +              max_nr = EXYNOS4_MAX_COMBINER_NR;
 +
 +      if (combiner_nr >= max_nr)
                BUG();
  
        combiner_data[combiner_nr].base = base;
@@@ -524,7 -417,7 +533,7 @@@ void __init exynos4_init_irq(void
                of_irq_init(exynos4_dt_irq_match);
  #endif
  
 -      for (irq = 0; irq < MAX_COMBINER_NR; irq++) {
 +      for (irq = 0; irq < EXYNOS4_MAX_COMBINER_NR; irq++) {
  
                combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq),
                                COMBINER_IRQ(irq, 0));
        s5p_init_irq(NULL, 0);
  }
  
 +void __init exynos5_init_irq(void)
 +{
 +      int irq;
 +
 +      gic_init(0, IRQ_PPI(0), S5P_VA_GIC_DIST, S5P_VA_GIC_CPU);
 +
 +      for (irq = 0; irq < EXYNOS5_MAX_COMBINER_NR; irq++) {
 +              combiner_init(irq, (void __iomem *)S5P_VA_COMBINER(irq),
 +                              COMBINER_IRQ(irq, 0));
 +              combiner_cascade_irq(irq, IRQ_SPI(irq));
 +      }
 +
 +      /*
 +       * The parameters of s5p_init_irq() are for VIC init.
 +       * Theses parameters should be NULL and 0 because EXYNOS4
 +       * uses GIC instead of VIC.
 +       */
 +      s5p_init_irq(NULL, 0);
 +}
 +
  struct bus_type exynos4_subsys = {
        .name           = "exynos4-core",
        .dev_name       = "exynos4-core",
  };
  
 +struct bus_type exynos5_subsys = {
 +      .name           = "exynos5-core",
 +      .dev_name       = "exynos5-core",
 +};
 +
  static struct device exynos4_dev = {
        .bus    = &exynos4_subsys,
  };
  
 -static int __init exynos4_core_init(void)
 +static struct device exynos5_dev = {
 +      .bus    = &exynos5_subsys,
 +};
 +
 +static int __init exynos_core_init(void)
  {
 -      return subsys_system_register(&exynos4_subsys, NULL);
 +      if (soc_is_exynos5250())
 +              return subsys_system_register(&exynos5_subsys, NULL);
 +      else
 +              return subsys_system_register(&exynos4_subsys, NULL);
  }
 -core_initcall(exynos4_core_init);
 +core_initcall(exynos_core_init);
  
  #ifdef CONFIG_CACHE_L2X0
  static int __init exynos4_l2x0_cache_init(void)
  {
-       /* TAG, Data Latency Control: 2cycle */
-       __raw_writel(0x110, S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL);
 +      if (soc_is_exynos5250())
 +              return 0;
 +
+       int ret;
+       ret = l2x0_of_init(L2_AUX_VAL, L2_AUX_MASK);
+       if (!ret) {
+               l2x0_regs_phys = virt_to_phys(&l2x0_saved_regs);
+               clean_dcache_area(&l2x0_regs_phys, sizeof(unsigned long));
+               return 0;
+       }
+       if (!(__raw_readl(S5P_VA_L2CC + L2X0_CTRL) & 0x1)) {
+               l2x0_saved_regs.phy_base = EXYNOS4_PA_L2CC;
+               /* TAG, Data Latency Control: 2 cycles */
+               l2x0_saved_regs.tag_latency = 0x110;
  
-       if (soc_is_exynos4210())
-               __raw_writel(0x110, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL);
-       else if (soc_is_exynos4212() || soc_is_exynos4412())
-               __raw_writel(0x120, S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL);
+               if (soc_is_exynos4212() || soc_is_exynos4412())
+                       l2x0_saved_regs.data_latency = 0x120;
+               else
+                       l2x0_saved_regs.data_latency = 0x110;
+               l2x0_saved_regs.prefetch_ctrl = 0x30000007;
+               l2x0_saved_regs.pwr_ctrl =
+                       (L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN);
  
-       /* L2X0 Prefetch Control */
-       __raw_writel(0x30000007, S5P_VA_L2CC + L2X0_PREFETCH_CTRL);
+               l2x0_regs_phys = virt_to_phys(&l2x0_saved_regs);
  
-       /* L2X0 Power Control */
-       __raw_writel(L2X0_DYNAMIC_CLK_GATING_EN | L2X0_STNDBY_MODE_EN,
-                    S5P_VA_L2CC + L2X0_POWER_CTRL);
+               __raw_writel(l2x0_saved_regs.tag_latency,
+                               S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL);
+               __raw_writel(l2x0_saved_regs.data_latency,
+                               S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL);
  
-       l2x0_init(S5P_VA_L2CC, 0x7C470001, 0xC200ffff);
+               /* L2X0 Prefetch Control */
+               __raw_writel(l2x0_saved_regs.prefetch_ctrl,
+                               S5P_VA_L2CC + L2X0_PREFETCH_CTRL);
+               /* L2X0 Power Control */
+               __raw_writel(l2x0_saved_regs.pwr_ctrl,
+                               S5P_VA_L2CC + L2X0_POWER_CTRL);
+               clean_dcache_area(&l2x0_regs_phys, sizeof(unsigned long));
+               clean_dcache_area(&l2x0_saved_regs, sizeof(struct l2x0_regs));
+       }
  
+       l2x0_init(S5P_VA_L2CC, L2_AUX_VAL, L2_AUX_MASK);
        return 0;
  }
 -
  early_initcall(exynos4_l2x0_cache_init);
  #endif
  
 -int __init exynos_init(void)
 +static int __init exynos5_l2_cache_init(void)
  {
 -      printk(KERN_INFO "EXYNOS: Initializing architecture\n");
 +      unsigned int val;
  
 -      /* set idle function */
 -      pm_idle = exynos_idle;
 +      if (!soc_is_exynos5250())
 +              return 0;
 +
 +      asm volatile("mrc p15, 0, %0, c1, c0, 0\n"
 +                   "bic %0, %0, #(1 << 2)\n"  /* cache disable */
 +                   "mcr p15, 0, %0, c1, c0, 0\n"
 +                   "mrc p15, 1, %0, c9, c0, 2\n"
 +                   : "=r"(val));
 +
 +      val |= (1 << 9) | (1 << 5) | (2 << 6) | (2 << 0);
  
 -      return device_register(&exynos4_dev);
 +      asm volatile("mcr p15, 1, %0, c9, c0, 2\n" : : "r"(val));
 +      asm volatile("mrc p15, 0, %0, c1, c0, 0\n"
 +                   "orr %0, %0, #(1 << 2)\n"  /* cache enable */
 +                   "mcr p15, 0, %0, c1, c0, 0\n"
 +                   : : "r"(val));
 +
 +      return 0;
 +}
 +early_initcall(exynos5_l2_cache_init);
 +
 +static int __init exynos_init(void)
 +{
 +      printk(KERN_INFO "EXYNOS: Initializing architecture\n");
 +
 +      if (soc_is_exynos5250())
 +              return device_register(&exynos5_dev);
 +      else
 +              return device_register(&exynos4_dev);
  }
  
  /* uart registration process */
  
 -void __init exynos4_init_uarts(struct s3c2410_uartcfg *cfg, int no)
 +static void __init exynos_init_uarts(struct s3c2410_uartcfg *cfg, int no)
  {
        struct s3c2410_uartcfg *tcfg = cfg;
        u32 ucnt;
        for (ucnt = 0; ucnt < no; ucnt++, tcfg++)
                tcfg->has_fracval = 1;
  
 -      s3c24xx_init_uartdevs("exynos4210-uart", s5p_uart_resources, cfg, no);
 +      if (soc_is_exynos5250())
 +              s3c24xx_init_uartdevs("exynos4210-uart", exynos5_uart_resources, cfg, no);
 +      else
 +              s3c24xx_init_uartdevs("exynos4210-uart", exynos4_uart_resources, cfg, no);
  }
  
 +static void __iomem *exynos_eint_base;
 +
  static DEFINE_SPINLOCK(eint_lock);
  
  static unsigned int eint0_15_data[16];
  
 -static unsigned int exynos4_get_irq_nr(unsigned int number)
 +static inline int exynos4_irq_to_gpio(unsigned int irq)
  {
 -      u32 ret = 0;
 +      if (irq < IRQ_EINT(0))
 +              return -EINVAL;
  
 -      switch (number) {
 -      case 0 ... 3:
 -              ret = (number + IRQ_EINT0);
 -              break;
 -      case 4 ... 7:
 -              ret = (number + (IRQ_EINT4 - 4));
 -              break;
 -      case 8 ... 15:
 -              ret = (number + (IRQ_EINT8 - 8));
 -              break;
 -      default:
 -              printk(KERN_ERR "number available : %d\n", number);
 -      }
 +      irq -= IRQ_EINT(0);
 +      if (irq < 8)
 +              return EXYNOS4_GPX0(irq);
 +
 +      irq -= 8;
 +      if (irq < 8)
 +              return EXYNOS4_GPX1(irq);
 +
 +      irq -= 8;
 +      if (irq < 8)
 +              return EXYNOS4_GPX2(irq);
 +
 +      irq -= 8;
 +      if (irq < 8)
 +              return EXYNOS4_GPX3(irq);
 +
 +      return -EINVAL;
 +}
 +
 +static inline int exynos5_irq_to_gpio(unsigned int irq)
 +{
 +      if (irq < IRQ_EINT(0))
 +              return -EINVAL;
 +
 +      irq -= IRQ_EINT(0);
 +      if (irq < 8)
 +              return EXYNOS5_GPX0(irq);
 +
 +      irq -= 8;
 +      if (irq < 8)
 +              return EXYNOS5_GPX1(irq);
 +
 +      irq -= 8;
 +      if (irq < 8)
 +              return EXYNOS5_GPX2(irq);
  
 -      return ret;
 +      irq -= 8;
 +      if (irq < 8)
 +              return EXYNOS5_GPX3(irq);
 +
 +      return -EINVAL;
  }
  
 -static inline void exynos4_irq_eint_mask(struct irq_data *data)
 +static unsigned int exynos4_eint0_15_src_int[16] = {
 +      EXYNOS4_IRQ_EINT0,
 +      EXYNOS4_IRQ_EINT1,
 +      EXYNOS4_IRQ_EINT2,
 +      EXYNOS4_IRQ_EINT3,
 +      EXYNOS4_IRQ_EINT4,
 +      EXYNOS4_IRQ_EINT5,
 +      EXYNOS4_IRQ_EINT6,
 +      EXYNOS4_IRQ_EINT7,
 +      EXYNOS4_IRQ_EINT8,
 +      EXYNOS4_IRQ_EINT9,
 +      EXYNOS4_IRQ_EINT10,
 +      EXYNOS4_IRQ_EINT11,
 +      EXYNOS4_IRQ_EINT12,
 +      EXYNOS4_IRQ_EINT13,
 +      EXYNOS4_IRQ_EINT14,
 +      EXYNOS4_IRQ_EINT15,
 +};
 +
 +static unsigned int exynos5_eint0_15_src_int[16] = {
 +      EXYNOS5_IRQ_EINT0,
 +      EXYNOS5_IRQ_EINT1,
 +      EXYNOS5_IRQ_EINT2,
 +      EXYNOS5_IRQ_EINT3,
 +      EXYNOS5_IRQ_EINT4,
 +      EXYNOS5_IRQ_EINT5,
 +      EXYNOS5_IRQ_EINT6,
 +      EXYNOS5_IRQ_EINT7,
 +      EXYNOS5_IRQ_EINT8,
 +      EXYNOS5_IRQ_EINT9,
 +      EXYNOS5_IRQ_EINT10,
 +      EXYNOS5_IRQ_EINT11,
 +      EXYNOS5_IRQ_EINT12,
 +      EXYNOS5_IRQ_EINT13,
 +      EXYNOS5_IRQ_EINT14,
 +      EXYNOS5_IRQ_EINT15,
 +};
 +static inline void exynos_irq_eint_mask(struct irq_data *data)
  {
        u32 mask;
  
        spin_lock(&eint_lock);
 -      mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(data->irq)));
 -      mask |= eint_irq_to_bit(data->irq);
 -      __raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(data->irq)));
 +      mask = __raw_readl(EINT_MASK(exynos_eint_base, data->irq));
 +      mask |= EINT_OFFSET_BIT(data->irq);
 +      __raw_writel(mask, EINT_MASK(exynos_eint_base, data->irq));
        spin_unlock(&eint_lock);
  }
  
 -static void exynos4_irq_eint_unmask(struct irq_data *data)
 +static void exynos_irq_eint_unmask(struct irq_data *data)
  {
        u32 mask;
  
        spin_lock(&eint_lock);
 -      mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(data->irq)));
 -      mask &= ~(eint_irq_to_bit(data->irq));
 -      __raw_writel(mask, S5P_EINT_MASK(EINT_REG_NR(data->irq)));
 +      mask = __raw_readl(EINT_MASK(exynos_eint_base, data->irq));
 +      mask &= ~(EINT_OFFSET_BIT(data->irq));
 +      __raw_writel(mask, EINT_MASK(exynos_eint_base, data->irq));
        spin_unlock(&eint_lock);
  }
  
 -static inline void exynos4_irq_eint_ack(struct irq_data *data)
 +static inline void exynos_irq_eint_ack(struct irq_data *data)
  {
 -      __raw_writel(eint_irq_to_bit(data->irq),
 -                   S5P_EINT_PEND(EINT_REG_NR(data->irq)));
 +      __raw_writel(EINT_OFFSET_BIT(data->irq),
 +                   EINT_PEND(exynos_eint_base, data->irq));
  }
  
 -static void exynos4_irq_eint_maskack(struct irq_data *data)
 +static void exynos_irq_eint_maskack(struct irq_data *data)
  {
 -      exynos4_irq_eint_mask(data);
 -      exynos4_irq_eint_ack(data);
 +      exynos_irq_eint_mask(data);
 +      exynos_irq_eint_ack(data);
  }
  
 -static int exynos4_irq_eint_set_type(struct irq_data *data, unsigned int type)
 +static int exynos_irq_eint_set_type(struct irq_data *data, unsigned int type)
  {
        int offs = EINT_OFFSET(data->irq);
        int shift;
        mask = 0x7 << shift;
  
        spin_lock(&eint_lock);
 -      ctrl = __raw_readl(S5P_EINT_CON(EINT_REG_NR(data->irq)));
 +      ctrl = __raw_readl(EINT_CON(exynos_eint_base, data->irq));
        ctrl &= ~mask;
        ctrl |= newvalue << shift;
 -      __raw_writel(ctrl, S5P_EINT_CON(EINT_REG_NR(data->irq)));
 +      __raw_writel(ctrl, EINT_CON(exynos_eint_base, data->irq));
        spin_unlock(&eint_lock);
  
 -      switch (offs) {
 -      case 0 ... 7:
 -              s3c_gpio_cfgpin(EINT_GPIO_0(offs & 0x7), EINT_MODE);
 -              break;
 -      case 8 ... 15:
 -              s3c_gpio_cfgpin(EINT_GPIO_1(offs & 0x7), EINT_MODE);
 -              break;
 -      case 16 ... 23:
 -              s3c_gpio_cfgpin(EINT_GPIO_2(offs & 0x7), EINT_MODE);
 -              break;
 -      case 24 ... 31:
 -              s3c_gpio_cfgpin(EINT_GPIO_3(offs & 0x7), EINT_MODE);
 -              break;
 -      default:
 -              printk(KERN_ERR "No such irq number %d", offs);
 -      }
 +      if (soc_is_exynos5250())
 +              s3c_gpio_cfgpin(exynos5_irq_to_gpio(data->irq), S3C_GPIO_SFN(0xf));
 +      else
 +              s3c_gpio_cfgpin(exynos4_irq_to_gpio(data->irq), S3C_GPIO_SFN(0xf));
  
        return 0;
  }
  
 -static struct irq_chip exynos4_irq_eint = {
 -      .name           = "exynos4-eint",
 -      .irq_mask       = exynos4_irq_eint_mask,
 -      .irq_unmask     = exynos4_irq_eint_unmask,
 -      .irq_mask_ack   = exynos4_irq_eint_maskack,
 -      .irq_ack        = exynos4_irq_eint_ack,
 -      .irq_set_type   = exynos4_irq_eint_set_type,
 +static struct irq_chip exynos_irq_eint = {
 +      .name           = "exynos-eint",
 +      .irq_mask       = exynos_irq_eint_mask,
 +      .irq_unmask     = exynos_irq_eint_unmask,
 +      .irq_mask_ack   = exynos_irq_eint_maskack,
 +      .irq_ack        = exynos_irq_eint_ack,
 +      .irq_set_type   = exynos_irq_eint_set_type,
  #ifdef CONFIG_PM
        .irq_set_wake   = s3c_irqext_wake,
  #endif
   *
   * Each EINT pend/mask registers handle eight of them.
   */
 -static inline void exynos4_irq_demux_eint(unsigned int start)
 +static inline void exynos_irq_demux_eint(unsigned int start)
  {
        unsigned int irq;
  
 -      u32 status = __raw_readl(S5P_EINT_PEND(EINT_REG_NR(start)));
 -      u32 mask = __raw_readl(S5P_EINT_MASK(EINT_REG_NR(start)));
 +      u32 status = __raw_readl(EINT_PEND(exynos_eint_base, start));
 +      u32 mask = __raw_readl(EINT_MASK(exynos_eint_base, start));
  
        status &= ~mask;
        status &= 0xff;
        }
  }
  
 -static void exynos4_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc)
 +static void exynos_irq_demux_eint16_31(unsigned int irq, struct irq_desc *desc)
  {
        struct irq_chip *chip = irq_get_chip(irq);
        chained_irq_enter(chip, desc);
 -      exynos4_irq_demux_eint(IRQ_EINT(16));
 -      exynos4_irq_demux_eint(IRQ_EINT(24));
 +      exynos_irq_demux_eint(IRQ_EINT(16));
 +      exynos_irq_demux_eint(IRQ_EINT(24));
        chained_irq_exit(chip, desc);
  }
  
 -static void exynos4_irq_eint0_15(unsigned int irq, struct irq_desc *desc)
 +static void exynos_irq_eint0_15(unsigned int irq, struct irq_desc *desc)
  {
        u32 *irq_data = irq_get_handler_data(irq);
        struct irq_chip *chip = irq_get_chip(irq);
        chained_irq_exit(chip, desc);
  }
  
 -int __init exynos4_init_irq_eint(void)
 +static int __init exynos_init_irq_eint(void)
  {
        int irq;
  
 +      if (soc_is_exynos5250())
 +              exynos_eint_base = ioremap(EXYNOS5_PA_GPIO1, SZ_4K);
 +      else
 +              exynos_eint_base = ioremap(EXYNOS4_PA_GPIO2, SZ_4K);
 +
 +      if (exynos_eint_base == NULL) {
 +              pr_err("unable to ioremap for EINT base address\n");
 +              return -ENOMEM;
 +      }
 +
        for (irq = 0 ; irq <= 31 ; irq++) {
 -              irq_set_chip_and_handler(IRQ_EINT(irq), &exynos4_irq_eint,
 +              irq_set_chip_and_handler(IRQ_EINT(irq), &exynos_irq_eint,
                                         handle_level_irq);
                set_irq_flags(IRQ_EINT(irq), IRQF_VALID);
        }
  
 -      irq_set_chained_handler(IRQ_EINT16_31, exynos4_irq_demux_eint16_31);
 +      irq_set_chained_handler(EXYNOS_IRQ_EINT16_31, exynos_irq_demux_eint16_31);
  
        for (irq = 0 ; irq <= 15 ; irq++) {
                eint0_15_data[irq] = IRQ_EINT(irq);
  
 -              irq_set_handler_data(exynos4_get_irq_nr(irq),
 -                                   &eint0_15_data[irq]);
 -              irq_set_chained_handler(exynos4_get_irq_nr(irq),
 -                                      exynos4_irq_eint0_15);
 +              if (soc_is_exynos5250()) {
 +                      irq_set_handler_data(exynos5_eint0_15_src_int[irq],
 +                                           &eint0_15_data[irq]);
 +                      irq_set_chained_handler(exynos5_eint0_15_src_int[irq],
 +                                              exynos_irq_eint0_15);
 +              } else {
 +                      irq_set_handler_data(exynos4_eint0_15_src_int[irq],
 +                                           &eint0_15_data[irq]);
 +                      irq_set_chained_handler(exynos4_eint0_15_src_int[irq],
 +                                              exynos_irq_eint0_15);
 +              }
        }
  
        return 0;
  }
 -arch_initcall(exynos4_init_irq_eint);
 +arch_initcall(exynos_init_irq_eint);
index bf90bb0ab2b808c1423ca360a6f17415c722159c,a8cd65fcc685d8e818c3665c1429ef91ebcda168..188d87d6ec41eacd65ef0300b13e008daa7f48b8
  
  #define EXYNOS4_PA_SYSRAM0            0x02025000
  #define EXYNOS4_PA_SYSRAM1            0x02020000
 +#define EXYNOS5_PA_SYSRAM             0x02020000
  
  #define EXYNOS4_PA_FIMC0              0x11800000
  #define EXYNOS4_PA_FIMC1              0x11810000
  #define EXYNOS4_PA_FIMC2              0x11820000
  #define EXYNOS4_PA_FIMC3              0x11830000
  
+ #define EXYNOS4_PA_JPEG                       0x11840000
+ #define EXYNOS4_PA_G2D                        0x12800000
  #define EXYNOS4_PA_I2S0                       0x03830000
  #define EXYNOS4_PA_I2S1                       0xE3100000
  #define EXYNOS4_PA_I2S2                       0xE2A00000
  #define EXYNOS4_PA_ONENAND            0x0C000000
  #define EXYNOS4_PA_ONENAND_DMA                0x0C600000
  
 -#define EXYNOS4_PA_CHIPID             0x10000000
 +#define EXYNOS_PA_CHIPID              0x10000000
  
  #define EXYNOS4_PA_SYSCON             0x10010000
 +#define EXYNOS5_PA_SYSCON             0x10050100
 +
  #define EXYNOS4_PA_PMU                        0x10020000
 +#define EXYNOS5_PA_PMU                        0x10040000
 +
  #define EXYNOS4_PA_CMU                        0x10030000
 +#define EXYNOS5_PA_CMU                        0x10010000
  
  #define EXYNOS4_PA_SYSTIMER           0x10050000
 +#define EXYNOS5_PA_SYSTIMER           0x101C0000
 +
  #define EXYNOS4_PA_WATCHDOG           0x10060000
 +#define EXYNOS5_PA_WATCHDOG           0x101D0000
 +
  #define EXYNOS4_PA_RTC                        0x10070000
  
  #define EXYNOS4_PA_KEYPAD             0x100A0000
  
  #define EXYNOS4_PA_DMC0                       0x10400000
+ #define EXYNOS4_PA_DMC1                       0x10410000
  
  #define EXYNOS4_PA_COMBINER           0x10440000
 +#define EXYNOS5_PA_COMBINER           0x10440000
  
  #define EXYNOS4_PA_GIC_CPU            0x10480000
  #define EXYNOS4_PA_GIC_DIST           0x10490000
 +#define EXYNOS5_PA_GIC_CPU            0x10480000
 +#define EXYNOS5_PA_GIC_DIST           0x10490000
  
  #define EXYNOS4_PA_COREPERI           0x10500000
  #define EXYNOS4_PA_TWD                        0x10500600
  #define EXYNOS4_PA_L2CC                       0x10502000
  
 -#define EXYNOS4_PA_MDMA                       0x10810000
 +#define EXYNOS4_PA_MDMA0              0x10810000
 +#define EXYNOS4_PA_MDMA1              0x12840000
  #define EXYNOS4_PA_PDMA0              0x12680000
  #define EXYNOS4_PA_PDMA1              0x12690000
  
  #define EXYNOS4_PA_SPI1                       0x13930000
  #define EXYNOS4_PA_SPI2                       0x13940000
  
 -
  #define EXYNOS4_PA_GPIO1              0x11400000
  #define EXYNOS4_PA_GPIO2              0x11000000
  #define EXYNOS4_PA_GPIO3              0x03860000
  #define EXYNOS4_PA_SATAPHY_CTRL               0x126B0000
  
  #define EXYNOS4_PA_SROMC              0x12570000
 +#define EXYNOS5_PA_SROMC              0x12250000
  
  #define EXYNOS4_PA_EHCI                       0x12580000
  #define EXYNOS4_PA_OHCI                       0x12590000
  #define EXYNOS4_PA_MFC                        0x13400000
  
  #define EXYNOS4_PA_UART                       0x13800000
 +#define EXYNOS5_PA_UART                       0x12C00000
  
  #define EXYNOS4_PA_VP                 0x12C00000
  #define EXYNOS4_PA_MIXER              0x12C10000
  #define EXYNOS4_PA_IIC_HDMIPHY                0x138E0000
  
  #define EXYNOS4_PA_IIC(x)             (0x13860000 + ((x) * 0x10000))
 +#define EXYNOS5_PA_IIC(x)             (0x12C60000 + ((x) * 0x10000))
  
  #define EXYNOS4_PA_ADC                        0x13910000
  #define EXYNOS4_PA_ADC1                       0x13911000
  #define EXYNOS4_PA_SPDIF              0x139B0000
  
  #define EXYNOS4_PA_TIMER              0x139D0000
 +#define EXYNOS5_PA_TIMER              0x12DD0000
  
  #define EXYNOS4_PA_SDRAM              0x40000000
 +#define EXYNOS5_PA_SDRAM              0x40000000
  
  /* Compatibiltiy Defines */
  
  #define S3C_PA_IIC7                   EXYNOS4_PA_IIC(7)
  #define S3C_PA_RTC                    EXYNOS4_PA_RTC
  #define S3C_PA_WDT                    EXYNOS4_PA_WATCHDOG
 -#define S3C_PA_UART                   EXYNOS4_PA_UART
  #define S3C_PA_SPI0                   EXYNOS4_PA_SPI0
  #define S3C_PA_SPI1                   EXYNOS4_PA_SPI1
  #define S3C_PA_SPI2                   EXYNOS4_PA_SPI2
  #define S5P_PA_FIMC1                  EXYNOS4_PA_FIMC1
  #define S5P_PA_FIMC2                  EXYNOS4_PA_FIMC2
  #define S5P_PA_FIMC3                  EXYNOS4_PA_FIMC3
+ #define S5P_PA_JPEG                   EXYNOS4_PA_JPEG
+ #define S5P_PA_G2D                    EXYNOS4_PA_G2D
  #define S5P_PA_FIMD0                  EXYNOS4_PA_FIMD0
  #define S5P_PA_HDMI                   EXYNOS4_PA_HDMI
  #define S5P_PA_IIC_HDMIPHY            EXYNOS4_PA_IIC_HDMIPHY
  
  /* Compatibility UART */
  
 -#define S3C_VA_UARTx(x)                       (S3C_VA_UART + ((x) * S3C_UART_OFFSET))
 +#define EXYNOS4_PA_UART0              0x13800000
 +#define EXYNOS4_PA_UART1              0x13810000
 +#define EXYNOS4_PA_UART2              0x13820000
 +#define EXYNOS4_PA_UART3              0x13830000
 +#define EXYNOS4_SZ_UART                       SZ_256
  
 -#define S5P_PA_UART(x)                        (EXYNOS4_PA_UART + ((x) * S3C_UART_OFFSET))
 -#define S5P_PA_UART0                  S5P_PA_UART(0)
 -#define S5P_PA_UART1                  S5P_PA_UART(1)
 -#define S5P_PA_UART2                  S5P_PA_UART(2)
 -#define S5P_PA_UART3                  S5P_PA_UART(3)
 -#define S5P_PA_UART4                  S5P_PA_UART(4)
 +#define EXYNOS5_PA_UART0              0x12C00000
 +#define EXYNOS5_PA_UART1              0x12C10000
 +#define EXYNOS5_PA_UART2              0x12C20000
 +#define EXYNOS5_PA_UART3              0x12C30000
 +#define EXYNOS5_SZ_UART                       SZ_256
  
 -#define S5P_SZ_UART                   SZ_256
 +#define S3C_VA_UARTx(x)                       (S3C_VA_UART + ((x) * S3C_UART_OFFSET))
  
  #endif /* __ASM_ARCH_MAP_H */
index 1016515dc9a83a4ed444eb7acf09dd91f290936c,3e894ba25b0167a2268001ee4fdabbf0c0bbffed..cae3e2dae2e2a81405fab0fd3260de0b71ebccb1
  #include <mach/regs-mct.h>
  #include <asm/mach/time.h>
  
+ #define TICK_BASE_CNT 1
  enum {
        MCT_INT_SPI,
        MCT_INT_PPI
  };
  
- static unsigned long clk_cnt_per_tick;
  static unsigned long clk_rate;
  static unsigned int mct_int_type;
  
@@@ -205,11 -206,14 +206,14 @@@ static int exynos4_comp_set_next_event(
  static void exynos4_comp_set_mode(enum clock_event_mode mode,
                                  struct clock_event_device *evt)
  {
+       unsigned long cycles_per_jiffy;
        exynos4_mct_comp0_stop();
  
        switch (mode) {
        case CLOCK_EVT_MODE_PERIODIC:
-               exynos4_mct_comp0_start(mode, clk_cnt_per_tick);
+               cycles_per_jiffy =
+                       (((unsigned long long) NSEC_PER_SEC / HZ * evt->mult) >> evt->shift);
+               exynos4_mct_comp0_start(mode, cycles_per_jiffy);
                break;
  
        case CLOCK_EVT_MODE_ONESHOT:
@@@ -248,9 -252,7 +252,7 @@@ static struct irqaction mct_comp_event_
  
  static void exynos4_clockevent_init(void)
  {
-       clk_cnt_per_tick = clk_rate / 2 / HZ;
-       clockevents_calc_mult_shift(&mct_comp_device, clk_rate / 2, 5);
+       clockevents_calc_mult_shift(&mct_comp_device, clk_rate, 5);
        mct_comp_device.max_delta_ns =
                clockevent_delta2ns(0xffffffff, &mct_comp_device);
        mct_comp_device.min_delta_ns =
        mct_comp_device.cpumask = cpumask_of(0);
        clockevents_register_device(&mct_comp_device);
  
 -      setup_irq(IRQ_MCT_G0, &mct_comp_event_irq);
 +      if (soc_is_exynos5250())
 +              setup_irq(EXYNOS5_IRQ_MCT_G0, &mct_comp_event_irq);
 +      else
 +              setup_irq(EXYNOS4_IRQ_MCT_G0, &mct_comp_event_irq);
  }
  
  #ifdef CONFIG_LOCAL_TIMERS
@@@ -317,12 -316,15 +319,15 @@@ static inline void exynos4_tick_set_mod
                                         struct clock_event_device *evt)
  {
        struct mct_clock_event_device *mevt = this_cpu_ptr(&percpu_mct_tick);
+       unsigned long cycles_per_jiffy;
  
        exynos4_mct_tick_stop(mevt);
  
        switch (mode) {
        case CLOCK_EVT_MODE_PERIODIC:
-               exynos4_mct_tick_start(clk_cnt_per_tick, mevt);
+               cycles_per_jiffy =
+                       (((unsigned long long) NSEC_PER_SEC / HZ * evt->mult) >> evt->shift);
+               exynos4_mct_tick_start(cycles_per_jiffy, mevt);
                break;
  
        case CLOCK_EVT_MODE_ONESHOT:
@@@ -396,7 -398,7 +401,7 @@@ static void exynos4_mct_tick_init(struc
        evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
        evt->rating = 450;
  
-       clockevents_calc_mult_shift(evt, clk_rate / 2, 5);
+       clockevents_calc_mult_shift(evt, clk_rate / (TICK_BASE_CNT + 1), 5);
        evt->max_delta_ns =
                clockevent_delta2ns(0x7fffffff, evt);
        evt->min_delta_ns =
  
        clockevents_register_device(evt);
  
-       exynos4_mct_write(0x1, mevt->base + MCT_L_TCNTB_OFFSET);
+       exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET);
  
        if (mct_int_type == MCT_INT_SPI) {
                if (cpu == 0) {
                        mct_tick0_event_irq.dev_id = mevt;
 -                      evt->irq = IRQ_MCT_L0;
 -                      setup_irq(IRQ_MCT_L0, &mct_tick0_event_irq);
 +                      evt->irq = EXYNOS4_IRQ_MCT_L0;
 +                      setup_irq(EXYNOS4_IRQ_MCT_L0, &mct_tick0_event_irq);
                } else {
                        mct_tick1_event_irq.dev_id = mevt;
 -                      evt->irq = IRQ_MCT_L1;
 -                      setup_irq(IRQ_MCT_L1, &mct_tick1_event_irq);
 -                      irq_set_affinity(IRQ_MCT_L1, cpumask_of(1));
 +                      evt->irq = EXYNOS4_IRQ_MCT_L1;
 +                      setup_irq(EXYNOS4_IRQ_MCT_L1, &mct_tick1_event_irq);
 +                      irq_set_affinity(EXYNOS4_IRQ_MCT_L1, cpumask_of(1));
                }
        } else {
 -              enable_percpu_irq(IRQ_MCT_LOCALTIMER, 0);
 +              enable_percpu_irq(EXYNOS_IRQ_MCT_LOCALTIMER, 0);
        }
  }
  
@@@ -440,7 -442,7 +445,7 @@@ void local_timer_stop(struct clock_even
                else
                        remove_irq(evt->irq, &mct_tick1_event_irq);
        else
 -              disable_percpu_irq(IRQ_MCT_LOCALTIMER);
 +              disable_percpu_irq(EXYNOS_IRQ_MCT_LOCALTIMER);
  }
  #endif /* CONFIG_LOCAL_TIMERS */
  
@@@ -455,11 -457,11 +460,11 @@@ static void __init exynos4_timer_resour
        if (mct_int_type == MCT_INT_PPI) {
                int err;
  
 -              err = request_percpu_irq(IRQ_MCT_LOCALTIMER,
 +              err = request_percpu_irq(EXYNOS_IRQ_MCT_LOCALTIMER,
                                         exynos4_mct_tick_isr, "MCT",
                                         &percpu_mct_tick);
                WARN(err, "MCT: can't request IRQ %d (%d)\n",
 -                   IRQ_MCT_LOCALTIMER, err);
 +                   EXYNOS_IRQ_MCT_LOCALTIMER, err);
        }
  #endif /* CONFIG_LOCAL_TIMERS */
  }
index f105bd2b6765ab66da94c8481f2ca1460f135976,2dd55a191abd04978e8f513a7c5183753e9dcb3b..428cfeb577248a5e812e7c954b8faa7584bbbe3a
  #include <mach/pmu.h>
  
  static struct sleep_save exynos4_set_clksrc[] = {
 -      { .reg = S5P_CLKSRC_MASK_TOP                    , .val = 0x00000001, },
 -      { .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_MAUDIO                 , .val = 0x00000001, },
 -      { .reg = S5P_CLKSRC_MASK_FSYS                   , .val = 0x01011111, },
 -      { .reg = S5P_CLKSRC_MASK_PERIL0                 , .val = 0x01111111, },
 -      { .reg = S5P_CLKSRC_MASK_PERIL1                 , .val = 0x01110111, },
 -      { .reg = S5P_CLKSRC_MASK_DMC                    , .val = 0x00010000, },
 +      { .reg = EXYNOS4_CLKSRC_MASK_TOP                , .val = 0x00000001, },
 +      { .reg = EXYNOS4_CLKSRC_MASK_CAM                , .val = 0x11111111, },
 +      { .reg = EXYNOS4_CLKSRC_MASK_TV                 , .val = 0x00000111, },
 +      { .reg = EXYNOS4_CLKSRC_MASK_LCD0               , .val = 0x00001111, },
 +      { .reg = EXYNOS4_CLKSRC_MASK_MAUDIO             , .val = 0x00000001, },
 +      { .reg = EXYNOS4_CLKSRC_MASK_FSYS               , .val = 0x01011111, },
 +      { .reg = EXYNOS4_CLKSRC_MASK_PERIL0             , .val = 0x01111111, },
 +      { .reg = EXYNOS4_CLKSRC_MASK_PERIL1             , .val = 0x01110111, },
 +      { .reg = EXYNOS4_CLKSRC_MASK_DMC                , .val = 0x00010000, },
  };
  
  static struct sleep_save exynos4210_set_clksrc[] = {
 -      { .reg = S5P_CLKSRC_MASK_LCD1                   , .val = 0x00001111, },
 +      { .reg = EXYNOS4210_CLKSRC_MASK_LCD1            , .val = 0x00001111, },
  };
  
  static struct sleep_save exynos4_epll_save[] = {
 -      SAVE_ITEM(S5P_EPLL_CON0),
 -      SAVE_ITEM(S5P_EPLL_CON1),
 +      SAVE_ITEM(EXYNOS4_EPLL_CON0),
 +      SAVE_ITEM(EXYNOS4_EPLL_CON1),
  };
  
  static struct sleep_save exynos4_vpll_save[] = {
 -      SAVE_ITEM(S5P_VPLL_CON0),
 -      SAVE_ITEM(S5P_VPLL_CON1),
 +      SAVE_ITEM(EXYNOS4_VPLL_CON0),
 +      SAVE_ITEM(EXYNOS4_VPLL_CON1),
  };
  
  static struct sleep_save exynos4_core_save[] = {
        SAVE_ITEM(S5P_SROM_BC3),
  };
  
- static struct sleep_save exynos4_l2cc_save[] = {
-       SAVE_ITEM(S5P_VA_L2CC + L2X0_TAG_LATENCY_CTRL),
-       SAVE_ITEM(S5P_VA_L2CC + L2X0_DATA_LATENCY_CTRL),
-       SAVE_ITEM(S5P_VA_L2CC + L2X0_PREFETCH_CTRL),
-       SAVE_ITEM(S5P_VA_L2CC + L2X0_POWER_CTRL),
-       SAVE_ITEM(S5P_VA_L2CC + L2X0_AUX_CTRL),
- };
  
  /* For Cortex-A9 Diagnostic and Power control register */
  static unsigned int save_arm_register[2];
@@@ -182,7 -175,6 +175,6 @@@ static void exynos4_pm_prepare(void
        u32 tmp;
  
        s3c_pm_do_save(exynos4_core_save, ARRAY_SIZE(exynos4_core_save));
-       s3c_pm_do_save(exynos4_l2cc_save, ARRAY_SIZE(exynos4_l2cc_save));
        s3c_pm_do_save(exynos4_epll_save, ARRAY_SIZE(exynos4_epll_save));
        s3c_pm_do_save(exynos4_vpll_save, ARRAY_SIZE(exynos4_vpll_save));
  
  
  }
  
 -static int exynos4_pm_add(struct device *dev)
 +static int exynos4_pm_add(struct device *dev, struct subsys_interface *sif)
  {
        pm_cpu_prep = exynos4_pm_prepare;
        pm_cpu_sleep = exynos4_cpu_suspend;
@@@ -239,7 -231,7 +231,7 @@@ static void exynos4_restore_pll(void
                locktime = (3000 / pll_in_rate) * p_div;
                lockcnt = locktime * 10000 / (10000 / pll_in_rate);
  
 -              __raw_writel(lockcnt, S5P_EPLL_LOCK);
 +              __raw_writel(lockcnt, EXYNOS4_EPLL_LOCK);
  
                s3c_pm_do_restore_core(exynos4_epll_save,
                                        ARRAY_SIZE(exynos4_epll_save));
                locktime = 750;
                lockcnt = locktime * 10000 / (10000 / pll_in_rate);
  
 -              __raw_writel(lockcnt, S5P_VPLL_LOCK);
 +              __raw_writel(lockcnt, EXYNOS4_VPLL_LOCK);
  
                s3c_pm_do_restore_core(exynos4_vpll_save,
                                        ARRAY_SIZE(exynos4_vpll_save));
  
        do {
                if (epll_wait) {
 -                      pll_con = __raw_readl(S5P_EPLL_CON0);
 -                      if (pll_con & (1 << S5P_EPLLCON0_LOCKED_SHIFT))
 +                      pll_con = __raw_readl(EXYNOS4_EPLL_CON0);
 +                      if (pll_con & (1 << EXYNOS4_EPLLCON0_LOCKED_SHIFT))
                                epll_wait = 0;
                }
  
                if (vpll_wait) {
 -                      pll_con = __raw_readl(S5P_VPLL_CON0);
 -                      if (pll_con & (1 << S5P_VPLLCON0_LOCKED_SHIFT))
 +                      pll_con = __raw_readl(EXYNOS4_VPLL_CON0);
 +                      if (pll_con & (1 << EXYNOS4_VPLLCON0_LOCKED_SHIFT))
                                vpll_wait = 0;
                }
        } while (epll_wait || vpll_wait);
@@@ -384,17 -376,8 +376,10 @@@ static void exynos4_pm_resume(void
  
        exynos4_restore_pll();
  
 +#ifdef CONFIG_SMP
        scu_enable(S5P_VA_SCU);
 +#endif
  
- #ifdef CONFIG_CACHE_L2X0
-       s3c_pm_do_restore_core(exynos4_l2cc_save, ARRAY_SIZE(exynos4_l2cc_save));
-       outer_inv_all();
-       /* enable L2X0*/
-       writel_relaxed(1, S5P_VA_L2CC + L2X0_CTRL);
- #endif
  early_wakeup:
        return;
  }
index aebbcc291b4e2ae35c5d8dee6035002fa038bd49,63f2c8aa119da745a107421f14091988bdd63af9..52f079a691cb4627b66eb6fa4bb7ad2d14327e9a
@@@ -138,11 -138,6 +138,11 @@@ static struct clk init_clocks_off[] = 
                .ctrlbit        = S3C_CLKCON_PCLK_TSADC,
        }, {
                .name           = "i2c",
 +#ifdef CONFIG_S3C_DEV_I2C1
 +              .devname        = "s3c2440-i2c.0",
 +#else
 +              .devname        = "s3c2440-i2c",
 +#endif
                .parent         = &clk_p,
                .enable         = s3c64xx_pclk_ctrl,
                .ctrlbit        = S3C_CLKCON_PCLK_IIC,
                .parent         = &clk_48m,
                .enable         = s3c64xx_sclk_ctrl,
                .ctrlbit        = S3C_CLKCON_SCLK_MMC2_48,
+       }, {
+               .name           = "ac97",
+               .parent         = &clk_p,
+               .ctrlbit        = S3C_CLKCON_PCLK_AC97,
+       }, {
+               .name           = "cfcon",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_IHOST,
        }, {
                .name           = "dma0",
                .parent         = &clk_h,
                .parent         = &clk_h,
                .enable         = s3c64xx_hclk_ctrl,
                .ctrlbit        = S3C_CLKCON_HCLK_DMA1,
+       }, {
+               .name           = "3dse",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_3DSE,
+       }, {
+               .name           = "hclk_secur",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_SECUR,
+       }, {
+               .name           = "sdma1",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_SDMA1,
+       }, {
+               .name           = "sdma0",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_SDMA0,
+       }, {
+               .name           = "hclk_jpeg",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_JPEG,
+       }, {
+               .name           = "camif",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_CAMIF,
+       }, {
+               .name           = "hclk_scaler",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_SCALER,
+       }, {
+               .name           = "2d",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_2D,
+       }, {
+               .name           = "tv",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_TV,
+       }, {
+               .name           = "post0",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_POST0,
+       }, {
+               .name           = "rot",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_ROT,
+       }, {
+               .name           = "hclk_mfc",
+               .parent         = &clk_h,
+               .enable         = s3c64xx_hclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_HCLK_MFC,
+       }, {
+               .name           = "pclk_mfc",
+               .parent         = &clk_p,
+               .enable         = s3c64xx_pclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_PCLK_MFC,
+       }, {
+               .name           = "dac27",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_DAC27,
+       }, {
+               .name           = "tv27",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_TV27,
+       }, {
+               .name           = "scaler27",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_SCALER27,
+       }, {
+               .name           = "sclk_scaler",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_SCALER,
+       }, {
+               .name           = "post0_27",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_POST0_27,
+       }, {
+               .name           = "secur",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_SECUR,
+       }, {
+               .name           = "sclk_mfc",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_MFC,
+       }, {
+               .name           = "cam",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_CAM,
+       }, {
+               .name           = "sclk_jpeg",
+               .enable         = s3c64xx_sclk_ctrl,
+               .ctrlbit        = S3C_CLKCON_SCLK_JPEG,
        },
  };
  
@@@ -289,16 -394,7 +399,7 @@@ static struct clk init_clocks[] = 
                .name           = "watchdog",
                .parent         = &clk_p,
                .ctrlbit        = S3C_CLKCON_PCLK_WDT,
-       }, {
-               .name           = "ac97",
-               .parent         = &clk_p,
-               .ctrlbit        = S3C_CLKCON_PCLK_AC97,
-       }, {
-               .name           = "cfcon",
-               .parent         = &clk_h,
-               .enable         = s3c64xx_hclk_ctrl,
-               .ctrlbit        = S3C_CLKCON_HCLK_IHOST,
-       }
+       },
  };
  
  static struct clk clk_hsmmc0 = {
index 88795ea2ecaafef9c7082276704cd6d76dce03fa,7a308699f81661fb3260fa8998753bd52916a38f..96bea32023046393e200d3a87987cd1557ce0f2a
@@@ -9,8 -9,8 +9,8 @@@ config PLAT_S5
        bool
        depends on (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210 || ARCH_EXYNOS)
        default y
 -      select ARM_VIC if !ARCH_EXYNOS4
 -      select ARM_GIC if ARCH_EXYNOS4
 +      select ARM_VIC if !ARCH_EXYNOS
 +      select ARM_GIC if ARCH_EXYNOS
        select GIC_NON_BANKED if ARCH_EXYNOS4
        select NO_IOPORT
        select ARCH_REQUIRE_GPIOLIB
@@@ -40,10 -40,6 +40,10 @@@ config S5P_HR
        help
          Use the High Resolution timer support
  
 +config S5P_DEV_UART
 +      def_bool y
 +      depends on (ARCH_S5P64X0 || ARCH_S5PC100 || ARCH_S5PV210)
 +
  config S5P_PM
        bool
        help
@@@ -84,6 -80,16 +84,16 @@@ config S5P_DEV_FIMC
        help
          Compile in platform device definitions for FIMC controller 3
  
+ config S5P_DEV_JPEG
+       bool
+       help
+         Compile in platform device definitions for JPEG codec
+ config S5P_DEV_G2D
+       bool
+       help
+         Compile in platform device definitions for G2D device
  config S5P_DEV_FIMD0
        bool
        help
index 98b864777a31e139eb8550db2818e1e785185abb,cd0b9da9bbc4de640a86d45fefd0955afe6f1f27..cd5aac08a2655e64f7439bd3d2d24dc509bd55f1
@@@ -57,6 -57,7 +57,7 @@@
  #include <plat/sdhci.h>
  #include <plat/ts.h>
  #include <plat/udc.h>
+ #include <plat/udc-hs.h>
  #include <plat/usb-control.h>
  #include <plat/usb-phy.h>
  #include <plat/regs-iic.h>
@@@ -267,6 -268,52 +268,52 @@@ struct platform_device s5p_device_fimc
  };
  #endif /* CONFIG_S5P_DEV_FIMC3 */
  
+ /* G2D */
+ #ifdef CONFIG_S5P_DEV_G2D
+ static struct resource s5p_g2d_resource[] = {
+       [0] = {
+               .start  = S5P_PA_G2D,
+               .end    = S5P_PA_G2D + SZ_4K - 1,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = IRQ_2D,
+               .end    = IRQ_2D,
+               .flags  = IORESOURCE_IRQ,
+       },
+ };
+ struct platform_device s5p_device_g2d = {
+       .name           = "s5p-g2d",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(s5p_g2d_resource),
+       .resource       = s5p_g2d_resource,
+       .dev            = {
+               .dma_mask               = &samsung_device_dma_mask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+ };
+ #endif /* CONFIG_S5P_DEV_G2D */
+ #ifdef CONFIG_S5P_DEV_JPEG
+ static struct resource s5p_jpeg_resource[] = {
+       [0] = DEFINE_RES_MEM(S5P_PA_JPEG, SZ_4K),
+       [1] = DEFINE_RES_IRQ(IRQ_JPEG),
+ };
+ struct platform_device s5p_device_jpeg = {
+       .name           = "s5p-jpeg",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(s5p_jpeg_resource),
+       .resource       = s5p_jpeg_resource,
+       .dev            = {
+               .dma_mask               = &samsung_device_dma_mask,
+               .coherent_dma_mask      = DMA_BIT_MASK(32),
+       },
+ };
+ #endif /*  CONFIG_S5P_DEV_JPEG */
  /* FIMD0 */
  
  #ifdef CONFIG_S5P_DEV_FIMD0
@@@ -468,10 -515,8 +515,10 @@@ void __init s3c_i2c0_set_platdata(struc
  {
        struct s3c2410_platform_i2c *npd;
  
 -      if (!pd)
 +      if (!pd) {
                pd = &default_i2c_data;
 +              pd->bus_num = 0;
 +      }
  
        npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c),
                               &s3c_device_i2c0);
@@@ -744,6 -789,17 +791,6 @@@ struct platform_device s3c_device_iis 
  };
  #endif /* CONFIG_PLAT_S3C24XX */
  
 -#ifdef CONFIG_CPU_S3C2440
 -struct platform_device s3c2412_device_iis = {
 -      .name           = "s3c2412-iis",
 -      .id             = -1,
 -      .dev            = {
 -              .dma_mask               = &samsung_device_dma_mask,
 -              .coherent_dma_mask      = DMA_BIT_MASK(32),
 -      }
 -};
 -#endif /* CONFIG_CPU_S3C2440 */
 -
  /* IDE CFCON */
  
  #ifdef CONFIG_SAMSUNG_DEV_IDE
@@@ -758,7 -814,7 +805,7 @@@ struct platform_device s3c_device_cfco
        .resource       = s3c_cfcon_resource,
  };
  
- void s3c_ide_set_platdata(struct s3c_ide_platdata *pdata)
+ void __init s3c_ide_set_platdata(struct s3c_ide_platdata *pdata)
  {
        s3c_set_platdata(pdata, sizeof(struct s3c_ide_platdata),
                         &s3c_device_cfcon);
@@@ -876,7 -932,7 +923,7 @@@ struct platform_device s5p_device_mfc_
  
  #ifdef CONFIG_S5P_DEV_CSIS0
  static struct resource s5p_mipi_csis0_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_MIPI_CSIS0, SZ_4K),
+       [0] = DEFINE_RES_MEM(S5P_PA_MIPI_CSIS0, SZ_16K),
        [1] = DEFINE_RES_IRQ(IRQ_MIPI_CSIS0),
  };
  
@@@ -890,7 -946,7 +937,7 @@@ struct platform_device s5p_device_mipi_
  
  #ifdef CONFIG_S5P_DEV_CSIS1
  static struct resource s5p_mipi_csis1_resource[] = {
-       [0] = DEFINE_RES_MEM(S5P_PA_MIPI_CSIS1, SZ_4K),
+       [0] = DEFINE_RES_MEM(S5P_PA_MIPI_CSIS1, SZ_16K),
        [1] = DEFINE_RES_IRQ(IRQ_MIPI_CSIS1),
  };
  
@@@ -1038,7 -1094,7 +1085,7 @@@ struct platform_device s3c64xx_device_o
        .resource       = s3c64xx_onenand1_resources,
  };
  
- void s3c64xx_onenand1_set_platdata(struct onenand_platform_data *pdata)
+ void __init s3c64xx_onenand1_set_platdata(struct onenand_platform_data *pdata)
  {
        s3c_set_platdata(pdata, sizeof(struct onenand_platform_data),
                         &s3c64xx_device_onenand1);
@@@ -1067,7 -1123,7 +1114,7 @@@ static struct resource s5p_pmu_resource
        DEFINE_RES_IRQ(IRQ_PMU)
  };
  
 -struct platform_device s5p_device_pmu = {
 +static struct platform_device s5p_device_pmu = {
        .name           = "arm-pmu",
        .id             = ARM_PMU_DEVICE_CPU,
        .num_resources  = ARRAY_SIZE(s5p_pmu_resource),
@@@ -1412,6 -1468,19 +1459,19 @@@ struct platform_device s3c_device_usb_h
                .coherent_dma_mask      = DMA_BIT_MASK(32),
        },
  };
+ void __init s3c_hsotg_set_platdata(struct s3c_hsotg_plat *pd)
+ {
+       struct s3c_hsotg_plat *npd;
+       npd = s3c_set_platdata(pd, sizeof(struct s3c_hsotg_plat),
+                       &s3c_device_usb_hsotg);
+       if (!npd->phy_init)
+               npd->phy_init = s5p_usb_phy_init;
+       if (!npd->phy_exit)
+               npd->phy_exit = s5p_usb_phy_exit;
+ }
  #endif /* CONFIG_S3C_DEV_USB_HSOTG */
  
  /* USB High Spped 2.0 Device (Gadget) */
index 32cc67e6be1330ef16cba3935543d82c47a7040b,5e7972de3ed58bf14dbbad3faf018bdc7120f7de..2155d4af62a30ce2d83c016e097690ba1b0ae316
@@@ -26,8 -26,6 +26,8 @@@ struct s3c24xx_uart_resources 
  extern struct s3c24xx_uart_resources s3c2410_uart_resources[];
  extern struct s3c24xx_uart_resources s3c64xx_uart_resources[];
  extern struct s3c24xx_uart_resources s5p_uart_resources[];
 +extern struct s3c24xx_uart_resources exynos4_uart_resources[];
 +extern struct s3c24xx_uart_resources exynos5_uart_resources[];
  
  extern struct platform_device *s3c24xx_uart_devs[];
  extern struct platform_device *s3c24xx_uart_src[];
@@@ -81,6 -79,8 +81,8 @@@ extern struct platform_device s5p_devic
  extern struct platform_device s5p_device_fimc2;
  extern struct platform_device s5p_device_fimc3;
  extern struct platform_device s5p_device_fimc_md;
+ extern struct platform_device s5p_device_jpeg;
+ extern struct platform_device s5p_device_g2d;
  extern struct platform_device s5p_device_fimd0;
  extern struct platform_device s5p_device_hdmi;
  extern struct platform_device s5p_device_i2c_hdmiphy;