Merge branch 'topic-0620/samsung-pm-3.4' into chromeos-exynos-3.4
authorOlof Johansson <olofj@chromium.org>
Wed, 20 Jun 2012 18:53:33 +0000 (11:53 -0700)
committerOlof Johansson <olofj@chromium.org>
Wed, 20 Jun 2012 18:53:33 +0000 (11:53 -0700)
* topic-0620/samsung-pm-3.4: (32 commits)
  CHROMIUM: exynos: pwm: Cosmetic tidy of PWM variable names
  CHROMIUM: exynos: Stop the PWM timer while configuring it.
  CHROMIUM: exynos: Ensure the manual update bit is off before setting it.
  exynos5: cpufreq: updated asv voltage table for cpufreq
  exynos: daisy: Add support for controlling the 32KHz peripheral clock
  trivial: regulator: Fix indentation in MAX77686
  ARM: exynos: Add thermal sensor driver platform data support
  thermal: exynos: Register the tmu sensor with the kernel thermal layer
  thermal: exynos5: Add exynos5 thermal sensor driver support
  hwmon: exynos4: Move thermal sensor driver to driver/thermal directory
  thermal: Add generic cpufreq cooling implementation
  ARM: EXYNOS5: Fix i2c suspend/resume issue
  ARM: Add missing clock definition
  ARM: EXYNOS: Add WDT reset register definitions
  regulator: Support for PMIC-MAX77686.
  mfd: Add suport for MAX77686.
  i2c: exynos: Add fix for i2c suspend/resume
  ARM: EXYNOS: Select ARM_CPU_SUSPEND & S5P_SLEEP if CPU_IDLE enabled
  UPSTREAM: cpufreq: exynos: Show list of available frequencies
  UPSTREAM: arm: exynos: Adapt to cpuidle core time keeping and irq enable
  ...

Conflicts:
arch/arm/mach-exynos/include/mach/regs-pmu.h

Change-Id: I1d871adc49be46453f87e6f4487a1711065fc2f1

1  2 
arch/arm/mach-exynos/Kconfig
arch/arm/mach-exynos/Makefile
arch/arm/mach-exynos/clock-exynos5.c
arch/arm/mach-exynos/common.c
arch/arm/mach-exynos/include/mach/regs-clock.h
arch/arm/mach-exynos/include/mach/regs-pmu.h
drivers/i2c/busses/i2c-s3c2410.c

@@@ -62,6 -62,10 +62,10 @@@ config SOC_EXYNOS525
        default y
        depends on ARCH_EXYNOS5
        select SAMSUNG_DMADEV
+       select ARM_CPU_SUSPEND if (PM || CPU_IDLE)
+       select S5P_PM if PM
+       select S5P_SLEEP if (PM || CPU_IDLE)
        help
          Enable EXYNOS5250 SoC support
  
@@@ -86,20 -90,10 +90,20 @@@ config EXYNOS4_SETUP_FIMD
        help
          Common setup code for FIMD0.
  
 -config EXYNOS4_DEV_SYSMMU
 +config EXYNOS4_SETUP_DP
        bool
        help
 -        Common setup code for SYSTEM MMU in EXYNOS4
 +        Common setup code for DP.
 +
 +config EXYNOS4_SETUP_FIMD
 +      bool
 +      help
 +        Common setup code for FIMD.
 +
 +config EXYNOS_DEV_SYSMMU
 +      bool
 +      help
 +        Common setup code for SYSTEM MMU in EXYNOS
  
  config EXYNOS4_DEV_DWMCI
        bool
@@@ -177,17 -171,6 +181,17 @@@ config EXYNOS4_SETUP_SP
        help
          Common setup code for SPI GPIO configurations.
  
 +config EXYNOS4_SETUP_MIPI_DSIM
 +      bool
 +      depends on FB_MIPI_DSIM
 +      help
 +        Common setup code for MIPI_DSIM to support mainline style fimd.
 +
 +config EXYNOS4_SETUP_TVOUT
 +      bool
 +      help
 +        Common setup code for TVOUT
 +
  # machine support
  
  if ARCH_EXYNOS4
@@@ -410,13 -393,6 +414,13 @@@ config MACH_EXYNOS5_D
        select SOC_EXYNOS5250
        select USE_OF
        select ARM_AMBA
 +      select EXYNOS_DEV_SYSMMU
 +      select EXYNOS4_SETUP_MIPI_DSIM
 +      select EXYNOS4_SETUP_DP
 +      select EXYNOS4_SETUP_USB_PHY
 +      select SAMSUNG_DEV_BACKLIGHT
 +      select SAMSUNG_DEV_PWM
 +      select EXYNOS4_SETUP_TVOUT
        help
          Machine support for Samsung Exynos4 machine with device tree enabled.
          Select this if a fdt blob is available for the EXYNOS4 SoC based board.
@@@ -22,7 -22,7 +22,7 @@@ obj-$(CONFIG_PM)              += pm.
  obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o
  obj-$(CONFIG_CPU_IDLE)                += cpuidle.o
  
- obj-$(CONFIG_ARCH_EXYNOS4)    += pmu.o
+ obj-$(CONFIG_ARCH_EXYNOS    += pmu.o
  
  obj-$(CONFIG_SMP)             += platsmp.o headsmp.o
  
@@@ -30,8 -30,6 +30,8 @@@ obj-$(CONFIG_EXYNOS4_MCT)     += mct.
  
  obj-$(CONFIG_HOTPLUG_CPU)     += hotplug.o
  
 +obj-$(CONFIG_ARCH_EXYNOS)     += clock-audss.o
 +
  # machine support
  
  obj-$(CONFIG_MACH_SMDKC210)           += mach-smdkv310.o
@@@ -52,7 -50,7 +52,7 @@@ obj-$(CONFIG_MACH_EXYNOS5_DT)         += mach-
  obj-y                                 += dev-uart.o
  obj-$(CONFIG_ARCH_EXYNOS4)            += dev-audio.o
  obj-$(CONFIG_EXYNOS4_DEV_AHCI)                += dev-ahci.o
 -obj-$(CONFIG_EXYNOS4_DEV_SYSMMU)      += dev-sysmmu.o
 +obj-$(CONFIG_EXYNOS_DEV_SYSMMU)               += dev-sysmmu.o
  obj-$(CONFIG_EXYNOS4_DEV_DWMCI)               += dev-dwmci.o
  obj-$(CONFIG_EXYNOS_DEV_DMA)          += dma.o
  obj-$(CONFIG_EXYNOS4_DEV_USB_OHCI)    += dev-ohci.o
@@@ -60,9 -58,6 +60,9 @@@
  obj-$(CONFIG_ARCH_EXYNOS)             += setup-i2c0.o
  obj-$(CONFIG_EXYNOS4_SETUP_FIMC)      += setup-fimc.o
  obj-$(CONFIG_EXYNOS4_SETUP_FIMD0)     += setup-fimd0.o
 +obj-$(CONFIG_EXYNOS4_SETUP_DP)         += setup-dp.o
 +obj-$(CONFIG_EXYNOS4_SETUP_FIMD)               += setup-fimd.o
 +obj-$(CONFIG_EXYNOS4_SETUP_MIPI_DSIM)          += setup-mipidsim.o
  obj-$(CONFIG_EXYNOS4_SETUP_I2C1)      += setup-i2c1.o
  obj-$(CONFIG_EXYNOS4_SETUP_I2C2)      += setup-i2c2.o
  obj-$(CONFIG_EXYNOS4_SETUP_I2C3)      += setup-i2c3.o
@@@ -74,4 -69,3 +74,4 @@@ obj-$(CONFIG_EXYNOS4_SETUP_KEYPAD)    += s
  obj-$(CONFIG_EXYNOS4_SETUP_SDHCI_GPIO)        += setup-sdhci-gpio.o
  obj-$(CONFIG_EXYNOS4_SETUP_USB_PHY)   += setup-usb-phy.o
  obj-$(CONFIG_EXYNOS4_SETUP_SPI)               += setup-spi.o
 +obj-$(CONFIG_EXYNOS4_SETUP_TVOUT)     += setup-tvout.o
  
  #ifdef CONFIG_PM_SLEEP
  static struct sleep_save exynos5_clock_save[] = {
-       /* will be implemented */
+       SAVE_ITEM(EXYNOS5_CLKSRC_MASK_TOP),
+       SAVE_ITEM(EXYNOS5_CLKSRC_MASK_GSCL),
+       SAVE_ITEM(EXYNOS5_CLKSRC_MASK_DISP1_0),
+       SAVE_ITEM(EXYNOS5_CLKSRC_MASK_FSYS),
+       SAVE_ITEM(EXYNOS5_CLKSRC_MASK_MAUDIO),
+       SAVE_ITEM(EXYNOS5_CLKSRC_MASK_PERIC0),
+       SAVE_ITEM(EXYNOS5_CLKSRC_MASK_PERIC1),
+       SAVE_ITEM(EXYNOS5_CLKGATE_IP_GSCL),
+       SAVE_ITEM(EXYNOS5_CLKGATE_IP_DISP1),
+       SAVE_ITEM(EXYNOS5_CLKGATE_IP_MFC),
+       SAVE_ITEM(EXYNOS5_CLKGATE_IP_G3D),
+       SAVE_ITEM(EXYNOS5_CLKGATE_IP_GEN),
+       SAVE_ITEM(EXYNOS5_CLKGATE_IP_FSYS),
+       SAVE_ITEM(EXYNOS5_CLKGATE_IP_GPS),
+       SAVE_ITEM(EXYNOS5_CLKGATE_IP_PERIC),
+       SAVE_ITEM(EXYNOS5_CLKGATE_IP_PERIS),
+       SAVE_ITEM(EXYNOS5_CLKGATE_BLOCK),
+       SAVE_ITEM(EXYNOS5_CLKDIV_TOP0),
+       SAVE_ITEM(EXYNOS5_CLKDIV_TOP1),
+       SAVE_ITEM(EXYNOS5_CLKDIV_GSCL),
+       SAVE_ITEM(EXYNOS5_CLKDIV_DISP1_0),
+       SAVE_ITEM(EXYNOS5_CLKDIV_GEN),
+       SAVE_ITEM(EXYNOS5_CLKDIV_MAUDIO),
+       SAVE_ITEM(EXYNOS5_CLKDIV_FSYS0),
+       SAVE_ITEM(EXYNOS5_CLKDIV_FSYS1),
+       SAVE_ITEM(EXYNOS5_CLKDIV_FSYS2),
+       SAVE_ITEM(EXYNOS5_CLKDIV_FSYS3),
+       SAVE_ITEM(EXYNOS5_CLKDIV_PERIC0),
+       SAVE_ITEM(EXYNOS5_CLKDIV_PERIC1),
+       SAVE_ITEM(EXYNOS5_CLKDIV_PERIC2),
+       SAVE_ITEM(EXYNOS5_CLKDIV_PERIC3),
+       SAVE_ITEM(EXYNOS5_CLKDIV_PERIC4),
+       SAVE_ITEM(EXYNOS5_CLKDIV_PERIC5),
+       SAVE_ITEM(EXYNOS5_SCLK_DIV_ISP),
+       SAVE_ITEM(EXYNOS5_CLKSRC_TOP0),
+       SAVE_ITEM(EXYNOS5_CLKSRC_TOP1),
+       SAVE_ITEM(EXYNOS5_CLKSRC_TOP2),
+       SAVE_ITEM(EXYNOS5_CLKSRC_TOP3),
+       SAVE_ITEM(EXYNOS5_CLKSRC_GSCL),
+       SAVE_ITEM(EXYNOS5_CLKSRC_DISP1_0),
+       SAVE_ITEM(EXYNOS5_CLKSRC_MAUDIO),
+       SAVE_ITEM(EXYNOS5_CLKSRC_FSYS),
+       SAVE_ITEM(EXYNOS5_CLKSRC_PERIC0),
+       SAVE_ITEM(EXYNOS5_CLKSRC_PERIC1),
+       SAVE_ITEM(EXYNOS5_SCLK_SRC_ISP),
+       SAVE_ITEM(EXYNOS5_EPLL_CON0),
+       SAVE_ITEM(EXYNOS5_EPLL_CON1),
+       SAVE_ITEM(EXYNOS5_EPLL_CON2),
+       SAVE_ITEM(EXYNOS5_VPLL_CON0),
+       SAVE_ITEM(EXYNOS5_VPLL_CON1),
+       SAVE_ITEM(EXYNOS5_VPLL_CON2),
  };
  #endif
  
@@@ -72,11 -122,6 +122,11 @@@ static int exynos5_clksrc_mask_fsys_ctr
        return s5p_gatectrl(EXYNOS5_CLKSRC_MASK_FSYS, clk, enable);
  }
  
 +static int exynos5_clk_ip_gscl_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS5_CLKGATE_IP_GSCL, clk, enable);
 +}
 +
  static int exynos5_clksrc_mask_gscl_ctrl(struct clk *clk, int enable)
  {
        return s5p_gatectrl(EXYNOS5_CLKSRC_MASK_GSCL, clk, enable);
@@@ -132,31 -177,6 +182,31 @@@ static int exynos5_clk_ip_peris_ctrl(st
        return s5p_gatectrl(EXYNOS5_CLKGATE_IP_PERIS, clk, enable);
  }
  
 +static int exynos5_clksrc_mask_peric1_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS5_CLKSRC_MASK_PERIC1, clk, enable);
 +}
 +
 +static int exynos5_clk_ip_acp_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS5_CLKGATE_IP_ACP, clk, enable);
 +}
 +
 +static int exynos5_clk_ip_isp0_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS5_CLKGATE_IP_ISP0, clk, enable);
 +}
 +
 +static int exynos5_clk_ip_isp1_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(EXYNOS5_CLKGATE_IP_ISP1, clk, enable);
 +}
 +
 +static int exynos5_clk_hdmiphy_ctrl(struct clk *clk, int enable)
 +{
 +      return s5p_gatectrl(S5P_HDMI_PHY_CONTROL, clk, enable);
 +}
 +
  /* Core list of CMU_CPU side */
  
  static struct clksrc_clk exynos5_clk_mout_apll = {
@@@ -592,19 -612,14 +642,19 @@@ static struct clk exynos5_init_clocks_o
                .ctrlbit        = (1 << 25),
        }, {
                .name           = "mfc",
 -              .devname        = "s5p-mfc",
 +              .devname        = "s5p-mfc-v6",
                .enable         = exynos5_clk_ip_mfc_ctrl,
                .ctrlbit        = (1 << 0),
        }, {
                .name           = "hdmi",
 -              .devname        = "exynos4-hdmi",
 +              .devname        = "exynos5-hdmi",
                .enable         = exynos5_clk_ip_disp1_ctrl,
                .ctrlbit        = (1 << 6),
 +      }, {
 +              .name           = "hdmiphy",
 +              .devname        = "exynos5-hdmi",
 +              .enable         = exynos5_clk_hdmiphy_ctrl,
 +              .ctrlbit        = (1 << 0),
        }, {
                .name           = "mixer",
                .devname        = "s5p-mixer",
                .name           = "dsim0",
                .enable         = exynos5_clk_ip_disp1_ctrl,
                .ctrlbit        = (1 << 3),
 +      }, {
 +              .name           = "fimd",
 +              .devname        = "exynos5-fb",
 +              .enable         = exynos5_clk_ip_disp1_ctrl,
 +              .ctrlbit        = (1 << 0),
        }, {
                .name           = "iis",
                .devname        = "samsung-i2s.1",
                .name           = "usbhost",
                .enable         = exynos5_clk_ip_fsys_ctrl ,
                .ctrlbit        = (1 << 18),
 +      }, {
 +              .name           = "usbdrd30",
 +              .parent         = &exynos5_clk_aclk_200.clk,
 +              .enable         = exynos5_clk_ip_fsys_ctrl,
 +              .ctrlbit        = (1 << 19),
        }, {
                .name           = "usbotg",
                .enable         = exynos5_clk_ip_fsys_ctrl,
                .ctrlbit        = (1 << 13),
        }, {
                .name           = "i2c",
 -              .devname        = "s3c2440-hdmiphy-i2c",
                .parent         = &exynos5_clk_aclk_66.clk,
                .enable         = exynos5_clk_ip_peric_ctrl,
                .ctrlbit        = (1 << 14),
 +      }, {
 +              .name           = "gscl",
 +              .devname        = "exynos-gsc.0",
 +              .enable         = exynos5_clk_ip_gscl_ctrl,
 +              .ctrlbit        = (1 << 0),
 +      }, {
 +              .name           = "gscl",
 +              .devname        = "exynos-gsc.1",
 +              .enable         = exynos5_clk_ip_gscl_ctrl,
 +              .ctrlbit        = (1 << 1),
 +      }, {
 +              .name           = "gscl",
 +              .devname        = "exynos-gsc.2",
 +              .enable         = exynos5_clk_ip_gscl_ctrl,
 +              .ctrlbit        = (1 << 2),
 +      }, {
 +              .name           = "gscl",
 +              .devname        = "exynos-gsc.3",
 +              .enable         = exynos5_clk_ip_gscl_ctrl,
 +              .ctrlbit        = (1 << 3),
 +      }, {
 +              .name           = "fimg2d",
 +              .enable         = exynos5_clk_ip_acp_ctrl,
 +              .ctrlbit        = (1 << 3),
 +      }, {
 +              .name           = "dp",
 +              .devname        = "s5p-dp",
 +              .enable         = exynos5_clk_ip_disp1_ctrl,
 +              .ctrlbit        = (1 << 4),
 +      }, {
 +              .name           = SYSMMU_CLOCK_NAME,
 +              .devname        = SYSMMU_CLOCK_DEVNAME(mfc_l, 3),
 +              .enable         = &exynos5_clk_ip_mfc_ctrl,
 +              /* There is change in the MFC_L & MFC_R in v6.5 */
 +              .ctrlbit        = (1 << 2),
 +              .parent         = &exynos5_init_clocks_off[10],
 +      }, {
 +              .name           = SYSMMU_CLOCK_NAME,
 +              .devname        = SYSMMU_CLOCK_DEVNAME(mfc_r, 4),
 +              .enable         = &exynos5_clk_ip_mfc_ctrl,
 +              .ctrlbit        = (1 << 1),
 +              .parent         = &exynos5_init_clocks_off[10],
 +      }, {
 +              .name           = SYSMMU_CLOCK_NAME,
 +              .devname        = SYSMMU_CLOCK_DEVNAME(tv, 28),
 +              .enable         = &exynos5_clk_ip_disp1_ctrl,
 +              .ctrlbit        = (1 << 9),
 +              .parent         = &exynos5_init_clocks_off[13],
 +      }, {
 +              .name           = SYSMMU_CLOCK_NAME,
 +              .devname        = SYSMMU_CLOCK_DEVNAME(jpeg, 7),
 +              .enable         = &exynos5_clk_ip_gen_ctrl,
 +              .ctrlbit        = (1 << 7),
 +      }, {
 +              .name           = SYSMMU_CLOCK_NAME,
 +              .devname        = SYSMMU_CLOCK_DEVNAME(rot, 5),
 +              .enable         = &exynos5_clk_ip_gen_ctrl,
 +              .ctrlbit        = (1 << 6)
 +      }, {
 +              .name           = SYSMMU_CLOCK_NAME,
 +              .devname        = SYSMMU_CLOCK_DEVNAME(gsc0, 23),
 +              .enable         = &exynos5_clk_ip_gscl_ctrl,
 +              .ctrlbit        = (1 << 7),
 +              .parent         = &exynos5_init_clocks_off[40],
 +      }, {
 +              .name           = SYSMMU_CLOCK_NAME,
 +              .devname        = SYSMMU_CLOCK_DEVNAME(gsc1, 24),
 +              .enable         = &exynos5_clk_ip_gscl_ctrl,
 +              .ctrlbit        = (1 << 8),
 +              .parent         = &exynos5_init_clocks_off[41],
 +      }, {
 +              .name           = SYSMMU_CLOCK_NAME,
 +              .devname        = SYSMMU_CLOCK_DEVNAME(gsc2, 25),
 +              .enable         = &exynos5_clk_ip_gscl_ctrl,
 +              .ctrlbit        = (1 << 9),
 +              .parent         = &exynos5_init_clocks_off[42],
 +      }, {
 +              .name           = SYSMMU_CLOCK_NAME,
 +              .devname        = SYSMMU_CLOCK_DEVNAME(gsc3, 26),
 +              .enable         = &exynos5_clk_ip_gscl_ctrl,
 +              .ctrlbit        = (1 << 10),
 +              .parent         = &exynos5_init_clocks_off[43],
 +      }, {
 +              .name           = SYSMMU_CLOCK_NAME,
 +              .devname        = SYSMMU_CLOCK_DEVNAME(isp, 11),
 +              .enable         = &exynos5_clk_ip_isp0_ctrl,
 +              .ctrlbit        = (0x3F << 8),
 +      }, {
 +              .name           = SYSMMU_CLOCK_NAME2,
 +              .devname        = SYSMMU_CLOCK_DEVNAME(isp, 11),
 +              .enable         = &exynos5_clk_ip_isp1_ctrl,
 +              .ctrlbit        = (0xF << 4),
 +      }, {
 +              .name           = SYSMMU_CLOCK_NAME,
 +              .devname        = SYSMMU_CLOCK_DEVNAME(2d, 2),
 +              .enable         = &exynos5_clk_ip_acp_ctrl,
 +              .ctrlbit        = (1 << 7),
        }
  };
  
@@@ -912,16 -821,6 +962,16 @@@ struct clksrc_sources exynos5_clkset_gr
        .nr_sources     = ARRAY_SIZE(exynos5_clkset_group_list),
  };
  
 +struct clk *exynos5_clkset_usbdrd30_list[] = {
 +      [0] = &exynos5_clk_mout_mpll.clk,
 +      [1] = &exynos5_clk_mout_cpll.clk,
 +};
 +
 +struct clksrc_sources exynos5_clkset_usbdrd30 = {
 +      .sources        = exynos5_clkset_usbdrd30_list,
 +      .nr_sources     = ARRAY_SIZE(exynos5_clkset_usbdrd30_list),
 +};
 +
  /* Possible clock sources for aclk_266_gscl_sub Mux */
  static struct clk *clk_src_gscl_266_list[] = {
        [0] = &clk_ext_xtal_mux,
@@@ -1074,7 -973,7 +1124,7 @@@ static struct clksrc_clk exynos5_clksrc
        {
                .clk    = {
                        .name           = "sclk_fimd",
 -                      .devname        = "s3cfb.1",
 +                      .devname        = "exynos5-fb",
                        .enable         = exynos5_clksrc_mask_disp1_0_ctrl,
                        .ctrlbit        = (1 << 0),
                },
                        .parent         = &exynos5_clk_mout_cpll.clk,
                },
                .reg_div = { .reg = EXYNOS5_CLKDIV_GEN, .shift = 4, .size = 3 },
 +      }, {
 +              .clk    = {
 +                      .name           = "sclk_usbdrd30",
 +                      .enable         = exynos5_clksrc_mask_fsys_ctrl,
 +                      .ctrlbit        = (1 << 28),
 +              },
 +              .sources = &exynos5_clkset_usbdrd30,
 +              .reg_src = { .reg = EXYNOS5_CLKSRC_FSYS, .shift = 28, .size = 1 },
 +              .reg_div = { .reg = EXYNOS5_CLKDIV_FSYS0, .shift = 24, .size = 4 },
 +      },
 +};
 +
 +/* For ACLK_300_gscl_mid */
 +static struct clksrc_clk exynos5_clk_mout_aclk_300_gscl_mid = {
 +      .clk    = {
 +              .name   = "mout_aclk_300_gscl_mid",
 +      },
 +      .sources = &exynos5_clkset_aclk,
 +      .reg_src = { .reg = EXYNOS5_CLKSRC_TOP0, .shift = 24, .size = 1 },
 +};
 +
 +/* For ACLK_300_gscl */
 +struct clk *exynos5_clkset_aclk_300_gscl_list[] = {
 +      [0] = &exynos5_clk_mout_aclk_300_gscl_mid.clk,
 +      [1] = &exynos5_clk_sclk_vpll.clk,
 +};
 +
 +struct clksrc_sources exynos5_clkset_aclk_300_gscl = {
 +      .sources        = exynos5_clkset_aclk_300_gscl_list,
 +      .nr_sources     = ARRAY_SIZE(exynos5_clkset_aclk_300_gscl_list),
 +};
 +
 +static struct clksrc_clk exynos5_clk_mout_aclk_300_gscl = {
 +      .clk    = {
 +              .name           = "mout_aclk_300_gscl",
 +      },
 +      .sources = &exynos5_clkset_aclk_300_gscl,
 +      .reg_src = { .reg = EXYNOS5_CLKSRC_TOP0, .shift = 25, .size = 1 },
 +};
 +
 +static struct clksrc_clk exynos5_clk_dout_aclk_300_gscl = {
 +      .clk    = {
 +              .name           = "dout_aclk_300_gscl",
 +              .parent         = &exynos5_clk_mout_aclk_300_gscl.clk,
 +      },
 +      .reg_div = { .reg = EXYNOS5_CLKDIV_TOP1, .shift = 12, .size = 3 },
 +};
 +
 +/* Possible clock sources for aclk_300_gscl_sub Mux */
 +static struct clk *clk_src_gscl_300_list[] = {
 +      [0] = &clk_ext_xtal_mux,
 +      [1] = &exynos5_clk_dout_aclk_300_gscl.clk,
 +};
 +
 +static struct clksrc_sources clk_src_gscl_300 = {
 +      .sources        = clk_src_gscl_300_list,
 +      .nr_sources     = ARRAY_SIZE(clk_src_gscl_300_list),
 +};
 +
 +static struct clksrc_clk exynos5_clk_aclk_300_gscl = {
 +      .clk    = {
 +              .name           = "aclk_300_gscl",
        },
 +      .sources = &clk_src_gscl_300,
 +      .reg_src = { .reg = EXYNOS5_CLKSRC_TOP3, .shift = 10, .size = 1 },
  };
  
  /* Clock initialization code */
@@@ -1231,10 -1066,6 +1281,10 @@@ static struct clksrc_clk *exynos5_syscl
        &exynos5_clk_aclk_266,
        &exynos5_clk_aclk_200,
        &exynos5_clk_aclk_166,
 +      &exynos5_clk_mout_aclk_300_gscl_mid,
 +      &exynos5_clk_mout_aclk_300_gscl,
 +      &exynos5_clk_dout_aclk_300_gscl,
 +      &exynos5_clk_aclk_300_gscl,
        &exynos5_clk_aclk_66_pre,
        &exynos5_clk_aclk_66,
        &exynos5_clk_dout_mmc0,
@@@ -195,11 -195,6 +195,11 @@@ static struct map_desc exynos4_iodesc[
                .pfn            = __phys_to_pfn(EXYNOS4_PA_HSPHY),
                .length         = SZ_4K,
                .type           = MT_DEVICE,
 +      }, {
 +              .virtual        = (unsigned long)S5P_VA_AUDSS,
 +              .pfn            = __phys_to_pfn(EXYNOS_PA_AUDSS),
 +              .length         = SZ_4K,
 +              .type           = MT_DEVICE,
        },
  };
  
@@@ -282,21 -277,6 +282,21 @@@ static struct map_desc exynos5_iodesc[
                .pfn            = __phys_to_pfn(EXYNOS5_PA_GIC_DIST),
                .length         = SZ_4K,
                .type           = MT_DEVICE,
 +      }, {
 +              .virtual        = (unsigned long)S3C_VA_USB_HSPHY,
 +              .pfn            = __phys_to_pfn(EXYNOS5_PA_USB_PHY),
 +              .length         = SZ_256K,
 +              .type           = MT_DEVICE,
 +      }, {
 +              .virtual        = (unsigned long)S5P_VA_DRD_PHY,
 +              .pfn            = __phys_to_pfn(EXYNOS5_PA_DRD_PHY),
 +              .length         = SZ_256K,
 +              .type           = MT_DEVICE,
 +      }, {
 +              .virtual        = (unsigned long)S5P_VA_AUDSS,
 +              .pfn            = __phys_to_pfn(EXYNOS_PA_AUDSS),
 +              .length         = SZ_4K,
 +              .type           = MT_DEVICE,
        },
  };
  
@@@ -310,19 -290,6 +310,19 @@@ void exynos5_restart(char mode, const c
        __raw_writel(0x1, EXYNOS_SWRESET);
  }
  
 +static void wdt_reset_init(void)
 +{
 +      unsigned int value;
 +
 +      value = __raw_readl(EXYNOS5_AUTOMATIC_WDT_RESET_DISABLE);
 +      value &= ~EXYNOS5_SYS_WDTRESET;
 +      __raw_writel(value, EXYNOS5_AUTOMATIC_WDT_RESET_DISABLE);
 +
 +      value = __raw_readl(EXYNOS5_MASK_WDT_RESET_REQUEST);
 +      value &= ~EXYNOS5_SYS_WDTRESET;
 +      __raw_writel(value, EXYNOS5_MASK_WDT_RESET_REQUEST);
 +}
 +
  /*
   * exynos_map_io
   *
@@@ -340,9 -307,6 +340,9 @@@ void __init exynos_init_io(struct map_d
        s5p_init_cpu(S5P_VA_CHIPID);
  
        s3c_init_cpu(samsung_cpu_id, cpu_ids, ARRAY_SIZE(cpu_ids));
 +
 +      /* TO support Watch dog reset */
 +      wdt_reset_init();
  }
  
  static void __init exynos4_map_io(void)
@@@ -415,7 -379,6 +415,7 @@@ static void __init exynos4_init_clocks(
  
        exynos4_register_clocks();
        exynos4_setup_clocks();
 +      exynos_register_audss_clocks();
  }
  
  static void __init exynos5_init_clocks(int xtal)
  
        exynos5_register_clocks();
        exynos5_setup_clocks();
 +      exynos_register_audss_clocks();
  }
  
  #define COMBINER_ENABLE_SET   0x0
@@@ -671,6 -633,8 +671,8 @@@ void __init exynos5_init_irq(void
         * uses GIC instead of VIC.
         */
        s5p_init_irq(NULL, 0);
+       gic_arch_extn.irq_set_wake = s3c_irq_wake;
  }
  
  struct bus_type exynos_subsys = {
  #define EXYNOS5_CLKSRC_CORE1                  EXYNOS_CLKREG(0x04204)
  
  #define EXYNOS5_CLKGATE_IP_CORE                       EXYNOS_CLKREG(0x04900)
 +#define EXYNOS5_CLKGATE_ISP0                   EXYNOS_CLKREG(0x0C800)
 +
  
  #define EXYNOS5_CLKDIV_ACP                    EXYNOS_CLKREG(0x08500)
  
- #define EXYNOS5_CLKSRC_TOP2                   EXYNOS_CLKREG(0x10218)
  #define EXYNOS5_EPLL_CON0                     EXYNOS_CLKREG(0x10130)
  #define EXYNOS5_EPLL_CON1                     EXYNOS_CLKREG(0x10134)
+ #define EXYNOS5_EPLL_CON2                     EXYNOS_CLKREG(0x10138)
  #define EXYNOS5_VPLL_CON0                     EXYNOS_CLKREG(0x10140)
  #define EXYNOS5_VPLL_CON1                     EXYNOS_CLKREG(0x10144)
+ #define EXYNOS5_VPLL_CON2                     EXYNOS_CLKREG(0x10148)
  #define EXYNOS5_CPLL_CON0                     EXYNOS_CLKREG(0x10120)
  
  #define EXYNOS5_CLKSRC_TOP0                   EXYNOS_CLKREG(0x10210)
+ #define EXYNOS5_CLKSRC_TOP1                   EXYNOS_CLKREG(0x10214)
+ #define EXYNOS5_CLKSRC_TOP2                   EXYNOS_CLKREG(0x10218)
  #define EXYNOS5_CLKSRC_TOP3                   EXYNOS_CLKREG(0x1021C)
  #define EXYNOS5_CLKSRC_GSCL                   EXYNOS_CLKREG(0x10220)
  #define EXYNOS5_CLKSRC_DISP1_0                        EXYNOS_CLKREG(0x1022C)
+ #define EXYNOS5_CLKSRC_MAUDIO                 EXYNOS_CLKREG(0x10240)
  #define EXYNOS5_CLKSRC_FSYS                   EXYNOS_CLKREG(0x10244)
  #define EXYNOS5_CLKSRC_PERIC0                 EXYNOS_CLKREG(0x10250)
+ #define EXYNOS5_CLKSRC_PERIC1                 EXYNOS_CLKREG(0x10254)
+ #define EXYNOS5_SCLK_SRC_ISP                  EXYNOS_CLKREG(0x10270)
  
  #define EXYNOS5_CLKSRC_MASK_TOP                       EXYNOS_CLKREG(0x10310)
  #define EXYNOS5_CLKSRC_MASK_GSCL              EXYNOS_CLKREG(0x10320)
  #define EXYNOS5_CLKSRC_MASK_DISP1_0           EXYNOS_CLKREG(0x1032C)
+ #define EXYNOS5_CLKSRC_MASK_MAUDIO            EXYNOS_CLKREG(0x10334)
  #define EXYNOS5_CLKSRC_MASK_FSYS              EXYNOS_CLKREG(0x10340)
  #define EXYNOS5_CLKSRC_MASK_PERIC0            EXYNOS_CLKREG(0x10350)
 +#define EXYNOS5_CLKSRC_MASK_PERIC1             EXYNOS_CLKREG(0x10354)
  
  #define EXYNOS5_CLKDIV_TOP0                   EXYNOS_CLKREG(0x10510)
  #define EXYNOS5_CLKDIV_TOP1                   EXYNOS_CLKREG(0x10514)
  #define EXYNOS5_CLKDIV_GSCL                   EXYNOS_CLKREG(0x10520)
  #define EXYNOS5_CLKDIV_DISP1_0                        EXYNOS_CLKREG(0x1052C)
  #define EXYNOS5_CLKDIV_GEN                    EXYNOS_CLKREG(0x1053C)
+ #define EXYNOS5_CLKDIV_MAUDIO                 EXYNOS_CLKREG(0x10544)
  #define EXYNOS5_CLKDIV_FSYS0                  EXYNOS_CLKREG(0x10548)
  #define EXYNOS5_CLKDIV_FSYS1                  EXYNOS_CLKREG(0x1054C)
  #define EXYNOS5_CLKDIV_FSYS2                  EXYNOS_CLKREG(0x10550)
  #define EXYNOS5_CLKDIV_FSYS3                  EXYNOS_CLKREG(0x10554)
  #define EXYNOS5_CLKDIV_PERIC0                 EXYNOS_CLKREG(0x10558)
+ #define EXYNOS5_CLKDIV_PERIC1                 EXYNOS_CLKREG(0x1055C)
+ #define EXYNOS5_CLKDIV_PERIC2                 EXYNOS_CLKREG(0x10560)
+ #define EXYNOS5_CLKDIV_PERIC3                 EXYNOS_CLKREG(0x10564)
+ #define EXYNOS5_CLKDIV_PERIC4                 EXYNOS_CLKREG(0x10568)
+ #define EXYNOS5_CLKDIV_PERIC5                 EXYNOS_CLKREG(0x1056C)
+ #define EXYNOS5_SCLK_DIV_ISP                  EXYNOS_CLKREG(0x10580)
+ #define EXYNOS5_CLKDIV_STAT_TOP0              EXYNOS_CLKREG(0x10610)
  
  #define EXYNOS5_CLKGATE_IP_ACP                        EXYNOS_CLKREG(0x08800)
 +#define EXYNOS5_CLKGATE_IP_ISP0                 EXYNOS_CLKREG(0x0C800)
 +#define EXYNOS5_CLKGATE_IP_ISP1                 EXYNOS_CLKREG(0x0C804)
  #define EXYNOS5_CLKGATE_IP_GSCL                       EXYNOS_CLKREG(0x10920)
  #define EXYNOS5_CLKGATE_IP_DISP1              EXYNOS_CLKREG(0x10928)
  #define EXYNOS5_CLKGATE_IP_MFC                        EXYNOS_CLKREG(0x1092C)
+ #define EXYNOS5_CLKGATE_IP_G3D                        EXYNOS_CLKREG(0x10930)
  #define EXYNOS5_CLKGATE_IP_GEN                        EXYNOS_CLKREG(0x10934)
  #define EXYNOS5_CLKGATE_IP_FSYS                       EXYNOS_CLKREG(0x10944)
  #define EXYNOS5_CLKGATE_IP_GPS                        EXYNOS_CLKREG(0x1094C)
  #define EXYNOS5_CLKGATE_IP_PERIC              EXYNOS_CLKREG(0x10950)
  #define EXYNOS5_CLKGATE_IP_PERIS              EXYNOS_CLKREG(0x10960)
  #define EXYNOS5_CLKGATE_BLOCK                 EXYNOS_CLKREG(0x10980)
+ #define EXYNOS5_CLKOUT_CMU_TOP                        EXYNOS_CLKREG(0x10A00)
  
  #define EXYNOS5_PLL_DIV2_SEL                  EXYNOS_CLKREG(0x20A24)
  
@@@ -1,9 -1,8 +1,8 @@@
- /* linux/arch/arm/mach-exynos4/include/mach/regs-pmu.h
-  *
-  * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
+ /*
+  * Copyright (c) 2010-2012 Samsung Electronics Co., Ltd.
   *            http://www.samsung.com
   *
-  * EXYNOS4 - Power management unit definition
+  * EXYNOS - Power management unit definition
   *
   * 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
@@@ -16,6 -15,7 +15,7 @@@
  #include <mach/map.h>
  
  #define S5P_PMUREG(x)                         (S5P_VA_PMU + (x))
+ #define S5P_SYSREG(x)                         (S3C_VA_SYS + (x))
  
  #define S5P_CENTRAL_SEQ_CONFIGURATION         S5P_PMUREG(0x0200)
  
  #define S5P_HDMI_PHY_CONTROL                  S5P_PMUREG(0x0700)
  #define S5P_HDMI_PHY_ENABLE                   (1 << 0)
  
 +/* only for EXYNOS5250*/
 +#define S5P_USBDRD_PHY_CONTROL                        S5P_PMUREG(0x0704)
 +#define S5P_USBDRD_PHY_ENABLE                 (1 << 0)
 +
  #define S5P_DAC_PHY_CONTROL                   S5P_PMUREG(0x070C)
  #define S5P_DAC_PHY_ENABLE                    (1 << 0)
  
@@@ -52,9 -48,6 +52,9 @@@
  #define S5P_MIPI_DPHY_SRESETN                 (1 << 1)
  #define S5P_MIPI_DPHY_MRESETN                 (1 << 2)
  
 +#define S5P_DPTX_PHY_CONTROL                  S5P_PMUREG(0x720)
 +#define S5P_DPTX_PHY_ENABLE                   (1 << 0)
 +
  #define S5P_INFORM0                           S5P_PMUREG(0x0800)
  #define S5P_INFORM1                           S5P_PMUREG(0x0804)
  #define S5P_INFORM2                           S5P_PMUREG(0x0808)
  #define S5P_SECSS_MEM_OPTION                  S5P_PMUREG(0x2EC8)
  #define S5P_ROTATOR_MEM_OPTION                        S5P_PMUREG(0x2F48)
  
+ /* For EXYNOS5 */
+ #define EXYNOS5_GPS_LPI                                       S5P_PMUREG(0x0004)
+ #define EXYNOS5_USB_CFG                                       S5P_PMUREG(0x0230)
+ #define EXYNOS5_SYS_WDTRESET                          (1 << 20)
+ #define EXYNOS5_AUTOMATIC_WDT_RESET_DISABLE           S5P_PMUREG(0x0408)
+ #define EXYNOS5_MASK_WDT_RESET_REQUEST                        S5P_PMUREG(0x040C)
+ #define EXYNOS5_ARM_CORE0_SYS_PWR_REG                 S5P_PMUREG(0x1000)
+ #define EXYNOS5_DIS_IRQ_ARM_CORE0_LOCAL_SYS_PWR_REG   S5P_PMUREG(0x1004)
+ #define EXYNOS5_DIS_IRQ_ARM_CORE0_CENTRAL_SYS_PWR_REG S5P_PMUREG(0x1008)
+ #define EXYNOS5_ARM_CORE1_SYS_PWR_REG                 S5P_PMUREG(0x1010)
+ #define EXYNOS5_DIS_IRQ_ARM_CORE1_LOCAL_SYS_PWR_REG   S5P_PMUREG(0x1014)
+ #define EXYNOS5_DIS_IRQ_ARM_CORE1_CENTRAL_SYS_PWR_REG S5P_PMUREG(0x1018)
+ #define EXYNOS5_FSYS_ARM_SYS_PWR_REG                  S5P_PMUREG(0x1040)
+ #define EXYNOS5_DIS_IRQ_FSYS_ARM_CENTRAL_SYS_PWR_REG  S5P_PMUREG(0x1048)
+ #define EXYNOS5_ISP_ARM_SYS_PWR_REG                   S5P_PMUREG(0x1050)
+ #define EXYNOS5_DIS_IRQ_ISP_ARM_LOCAL_SYS_PWR_REG     S5P_PMUREG(0x1054)
+ #define EXYNOS5_DIS_IRQ_ISP_ARM_CENTRAL_SYS_PWR_REG   S5P_PMUREG(0x1058)
+ #define EXYNOS5_ARM_COMMON_SYS_PWR_REG                        S5P_PMUREG(0x1080)
+ #define EXYNOS5_ARM_L2_SYS_PWR_REG                    S5P_PMUREG(0x10C0)
+ #define EXYNOS5_CMU_ACLKSTOP_SYS_PWR_REG              S5P_PMUREG(0x1100)
+ #define EXYNOS5_CMU_SCLKSTOP_SYS_PWR_REG              S5P_PMUREG(0x1104)
+ #define EXYNOS5_CMU_RESET_SYS_PWR_REG                 S5P_PMUREG(0x110C)
+ #define EXYNOS5_CMU_ACLKSTOP_SYSMEM_SYS_PWR_REG               S5P_PMUREG(0x1120)
+ #define EXYNOS5_CMU_SCLKSTOP_SYSMEM_SYS_PWR_REG               S5P_PMUREG(0x1124)
+ #define EXYNOS5_CMU_RESET_SYSMEM_SYS_PWR_REG          S5P_PMUREG(0x112C)
+ #define EXYNOS5_DRAM_FREQ_DOWN_SYS_PWR_REG            S5P_PMUREG(0x1130)
+ #define EXYNOS5_DDRPHY_DLLOFF_SYS_PWR_REG             S5P_PMUREG(0x1134)
+ #define EXYNOS5_DDRPHY_DLLLOCK_SYS_PWR_REG            S5P_PMUREG(0x1138)
+ #define EXYNOS5_APLL_SYSCLK_SYS_PWR_REG                       S5P_PMUREG(0x1140)
+ #define EXYNOS5_MPLL_SYSCLK_SYS_PWR_REG                       S5P_PMUREG(0x1144)
+ #define EXYNOS5_VPLL_SYSCLK_SYS_PWR_REG                       S5P_PMUREG(0x1148)
+ #define EXYNOS5_EPLL_SYSCLK_SYS_PWR_REG                       S5P_PMUREG(0x114C)
+ #define EXYNOS5_BPLL_SYSCLK_SYS_PWR_REG                       S5P_PMUREG(0x1150)
+ #define EXYNOS5_CPLL_SYSCLK_SYS_PWR_REG                       S5P_PMUREG(0x1154)
+ #define EXYNOS5_MPLLUSER_SYSCLK_SYS_PWR_REG           S5P_PMUREG(0x1164)
+ #define EXYNOS5_BPLLUSER_SYSCLK_SYS_PWR_REG           S5P_PMUREG(0x1170)
+ #define EXYNOS5_TOP_BUS_SYS_PWR_REG                   S5P_PMUREG(0x1180)
+ #define EXYNOS5_TOP_RETENTION_SYS_PWR_REG             S5P_PMUREG(0x1184)
+ #define EXYNOS5_TOP_PWR_SYS_PWR_REG                   S5P_PMUREG(0x1188)
+ #define EXYNOS5_TOP_BUS_SYSMEM_SYS_PWR_REG            S5P_PMUREG(0x1190)
+ #define EXYNOS5_TOP_RETENTION_SYSMEM_SYS_PWR_REG      S5P_PMUREG(0x1194)
+ #define EXYNOS5_TOP_PWR_SYSMEM_SYS_PWR_REG            S5P_PMUREG(0x1198)
+ #define EXYNOS5_LOGIC_RESET_SYS_PWR_REG                       S5P_PMUREG(0x11A0)
+ #define EXYNOS5_OSCCLK_GATE_SYS_PWR_REG                       S5P_PMUREG(0x11A4)
+ #define EXYNOS5_LOGIC_RESET_SYSMEM_SYS_PWR_REG                S5P_PMUREG(0x11B0)
+ #define EXYNOS5_OSCCLK_GATE_SYSMEM_SYS_PWR_REG                S5P_PMUREG(0x11B4)
+ #define EXYNOS5_USBOTG_MEM_SYS_PWR_REG                        S5P_PMUREG(0x11C0)
+ #define EXYNOS5_G2D_MEM_SYS_PWR_REG                   S5P_PMUREG(0x11C8)
+ #define EXYNOS5_USBDRD_MEM_SYS_PWR_REG                        S5P_PMUREG(0x11CC)
+ #define EXYNOS5_SDMMC_MEM_SYS_PWR_REG                 S5P_PMUREG(0x11D0)
+ #define EXYNOS5_CSSYS_MEM_SYS_PWR_REG                 S5P_PMUREG(0x11D4)
+ #define EXYNOS5_SECSS_MEM_SYS_PWR_REG                 S5P_PMUREG(0x11D8)
+ #define EXYNOS5_ROTATOR_MEM_SYS_PWR_REG                       S5P_PMUREG(0x11DC)
+ #define EXYNOS5_INTRAM_MEM_SYS_PWR_REG                        S5P_PMUREG(0x11E0)
+ #define EXYNOS5_INTROM_MEM_SYS_PWR_REG                        S5P_PMUREG(0x11E4)
+ #define EXYNOS5_JPEG_MEM_SYS_PWR_REG                  S5P_PMUREG(0x11E8)
+ #define EXYNOS5_HSI_MEM_SYS_PWR_REG                   S5P_PMUREG(0x11EC)
+ #define EXYNOS5_MCUIOP_MEM_SYS_PWR_REG                        S5P_PMUREG(0x11F4)
+ #define EXYNOS5_SATA_MEM_SYS_PWR_REG                  S5P_PMUREG(0x11FC)
+ #define EXYNOS5_PAD_RETENTION_DRAM_SYS_PWR_REG                S5P_PMUREG(0x1200)
+ #define EXYNOS5_PAD_RETENTION_MAU_SYS_PWR_REG         S5P_PMUREG(0x1204)
+ #define EXYNOS5_PAD_RETENTION_EFNAND_SYS_PWR_REG      S5P_PMUREG(0x1208)
+ #define EXYNOS5_PAD_RETENTION_GPIO_SYS_PWR_REG                S5P_PMUREG(0x1220)
+ #define EXYNOS5_PAD_RETENTION_UART_SYS_PWR_REG                S5P_PMUREG(0x1224)
+ #define EXYNOS5_PAD_RETENTION_MMCA_SYS_PWR_REG                S5P_PMUREG(0x1228)
+ #define EXYNOS5_PAD_RETENTION_MMCB_SYS_PWR_REG                S5P_PMUREG(0x122C)
+ #define EXYNOS5_PAD_RETENTION_EBIA_SYS_PWR_REG                S5P_PMUREG(0x1230)
+ #define EXYNOS5_PAD_RETENTION_EBIB_SYS_PWR_REG                S5P_PMUREG(0x1234)
+ #define EXYNOS5_PAD_RETENTION_SPI_SYS_PWR_REG         S5P_PMUREG(0x1238)
+ #define EXYNOS5_PAD_RETENTION_GPIO_SYSMEM_SYS_PWR_REG S5P_PMUREG(0x123C)
+ #define EXYNOS5_PAD_ISOLATION_SYS_PWR_REG             S5P_PMUREG(0x1240)
+ #define EXYNOS5_PAD_ISOLATION_SYSMEM_SYS_PWR_REG      S5P_PMUREG(0x1250)
+ #define EXYNOS5_PAD_ALV_SEL_SYS_PWR_REG                       S5P_PMUREG(0x1260)
+ #define EXYNOS5_XUSBXTI_SYS_PWR_REG                   S5P_PMUREG(0x1280)
+ #define EXYNOS5_XXTI_SYS_PWR_REG                      S5P_PMUREG(0x1284)
+ #define EXYNOS5_EXT_REGULATOR_SYS_PWR_REG             S5P_PMUREG(0x12C0)
+ #define EXYNOS5_GPIO_MODE_SYS_PWR_REG                 S5P_PMUREG(0x1300)
+ #define EXYNOS5_GPIO_MODE_SYSMEM_SYS_PWR_REG          S5P_PMUREG(0x1320)
+ #define EXYNOS5_GPIO_MODE_MAU_SYS_PWR_REG             S5P_PMUREG(0x1340)
+ #define EXYNOS5_TOP_ASB_RESET_SYS_PWR_REG             S5P_PMUREG(0x1344)
+ #define EXYNOS5_TOP_ASB_ISOLATION_SYS_PWR_REG         S5P_PMUREG(0x1348)
+ #define EXYNOS5_GSCL_SYS_PWR_REG                      S5P_PMUREG(0x1400)
+ #define EXYNOS5_ISP_SYS_PWR_REG                               S5P_PMUREG(0x1404)
+ #define EXYNOS5_MFC_SYS_PWR_REG                               S5P_PMUREG(0x1408)
+ #define EXYNOS5_G3D_SYS_PWR_REG                               S5P_PMUREG(0x140C)
+ #define EXYNOS5_DISP1_SYS_PWR_REG                     S5P_PMUREG(0x1414)
+ #define EXYNOS5_MAU_SYS_PWR_REG                               S5P_PMUREG(0x1418)
+ #define EXYNOS5_GPS_SYS_PWR_REG                               S5P_PMUREG(0x141C)
+ #define EXYNOS5_CMU_CLKSTOP_GSCL_SYS_PWR_REG          S5P_PMUREG(0x1480)
+ #define EXYNOS5_CMU_CLKSTOP_ISP_SYS_PWR_REG           S5P_PMUREG(0x1484)
+ #define EXYNOS5_CMU_CLKSTOP_MFC_SYS_PWR_REG           S5P_PMUREG(0x1488)
+ #define EXYNOS5_CMU_CLKSTOP_G3D_SYS_PWR_REG           S5P_PMUREG(0x148C)
+ #define EXYNOS5_CMU_CLKSTOP_DISP1_SYS_PWR_REG         S5P_PMUREG(0x1494)
+ #define EXYNOS5_CMU_CLKSTOP_MAU_SYS_PWR_REG           S5P_PMUREG(0x1498)
+ #define EXYNOS5_CMU_CLKSTOP_GPS_SYS_PWR_REG           S5P_PMUREG(0x149C)
+ #define EXYNOS5_CMU_SYSCLK_GSCL_SYS_PWR_REG           S5P_PMUREG(0x14C0)
+ #define EXYNOS5_CMU_SYSCLK_ISP_SYS_PWR_REG            S5P_PMUREG(0x14C4)
+ #define EXYNOS5_CMU_SYSCLK_MFC_SYS_PWR_REG            S5P_PMUREG(0x14C8)
+ #define EXYNOS5_CMU_SYSCLK_G3D_SYS_PWR_REG            S5P_PMUREG(0x14CC)
+ #define EXYNOS5_CMU_SYSCLK_DISP1_SYS_PWR_REG          S5P_PMUREG(0x14D4)
+ #define EXYNOS5_CMU_SYSCLK_MAU_SYS_PWR_REG            S5P_PMUREG(0x14D8)
+ #define EXYNOS5_CMU_SYSCLK_GPS_SYS_PWR_REG            S5P_PMUREG(0x14DC)
+ #define EXYNOS5_CMU_RESET_GSCL_SYS_PWR_REG            S5P_PMUREG(0x1580)
+ #define EXYNOS5_CMU_RESET_ISP_SYS_PWR_REG             S5P_PMUREG(0x1584)
+ #define EXYNOS5_CMU_RESET_MFC_SYS_PWR_REG             S5P_PMUREG(0x1588)
+ #define EXYNOS5_CMU_RESET_G3D_SYS_PWR_REG             S5P_PMUREG(0x158C)
+ #define EXYNOS5_CMU_RESET_DISP1_SYS_PWR_REG           S5P_PMUREG(0x1594)
+ #define EXYNOS5_CMU_RESET_MAU_SYS_PWR_REG             S5P_PMUREG(0x1598)
+ #define EXYNOS5_CMU_RESET_GPS_SYS_PWR_REG             S5P_PMUREG(0x159C)
+ #define EXYNOS5_ARM_CORE0_OPTION                      S5P_PMUREG(0x2008)
+ #define EXYNOS5_ARM_CORE1_OPTION                      S5P_PMUREG(0x2088)
+ #define EXYNOS5_FSYS_ARM_OPTION                               S5P_PMUREG(0x2208)
+ #define EXYNOS5_ISP_ARM_OPTION                                S5P_PMUREG(0x2288)
+ #define EXYNOS5_ARM_COMMON_OPTION                     S5P_PMUREG(0x2408)
+ #define EXYNOS5_TOP_PWR_OPTION                                S5P_PMUREG(0x2C48)
+ #define EXYNOS5_TOP_PWR_SYSMEM_OPTION                 S5P_PMUREG(0x2CC8)
+ #define EXYNOS5_JPEG_MEM_OPTION                               S5P_PMUREG(0x2F48)
+ #define EXYNOS5_GSCL_STATUS                           S5P_PMUREG(0x4004)
+ #define EXYNOS5_ISP_STATUS                            S5P_PMUREG(0x4024)
+ #define EXYNOS5_GSCL_OPTION                           S5P_PMUREG(0x4008)
+ #define EXYNOS5_ISP_OPTION                            S5P_PMUREG(0x4028)
+ #define EXYNOS5_MFC_OPTION                            S5P_PMUREG(0x4048)
+ #define EXYNOS5_G3D_CONFIGURATION                     S5P_PMUREG(0x4060)
+ #define EXYNOS5_G3D_STATUS                            S5P_PMUREG(0x4064)
+ #define EXYNOS5_G3D_OPTION                            S5P_PMUREG(0x4068)
+ #define EXYNOS5_DISP1_OPTION                          S5P_PMUREG(0x40A8)
+ #define EXYNOS5_MAU_OPTION                            S5P_PMUREG(0x40C8)
+ #define EXYNOS5_GPS_OPTION                            S5P_PMUREG(0x40E8)
+ #define EXYNOS5_USE_SC_FEEDBACK                                       (1 << 1)
+ #define EXYNOS5_USE_SC_COUNTER                                        (1 << 0)
+ #define EXYNOS5_MANUAL_L2RSTDISABLE_CONTROL                   (1 << 2)
+ #define EXYNOS5_SKIP_DEACTIVATE_ACEACP_IN_PWDN                        (1 << 7)
+ #define EXYNOS5_OPTION_USE_STANDBYWFE                         (1 << 24)
+ #define EXYNOS5_OPTION_USE_STANDBYWFI                         (1 << 16)
+ #define EXYNOS5_OPTION_USE_RETENTION                          (1 << 4)
+ #define EXYNOS5_SYS_I2C_CFG                                   S5P_SYSREG(0x234)
 +#define EXYNOS5_SYS_DISP1BLK_CFG              S5P_SYSREG(0x214)
 +#define ENABLE_FIMDBYPASS_DISP1                       (1 << 15)
  
  #endif /* __ASM_ARCH_REGS_PMU_H */
  #include <plat/regs-iic.h>
  #include <plat/iic.h>
  
 -/* i2c controller state */
 +/* Treat S3C2410 as baseline hardware, anything else is supported via quirks */
 +#define QUIRK_S3C2440         (1 << 0)
 +#define QUIRK_HDMIPHY         (1 << 1)
 +#define QUIRK_NO_GPIO         (1 << 2)
  
 +/* i2c controller state */
  enum s3c24xx_i2c_state {
        STATE_IDLE,
        STATE_START,
        STATE_STOP
  };
  
 -enum s3c24xx_i2c_type {
 -      TYPE_S3C2410,
 -      TYPE_S3C2440,
 -};
 -
  struct s3c24xx_i2c {
        spinlock_t              lock;
        wait_queue_head_t       wait;
 +      unsigned int            quirks;
        unsigned int            suspended:1;
  
        struct i2c_msg          *msg;
  #endif
  };
  
 -/* default platform data removed, dev should always carry data. */
 +static struct platform_device_id s3c24xx_driver_ids[] = {
 +      {
 +              .name           = "s3c2410-i2c",
 +              .driver_data    = 0,
 +      }, {
 +              .name           = "s3c2440-i2c",
 +              .driver_data    = QUIRK_S3C2440,
 +      }, {
 +              .name           = "s3c2440-hdmiphy-i2c",
 +              .driver_data    = QUIRK_S3C2440 | QUIRK_HDMIPHY | QUIRK_NO_GPIO,
 +      }, { },
 +};
 +MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids);
 +
 +#ifdef CONFIG_OF
 +static const struct of_device_id s3c24xx_i2c_match[] = {
 +      { .compatible = "samsung,s3c2410-i2c", .data = (void *)0 },
 +      { .compatible = "samsung,s3c2440-i2c", .data = (void *)QUIRK_S3C2440 },
 +      { .compatible = "samsung,s3c2440-hdmiphy-i2c",
 +        .data = (void *)(QUIRK_S3C2440 | QUIRK_HDMIPHY | QUIRK_NO_GPIO) },
 +      {},
 +};
 +MODULE_DEVICE_TABLE(of, s3c24xx_i2c_match);
 +#endif
  
 -/* s3c24xx_i2c_is2440()
 +/* s3c24xx_get_device_quirks
   *
 - * return true is this is an s3c2440
 + * Get controller type either from device tree or platform device variant.
  */
  
 -static inline int s3c24xx_i2c_is2440(struct s3c24xx_i2c *i2c)
 +static inline unsigned int s3c24xx_get_device_quirks(struct platform_device *pdev)
  {
 -      struct platform_device *pdev = to_platform_device(i2c->dev);
 -      enum s3c24xx_i2c_type type;
 -
 -#ifdef CONFIG_OF
 -      if (i2c->dev->of_node)
 -              return of_device_is_compatible(i2c->dev->of_node,
 -                              "samsung,s3c2440-i2c");
 -#endif
 +      if (pdev->dev.of_node) {
 +              const struct of_device_id *match;
 +              match = of_match_node(of_match_ptr(s3c24xx_i2c_match),
 +                                    pdev->dev.of_node);
 +              return (unsigned int)match->data;
 +      }
  
 -      type = platform_get_device_id(pdev)->driver_data;
 -      return type == TYPE_S3C2440;
 +      return platform_get_device_id(pdev)->driver_data;
  }
  
  /* s3c24xx_i2c_master_complete
@@@ -491,13 -471,6 +491,13 @@@ static int s3c24xx_i2c_set_master(struc
        unsigned long iicstat;
        int timeout = 400;
  
 +      /* the timeout for HDMIPHY is reduced to 10 ms because
 +       * the hangup is expected to happen, so waiting 400 ms
 +       * causes only unnecessary system hangup
 +       */
 +      if (i2c->quirks & QUIRK_HDMIPHY)
 +              timeout = 10;
 +
        while (timeout-- > 0) {
                iicstat = readl(i2c->regs + S3C2410_IICSTAT);
  
                msleep(1);
        }
  
 +      /* hang-up of bus dedicated for HDMIPHY occurred, resetting */
 +      if (i2c->quirks & QUIRK_HDMIPHY) {
 +              writel(0, i2c->regs + S3C2410_IICCON);
 +              writel(0, i2c->regs + S3C2410_IICSTAT);
 +              writel(0, i2c->regs + S3C2410_IICDS);
 +
 +              return 0;
 +      }
 +
        return -ETIMEDOUT;
  }
  
@@@ -712,7 -676,7 +712,7 @@@ static int s3c24xx_i2c_clockrate(struc
  
        writel(iiccon, i2c->regs + S3C2410_IICCON);
  
 -      if (s3c24xx_i2c_is2440(i2c)) {
 +      if (i2c->quirks & QUIRK_S3C2440) {
                unsigned long sda_delay;
  
                if (pdata->sda_delay) {
@@@ -797,15 -761,13 +797,16 @@@ static int s3c24xx_i2c_parse_dt_gpio(st
  {
        int idx, gpio, ret;
  
 +      if (i2c->quirks & QUIRK_NO_GPIO)
 +              return 0;
 +
        for (idx = 0; idx < 2; idx++) {
                gpio = of_get_gpio(i2c->dev->of_node, idx);
                if (!gpio_is_valid(gpio)) {
                        dev_err(i2c->dev, "invalid gpio[%d]: %d\n", idx, gpio);
                        goto free_gpio;
                }
+               i2c->gpios[idx] = gpio;
  
                ret = gpio_request(gpio, "i2c-bus");
                if (ret) {
@@@ -824,10 -786,6 +825,10 @@@ free_gpio
  static void s3c24xx_i2c_dt_gpio_free(struct s3c24xx_i2c *i2c)
  {
        unsigned int idx;
 +
 +      if (i2c->quirks & QUIRK_NO_GPIO)
 +              return;
 +
        for (idx = 0; idx < 2; idx++)
                gpio_free(i2c->gpios[idx]);
  }
@@@ -899,18 -857,11 +900,18 @@@ static voi
  s3c24xx_i2c_parse_dt(struct device_node *np, struct s3c24xx_i2c *i2c)
  {
        struct s3c2410_platform_i2c *pdata = i2c->pdata;
 +      int id;
  
        if (!np)
                return;
  
 -      pdata->bus_num = -1; /* i2c bus number is dynamically assigned */
 +      id = of_alias_get_id(np, "i2c");
 +      if (id < 0) {
 +              dev_warn(i2c->dev, "failed to get alias id:%d\n", id);
 +              pdata->bus_num = -1;
 +      } else
 +              /* i2c bus number is statically assigned from alias*/
 +              pdata->bus_num = id;
        of_property_read_u32(np, "samsung,i2c-sda-delay", &pdata->sda_delay);
        of_property_read_u32(np, "samsung,i2c-slave-addr", &pdata->slave_addr);
        of_property_read_u32(np, "samsung,i2c-max-bus-freq",
@@@ -956,7 -907,6 +957,7 @@@ static int s3c24xx_i2c_probe(struct pla
                goto err_noclk;
        }
  
 +      i2c->quirks = s3c24xx_get_device_quirks(pdev);
        if (pdata)
                memcpy(i2c->pdata, pdata, sizeof(*pdata));
        else
@@@ -1131,6 -1081,7 +1132,7 @@@ static int s3c24xx_i2c_suspend_noirq(st
        struct platform_device *pdev = to_platform_device(dev);
        struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev);
  
+       s3c24xx_i2c_dt_gpio_free(i2c);
        i2c->suspended = 1;
  
        return 0;
@@@ -1161,6 -1112,28 +1163,6 @@@ static const struct dev_pm_ops s3c24xx_
  
  /* device driver for platform bus bits */
  
 -static struct platform_device_id s3c24xx_driver_ids[] = {
 -      {
 -              .name           = "s3c2410-i2c",
 -              .driver_data    = TYPE_S3C2410,
 -      }, {
 -              .name           = "s3c2440-i2c",
 -              .driver_data    = TYPE_S3C2440,
 -      }, { },
 -};
 -MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids);
 -
 -#ifdef CONFIG_OF
 -static const struct of_device_id s3c24xx_i2c_match[] = {
 -      { .compatible = "samsung,s3c2410-i2c" },
 -      { .compatible = "samsung,s3c2440-i2c" },
 -      {},
 -};
 -MODULE_DEVICE_TABLE(of, s3c24xx_i2c_match);
 -#else
 -#define s3c24xx_i2c_match NULL
 -#endif
 -
  static struct platform_driver s3c24xx_i2c_driver = {
        .probe          = s3c24xx_i2c_probe,
        .remove         = s3c24xx_i2c_remove,
                .owner  = THIS_MODULE,
                .name   = "s3c-i2c",
                .pm     = S3C24XX_DEV_PM_OPS,
 -              .of_match_table = s3c24xx_i2c_match,
 +              .of_match_table = of_match_ptr(s3c24xx_i2c_match),
        },
  };