diff mbox

[v2,1/3] ARM: EXYNOS: Map PMU address through DT

Message ID 1395061795-17777-2-git-send-email-vikas.sajjan@samsung.com
State Superseded, archived
Headers show

Commit Message

Vikas Sajjan March 17, 2014, 1:09 p.m. UTC
Instead of hardcoding the PMU details for each SoC, pass this information
through device tree (DT).

Signed-off-by: Vikas Sajjan <vikas.sajjan@samsung.com>
---
 .../devicetree/bindings/arm/samsung/pmu.txt        |    5 +-
 arch/arm/boot/dts/exynos4.dtsi                     |    5 ++
 arch/arm/boot/dts/exynos5260.dtsi                  |    5 ++
 arch/arm/mach-exynos/common.c                      |   51 +++++++++++++-------
 arch/arm/mach-exynos/include/mach/map.h            |    3 --
 5 files changed, 47 insertions(+), 22 deletions(-)

Comments

Sachin Kamat March 17, 2014, 2:23 p.m. UTC | #1
Hi Vikas,

On 17 March 2014 18:39, Vikas Sajjan <vikas.sajjan@samsung.com> wrote:
> Instead of hardcoding the PMU details for each SoC, pass this information
> through device tree (DT).
>
> Signed-off-by: Vikas Sajjan <vikas.sajjan@samsung.com>
> ---
>  .../devicetree/bindings/arm/samsung/pmu.txt        |    5 +-
>  arch/arm/boot/dts/exynos4.dtsi                     |    5 ++
>  arch/arm/boot/dts/exynos5260.dtsi                  |    5 ++
>  arch/arm/mach-exynos/common.c                      |   51 +++++++++++++-------
>  arch/arm/mach-exynos/include/mach/map.h            |    3 --
>  5 files changed, 47 insertions(+), 22 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/arm/samsung/pmu.txt b/Documentation/devicetree/bindings/arm/samsung/pmu.txt
> index f1f1552..667a7f0 100644
> --- a/Documentation/devicetree/bindings/arm/samsung/pmu.txt
> +++ b/Documentation/devicetree/bindings/arm/samsung/pmu.txt
> @@ -2,14 +2,15 @@ SAMSUNG Exynos SoC series PMU Registers
>
>  Properties:
>   - compatible : should contain two values. First value must be one from following list:
> +                  - "samsung,exynos4210-pmu" - for Exynos4210 and Exynos4x12 SoC,
>                    - "samsung,exynos5250-pmu" - for Exynos5250 SoC,
> -                  - "samsung,exynos5420-pmu" - for Exynos5420 SoC.
> +                  - "samsung,exynos5420-pmu" - for Exynos5420 and Exynos5260 SoC.
>                 second value must be always "syscon".
>
>   - reg : offset and length of the register set.
>
>  Example :
>  pmu_system_controller: system-controller@10040000 {
> -       compatible = "samsung,exynos5250-pmu", "syscon";
> +       compatible = "samsung,exynos5250-pmu";

If you have removed "syscon" deliberately above, then you should also
remove the same in the
binding description which says "second value must be always "syscon".".
Tomasz Figa March 19, 2014, 4:01 p.m. UTC | #2
On 17.03.2014 15:23, Sachin Kamat wrote:
> Hi Vikas,
>
> On 17 March 2014 18:39, Vikas Sajjan <vikas.sajjan@samsung.com> wrote:
>> Instead of hardcoding the PMU details for each SoC, pass this information
>> through device tree (DT).
>>
>> Signed-off-by: Vikas Sajjan <vikas.sajjan@samsung.com>
>> ---
>>   .../devicetree/bindings/arm/samsung/pmu.txt        |    5 +-
>>   arch/arm/boot/dts/exynos4.dtsi                     |    5 ++
>>   arch/arm/boot/dts/exynos5260.dtsi                  |    5 ++
>>   arch/arm/mach-exynos/common.c                      |   51 +++++++++++++-------
>>   arch/arm/mach-exynos/include/mach/map.h            |    3 --
>>   5 files changed, 47 insertions(+), 22 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/arm/samsung/pmu.txt b/Documentation/devicetree/bindings/arm/samsung/pmu.txt
>> index f1f1552..667a7f0 100644
>> --- a/Documentation/devicetree/bindings/arm/samsung/pmu.txt
>> +++ b/Documentation/devicetree/bindings/arm/samsung/pmu.txt
>> @@ -2,14 +2,15 @@ SAMSUNG Exynos SoC series PMU Registers
>>
>>   Properties:
>>    - compatible : should contain two values. First value must be one from following list:
>> +                  - "samsung,exynos4210-pmu" - for Exynos4210 and Exynos4x12 SoC,
>>                     - "samsung,exynos5250-pmu" - for Exynos5250 SoC,
>> -                  - "samsung,exynos5420-pmu" - for Exynos5420 SoC.
>> +                  - "samsung,exynos5420-pmu" - for Exynos5420 and Exynos5260 SoC.
>>                  second value must be always "syscon".
>>
>>    - reg : offset and length of the register set.
>>
>>   Example :
>>   pmu_system_controller: system-controller@10040000 {
>> -       compatible = "samsung,exynos5250-pmu", "syscon";
>> +       compatible = "samsung,exynos5250-pmu";
>
> If you have removed "syscon" deliberately above, then you should also
> remove the same in the
> binding description which says "second value must be always "syscon".".
>

I believe that "syscon" should be still present as I don't see any code 
providing access to PMU registers to other drivers, that could replace 
the standard syscon interface, being added by this series.

Best regards,
Tomasz
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Tomasz Figa April 15, 2014, 6:28 p.m. UTC | #3
Hi Vikas,

On 17.03.2014 14:09, Vikas Sajjan wrote:
> Instead of hardcoding the PMU details for each SoC, pass this information
> through device tree (DT).
>
> Signed-off-by: Vikas Sajjan <vikas.sajjan@samsung.com>
> ---
>   .../devicetree/bindings/arm/samsung/pmu.txt        |    5 +-
>   arch/arm/boot/dts/exynos4.dtsi                     |    5 ++
>   arch/arm/boot/dts/exynos5260.dtsi                  |    5 ++
>   arch/arm/mach-exynos/common.c                      |   51 +++++++++++++-------
>   arch/arm/mach-exynos/include/mach/map.h            |    3 --
>   5 files changed, 47 insertions(+), 22 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/arm/samsung/pmu.txt b/Documentation/devicetree/bindings/arm/samsung/pmu.txt
> index f1f1552..667a7f0 100644
> --- a/Documentation/devicetree/bindings/arm/samsung/pmu.txt
> +++ b/Documentation/devicetree/bindings/arm/samsung/pmu.txt
> @@ -2,14 +2,15 @@ SAMSUNG Exynos SoC series PMU Registers
>
>   Properties:
>    - compatible : should contain two values. First value must be one from following list:
> +		   - "samsung,exynos4210-pmu" - for Exynos4210 and Exynos4x12 SoC,
>   		   - "samsung,exynos5250-pmu" - for Exynos5250 SoC,
> -		   - "samsung,exynos5420-pmu" - for Exynos5420 SoC.
> +		   - "samsung,exynos5420-pmu" - for Exynos5420 and Exynos5260 SoC.

Do Exynos5420 and 5260 really have identical PMU blocks with the same 
register layouts? If not, they should have different compatible strings.

>   		second value must be always "syscon".
>
>    - reg : offset and length of the register set.
>
>   Example :
>   pmu_system_controller: system-controller@10040000 {
> -	compatible = "samsung,exynos5250-pmu", "syscon";
> +	compatible = "samsung,exynos5250-pmu";
>   	reg = <0x10040000 0x5000>;
>   };
> diff --git a/arch/arm/boot/dts/exynos4.dtsi b/arch/arm/boot/dts/exynos4.dtsi
> index 08452e1..94cbafa 100644
> --- a/arch/arm/boot/dts/exynos4.dtsi
> +++ b/arch/arm/boot/dts/exynos4.dtsi
> @@ -55,6 +55,11 @@
>   		#phy-cells = <1>;
>   	};
>
> +	pmu_system_controller: system-controller@10020000 {
> +		compatible = "samsung,exynos4210-pmu";

Missing "syscon" compatible string.

> +		reg = <0x10020000 0x4000>;
> +	};
> +
>   	pd_mfc: mfc-power-domain@10023C40 {
>   		compatible = "samsung,exynos4210-pd";
>   		reg = <0x10023C40 0x20>;
> diff --git a/arch/arm/boot/dts/exynos5260.dtsi b/arch/arm/boot/dts/exynos5260.dtsi
> index a93fea8..2a4dace 100644
> --- a/arch/arm/boot/dts/exynos5260.dtsi
> +++ b/arch/arm/boot/dts/exynos5260.dtsi
> @@ -264,6 +264,11 @@
>   			};
>   		};
>
> +		pmu_system_controller: system-controller@10D50000 {
> +			compatible = "samsung,exynos5420-pmu";

Missing "syscon" compatible string.

> +			reg = <0x10D50000 0x5000>;
> +		};
> +
>   		pinctrl_0: pinctrl@11600000 {
>   			compatible = "samsung,exynos5260-pinctrl";
>   			reg = <0x11600000 0x1000>;
> diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c
> index 1df81ff..c75733b 100644
> --- a/arch/arm/mach-exynos/common.c
> +++ b/arch/arm/mach-exynos/common.c
> @@ -79,11 +79,6 @@ static struct map_desc exynos4_iodesc[] __initdata = {
>   		.length		= SZ_4K,
>   		.type		= MT_DEVICE,
>   	}, {
> -		.virtual	= (unsigned long)S5P_VA_PMU,
> -		.pfn		= __phys_to_pfn(EXYNOS4_PA_PMU),
> -		.length		= SZ_64K,
> -		.type		= MT_DEVICE,
> -	}, {
>   		.virtual	= (unsigned long)S5P_VA_COMBINER_BASE,
>   		.pfn		= __phys_to_pfn(EXYNOS4_PA_COMBINER),
>   		.length		= SZ_4K,
> @@ -157,11 +152,6 @@ static struct map_desc exynos5_iodesc[] __initdata = {
>   		.pfn		= __phys_to_pfn(EXYNOS5_PA_CMU),
>   		.length		= 144 * SZ_1K,
>   		.type		= MT_DEVICE,
> -	}, {
> -		.virtual	= (unsigned long)S5P_VA_PMU,
> -		.pfn		= __phys_to_pfn(EXYNOS5_PA_PMU),
> -		.length		= SZ_64K,
> -		.type		= MT_DEVICE,
>   	},
>   };
>
> @@ -243,12 +233,12 @@ static int __init exynos_fdt_map_chipid(unsigned long node, const char *uname,
>   	return 1;
>   }
>
> -struct __sysram_desc {
> +struct __exynos_reg_desc {
>   	char name[32];
>   	unsigned long addr;
>   };
>
> -static struct __sysram_desc sysram_desc[] __initdata = {
> +static struct __exynos_reg_desc exynos_sysram_desc[] __initdata = {
>   	{
>   		.name = "samsung,exynos4210-sysram",
>   		.addr = (unsigned long)S5P_VA_SYSRAM,
> @@ -258,7 +248,20 @@ static struct __sysram_desc sysram_desc[] __initdata = {
>   	},
>   };
>
> -static int __init exynos_fdt_map_sysram(unsigned long node, const char *uname,
> +static struct __exynos_reg_desc exynos_pmu_desc[] __initdata = {
> +	{
> +		.name = "samsung,exynos4210-pmu",
> +		.addr = (unsigned long)S5P_VA_PMU,
> +	}, {
> +		.name = "samsung,exynos5250-pmu",
> +		.addr = (unsigned long)S5P_VA_PMU,
> +	}, {
> +		.name = "samsung,exynos5420-pmu",
> +		.addr = (unsigned long)S5P_VA_PMU,
> +	},
> +};
> +
> +static int __init exynos_fdt_map_reg(unsigned long node, const char *uname,
>   					int depth, void *data)
>   {
>   	struct map_desc iodesc;
> @@ -266,12 +269,26 @@ static int __init exynos_fdt_map_sysram(unsigned long node, const char *uname,
>   	unsigned long len;
>   	int i;
>
> -	for (i = 0; i < ARRAY_SIZE(sysram_desc); i++) {
> -		if (of_flat_dt_is_compatible(node, sysram_desc[i].name)) {
> +	for (i = 0; i < ARRAY_SIZE(exynos_sysram_desc); i++) {
> +		if (of_flat_dt_is_compatible(node,
> +					exynos_sysram_desc[i].name)) {
> +			reg = of_get_flat_dt_prop(node, "reg", &len);
> +			if (!reg || len != (sizeof(unsigned long) * 2))
> +				return -ENODEV;
> +			iodesc.virtual = exynos_sysram_desc[i].addr;
> +			iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0]));
> +			iodesc.length = be32_to_cpu(reg[1]);
> +			iodesc.type = MT_DEVICE;
> +			iotable_init(&iodesc, 1);
> +		}
> +	}
> +
> +	for (i = 0; i < ARRAY_SIZE(exynos_pmu_desc); i++) {
> +		if (of_flat_dt_is_compatible(node, exynos_pmu_desc[i].name)) {
>   			reg = of_get_flat_dt_prop(node, "reg", &len);
>   			if (!reg || len != (sizeof(unsigned long) * 2))
>   				return -ENODEV;
> -			iodesc.virtual = sysram_desc[i].addr;
> +			iodesc.virtual = exynos_pmu_desc[i].addr;
>   			iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0]));
>   			iodesc.length = be32_to_cpu(reg[1]);
>   			iodesc.type = MT_DEVICE;
> @@ -298,7 +315,7 @@ void __init exynos_init_io(void)
>
>   	exynos_map_io();
>
> -	of_scan_flat_dt(exynos_fdt_map_sysram, NULL);
> +	of_scan_flat_dt(exynos_fdt_map_reg, NULL);

Do you really need to map PMU statically using iotable_init() at fixed 
virtual address? Shouldn't rather actual users of PMU registers bind to 
PMU node and use of_iomap()?

Best regards,
Tomasz
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Chanwoo Choi April 17, 2014, 3:44 a.m. UTC | #4
Hi Vikas,

As you comment, I found the history of this patch in mailing list.
It seems like that this patch stop the review.

Besides, Pankaj posted same patch to support PMU as following:
- https://lkml.org/lkml/2014/4/2/48

Do you have a plan to resend or not?
because I need this patch to remove PMU static memory mapping for Exynos3250.

Best Regards,
Chanwoo Choi

On 03/17/2014 10:09 PM, Vikas Sajjan wrote:
> Instead of hardcoding the PMU details for each SoC, pass this information
> through device tree (DT).
> 
> Signed-off-by: Vikas Sajjan <vikas.sajjan@samsung.com>
> ---
>  .../devicetree/bindings/arm/samsung/pmu.txt        |    5 +-
>  arch/arm/boot/dts/exynos4.dtsi                     |    5 ++
>  arch/arm/boot/dts/exynos5260.dtsi                  |    5 ++
>  arch/arm/mach-exynos/common.c                      |   51 +++++++++++++-------
>  arch/arm/mach-exynos/include/mach/map.h            |    3 --
>  5 files changed, 47 insertions(+), 22 deletions(-)
> 
> diff --git a/Documentation/devicetree/bindings/arm/samsung/pmu.txt b/Documentation/devicetree/bindings/arm/samsung/pmu.txt
> index f1f1552..667a7f0 100644
> --- a/Documentation/devicetree/bindings/arm/samsung/pmu.txt
> +++ b/Documentation/devicetree/bindings/arm/samsung/pmu.txt
> @@ -2,14 +2,15 @@ SAMSUNG Exynos SoC series PMU Registers
>  
>  Properties:
>   - compatible : should contain two values. First value must be one from following list:
> +		   - "samsung,exynos4210-pmu" - for Exynos4210 and Exynos4x12 SoC,
>  		   - "samsung,exynos5250-pmu" - for Exynos5250 SoC,
> -		   - "samsung,exynos5420-pmu" - for Exynos5420 SoC.
> +		   - "samsung,exynos5420-pmu" - for Exynos5420 and Exynos5260 SoC.
>  		second value must be always "syscon".
>  
>   - reg : offset and length of the register set.
>  
>  Example :
>  pmu_system_controller: system-controller@10040000 {
> -	compatible = "samsung,exynos5250-pmu", "syscon";
> +	compatible = "samsung,exynos5250-pmu";
>  	reg = <0x10040000 0x5000>;
>  };
> diff --git a/arch/arm/boot/dts/exynos4.dtsi b/arch/arm/boot/dts/exynos4.dtsi
> index 08452e1..94cbafa 100644
> --- a/arch/arm/boot/dts/exynos4.dtsi
> +++ b/arch/arm/boot/dts/exynos4.dtsi
> @@ -55,6 +55,11 @@
>  		#phy-cells = <1>;
>  	};
>  
> +	pmu_system_controller: system-controller@10020000 {
> +		compatible = "samsung,exynos4210-pmu";
> +		reg = <0x10020000 0x4000>;
> +	};
> +
>  	pd_mfc: mfc-power-domain@10023C40 {
>  		compatible = "samsung,exynos4210-pd";
>  		reg = <0x10023C40 0x20>;
> diff --git a/arch/arm/boot/dts/exynos5260.dtsi b/arch/arm/boot/dts/exynos5260.dtsi
> index a93fea8..2a4dace 100644
> --- a/arch/arm/boot/dts/exynos5260.dtsi
> +++ b/arch/arm/boot/dts/exynos5260.dtsi
> @@ -264,6 +264,11 @@
>  			};
>  		};
>  
> +		pmu_system_controller: system-controller@10D50000 {
> +			compatible = "samsung,exynos5420-pmu";
> +			reg = <0x10D50000 0x5000>;
> +		};
> +
>  		pinctrl_0: pinctrl@11600000 {
>  			compatible = "samsung,exynos5260-pinctrl";
>  			reg = <0x11600000 0x1000>;
> diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c
> index 1df81ff..c75733b 100644
> --- a/arch/arm/mach-exynos/common.c
> +++ b/arch/arm/mach-exynos/common.c
> @@ -79,11 +79,6 @@ static struct map_desc exynos4_iodesc[] __initdata = {
>  		.length		= SZ_4K,
>  		.type		= MT_DEVICE,
>  	}, {
> -		.virtual	= (unsigned long)S5P_VA_PMU,
> -		.pfn		= __phys_to_pfn(EXYNOS4_PA_PMU),
> -		.length		= SZ_64K,
> -		.type		= MT_DEVICE,
> -	}, {
>  		.virtual	= (unsigned long)S5P_VA_COMBINER_BASE,
>  		.pfn		= __phys_to_pfn(EXYNOS4_PA_COMBINER),
>  		.length		= SZ_4K,
> @@ -157,11 +152,6 @@ static struct map_desc exynos5_iodesc[] __initdata = {
>  		.pfn		= __phys_to_pfn(EXYNOS5_PA_CMU),
>  		.length		= 144 * SZ_1K,
>  		.type		= MT_DEVICE,
> -	}, {
> -		.virtual	= (unsigned long)S5P_VA_PMU,
> -		.pfn		= __phys_to_pfn(EXYNOS5_PA_PMU),
> -		.length		= SZ_64K,
> -		.type		= MT_DEVICE,
>  	},
>  };
>  
> @@ -243,12 +233,12 @@ static int __init exynos_fdt_map_chipid(unsigned long node, const char *uname,
>  	return 1;
>  }
>  
> -struct __sysram_desc {
> +struct __exynos_reg_desc {
>  	char name[32];
>  	unsigned long addr;
>  };
>  
> -static struct __sysram_desc sysram_desc[] __initdata = {
> +static struct __exynos_reg_desc exynos_sysram_desc[] __initdata = {
>  	{
>  		.name = "samsung,exynos4210-sysram",
>  		.addr = (unsigned long)S5P_VA_SYSRAM,
> @@ -258,7 +248,20 @@ static struct __sysram_desc sysram_desc[] __initdata = {
>  	},
>  };
>  
> -static int __init exynos_fdt_map_sysram(unsigned long node, const char *uname,
> +static struct __exynos_reg_desc exynos_pmu_desc[] __initdata = {
> +	{
> +		.name = "samsung,exynos4210-pmu",
> +		.addr = (unsigned long)S5P_VA_PMU,
> +	}, {
> +		.name = "samsung,exynos5250-pmu",
> +		.addr = (unsigned long)S5P_VA_PMU,
> +	}, {
> +		.name = "samsung,exynos5420-pmu",
> +		.addr = (unsigned long)S5P_VA_PMU,
> +	},
> +};
> +
> +static int __init exynos_fdt_map_reg(unsigned long node, const char *uname,
>  					int depth, void *data)
>  {
>  	struct map_desc iodesc;
> @@ -266,12 +269,26 @@ static int __init exynos_fdt_map_sysram(unsigned long node, const char *uname,
>  	unsigned long len;
>  	int i;
>  
> -	for (i = 0; i < ARRAY_SIZE(sysram_desc); i++) {
> -		if (of_flat_dt_is_compatible(node, sysram_desc[i].name)) {
> +	for (i = 0; i < ARRAY_SIZE(exynos_sysram_desc); i++) {
> +		if (of_flat_dt_is_compatible(node,
> +					exynos_sysram_desc[i].name)) {
> +			reg = of_get_flat_dt_prop(node, "reg", &len);
> +			if (!reg || len != (sizeof(unsigned long) * 2))
> +				return -ENODEV;
> +			iodesc.virtual = exynos_sysram_desc[i].addr;
> +			iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0]));
> +			iodesc.length = be32_to_cpu(reg[1]);
> +			iodesc.type = MT_DEVICE;
> +			iotable_init(&iodesc, 1);
> +		}
> +	}
> +
> +	for (i = 0; i < ARRAY_SIZE(exynos_pmu_desc); i++) {
> +		if (of_flat_dt_is_compatible(node, exynos_pmu_desc[i].name)) {
>  			reg = of_get_flat_dt_prop(node, "reg", &len);
>  			if (!reg || len != (sizeof(unsigned long) * 2))
>  				return -ENODEV;
> -			iodesc.virtual = sysram_desc[i].addr;
> +			iodesc.virtual = exynos_pmu_desc[i].addr;
>  			iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0]));
>  			iodesc.length = be32_to_cpu(reg[1]);
>  			iodesc.type = MT_DEVICE;
> @@ -298,7 +315,7 @@ void __init exynos_init_io(void)
>  
>  	exynos_map_io();
>  
> -	of_scan_flat_dt(exynos_fdt_map_sysram, NULL);
> +	of_scan_flat_dt(exynos_fdt_map_reg, NULL);
>  }
>  
>  static void __init exynos_map_io(void)
> diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h
> index 548269a..34eee6e 100644
> --- a/arch/arm/mach-exynos/include/mach/map.h
> +++ b/arch/arm/mach-exynos/include/mach/map.h
> @@ -28,9 +28,6 @@
>  #define EXYNOS4_PA_SYSCON		0x10010000
>  #define EXYNOS5_PA_SYSCON		0x10050100
>  
> -#define EXYNOS4_PA_PMU			0x10020000
> -#define EXYNOS5_PA_PMU			0x10040000
> -
>  #define EXYNOS4_PA_CMU			0x10030000
>  #define EXYNOS5_PA_CMU			0x10010000
>  
> 

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/arm/samsung/pmu.txt b/Documentation/devicetree/bindings/arm/samsung/pmu.txt
index f1f1552..667a7f0 100644
--- a/Documentation/devicetree/bindings/arm/samsung/pmu.txt
+++ b/Documentation/devicetree/bindings/arm/samsung/pmu.txt
@@ -2,14 +2,15 @@  SAMSUNG Exynos SoC series PMU Registers
 
 Properties:
  - compatible : should contain two values. First value must be one from following list:
+		   - "samsung,exynos4210-pmu" - for Exynos4210 and Exynos4x12 SoC,
 		   - "samsung,exynos5250-pmu" - for Exynos5250 SoC,
-		   - "samsung,exynos5420-pmu" - for Exynos5420 SoC.
+		   - "samsung,exynos5420-pmu" - for Exynos5420 and Exynos5260 SoC.
 		second value must be always "syscon".
 
  - reg : offset and length of the register set.
 
 Example :
 pmu_system_controller: system-controller@10040000 {
-	compatible = "samsung,exynos5250-pmu", "syscon";
+	compatible = "samsung,exynos5250-pmu";
 	reg = <0x10040000 0x5000>;
 };
diff --git a/arch/arm/boot/dts/exynos4.dtsi b/arch/arm/boot/dts/exynos4.dtsi
index 08452e1..94cbafa 100644
--- a/arch/arm/boot/dts/exynos4.dtsi
+++ b/arch/arm/boot/dts/exynos4.dtsi
@@ -55,6 +55,11 @@ 
 		#phy-cells = <1>;
 	};
 
+	pmu_system_controller: system-controller@10020000 {
+		compatible = "samsung,exynos4210-pmu";
+		reg = <0x10020000 0x4000>;
+	};
+
 	pd_mfc: mfc-power-domain@10023C40 {
 		compatible = "samsung,exynos4210-pd";
 		reg = <0x10023C40 0x20>;
diff --git a/arch/arm/boot/dts/exynos5260.dtsi b/arch/arm/boot/dts/exynos5260.dtsi
index a93fea8..2a4dace 100644
--- a/arch/arm/boot/dts/exynos5260.dtsi
+++ b/arch/arm/boot/dts/exynos5260.dtsi
@@ -264,6 +264,11 @@ 
 			};
 		};
 
+		pmu_system_controller: system-controller@10D50000 {
+			compatible = "samsung,exynos5420-pmu";
+			reg = <0x10D50000 0x5000>;
+		};
+
 		pinctrl_0: pinctrl@11600000 {
 			compatible = "samsung,exynos5260-pinctrl";
 			reg = <0x11600000 0x1000>;
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c
index 1df81ff..c75733b 100644
--- a/arch/arm/mach-exynos/common.c
+++ b/arch/arm/mach-exynos/common.c
@@ -79,11 +79,6 @@  static struct map_desc exynos4_iodesc[] __initdata = {
 		.length		= SZ_4K,
 		.type		= MT_DEVICE,
 	}, {
-		.virtual	= (unsigned long)S5P_VA_PMU,
-		.pfn		= __phys_to_pfn(EXYNOS4_PA_PMU),
-		.length		= SZ_64K,
-		.type		= MT_DEVICE,
-	}, {
 		.virtual	= (unsigned long)S5P_VA_COMBINER_BASE,
 		.pfn		= __phys_to_pfn(EXYNOS4_PA_COMBINER),
 		.length		= SZ_4K,
@@ -157,11 +152,6 @@  static struct map_desc exynos5_iodesc[] __initdata = {
 		.pfn		= __phys_to_pfn(EXYNOS5_PA_CMU),
 		.length		= 144 * SZ_1K,
 		.type		= MT_DEVICE,
-	}, {
-		.virtual	= (unsigned long)S5P_VA_PMU,
-		.pfn		= __phys_to_pfn(EXYNOS5_PA_PMU),
-		.length		= SZ_64K,
-		.type		= MT_DEVICE,
 	},
 };
 
@@ -243,12 +233,12 @@  static int __init exynos_fdt_map_chipid(unsigned long node, const char *uname,
 	return 1;
 }
 
-struct __sysram_desc {
+struct __exynos_reg_desc {
 	char name[32];
 	unsigned long addr;
 };
 
-static struct __sysram_desc sysram_desc[] __initdata = {
+static struct __exynos_reg_desc exynos_sysram_desc[] __initdata = {
 	{
 		.name = "samsung,exynos4210-sysram",
 		.addr = (unsigned long)S5P_VA_SYSRAM,
@@ -258,7 +248,20 @@  static struct __sysram_desc sysram_desc[] __initdata = {
 	},
 };
 
-static int __init exynos_fdt_map_sysram(unsigned long node, const char *uname,
+static struct __exynos_reg_desc exynos_pmu_desc[] __initdata = {
+	{
+		.name = "samsung,exynos4210-pmu",
+		.addr = (unsigned long)S5P_VA_PMU,
+	}, {
+		.name = "samsung,exynos5250-pmu",
+		.addr = (unsigned long)S5P_VA_PMU,
+	}, {
+		.name = "samsung,exynos5420-pmu",
+		.addr = (unsigned long)S5P_VA_PMU,
+	},
+};
+
+static int __init exynos_fdt_map_reg(unsigned long node, const char *uname,
 					int depth, void *data)
 {
 	struct map_desc iodesc;
@@ -266,12 +269,26 @@  static int __init exynos_fdt_map_sysram(unsigned long node, const char *uname,
 	unsigned long len;
 	int i;
 
-	for (i = 0; i < ARRAY_SIZE(sysram_desc); i++) {
-		if (of_flat_dt_is_compatible(node, sysram_desc[i].name)) {
+	for (i = 0; i < ARRAY_SIZE(exynos_sysram_desc); i++) {
+		if (of_flat_dt_is_compatible(node,
+					exynos_sysram_desc[i].name)) {
+			reg = of_get_flat_dt_prop(node, "reg", &len);
+			if (!reg || len != (sizeof(unsigned long) * 2))
+				return -ENODEV;
+			iodesc.virtual = exynos_sysram_desc[i].addr;
+			iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0]));
+			iodesc.length = be32_to_cpu(reg[1]);
+			iodesc.type = MT_DEVICE;
+			iotable_init(&iodesc, 1);
+		}
+	}
+
+	for (i = 0; i < ARRAY_SIZE(exynos_pmu_desc); i++) {
+		if (of_flat_dt_is_compatible(node, exynos_pmu_desc[i].name)) {
 			reg = of_get_flat_dt_prop(node, "reg", &len);
 			if (!reg || len != (sizeof(unsigned long) * 2))
 				return -ENODEV;
-			iodesc.virtual = sysram_desc[i].addr;
+			iodesc.virtual = exynos_pmu_desc[i].addr;
 			iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0]));
 			iodesc.length = be32_to_cpu(reg[1]);
 			iodesc.type = MT_DEVICE;
@@ -298,7 +315,7 @@  void __init exynos_init_io(void)
 
 	exynos_map_io();
 
-	of_scan_flat_dt(exynos_fdt_map_sysram, NULL);
+	of_scan_flat_dt(exynos_fdt_map_reg, NULL);
 }
 
 static void __init exynos_map_io(void)
diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h
index 548269a..34eee6e 100644
--- a/arch/arm/mach-exynos/include/mach/map.h
+++ b/arch/arm/mach-exynos/include/mach/map.h
@@ -28,9 +28,6 @@ 
 #define EXYNOS4_PA_SYSCON		0x10010000
 #define EXYNOS5_PA_SYSCON		0x10050100
 
-#define EXYNOS4_PA_PMU			0x10020000
-#define EXYNOS5_PA_PMU			0x10040000
-
 #define EXYNOS4_PA_CMU			0x10030000
 #define EXYNOS5_PA_CMU			0x10010000