Message ID | 1395061795-17777-2-git-send-email-vikas.sajjan@samsung.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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".".
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
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
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 > >
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
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(-)