[PATCH v10 2/3] ARM: EXYNOS: Change System MMU platform device definitions

Kyungmin Park kyungmin.park at samsung.com
Tue Mar 6 05:03:29 EST 2012


Hi,

On 3/6/12, KyongHo Cho <pullip.cho at samsung.com> wrote:
> Handling System MMUs with an identifier is not flexible to manage
> System MMU platform devices because of the following reasons:
> 1. A device driver which needs to handle System MMU must know the ID.
> 2. A System MMU may not present in some implementations of Exynos family.
> 3. Handling System MMU with IOMMU API does not require an ID.
>
> This patch is the result of removing ID of System MMUs.
> Instead, a device driver that needs to handle its System MMU must
> use IOMMU API while its descriptor of platform device is given.
>
> This patch also includes the following enhanclements:
> - A System MMU device becomes a child if its power domain device.
> - clkdev
>
> Signed-off-by: KyongHo Cho <pullip.cho at samsung.com>
> ---
>  arch/arm/mach-exynos/Kconfig                    |   11 +-
>  arch/arm/mach-exynos/Makefile                   |    2 +-
>  arch/arm/mach-exynos/clock-exynos4.c            |   79 ++--
>  arch/arm/mach-exynos/clock-exynos4.h            |    2 +
>  arch/arm/mach-exynos/clock-exynos4210.c         |   11 +
>  arch/arm/mach-exynos/clock-exynos4212.c         |   28 ++-
>  arch/arm/mach-exynos/clock-exynos5.c            |   90 +++++
>  arch/arm/mach-exynos/dev-sysmmu.c               |  457
> ++++++++++++----------
>  arch/arm/mach-exynos/include/mach/irqs.h        |  179 +++++-----
>  arch/arm/mach-exynos/include/mach/map.h         |   38 ++
>  arch/arm/mach-exynos/include/mach/regs-clock.h  |    5 +
>  arch/arm/mach-exynos/include/mach/regs-sysmmu.h |   28 --
>  arch/arm/mach-exynos/include/mach/sysmmu.h      |   84 +++--
>  arch/arm/mach-exynos/mach-armlex4210.c          |    1 -
>  arch/arm/mach-exynos/mach-smdkv310.c            |    1 -
>  15 files changed, 612 insertions(+), 404 deletions(-)
>  delete mode 100644 arch/arm/mach-exynos/include/mach/regs-sysmmu.h
>
> diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig
> index c49d450..d5a6a29 100644
> --- a/arch/arm/mach-exynos/Kconfig
> +++ b/arch/arm/mach-exynos/Kconfig
> @@ -88,10 +88,10 @@ config EXYNOS4_SETUP_FIMD0
>  	help
>  	  Common setup code for FIMD0.
>
> -config EXYNOS4_DEV_SYSMMU
> +config EXYNOS_DEV_SYSMMU
>  	bool
>  	help
> -	  Common setup code for SYSTEM MMU in EXYNOS4
> +	  Common setup code for SYSTEM MMU in EXYNOS platforms
>
>  config EXYNOS4_DEV_DWMCI
>  	bool
> @@ -201,12 +201,12 @@ config MACH_SMDKV310
>  	select S3C_DEV_HSMMC2
>  	select S3C_DEV_HSMMC3
>  	select SAMSUNG_DEV_BACKLIGHT
> +	select EXYNOS_DEV_SYSMMU
>  	select EXYNOS4_DEV_AHCI
>  	select SAMSUNG_DEV_KEYPAD
>  	select EXYNOS4_DEV_DMA
>  	select SAMSUNG_DEV_PWM
>  	select EXYNOS4_DEV_USB_OHCI
> -	select EXYNOS4_DEV_SYSMMU
>  	select EXYNOS4_SETUP_FIMD0
>  	select EXYNOS4_SETUP_I2C1
>  	select EXYNOS4_SETUP_KEYPAD
> @@ -225,7 +225,6 @@ config MACH_ARMLEX4210
>  	select S3C_DEV_HSMMC3
>  	select EXYNOS4_DEV_AHCI
>  	select EXYNOS4_DEV_DMA
> -	select EXYNOS4_DEV_SYSMMU
>  	select EXYNOS4_SETUP_SDHCI
>  	help
>  	  Machine support for Samsung ARMLEX4210 based on EXYNOS4210
> @@ -251,6 +250,7 @@ config MACH_UNIVERSAL_C210
>  	select S5P_DEV_MFC
>  	select S5P_DEV_ONENAND
>  	select S5P_DEV_TV
> +	select EXYNOS_DEV_SYSMMU
>  	select EXYNOS4_DEV_DMA
>  	select EXYNOS4_SETUP_FIMD0
>  	select EXYNOS4_SETUP_I2C1
> @@ -320,6 +320,7 @@ config MACH_ORIGEN
>  	select S5P_DEV_USB_EHCI
>  	select SAMSUNG_DEV_BACKLIGHT
>  	select SAMSUNG_DEV_PWM
> +	select EXYNOS_DEV_SYSMMU
>  	select EXYNOS4_DEV_DMA
>  	select EXYNOS4_DEV_USB_OHCI
>  	select EXYNOS4_SETUP_FIMD0
> @@ -343,6 +344,7 @@ config MACH_SMDK4212
>  	select SAMSUNG_DEV_BACKLIGHT
>  	select SAMSUNG_DEV_KEYPAD
>  	select SAMSUNG_DEV_PWM
> +	select EXYNOS_DEV_SYSMMU
>  	select EXYNOS4_SETUP_I2C1
>  	select EXYNOS4_SETUP_I2C3
>  	select EXYNOS4_SETUP_I2C7
> @@ -368,6 +370,7 @@ comment "EXYNOS5250 Boards"
>  config MACH_SMDK5250
>  	bool "SMDK5250"
>  	select SOC_EXYNOS5250
> +	select EXYNOS_DEV_SYSMMU
>  	help
>  	  Machine support for Samsung SMDK5250
>  endif
> diff --git a/arch/arm/mach-exynos/Makefile b/arch/arm/mach-exynos/Makefile
> index 6fd8dd9..8b655e9 100644
> --- a/arch/arm/mach-exynos/Makefile
> +++ b/arch/arm/mach-exynos/Makefile
> @@ -52,7 +52,7 @@ obj-$(CONFIG_MACH_SMDK5250)		+= mach-smdk5250.o
>  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_EXYNOS4_DEV_DMA)		+= dma.o
>  obj-$(CONFIG_EXYNOS4_DEV_USB_OHCI)	+= dev-ohci.o
> diff --git a/arch/arm/mach-exynos/clock-exynos4.c
> b/arch/arm/mach-exynos/clock-exynos4.c
> index d72a1fe..18c48f0 100644
> --- a/arch/arm/mach-exynos/clock-exynos4.c
> +++ b/arch/arm/mach-exynos/clock-exynos4.c
> @@ -169,7 +169,7 @@ 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)
> +int exynos4_clk_ip_image_ctrl(struct clk *clk, int enable)
>  {
>  	return s5p_gatectrl(EXYNOS4_CLKGATE_IP_IMAGE, clk, enable);
>  }
> @@ -199,6 +199,11 @@ static int exynos4_clk_ip_perir_ctrl(struct clk *clk,
> int enable)
>  	return s5p_gatectrl(EXYNOS4_CLKGATE_IP_PERIR, clk, enable);
>  }
>
> +int exynos4_clk_ip_dmc_ctrl(struct clk *clk, int enable)
> +{
> +	return s5p_gatectrl(EXYNOS4_CLKGATE_IP_DMC, clk, enable);
> +}
> +
>  static int exynos4_clk_hdmiphy_ctrl(struct clk *clk, int enable)
>  {
>  	return s5p_gatectrl(S5P_HDMI_PHY_CONTROL, clk, enable);
> @@ -679,61 +684,55 @@ static struct clk exynos4_init_clocks_off[] = {
>  		.enable		= exynos4_clk_ip_peril_ctrl,
>  		.ctrlbit	= (1 << 14),
>  	}, {
> -		.name		= "SYSMMU_MDMA",
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(mfc_l, 0),
> +		.enable		= exynos4_clk_ip_mfc_ctrl,
> +		.ctrlbit	= (1 << 1),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(mfc_r, 1),
> +		.enable		= exynos4_clk_ip_mfc_ctrl,
> +		.ctrlbit	= (1 << 2),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(tv, 2),
> +		.enable		= exynos4_clk_ip_tv_ctrl,
> +		.ctrlbit	= (1 << 4),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(jpeg, 3),
> +		.enable		= exynos4_clk_ip_cam_ctrl,
> +		.ctrlbit	= (1 << 11),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(rot, 4),
>  		.enable		= exynos4_clk_ip_image_ctrl,
> -		.ctrlbit	= (1 << 5),
> +		.ctrlbit	= (1 << 4),
>  	}, {
> -		.name		= "SYSMMU_FIMC0",
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(fimc0, 5),
>  		.enable		= exynos4_clk_ip_cam_ctrl,
>  		.ctrlbit	= (1 << 7),
>  	}, {
> -		.name		= "SYSMMU_FIMC1",
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(fimc1, 6),
>  		.enable		= exynos4_clk_ip_cam_ctrl,
>  		.ctrlbit	= (1 << 8),
>  	}, {
> -		.name		= "SYSMMU_FIMC2",
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(fimc2, 7),
>  		.enable		= exynos4_clk_ip_cam_ctrl,
>  		.ctrlbit	= (1 << 9),
>  	}, {
> -		.name		= "SYSMMU_FIMC3",
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(fimc3, 8),
>  		.enable		= exynos4_clk_ip_cam_ctrl,
>  		.ctrlbit	= (1 << 10),
>  	}, {
> -		.name		= "SYSMMU_JPEG",
> -		.enable		= exynos4_clk_ip_cam_ctrl,
> -		.ctrlbit	= (1 << 11),
> -	}, {
> -		.name		= "SYSMMU_FIMD0",
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(fimd0, 10),
>  		.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),
>  	}
>  };
>
> diff --git a/arch/arm/mach-exynos/clock-exynos4.h
> b/arch/arm/mach-exynos/clock-exynos4.h
> index 9d27a56..309cc71 100644
> --- a/arch/arm/mach-exynos/clock-exynos4.h
> +++ b/arch/arm/mach-exynos/clock-exynos4.h
> @@ -28,5 +28,7 @@ extern struct clk *exynos4_clkset_group_list[];
>  extern int exynos4_clksrc_mask_fsys_ctrl(struct clk *clk, int enable);
>  extern int exynos4_clk_ip_fsys_ctrl(struct clk *clk, int enable);
>  extern int exynos4_clk_ip_lcd1_ctrl(struct clk *clk, int enable);
> +extern int exynos4_clk_ip_image_ctrl(struct clk *clk, int enable);
> +extern int exynos4_clk_ip_dmc_ctrl(struct clk *clk, int enable);
>
>  #endif /* __ASM_ARCH_CLOCK_H */
> diff --git a/arch/arm/mach-exynos/clock-exynos4210.c
> b/arch/arm/mach-exynos/clock-exynos4210.c
> index 68763b3..c1fcd2f 100644
> --- a/arch/arm/mach-exynos/clock-exynos4210.c
> +++ b/arch/arm/mach-exynos/clock-exynos4210.c
> @@ -28,6 +28,7 @@
>  #include <mach/hardware.h>
>  #include <mach/map.h>
>  #include <mach/regs-clock.h>
> +#include <mach/sysmmu.h>
>
>  #include "clock-exynos4.h"
>  #include "common.h"
> @@ -96,6 +97,16 @@ static struct clk init_clocks_off[] = {
>  		.devname	= "exynos4-fb.1",
>  		.enable		= exynos4_clk_ip_lcd1_ctrl,
>  		.ctrlbit	= (1 << 0),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(2d, 14),
> +		.enable		= exynos4_clk_ip_image_ctrl,
> +		.ctrlbit	= (1 << 3),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(fimd1, 11),
> +		.enable		= exynos4_clk_ip_lcd1_ctrl,
> +		.ctrlbit	= (1 << 4),
>  	},
>  };
>
> diff --git a/arch/arm/mach-exynos/clock-exynos4212.c
> b/arch/arm/mach-exynos/clock-exynos4212.c
> index f22a0a2..e1059a2 100644
> --- a/arch/arm/mach-exynos/clock-exynos4212.c
> +++ b/arch/arm/mach-exynos/clock-exynos4212.c
> @@ -28,6 +28,7 @@
>  #include <mach/hardware.h>
>  #include <mach/map.h>
>  #include <mach/regs-clock.h>
> +#include <mach/sysmmu.h>
>
>  #include "clock-exynos4.h"
>  #include "common.h"
> @@ -41,6 +42,16 @@ static struct sleep_save exynos4212_clock_save[] = {
>  };
>  #endif
>
> +static int exynos4212_clk_ip_isp0_ctrl(struct clk *clk, int enable)
> +{
> +	return s5p_gatectrl(EXYNOS4_CLKGATE_IP_ISP0, clk, enable);
> +}
> +
> +static int exynos4212_clk_ip_isp1_ctrl(struct clk *clk, int enable)
> +{
> +	return s5p_gatectrl(EXYNOS4_CLKGATE_IP_ISP1, clk, enable);
> +}
> +
>  static struct clk *clk_src_mpll_user_list[] = {
>  	[0] = &clk_fin_mpll,
>  	[1] = &exynos4_clk_mout_mpll.clk,
> @@ -68,7 +79,22 @@ static struct clksrc_clk clksrcs[] = {
>  };
>
>  static struct clk init_clocks_off[] = {
> -	/* nothing here yet */
> +	{
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(2d, 14),
> +		.enable		= exynos4_clk_ip_dmc_ctrl,
> +		.ctrlbit	= (1 << 24),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(isp, 9),
> +		.enable		= exynos4212_clk_ip_isp0_ctrl,
> +		.ctrlbit	= (7 << 8),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME2,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(isp, 9),
> +		.enable		= exynos4212_clk_ip_isp1_ctrl,
> +		.ctrlbit	= (1 << 4),
> +	}
>  };
>
>  #ifdef CONFIG_PM_SLEEP
> diff --git a/arch/arm/mach-exynos/clock-exynos5.c
> b/arch/arm/mach-exynos/clock-exynos5.c
> index d013982..3320ad1 100644
> --- a/arch/arm/mach-exynos/clock-exynos5.c
> +++ b/arch/arm/mach-exynos/clock-exynos5.c
> @@ -82,6 +82,11 @@ static int exynos5_clksrc_mask_peric0_ctrl(struct clk
> *clk, int enable)
>  	return s5p_gatectrl(EXYNOS5_CLKSRC_MASK_PERIC0, 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_core_ctrl(struct clk *clk, int enable)
>  {
>  	return s5p_gatectrl(EXYNOS5_CLKGATE_IP_CORE, clk, enable);
> @@ -127,6 +132,21 @@ static int exynos5_clk_ip_peris_ctrl(struct clk *clk,
> int enable)
>  	return s5p_gatectrl(EXYNOS5_CLKGATE_IP_PERIS, 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_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);
> +}
> +
>  /* Core list of CMU_CPU side */
>
>  static struct clksrc_clk exynos5_clk_mout_apll = {
> @@ -630,6 +650,76 @@ static struct clk exynos5_init_clocks_off[] = {
>  		.parent		= &exynos5_clk_aclk_66.clk,
>  		.enable		= exynos5_clk_ip_peric_ctrl,
>  		.ctrlbit	= (1 << 14),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(mfc_l, 0),
> +		.enable		= &exynos5_clk_ip_mfc_ctrl,
> +		.ctrlbit	= (1 << 1),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(mfc_r, 1),
> +		.enable		= &exynos5_clk_ip_mfc_ctrl,
> +		.ctrlbit	= (1 << 2),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(tv, 2),
> +		.enable		= &exynos5_clk_ip_disp1_ctrl,
> +		.ctrlbit	= (1 << 9)
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(jpeg, 3),
> +		.enable		= &exynos5_clk_ip_gen_ctrl,
> +		.ctrlbit	= (1 << 7),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(rot, 4),
> +		.enable		= &exynos5_clk_ip_gen_ctrl,
> +		.ctrlbit	= (1 << 6)
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(gsc0, 5),
> +		.enable		= &exynos5_clk_ip_gscl_ctrl,
> +		.ctrlbit	= (1 << 7),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(gsc1, 6),
> +		.enable		= &exynos5_clk_ip_gscl_ctrl,
> +		.ctrlbit	= (1 << 8),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(gsc2, 7),
> +		.enable		= &exynos5_clk_ip_gscl_ctrl,
> +		.ctrlbit	= (1 << 9),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(gsc3, 8),
> +		.enable		= &exynos5_clk_ip_gscl_ctrl,
> +		.ctrlbit	= (1 << 10),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(isp, 9),
> +		.enable		= &exynos5_clk_ip_isp0_ctrl,
> +		.ctrlbit	= (0x3F << 8),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME2,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(isp, 9),
> +		.enable		= &exynos5_clk_ip_isp1_ctrl,
> +		.ctrlbit	= (0xF << 4),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(camif0, 12),
> +		.enable		= &exynos5_clk_ip_gscl_ctrl,
> +		.ctrlbit	= (1 << 11),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(camif1, 13),
> +		.enable		= &exynos5_clk_ip_gscl_ctrl,
> +		.ctrlbit	= (1 << 12),
> +	}, {
> +		.name		= SYSMMU_CLOCK_NAME,
> +		.devname	= SYSMMU_CLOCK_DEVNAME(2d, 14),
> +		.enable		= &exynos5_clk_ip_acp_ctrl,
> +		.ctrlbit	= (1 << 7)
>  	}
>  };
>
> diff --git a/arch/arm/mach-exynos/dev-sysmmu.c
> b/arch/arm/mach-exynos/dev-sysmmu.c
> index 781563f..c5b1ea3 100644
> --- a/arch/arm/mach-exynos/dev-sysmmu.c
> +++ b/arch/arm/mach-exynos/dev-sysmmu.c
> @@ -1,9 +1,9 @@
> -/* linux/arch/arm/mach-exynos4/dev-sysmmu.c
> +/* linux/arch/arm/mach-exynos/dev-sysmmu.c
>   *
> - * Copyright (c) 2010 Samsung Electronics Co., Ltd.
> + * Copyright (c) 2010-2012 Samsung Electronics Co., Ltd.
>   *		http://www.samsung.com
>   *
> - * EXYNOS4 - System MMU support
> + * EXYNOS - System MMU 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
> @@ -12,222 +12,263 @@
>
>  #include <linux/platform_device.h>
>  #include <linux/dma-mapping.h>
> -#include <linux/export.h>
> +
> +#include <plat/cpu.h>
>
>  #include <mach/map.h>
>  #include <mach/irqs.h>
>  #include <mach/sysmmu.h>
> -#include <plat/s5p-clock.h>
> -
> -/* These names must be equal to the clock names in mach-exynos4/clock.c */
> -const char *sysmmu_ips_name[EXYNOS4_SYSMMU_TOTAL_IPNUM] = {
> -	"SYSMMU_MDMA"	,
> -	"SYSMMU_SSS"	,
> -	"SYSMMU_FIMC0"	,
> -	"SYSMMU_FIMC1"	,
> -	"SYSMMU_FIMC2"	,
> -	"SYSMMU_FIMC3"	,
> -	"SYSMMU_JPEG"	,
> -	"SYSMMU_FIMD0"	,
> -	"SYSMMU_FIMD1"	,
> -	"SYSMMU_PCIe"	,
> -	"SYSMMU_G2D"	,
> -	"SYSMMU_ROTATOR",
> -	"SYSMMU_MDMA2"	,
> -	"SYSMMU_TV"	,
> -	"SYSMMU_MFC_L"	,
> -	"SYSMMU_MFC_R"	,
> -};
>
> -static struct resource exynos4_sysmmu_resource[] = {
> -	[0] = {
> -		.start	= EXYNOS4_PA_SYSMMU_MDMA,
> -		.end	= EXYNOS4_PA_SYSMMU_MDMA + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[1] = {
> -		.start	= IRQ_SYSMMU_MDMA0_0,
> -		.end	= IRQ_SYSMMU_MDMA0_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -	[2] = {
> -		.start	= EXYNOS4_PA_SYSMMU_SSS,
> -		.end	= EXYNOS4_PA_SYSMMU_SSS + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[3] = {
> -		.start	= IRQ_SYSMMU_SSS_0,
> -		.end	= IRQ_SYSMMU_SSS_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -	[4] = {
> -		.start	= EXYNOS4_PA_SYSMMU_FIMC0,
> -		.end	= EXYNOS4_PA_SYSMMU_FIMC0 + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[5] = {
> -		.start	= IRQ_SYSMMU_FIMC0_0,
> -		.end	= IRQ_SYSMMU_FIMC0_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -	[6] = {
> -		.start	= EXYNOS4_PA_SYSMMU_FIMC1,
> -		.end	= EXYNOS4_PA_SYSMMU_FIMC1 + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[7] = {
> -		.start	= IRQ_SYSMMU_FIMC1_0,
> -		.end	= IRQ_SYSMMU_FIMC1_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -	[8] = {
> -		.start	= EXYNOS4_PA_SYSMMU_FIMC2,
> -		.end	= EXYNOS4_PA_SYSMMU_FIMC2 + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[9] = {
> -		.start	= IRQ_SYSMMU_FIMC2_0,
> -		.end	= IRQ_SYSMMU_FIMC2_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -	[10] = {
> -		.start	= EXYNOS4_PA_SYSMMU_FIMC3,
> -		.end	= EXYNOS4_PA_SYSMMU_FIMC3 + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[11] = {
> -		.start	= IRQ_SYSMMU_FIMC3_0,
> -		.end	= IRQ_SYSMMU_FIMC3_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -	[12] = {
> -		.start	= EXYNOS4_PA_SYSMMU_JPEG,
> -		.end	= EXYNOS4_PA_SYSMMU_JPEG + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[13] = {
> -		.start	= IRQ_SYSMMU_JPEG_0,
> -		.end	= IRQ_SYSMMU_JPEG_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -	[14] = {
> -		.start	= EXYNOS4_PA_SYSMMU_FIMD0,
> -		.end	= EXYNOS4_PA_SYSMMU_FIMD0 + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[15] = {
> -		.start	= IRQ_SYSMMU_LCD0_M0_0,
> -		.end	= IRQ_SYSMMU_LCD0_M0_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -	[16] = {
> -		.start	= EXYNOS4_PA_SYSMMU_FIMD1,
> -		.end	= EXYNOS4_PA_SYSMMU_FIMD1 + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[17] = {
> -		.start	= IRQ_SYSMMU_LCD1_M1_0,
> -		.end	= IRQ_SYSMMU_LCD1_M1_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -	[18] = {
> -		.start	= EXYNOS4_PA_SYSMMU_PCIe,
> -		.end	= EXYNOS4_PA_SYSMMU_PCIe + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[19] = {
> -		.start	= IRQ_SYSMMU_PCIE_0,
> -		.end	= IRQ_SYSMMU_PCIE_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -	[20] = {
> -		.start	= EXYNOS4_PA_SYSMMU_G2D,
> -		.end	= EXYNOS4_PA_SYSMMU_G2D + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[21] = {
> -		.start	= IRQ_SYSMMU_2D_0,
> -		.end	= IRQ_SYSMMU_2D_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -	[22] = {
> -		.start	= EXYNOS4_PA_SYSMMU_ROTATOR,
> -		.end	= EXYNOS4_PA_SYSMMU_ROTATOR + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[23] = {
> -		.start	= IRQ_SYSMMU_ROTATOR_0,
> -		.end	= IRQ_SYSMMU_ROTATOR_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -	[24] = {
> -		.start	= EXYNOS4_PA_SYSMMU_MDMA2,
> -		.end	= EXYNOS4_PA_SYSMMU_MDMA2 + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[25] = {
> -		.start	= IRQ_SYSMMU_MDMA1_0,
> -		.end	= IRQ_SYSMMU_MDMA1_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -	[26] = {
> -		.start	= EXYNOS4_PA_SYSMMU_TV,
> -		.end	= EXYNOS4_PA_SYSMMU_TV + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[27] = {
> -		.start	= IRQ_SYSMMU_TV_M0_0,
> -		.end	= IRQ_SYSMMU_TV_M0_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -	[28] = {
> -		.start	= EXYNOS4_PA_SYSMMU_MFC_L,
> -		.end	= EXYNOS4_PA_SYSMMU_MFC_L + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[29] = {
> -		.start	= IRQ_SYSMMU_MFC_M0_0,
> -		.end	= IRQ_SYSMMU_MFC_M0_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -	[30] = {
> -		.start	= EXYNOS4_PA_SYSMMU_MFC_R,
> -		.end	= EXYNOS4_PA_SYSMMU_MFC_R + SZ_64K - 1,
> -		.flags	= IORESOURCE_MEM,
> -	},
> -	[31] = {
> -		.start	= IRQ_SYSMMU_MFC_M1_0,
> -		.end	= IRQ_SYSMMU_MFC_M1_0,
> -		.flags	= IORESOURCE_IRQ,
> -	},
> -};
> +static u64 exynos_sysmmu_dma_mask = DMA_BIT_MASK(32);
> +
> +#define SYSMMU_PLATFORM_DEVICE(ipname, devid)				\
> +static struct sysmmu_platform_data platdata_##ipname = {		\
> +	.dbgname = #ipname,						\
> +};									\
> +struct platform_device SYSMMU_PLATDEV(ipname) =				\
> +{									\
> +	.name		= SYSMMU_DEVNAME_BASE,				\
> +	.id		= devid,					\
> +	.dev		= {						\
> +		.dma_mask		= &exynos_sysmmu_dma_mask,	\
> +		.coherent_dma_mask	= DMA_BIT_MASK(32),		\
> +		.platform_data		= &platdata_##ipname,		\
> +	},								\
> +}
> +
> +SYSMMU_PLATFORM_DEVICE(mfc_l,	0);
> +SYSMMU_PLATFORM_DEVICE(mfc_r,	1);
> +SYSMMU_PLATFORM_DEVICE(tv,	2);
> +SYSMMU_PLATFORM_DEVICE(jpeg,	3);
> +SYSMMU_PLATFORM_DEVICE(rot,	4);
> +SYSMMU_PLATFORM_DEVICE(fimc0,	5); /* fimc* and gsc* exist exclusively */
> +SYSMMU_PLATFORM_DEVICE(fimc1,	6);
> +SYSMMU_PLATFORM_DEVICE(fimc2,	7);
> +SYSMMU_PLATFORM_DEVICE(fimc3,	8);
> +SYSMMU_PLATFORM_DEVICE(gsc0,	5);
> +SYSMMU_PLATFORM_DEVICE(gsc1,	6);
> +SYSMMU_PLATFORM_DEVICE(gsc2,	7);
> +SYSMMU_PLATFORM_DEVICE(gsc3,	8);
> +SYSMMU_PLATFORM_DEVICE(isp,	9);
> +SYSMMU_PLATFORM_DEVICE(fimd0,	10);
> +SYSMMU_PLATFORM_DEVICE(fimd1,	11);
> +SYSMMU_PLATFORM_DEVICE(camif0,	12);
> +SYSMMU_PLATFORM_DEVICE(camif1,	13);
> +SYSMMU_PLATFORM_DEVICE(2d,	14);
> +
> +#define SYSMMU_RESOURCE_NAME(core, ipname) sysmmures_##core##_##ipname
> +
> +#define SYSMMU_RESOURCE(core, ipname)					\
> +	static struct resource SYSMMU_RESOURCE_NAME(core, ipname)[] __initdata =
> +
> +#define DEFINE_SYSMMU_RESOURCE(core, mem, irq)				\
> +	DEFINE_RES_MEM_NAMED(core##_PA_SYSMMU_##mem, SZ_4K, #mem),	\
> +	DEFINE_RES_IRQ_NAMED(core##_IRQ_SYSMMU_##irq##_0, #mem)
> +
> +#define SYSMMU_RESOURCE_DEFINE(core, ipname, mem, irq)			\
> +	SYSMMU_RESOURCE(core, ipname) {					\
> +		DEFINE_SYSMMU_RESOURCE(core, mem, irq)			\
> +	}
>
> -struct platform_device exynos4_device_sysmmu = {
> -	.name		= "s5p-sysmmu",
> -	.id		= 32,
> -	.num_resources	= ARRAY_SIZE(exynos4_sysmmu_resource),
> -	.resource	= exynos4_sysmmu_resource,
> +struct sysmmu_resource_map {
> +	struct platform_device *pdev;
> +	struct resource *res;
> +	u32 rnum;
> +	struct device *pdd;
> +	char *clocknames;
>  };
> -EXPORT_SYMBOL(exynos4_device_sysmmu);
>
> -static struct clk *sysmmu_clk[S5P_SYSMMU_TOTAL_IPNUM];
> -void sysmmu_clk_init(struct device *dev, sysmmu_ips ips)
> -{
> -	sysmmu_clk[ips] = clk_get(dev, sysmmu_ips_name[ips]);
> -	if (IS_ERR(sysmmu_clk[ips]))
> -		sysmmu_clk[ips] = NULL;
> -	else
> -		clk_put(sysmmu_clk[ips]);
> +#define SYSMMU_RESOURCE_MAPPING(core, ipname, resname) {		\
> +	.pdev = &SYSMMU_PLATDEV(ipname),				\
> +	.res = SYSMMU_RESOURCE_NAME(EXYNOS##core, resname),		\
> +	.rnum = ARRAY_SIZE(SYSMMU_RESOURCE_NAME(EXYNOS##core, resname)),\
> +	.clocknames = SYSMMU_CLOCK_NAME,				\
>  }
>
> -void sysmmu_clk_enable(sysmmu_ips ips)
> -{
> -	if (sysmmu_clk[ips])
> -		clk_enable(sysmmu_clk[ips]);
> +#define SYSMMU_RESOURCE_MAPPING_MC(core, ipname, resname, pdata) {	\
> +	.pdev = &SYSMMU_PLATDEV(ipname),				\
> +	.res = SYSMMU_RESOURCE_NAME(EXYNOS##core, resname),		\
> +	.rnum = ARRAY_SIZE(SYSMMU_RESOURCE_NAME(EXYNOS##core, resname)),\
> +	.clocknames = SYSMMU_CLOCK_NAME "," SYSMMU_CLOCK_NAME2,		\
> +}
> +
> +#ifdef CONFIG_EXYNOS_DEV_PD
> +#define SYSMMU_RESOURCE_MAPPING_PD(core, ipname, resname, pd) {		\
> +	.pdev = &SYSMMU_PLATDEV(ipname),				\
> +	.res = &SYSMMU_RESOURCE_NAME(EXYNOS##core, resname),		\
> +	.rnum = ARRAY_SIZE(SYSMMU_RESOURCE_NAME(EXYNOS##core, resname)),\
> +	.clocknames = SYSMMU_CLOCK_NAME,				\
> +	.pdd = &exynos##core##_device_pd[pd].dev,			\
> +}
> +
> +#define SYSMMU_RESOURCE_MAPPING_MCPD(core, ipname, resname, pd, pdata) {\
> +	.pdev = &SYSMMU_PLATDEV(ipname),				\
> +	.res = &SYSMMU_RESOURCE_NAME(EXYNOS##core, resname),		\
> +	.rnum = ARRAY_SIZE(SYSMMU_RESOURCE_NAME(EXYNOS##core, resname)),\
> +	.clocknames = SYSMMU_CLOCK_NAME "," SYSMMU_CLOCK_NAME2,		\
> +	.pdd = &exynos##core##_device_pd[pd].dev,			\
>  }
> +#else
> +#define SYSMMU_RESOURCE_MAPPING_PD(core, ipname, resname, pd)		\
> +		SYSMMU_RESOURCE_MAPPING(core, ipname, resname)
> +#define SYSMMU_RESOURCE_MAPPING_MCPD(core, ipname, resname, pd, pdata)	\
> +		SYSMMU_RESOURCE_MAPPING_MC(core, ipname, resname, pdata)
> +
> +#endif /* CONFIG_EXYNOS_DEV_PD */
> +
> +#ifdef CONFIG_ARCH_EXYNOS4
> +SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimc0,	FIMC0,	FIMC0);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimc1,	FIMC1,	FIMC1);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimc2,	FIMC2,	FIMC2);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimc3,	FIMC3,	FIMC3);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS4, jpeg,	JPEG,	JPEG);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS4, 2d,	G2D,	2D);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS4, tv,	TV,	TV_M0);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS4, 2d_acp,	2D_ACP,	2D);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS4, rot,	ROTATOR, ROTATOR);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimd0,	FIMD0,	LCD0_M0);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS4, fimd1,	FIMD1,	LCD1_M1);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS4, flite0,	FIMC_LITE0, FIMC_LITE0);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS4, flite1,	FIMC_LITE1, FIMC_LITE1);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS4, mfc_r,	MFC_R,	MFC_M0);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS4, mfc_l,	MFC_L,	MFC_M1);
> +SYSMMU_RESOURCE(EXYNOS4, isp) {
> +	DEFINE_SYSMMU_RESOURCE(EXYNOS4, FIMC_ISP, FIMC_ISP),
> +	DEFINE_SYSMMU_RESOURCE(EXYNOS4, FIMC_DRC, FIMC_DRC),
> +	DEFINE_SYSMMU_RESOURCE(EXYNOS4, FIMC_FD, FIMC_FD),
> +	DEFINE_SYSMMU_RESOURCE(EXYNOS4, ISPCPU, FIMC_CX),
> +};
> +
> +static struct sysmmu_resource_map sysmmu_resmap4[] __initdata = {
> +	SYSMMU_RESOURCE_MAPPING_PD(4, fimc0,	fimc0,	PD_CAM),
> +	SYSMMU_RESOURCE_MAPPING_PD(4, fimc1,	fimc1,	PD_CAM),
> +	SYSMMU_RESOURCE_MAPPING_PD(4, fimc2,	fimc2,	PD_CAM),
> +	SYSMMU_RESOURCE_MAPPING_PD(4, fimc3,	fimc3,	PD_CAM),
> +	SYSMMU_RESOURCE_MAPPING_PD(4, tv,	tv,	PD_TV),
> +	SYSMMU_RESOURCE_MAPPING_PD(4, mfc_r,	mfc_r,	PD_MFC),
> +	SYSMMU_RESOURCE_MAPPING_PD(4, mfc_l,	mfc_l,	PD_MFC),
> +	SYSMMU_RESOURCE_MAPPING_PD(4, rot,	rot,	PD_LCD0),
> +	SYSMMU_RESOURCE_MAPPING_PD(4, jpeg,	jpeg,	PD_CAM),
> +	SYSMMU_RESOURCE_MAPPING_PD(4, fimd0,	fimd0,	PD_LCD0),
> +};
> +
> +static struct sysmmu_resource_map sysmmu_resmap4210[] __initdata = {
> +	SYSMMU_RESOURCE_MAPPING_PD(4, 2d,	2d,	PD_LCD0),
> +	SYSMMU_RESOURCE_MAPPING_PD(4, fimd1,	fimd1,	PD_LCD1),
> +};
> +
> +static struct sysmmu_resource_map sysmmu_resmap4212[] __initdata = {
> +	SYSMMU_RESOURCE_MAPPING(4,	2d,	2d_acp),
> +	SYSMMU_RESOURCE_MAPPING_PD(4,	camif0, flite0,	PD_ISP),
> +	SYSMMU_RESOURCE_MAPPING_PD(4,	camif1, flite1,	PD_ISP),
> +	SYSMMU_RESOURCE_MAPPING_PD(4,	isp,	isp,	PD_ISP),
> +};
> +#endif /* CONFIG_ARCH_EXYNOS4 */
>
> -void sysmmu_clk_disable(sysmmu_ips ips)
> +#ifdef CONFIG_ARCH_EXYNOS5
> +SYSMMU_RESOURCE_DEFINE(EXYNOS5, jpeg,	JPEG,	JPEG);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS5, fimd1,	FIMD1,	FIMD1);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS5, 2d,	2D,	2D);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS5, rot,	ROTATOR, ROTATOR);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS5, tv,	TV,	TV);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS5, flite0,	LITE0,	LITE0);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS5, flite1,	LITE1,	LITE1);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS5, gsc0,	GSC0,	GSC0);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS5, gsc1,	GSC1,	GSC1);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS5, gsc2,	GSC2,	GSC2);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS5, gsc3,	GSC3,	GSC3);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS5, mfc_r,	MFC_R,	MFC_R);
> +SYSMMU_RESOURCE_DEFINE(EXYNOS5, mfc_l,	MFC_L,	MFC_L);
> +SYSMMU_RESOURCE(EXYNOS5, isp) {
> +	DEFINE_SYSMMU_RESOURCE(EXYNOS5, ISP, ISP),
> +	DEFINE_SYSMMU_RESOURCE(EXYNOS5, DRC, DRC),
> +	DEFINE_SYSMMU_RESOURCE(EXYNOS5, FD, FD),
> +	DEFINE_SYSMMU_RESOURCE(EXYNOS5, ISPCPU, MCUISP),
> +	DEFINE_SYSMMU_RESOURCE(EXYNOS5, SCALERC, SCALERCISP),
> +	DEFINE_SYSMMU_RESOURCE(EXYNOS5, SCALERP, SCALERPISP),
> +	DEFINE_SYSMMU_RESOURCE(EXYNOS5,	ODC, ODC),
> +	DEFINE_SYSMMU_RESOURCE(EXYNOS5, DIS0, DIS0),
> +	DEFINE_SYSMMU_RESOURCE(EXYNOS5, DIS1, DIS1),
> +	DEFINE_SYSMMU_RESOURCE(EXYNOS5, 3DNR, 3DNR),
> +};
> +
> +static struct sysmmu_resource_map sysmmu_resmap5[] __initdata = {
> +	SYSMMU_RESOURCE_MAPPING(5,	jpeg,	jpeg),
> +	SYSMMU_RESOURCE_MAPPING(5,	fimd1,	fimd1),
> +	SYSMMU_RESOURCE_MAPPING(5,	2d,	2d),
> +	SYSMMU_RESOURCE_MAPPING(5,	rot,	rot),
> +	SYSMMU_RESOURCE_MAPPING_PD(5,	tv,	tv,	PD_DISP1),
> +	SYSMMU_RESOURCE_MAPPING_PD(5,	camif0,	flite0,	PD_GSCL),
> +	SYSMMU_RESOURCE_MAPPING_PD(5,	camif1,	flite1,	PD_GSCL),
> +	SYSMMU_RESOURCE_MAPPING_PD(5,	gsc0,	gsc0,	PD_GSCL),
> +	SYSMMU_RESOURCE_MAPPING_PD(5,	gsc1,	gsc1,	PD_GSCL),
> +	SYSMMU_RESOURCE_MAPPING_PD(5,	gsc2,	gsc2,	PD_GSCL),
> +	SYSMMU_RESOURCE_MAPPING_PD(5,	gsc3,	gsc3,	PD_GSCL),
> +	SYSMMU_RESOURCE_MAPPING_PD(5,	mfc_r,	mfc_r,	PD_MFC),
> +	SYSMMU_RESOURCE_MAPPING_PD(5,	mfc_l,	mfc_l,	PD_MFC),
> +	SYSMMU_RESOURCE_MAPPING_MCPD(5,	isp,	isp,	PD_ISP, mc_platdata),
> +};
> +#endif /* CONFIG_ARCH_EXYNOS5 */
> +
> +static int __init init_sysmmu_platform_device(void)
>  {
> -	if (sysmmu_clk[ips])
> -		clk_disable(sysmmu_clk[ips]);
> +	int i, j;
> +	struct sysmmu_resource_map *resmap[2] = {NULL, NULL};
> +	int nmap[2] = {0, 0};
> +
> +#ifdef CONFIG_ARCH_EXYNOS5
> +	if (soc_is_exynos5250()) {
> +		resmap[0] = sysmmu_resmap5;
> +		nmap[0] = ARRAY_SIZE(sysmmu_resmap5);
> +		nmap[1] = 0;
> +	}
> +#endif
> +
> +#ifdef CONFIG_ARCH_EXYNOS4
> +	if (resmap[0] == NULL) {
> +		resmap[0] = sysmmu_resmap4;
> +		nmap[0] = ARRAY_SIZE(sysmmu_resmap4);
> +	}
> +
> +	if (soc_is_exynos4210()) {
> +		resmap[1] = sysmmu_resmap4210;
> +		nmap[1] = ARRAY_SIZE(sysmmu_resmap4210);
> +	}
> +
> +	if (soc_is_exynos4412() || soc_is_exynos4212()) {
> +		resmap[1] = sysmmu_resmap4212;
> +		nmap[1] = ARRAY_SIZE(sysmmu_resmap4212);
> +	}
> +#endif
> +
> +	for (j = 0; j < 2; j++) {
> +		for (i = 0; i < nmap[j]; i++) {
> +			struct sysmmu_resource_map *map;
> +			struct sysmmu_platform_data *platdata;
> +
> +			map = &resmap[j][i];
> +
> +			map->pdev->dev.parent = map->pdd;
> +
> +			platdata = map->pdev->dev.platform_data;
> +			platdata->clockname = map->clocknames;
> +
> +			if (platform_device_add_resources(map->pdev, map->res,
> +								map->rnum)) {
> +				pr_err("%s: Failed to add device resources for "
> +						"%s.%d\n", __func__,
> +						map->pdev->name, map->pdev->id);
> +				continue;
> +			}
> +
> +			if (platform_device_register(map->pdev)) {
> +				pr_err("%s: Failed to register %s.%d\n",
> +					__func__, map->pdev->name,
> +						map->pdev->id);
> +			}
> +		}
> +	}
> +
> +	return 0;
>  }
> +arch_initcall(init_sysmmu_platform_device);
> diff --git a/arch/arm/mach-exynos/include/mach/irqs.h
> b/arch/arm/mach-exynos/include/mach/irqs.h
> index 33a119c..04646a8 100644
> --- a/arch/arm/mach-exynos/include/mach/irqs.h
> +++ b/arch/arm/mach-exynos/include/mach/irqs.h
> @@ -129,23 +129,30 @@
>  #define COMBINER_GROUP(x)	((x) * MAX_IRQ_IN_COMBINER + IRQ_SPI(128))
>  #define COMBINER_IRQ(x, y)	(COMBINER_GROUP(x) + y)
>
> -#define IRQ_SYSMMU_MDMA0_0	COMBINER_IRQ(4, 0)
> -#define IRQ_SYSMMU_SSS_0	COMBINER_IRQ(4, 1)
> -#define IRQ_SYSMMU_FIMC0_0	COMBINER_IRQ(4, 2)
> -#define IRQ_SYSMMU_FIMC1_0	COMBINER_IRQ(4, 3)
> -#define IRQ_SYSMMU_FIMC2_0	COMBINER_IRQ(4, 4)
> -#define IRQ_SYSMMU_FIMC3_0	COMBINER_IRQ(4, 5)
> -#define IRQ_SYSMMU_JPEG_0	COMBINER_IRQ(4, 6)
> -#define IRQ_SYSMMU_2D_0		COMBINER_IRQ(4, 7)
> -
> -#define IRQ_SYSMMU_ROTATOR_0	COMBINER_IRQ(5, 0)
> -#define IRQ_SYSMMU_MDMA1_0	COMBINER_IRQ(5, 1)
> -#define IRQ_SYSMMU_LCD0_M0_0	COMBINER_IRQ(5, 2)
> -#define IRQ_SYSMMU_LCD1_M1_0	COMBINER_IRQ(5, 3)
> -#define IRQ_SYSMMU_TV_M0_0	COMBINER_IRQ(5, 4)
> -#define IRQ_SYSMMU_MFC_M0_0	COMBINER_IRQ(5, 5)
> -#define IRQ_SYSMMU_MFC_M1_0	COMBINER_IRQ(5, 6)
> -#define IRQ_SYSMMU_PCIE_0	COMBINER_IRQ(5, 7)
> +#define EXYNOS4_IRQ_SYSMMU_MDMA0_0	COMBINER_IRQ(4, 0)
> +#define EXYNOS4_IRQ_SYSMMU_SSS_0	COMBINER_IRQ(4, 1)
> +#define EXYNOS4_IRQ_SYSMMU_FIMC0_0	COMBINER_IRQ(4, 2)
> +#define EXYNOS4_IRQ_SYSMMU_FIMC1_0	COMBINER_IRQ(4, 3)
> +#define EXYNOS4_IRQ_SYSMMU_FIMC2_0	COMBINER_IRQ(4, 4)
> +#define EXYNOS4_IRQ_SYSMMU_FIMC3_0	COMBINER_IRQ(4, 5)
> +#define EXYNOS4_IRQ_SYSMMU_JPEG_0	COMBINER_IRQ(4, 6)
> +#define EXYNOS4_IRQ_SYSMMU_2D_0		COMBINER_IRQ(4, 7)
> +
> +#define EXYNOS4_IRQ_SYSMMU_ROTATOR_0	COMBINER_IRQ(5, 0)
> +#define EXYNOS4_IRQ_SYSMMU_MDMA1_0	COMBINER_IRQ(5, 1)
> +#define EXYNOS4_IRQ_SYSMMU_LCD0_M0_0	COMBINER_IRQ(5, 2)
> +#define EXYNOS4_IRQ_SYSMMU_LCD1_M1_0	COMBINER_IRQ(5, 3)
> +#define EXYNOS4_IRQ_SYSMMU_TV_M0_0	COMBINER_IRQ(5, 4)
> +#define EXYNOS4_IRQ_SYSMMU_MFC_M0_0	COMBINER_IRQ(5, 5)
> +#define EXYNOS4_IRQ_SYSMMU_MFC_M1_0	COMBINER_IRQ(5, 6)
> +#define EXYNOS4_IRQ_SYSMMU_PCIE_0	COMBINER_IRQ(5, 7)
> +
> +#define EXYNOS4_IRQ_SYSMMU_FIMC_LITE0_0	COMBINER_IRQ(16, 0)
> +#define EXYNOS4_IRQ_SYSMMU_FIMC_LITE1_0	COMBINER_IRQ(16, 1)
> +#define EXYNOS4_IRQ_SYSMMU_FIMC_ISP_0	COMBINER_IRQ(16, 2)
> +#define EXYNOS4_IRQ_SYSMMU_FIMC_DRC_0	COMBINER_IRQ(16, 3)
> +#define EXYNOS4_IRQ_SYSMMU_FIMC_FD_0	COMBINER_IRQ(16, 4)
> +#define EXYNOS4_IRQ_SYSMMU_FIMC_CX_0	COMBINER_IRQ(16, 5)
>
>  #define IRQ_FIMD0_FIFO		COMBINER_IRQ(11, 0)
>  #define IRQ_FIMD0_VSYNC		COMBINER_IRQ(11, 1)
> @@ -275,70 +282,70 @@
>  #define IRQ_PMU			COMBINER_IRQ(1, 2)
>  #define IRQ_PMU_CPU1		COMBINER_IRQ(1, 6)
>
> -#define IRQ_SYSMMU_GSC0_0	COMBINER_IRQ(2, 0)
> -#define IRQ_SYSMMU_GSC0_1	COMBINER_IRQ(2, 1)
> -#define IRQ_SYSMMU_GSC1_0	COMBINER_IRQ(2, 2)
> -#define IRQ_SYSMMU_GSC1_1	COMBINER_IRQ(2, 3)
> -#define IRQ_SYSMMU_GSC2_0	COMBINER_IRQ(2, 4)
> -#define IRQ_SYSMMU_GSC2_1	COMBINER_IRQ(2, 5)
> -#define IRQ_SYSMMU_GSC3_0	COMBINER_IRQ(2, 6)
> -#define IRQ_SYSMMU_GSC3_1	COMBINER_IRQ(2, 7)
> -
> -#define IRQ_SYSMMU_FIMD1_0	COMBINER_IRQ(3, 2)
> -#define IRQ_SYSMMU_FIMD1_1	COMBINER_IRQ(3, 3)
> -#define IRQ_SYSMMU_LITE0_0	COMBINER_IRQ(3, 4)
> -#define IRQ_SYSMMU_LITE0_1	COMBINER_IRQ(3, 5)
> -#define IRQ_SYSMMU_SCALERPISP_0	COMBINER_IRQ(3, 6)
> -#define IRQ_SYSMMU_SCALERPISP_1	COMBINER_IRQ(3, 7)
> -
> -#define IRQ_SYSMMU_ROTATOR_0	COMBINER_IRQ(4, 0)
> -#define IRQ_SYSMMU_ROTATOR_1	COMBINER_IRQ(4, 1)
> -#define IRQ_SYSMMU_JPEG_0	COMBINER_IRQ(4, 2)
> -#define IRQ_SYSMMU_JPEG_1	COMBINER_IRQ(4, 3)
> -
> -#define IRQ_SYSMMU_FD_0		COMBINER_IRQ(5, 0)
> -#define IRQ_SYSMMU_FD_1		COMBINER_IRQ(5, 1)
> -#define IRQ_SYSMMU_SCALERCISP_0	COMBINER_IRQ(5, 2)
> -#define IRQ_SYSMMU_SCALERCISP_1	COMBINER_IRQ(5, 3)
> -#define IRQ_SYSMMU_MCUISP_0	COMBINER_IRQ(5, 4)
> -#define IRQ_SYSMMU_MCUISP_1	COMBINER_IRQ(5, 5)
> -#define IRQ_SYSMMU_3DNR_0	COMBINER_IRQ(5, 6)
> -#define IRQ_SYSMMU_3DNR_1	COMBINER_IRQ(5, 7)
> -
> -#define IRQ_SYSMMU_ARM_0	COMBINER_IRQ(6, 0)
> -#define IRQ_SYSMMU_ARM_1	COMBINER_IRQ(6, 1)
> -#define IRQ_SYSMMU_MFC_L_0	COMBINER_IRQ(6, 2)
> -#define IRQ_SYSMMU_MFC_L_1	COMBINER_IRQ(6, 3)
> -#define IRQ_SYSMMU_RTIC_0	COMBINER_IRQ(6, 4)
> -#define IRQ_SYSMMU_RTIC_1	COMBINER_IRQ(6, 5)
> -#define IRQ_SYSMMU_SSS_0	COMBINER_IRQ(6, 6)
> -#define IRQ_SYSMMU_SSS_1	COMBINER_IRQ(6, 7)
> -
> -#define IRQ_SYSMMU_MDMA0_0	COMBINER_IRQ(7, 0)
> -#define IRQ_SYSMMU_MDMA0_1	COMBINER_IRQ(7, 1)
> -#define IRQ_SYSMMU_MDMA1_0	COMBINER_IRQ(7, 2)
> -#define IRQ_SYSMMU_MDMA1_1	COMBINER_IRQ(7, 3)
> -#define IRQ_SYSMMU_TV_0		COMBINER_IRQ(7, 4)
> -#define IRQ_SYSMMU_TV_1		COMBINER_IRQ(7, 5)
> -#define IRQ_SYSMMU_GPSX_0	COMBINER_IRQ(7, 6)
> -#define IRQ_SYSMMU_GPSX_1	COMBINER_IRQ(7, 7)
> -
> -#define IRQ_SYSMMU_MFC_R_0	COMBINER_IRQ(8, 5)
> -#define IRQ_SYSMMU_MFC_R_1	COMBINER_IRQ(8, 6)
> -
> -#define IRQ_SYSMMU_DIS1_0	COMBINER_IRQ(9, 4)
> -#define IRQ_SYSMMU_DIS1_1	COMBINER_IRQ(9, 5)
> -
> -#define IRQ_DP			COMBINER_IRQ(10, 3)
> -#define IRQ_SYSMMU_DIS0_0	COMBINER_IRQ(10, 4)
> -#define IRQ_SYSMMU_DIS0_1	COMBINER_IRQ(10, 5)
> -#define IRQ_SYSMMU_ISP_0	COMBINER_IRQ(10, 6)
> -#define IRQ_SYSMMU_ISP_1	COMBINER_IRQ(10, 7)
> -
> -#define IRQ_SYSMMU_ODC_0	COMBINER_IRQ(11, 0)
> -#define IRQ_SYSMMU_ODC_1	COMBINER_IRQ(11, 1)
> -#define IRQ_SYSMMU_DRC_0	COMBINER_IRQ(11, 6)
> -#define IRQ_SYSMMU_DRC_1	COMBINER_IRQ(11, 7)
> +#define EXYNOS5_IRQ_SYSMMU_GSC0_0	COMBINER_IRQ(2, 0)
> +#define EXYNOS5_IRQ_SYSMMU_GSC0_1	COMBINER_IRQ(2, 1)
> +#define EXYNOS5_IRQ_SYSMMU_GSC1_0	COMBINER_IRQ(2, 2)
> +#define EXYNOS5_IRQ_SYSMMU_GSC1_1	COMBINER_IRQ(2, 3)
> +#define EXYNOS5_IRQ_SYSMMU_GSC2_0	COMBINER_IRQ(2, 4)
> +#define EXYNOS5_IRQ_SYSMMU_GSC2_1	COMBINER_IRQ(2, 5)
> +#define EXYNOS5_IRQ_SYSMMU_GSC3_0	COMBINER_IRQ(2, 6)
> +#define EXYNOS5_IRQ_SYSMMU_GSC3_1	COMBINER_IRQ(2, 7)
> +
> +#define EXYNOS5_IRQ_SYSMMU_FIMD1_0	COMBINER_IRQ(3, 2)
> +#define EXYNOS5_IRQ_SYSMMU_FIMD1_1	COMBINER_IRQ(3, 3)
> +#define EXYNOS5_IRQ_SYSMMU_LITE0_0	COMBINER_IRQ(3, 4)
> +#define EXYNOS5_IRQ_SYSMMU_LITE0_1	COMBINER_IRQ(3, 5)
> +#define EXYNOS5_IRQ_SYSMMU_SCALERPISP_0	COMBINER_IRQ(3, 6)
> +#define EXYNOS5_IRQ_SYSMMU_SCALERPISP_1	COMBINER_IRQ(3, 7)
> +
> +#define EXYNOS5_IRQ_SYSMMU_ROTATOR_0	COMBINER_IRQ(4, 0)
> +#define EXYNOS5_IRQ_SYSMMU_ROTATOR_1	COMBINER_IRQ(4, 1)
> +#define EXYNOS5_IRQ_SYSMMU_JPEG_0	COMBINER_IRQ(4, 2)
> +#define EXYNOS5_IRQ_SYSMMU_JPEG_1	COMBINER_IRQ(4, 3)
> +
> +#define EXYNOS5_IRQ_SYSMMU_FD_0		COMBINER_IRQ(5, 0)
> +#define EXYNOS5_IRQ_SYSMMU_FD_1		COMBINER_IRQ(5, 1)
> +#define EXYNOS5_IRQ_SYSMMU_SCALERCISP_0	COMBINER_IRQ(5, 2)
> +#define EXYNOS5_IRQ_SYSMMU_SCALERCISP_1	COMBINER_IRQ(5, 3)
> +#define EXYNOS5_IRQ_SYSMMU_MCUISP_0	COMBINER_IRQ(5, 4)
> +#define EXYNOS5_IRQ_SYSMMU_MCUISP_1	COMBINER_IRQ(5, 5)
> +#define EXYNOS5_IRQ_SYSMMU_3DNR_0	COMBINER_IRQ(5, 6)
> +#define EXYNOS5_IRQ_SYSMMU_3DNR_1	COMBINER_IRQ(5, 7)
> +
> +#define EXYNOS5_IRQ_SYSMMU_ARM_0	COMBINER_IRQ(6, 0)
> +#define EXYNOS5_IRQ_SYSMMU_ARM_1	COMBINER_IRQ(6, 1)
> +#define EXYNOS5_IRQ_SYSMMU_MFC_L_0	COMBINER_IRQ(6, 2)
> +#define EXYNOS5_IRQ_SYSMMU_MFC_L_1	COMBINER_IRQ(6, 3)
> +#define EXYNOS5_IRQ_SYSMMU_RTIC_0	COMBINER_IRQ(6, 4)
> +#define EXYNOS5_IRQ_SYSMMU_RTIC_1	COMBINER_IRQ(6, 5)
> +#define EXYNOS5_IRQ_SYSMMU_SSS_0	COMBINER_IRQ(6, 6)
> +#define EXYNOS5_IRQ_SYSMMU_SSS_1	COMBINER_IRQ(6, 7)
> +
> +#define EXYNOS5_IRQ_SYSMMU_MDMA0_0	COMBINER_IRQ(7, 0)
> +#define EXYNOS5_IRQ_SYSMMU_MDMA0_1	COMBINER_IRQ(7, 1)
> +#define EXYNOS5_IRQ_SYSMMU_MDMA1_0	COMBINER_IRQ(7, 2)
> +#define EXYNOS5_IRQ_SYSMMU_MDMA1_1	COMBINER_IRQ(7, 3)
> +#define EXYNOS5_IRQ_SYSMMU_TV_0		COMBINER_IRQ(7, 4)
> +#define EXYNOS5_IRQ_SYSMMU_TV_1		COMBINER_IRQ(7, 5)
> +#define EXYNOS5_IRQ_SYSMMU_GPSX_0	COMBINER_IRQ(7, 6)
> +#define EXYNOS5_IRQ_SYSMMU_GPSX_1	COMBINER_IRQ(7, 7)
> +
> +#define EXYNOS5_IRQ_SYSMMU_MFC_R_0	COMBINER_IRQ(8, 5)
> +#define EXYNOS5_IRQ_SYSMMU_MFC_R_1	COMBINER_IRQ(8, 6)
> +
> +#define EXYNOS5_IRQ_SYSMMU_DIS1_0	COMBINER_IRQ(9, 4)
> +#define EXYNOS5_IRQ_SYSMMU_DIS1_1	COMBINER_IRQ(9, 5)
> +
> +#define IRQ_DP				COMBINER_IRQ(10, 3)
> +#define EXYNOS5_IRQ_SYSMMU_DIS0_0	COMBINER_IRQ(10, 4)
> +#define EXYNOS5_IRQ_SYSMMU_DIS0_1	COMBINER_IRQ(10, 5)
> +#define EXYNOS5_IRQ_SYSMMU_ISP_0	COMBINER_IRQ(10, 6)
> +#define EXYNOS5_IRQ_SYSMMU_ISP_1	COMBINER_IRQ(10, 7)
> +
> +#define EXYNOS5_IRQ_SYSMMU_ODC_0	COMBINER_IRQ(11, 0)
> +#define EXYNOS5_IRQ_SYSMMU_ODC_1	COMBINER_IRQ(11, 1)
> +#define EXYNOS5_IRQ_SYSMMU_DRC_0	COMBINER_IRQ(11, 6)
> +#define EXYNOS5_IRQ_SYSMMU_DRC_1	COMBINER_IRQ(11, 7)
>
>  #define IRQ_FIMD1_FIFO		COMBINER_IRQ(18, 4)
>  #define IRQ_FIMD1_VSYNC		COMBINER_IRQ(18, 5)
> @@ -352,11 +359,11 @@
>  #define IRQ_MCT_G2		COMBINER_IRQ(23, 5)
>  #define IRQ_MCT_G3		COMBINER_IRQ(23, 6)
>
> -#define IRQ_EINT1		COMBINER_IRQ(24, 0)
> -#define IRQ_SYSMMU_LITE1_0	COMBINER_IRQ(24, 1)
> -#define IRQ_SYSMMU_LITE1_1	COMBINER_IRQ(24, 2)
> -#define IRQ_SYSMMU_2D_0		COMBINER_IRQ(24, 5)
> -#define IRQ_SYSMMU_2D_1		COMBINER_IRQ(24, 6)
> +#define IRQ_EINT1			COMBINER_IRQ(24, 0)
> +#define EXYNOS5_IRQ_SYSMMU_LITE1_0	COMBINER_IRQ(24, 1)
> +#define EXYNOS5_IRQ_SYSMMU_LITE1_1	COMBINER_IRQ(24, 2)
> +#define EXYNOS5_IRQ_SYSMMU_2D_0		COMBINER_IRQ(24, 5)
> +#define EXYNOS5_IRQ_SYSMMU_2D_1		COMBINER_IRQ(24, 6)
>
>  #define IRQ_EINT2		COMBINER_IRQ(25, 0)
>  #define IRQ_EINT3		COMBINER_IRQ(25, 1)
> diff --git a/arch/arm/mach-exynos/include/mach/map.h
> b/arch/arm/mach-exynos/include/mach/map.h
> index 57c13f1..cc4c8da 100644
> --- a/arch/arm/mach-exynos/include/mach/map.h
> +++ b/arch/arm/mach-exynos/include/mach/map.h
> @@ -87,6 +87,7 @@
>  #define EXYNOS4_PA_PDMA1		0x12690000
>
>  #define EXYNOS4_PA_SYSMMU_MDMA		0x10A40000
> +#define EXYNOS4_PA_SYSMMU_2D_ACP	0x10A40000
>  #define EXYNOS4_PA_SYSMMU_SSS		0x10A50000
>  #define EXYNOS4_PA_SYSMMU_FIMC0		0x11A20000
>  #define EXYNOS4_PA_SYSMMU_FIMC1		0x11A30000
> @@ -95,6 +96,12 @@
>  #define EXYNOS4_PA_SYSMMU_JPEG		0x11A60000
>  #define EXYNOS4_PA_SYSMMU_FIMD0		0x11E20000
>  #define EXYNOS4_PA_SYSMMU_FIMD1		0x12220000
> +#define EXYNOS4_PA_SYSMMU_FIMC_ISP	0x12260000
> +#define EXYNOS4_PA_SYSMMU_FIMC_DRC	0x12270000
> +#define EXYNOS4_PA_SYSMMU_FIMC_FD	0x122A0000
> +#define EXYNOS4_PA_SYSMMU_ISPCPU	0x122B0000
> +#define EXYNOS4_PA_SYSMMU_FIMC_LITE0	0x123B0000
> +#define EXYNOS4_PA_SYSMMU_FIMC_LITE1	0x123C0000
>  #define EXYNOS4_PA_SYSMMU_PCIe		0x12620000
>  #define EXYNOS4_PA_SYSMMU_G2D		0x12A20000
>  #define EXYNOS4_PA_SYSMMU_ROTATOR	0x12A30000
> @@ -102,6 +109,37 @@
>  #define EXYNOS4_PA_SYSMMU_TV		0x12E20000
>  #define EXYNOS4_PA_SYSMMU_MFC_L		0x13620000
>  #define EXYNOS4_PA_SYSMMU_MFC_R		0x13630000
> +
> +#define EXYNOS5_PA_SYSMMU_MDMA1		0x10A40000
> +#define EXYNOS5_PA_SYSMMU_SSS		0x10A50000
> +#define EXYNOS5_PA_SYSMMU_2D		0x10A60000
> +#define EXYNOS5_PA_SYSMMU_MFC_L		0x11200000
> +#define EXYNOS5_PA_SYSMMU_MFC_R		0x11210000
> +#define EXYNOS5_PA_SYSMMU_ROTATOR	0x11D40000
> +#define EXYNOS5_PA_SYSMMU_MDMA2		0x11D50000
> +#define EXYNOS5_PA_SYSMMU_JPEG		0x11F20000
> +#define EXYNOS5_PA_SYSMMU_IOP		0x12360000
> +#define EXYNOS5_PA_SYSMMU_RTIC		0x12370000
> +#define EXYNOS5_PA_SYSMMU_GPS		0x12630000
> +#define EXYNOS5_PA_SYSMMU_ISP		0x13260000
> +#define EXYNOS5_PA_SYSMMU_DRC		0x12370000
> +#define EXYNOS5_PA_SYSMMU_SCALERC	0x13280000
> +#define EXYNOS5_PA_SYSMMU_SCALERP	0x13290000
> +#define EXYNOS5_PA_SYSMMU_FD		0x132A0000
> +#define EXYNOS5_PA_SYSMMU_ISPCPU	0x132B0000
> +#define EXYNOS5_PA_SYSMMU_ODC		0x132C0000
> +#define EXYNOS5_PA_SYSMMU_DIS0		0x132D0000
> +#define EXYNOS5_PA_SYSMMU_DIS1		0x132E0000
> +#define EXYNOS5_PA_SYSMMU_3DNR		0x132F0000
> +#define EXYNOS5_PA_SYSMMU_LITE0		0x13C40000
> +#define EXYNOS5_PA_SYSMMU_LITE1		0x13C50000
> +#define EXYNOS5_PA_SYSMMU_GSC0		0x13E80000
> +#define EXYNOS5_PA_SYSMMU_GSC1		0x13E90000
> +#define EXYNOS5_PA_SYSMMU_GSC2		0x13EA0000
> +#define EXYNOS5_PA_SYSMMU_GSC3		0x13EB0000
> +#define EXYNOS5_PA_SYSMMU_FIMD1		0x14640000
> +#define EXYNOS5_PA_SYSMMU_TV		0x14650000
> +
>  #define EXYNOS4_PA_SPI0			0x13920000
>  #define EXYNOS4_PA_SPI1			0x13930000
>  #define EXYNOS4_PA_SPI2			0x13940000
> diff --git a/arch/arm/mach-exynos/include/mach/regs-clock.h
> b/arch/arm/mach-exynos/include/mach/regs-clock.h
> index 113836b..de42145 100644
> --- a/arch/arm/mach-exynos/include/mach/regs-clock.h
> +++ b/arch/arm/mach-exynos/include/mach/regs-clock.h
> @@ -130,6 +130,9 @@
>  #define EXYNOS4_CLKGATE_SCLKCPU			EXYNOS_CLKREG(0x14800)
>  #define EXYNOS4_CLKGATE_IP_CPU			EXYNOS_CLKREG(0x14900)
>
> +#define EXYNOS4_CLKGATE_IP_ISP0			EXYNOS_CLKREG(0x18800)
> +#define EXYNOS4_CLKGATE_IP_ISP1			EXYNOS_CLKREG(0x18804)
> +
>  #define EXYNOS4_APLL_LOCKTIME			(0x1C20)	/* 300us */
>
>  #define EXYNOS4_APLLCON0_ENABLE_SHIFT		(31)
> @@ -245,6 +248,8 @@
>  #define EXYNOS5_CLKDIV_PERIC0			EXYNOS_CLKREG(0x10558)
>
>  #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)
> diff --git a/arch/arm/mach-exynos/include/mach/regs-sysmmu.h
> b/arch/arm/mach-exynos/include/mach/regs-sysmmu.h
> deleted file mode 100644
> index 68ff6ad..0000000
> --- a/arch/arm/mach-exynos/include/mach/regs-sysmmu.h
> +++ /dev/null
> @@ -1,28 +0,0 @@
> -/* linux/arch/arm/mach-exynos4/include/mach/regs-sysmmu.h
> - *
> - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
> - *		http://www.samsung.com
> - *
> - * EXYNOS4 - System MMU register
> - *
> - * 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.
> -*/
> -
> -#ifndef __ASM_ARCH_REGS_SYSMMU_H
> -#define __ASM_ARCH_REGS_SYSMMU_H __FILE__
> -
> -#define S5P_MMU_CTRL			0x000
> -#define S5P_MMU_CFG			0x004
> -#define S5P_MMU_STATUS			0x008
> -#define S5P_MMU_FLUSH			0x00C
> -#define S5P_PT_BASE_ADDR		0x014
> -#define S5P_INT_STATUS			0x018
> -#define S5P_INT_CLEAR			0x01C
> -#define S5P_PAGE_FAULT_ADDR		0x024
> -#define S5P_AW_FAULT_ADDR		0x028
> -#define S5P_AR_FAULT_ADDR		0x02C
> -#define S5P_DEFAULT_SLAVE_ADDR		0x030
> -
> -#endif /* __ASM_ARCH_REGS_SYSMMU_H */
> diff --git a/arch/arm/mach-exynos/include/mach/sysmmu.h
> b/arch/arm/mach-exynos/include/mach/sysmmu.h
> index 6a5fbb5..7fe8527 100644
> --- a/arch/arm/mach-exynos/include/mach/sysmmu.h
> +++ b/arch/arm/mach-exynos/include/mach/sysmmu.h
> @@ -1,46 +1,62 @@
> -/* linux/arch/arm/mach-exynos4/include/mach/sysmmu.h
> - *
> - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
> +/*
> + * Copyright (c) 2011-2012 Samsung Electronics Co., Ltd.
>   *		http://www.samsung.com
>   *
> - * Samsung sysmmu driver for EXYNOS4
> + * EXYNOS - System MMU 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.
> -*/
> -
> -#ifndef __ASM_ARM_ARCH_SYSMMU_H
> -#define __ASM_ARM_ARCH_SYSMMU_H __FILE__
> -
> -enum exynos4_sysmmu_ips {
> -	SYSMMU_MDMA,
> -	SYSMMU_SSS,
> -	SYSMMU_FIMC0,
> -	SYSMMU_FIMC1,
> -	SYSMMU_FIMC2,
> -	SYSMMU_FIMC3,
> -	SYSMMU_JPEG,
> -	SYSMMU_FIMD0,
> -	SYSMMU_FIMD1,
> -	SYSMMU_PCIe,
> -	SYSMMU_G2D,
> -	SYSMMU_ROTATOR,
> -	SYSMMU_MDMA2,
> -	SYSMMU_TV,
> -	SYSMMU_MFC_L,
> -	SYSMMU_MFC_R,
> -	EXYNOS4_SYSMMU_TOTAL_IPNUM,
> + */
> +
> +#ifndef _ARM_MACH_EXYNOS_SYSMMU_H_
> +#define _ARM_MACH_EXYNOS_SYSMMU_H_
> +
> +struct sysmmu_platform_data {
> +	char *dbgname;
> +	/* comma(,) separated list of clock names for clock gating */
Do you use the clock gating instead of runtime pm?
> +	char *clockname;
>  };
>
> -#define S5P_SYSMMU_TOTAL_IPNUM		EXYNOS4_SYSMMU_TOTAL_IPNUM
> +#define SYSMMU_DEVNAME_BASE "exynos-sysmmu"
> +
> +#define SYSMMU_CLOCK_NAME "sysmmu"
> +#define SYSMMU_CLOCK_NAME2 "sysmmu_mc"
What's the meaning of "mc"?
> +
> +#ifdef CONFIG_EXYNOS_DEV_SYSMMU
> +#include <linux/device.h>
> +struct platform_device;
> +
> +#define SYSMMU_PLATDEV(ipname) exynos_device_sysmmu_##ipname
> +
> +extern struct platform_device SYSMMU_PLATDEV(mfc_l);
> +extern struct platform_device SYSMMU_PLATDEV(mfc_r);
> +extern struct platform_device SYSMMU_PLATDEV(tv);
> +extern struct platform_device SYSMMU_PLATDEV(jpeg);
> +extern struct platform_device SYSMMU_PLATDEV(rot);
Where's the fimc platform_device?

I think you only tested it with exynos5.
> +extern struct platform_device SYSMMU_PLATDEV(gsc0);
> +extern struct platform_device SYSMMU_PLATDEV(gsc1);
> +extern struct platform_device SYSMMU_PLATDEV(gsc2);
> +extern struct platform_device SYSMMU_PLATDEV(gsc3);
> +extern struct platform_device SYSMMU_PLATDEV(isp);
> +extern struct platform_device SYSMMU_PLATDEV(fimd0);
> +extern struct platform_device SYSMMU_PLATDEV(fimd1);
> +extern struct platform_device SYSMMU_PLATDEV(camif0);
> +extern struct platform_device SYSMMU_PLATDEV(camif1);
> +extern struct platform_device SYSMMU_PLATDEV(2d);
>
> -extern const char *sysmmu_ips_name[EXYNOS4_SYSMMU_TOTAL_IPNUM];
> +#ifdef CONFIG_IOMMU_API
> +static inline void platform_set_sysmmu(
> +				struct device *sysmmu, struct device *dev)
> +{
> +	dev->archdata.iommu = sysmmu;
> +}
> +#endif
>
> -typedef enum exynos4_sysmmu_ips sysmmu_ips;
> +#else /* !CONFIG_EXYNOS_DEV_SYSMMU */
> +#define platform_set_sysmmu(dev, sysmmu) do { } while (0)
> +#endif
>
> -void sysmmu_clk_init(struct device *dev, sysmmu_ips ips);
> -void sysmmu_clk_enable(sysmmu_ips ips);
> -void sysmmu_clk_disable(sysmmu_ips ips);
> +#define SYSMMU_CLOCK_DEVNAME(ipname, id) (SYSMMU_DEVNAME_BASE "." #id)
>
> -#endif /* __ASM_ARM_ARCH_SYSMMU_H */
> +#endif /* _ARM_MACH_EXYNOS_SYSMMU_H_ */
> diff --git a/arch/arm/mach-exynos/mach-armlex4210.c
> b/arch/arm/mach-exynos/mach-armlex4210.c
> index a1e7007..6ab171c 100644
> --- a/arch/arm/mach-exynos/mach-armlex4210.c
> +++ b/arch/arm/mach-exynos/mach-armlex4210.c
> @@ -154,7 +154,6 @@ static struct platform_device *armlex4210_devices[]
> __initdata = {
>  	&s3c_device_hsmmc3,
>  	&s3c_device_rtc,
>  	&s3c_device_wdt,
> -	&exynos4_device_sysmmu,
>  	&samsung_asoc_dma,
>  	&armlex4210_smsc911x,
>  	&exynos4_device_ahci,
> diff --git a/arch/arm/mach-exynos/mach-smdkv310.c
> b/arch/arm/mach-exynos/mach-smdkv310.c
> index 2b71f18..49975ad 100644
> --- a/arch/arm/mach-exynos/mach-smdkv310.c
> +++ b/arch/arm/mach-exynos/mach-smdkv310.c
> @@ -275,7 +275,6 @@ static struct platform_device *smdkv310_devices[]
> __initdata = {
>  	&s5p_device_mfc_l,
>  	&s5p_device_mfc_r,
>  	&exynos4_device_spdif,
> -	&exynos4_device_sysmmu,
>  	&samsung_asoc_dma,
>  	&samsung_asoc_idma,
>  	&s5p_device_fimd0,
> --
> 1.7.1
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
>



More information about the linux-arm-kernel mailing list