Message ID | 1404878455-31518-2-git-send-email-pankaj.dubey@samsung.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Pankaj Dubey wrote: > > Add support for mapping Samsung Power Management Unit (PMU) > base address from device tree. > > Signed-off-by: Pankaj Dubey <pankaj.dubey@samsung.com> > Reviewed-by: Tomasz Figa <t.figa@samsung.com> > --- > arch/arm/mach-exynos/common.h | 1 + > arch/arm/mach-exynos/exynos.c | 37 +++++++++++++++++++++++++++++++++++++ > 2 files changed, 38 insertions(+) > > diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h > index 152b464..f8daa9c 100644 > --- a/arch/arm/mach-exynos/common.h > +++ b/arch/arm/mach-exynos/common.h > @@ -113,6 +113,7 @@ IS_SAMSUNG_CPU(exynos5800, EXYNOS5800_SOC_ID, EXYNOS5_SOC_MASK) > > extern void __iomem *sysram_ns_base_addr; > extern void __iomem *sysram_base_addr; > +extern void __iomem *pmu_base_addr; > void exynos_sysram_init(void); > > void exynos_firmware_init(void); > diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c > index 186f35d..173aac8 100644 > --- a/arch/arm/mach-exynos/exynos.c > +++ b/arch/arm/mach-exynos/exynos.c > @@ -19,6 +19,7 @@ > #include <linux/of_platform.h> > #include <linux/platform_device.h> > #include <linux/pm_domain.h> > +#include <linux/irqchip.h> > > #include <asm/cacheflush.h> > #include <asm/hardware/cache-l2x0.h> > @@ -31,6 +32,8 @@ > #include "regs-pmu.h" > #include "regs-sys.h" > > +void __iomem *pmu_base_addr; > + > static struct map_desc exynos4_iodesc[] __initdata = { > { > .virtual = (unsigned long)S3C_VA_SYS, > @@ -253,6 +256,39 @@ static void __init exynos_init_io(void) > exynos_map_io(); > } > > +static const struct of_device_id exynos_dt_pmu_match[] = { > + { .compatible = "samsung,exynos3250-pmu" }, > + { .compatible = "samsung,exynos4210-pmu" }, > + { .compatible = "samsung,exynos4212-pmu" }, > + { .compatible = "samsung,exynos4412-pmu" }, > + { .compatible = "samsung,exynos5250-pmu" }, > + { .compatible = "samsung,exynos5420-pmu" }, > + { /*sentinel*/ }, > +}; > + > +static void exynos_map_pmu(void) > +{ > + struct device_node *np; > + > + np = of_find_matching_node(NULL, exynos_dt_pmu_match); > + if (np) > + pmu_base_addr = of_iomap(np, 0); > + > + if (!pmu_base_addr) > + panic("failed to find exynos pmu register\n"); > +} > + > +static void __init exynos_init_irq(void) > +{ > + irqchip_init(); > + /* > + * Since platsmp.c needs pmu base address by the time > + * DT is not unflatten so we can't use DT APIs before > + * init_irq > + */ > + exynos_map_pmu(); > +} > + > static void __init exynos_dt_machine_init(void) > { > struct device_node *i2c_np; > @@ -336,6 +372,7 @@ DT_MACHINE_START(EXYNOS_DT, "SAMSUNG EXYNOS (Flattened Device Tree)") > .smp = smp_ops(exynos_smp_ops), > .map_io = exynos_init_io, > .init_early = exynos_firmware_init, > + .init_irq = exynos_init_irq, > .init_machine = exynos_dt_machine_init, > .init_late = exynos_init_late, > .dt_compat = exynos_dt_compat, > -- > 1.7.9.5 Looks good to me, will apply. Thanks, Kukjin
Am 10.07.2014 15:49, schrieb Kukjin Kim: > Pankaj Dubey wrote: >> >> Add support for mapping Samsung Power Management Unit (PMU) >> base address from device tree. >> >> Signed-off-by: Pankaj Dubey <pankaj.dubey@samsung.com> >> Reviewed-by: Tomasz Figa <t.figa@samsung.com> >> --- >> arch/arm/mach-exynos/common.h | 1 + >> arch/arm/mach-exynos/exynos.c | 37 +++++++++++++++++++++++++++++++++++++ >> 2 files changed, 38 insertions(+) >> >> diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h >> index 152b464..f8daa9c 100644 >> --- a/arch/arm/mach-exynos/common.h >> +++ b/arch/arm/mach-exynos/common.h >> @@ -113,6 +113,7 @@ IS_SAMSUNG_CPU(exynos5800, EXYNOS5800_SOC_ID, EXYNOS5_SOC_MASK) >> >> extern void __iomem *sysram_ns_base_addr; >> extern void __iomem *sysram_base_addr; >> +extern void __iomem *pmu_base_addr; >> void exynos_sysram_init(void); >> >> void exynos_firmware_init(void); >> diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c >> index 186f35d..173aac8 100644 >> --- a/arch/arm/mach-exynos/exynos.c >> +++ b/arch/arm/mach-exynos/exynos.c >> @@ -19,6 +19,7 @@ >> #include <linux/of_platform.h> >> #include <linux/platform_device.h> >> #include <linux/pm_domain.h> >> +#include <linux/irqchip.h> >> >> #include <asm/cacheflush.h> >> #include <asm/hardware/cache-l2x0.h> >> @@ -31,6 +32,8 @@ >> #include "regs-pmu.h" >> #include "regs-sys.h" >> >> +void __iomem *pmu_base_addr; >> + >> static struct map_desc exynos4_iodesc[] __initdata = { >> { >> .virtual = (unsigned long)S3C_VA_SYS, >> @@ -253,6 +256,39 @@ static void __init exynos_init_io(void) >> exynos_map_io(); >> } >> >> +static const struct of_device_id exynos_dt_pmu_match[] = { >> + { .compatible = "samsung,exynos3250-pmu" }, >> + { .compatible = "samsung,exynos4210-pmu" }, >> + { .compatible = "samsung,exynos4212-pmu" }, >> + { .compatible = "samsung,exynos4412-pmu" }, >> + { .compatible = "samsung,exynos5250-pmu" }, >> + { .compatible = "samsung,exynos5420-pmu" }, >> + { /*sentinel*/ }, >> +}; >> + >> +static void exynos_map_pmu(void) >> +{ >> + struct device_node *np; >> + >> + np = of_find_matching_node(NULL, exynos_dt_pmu_match); >> + if (np) >> + pmu_base_addr = of_iomap(np, 0); >> + >> + if (!pmu_base_addr) >> + panic("failed to find exynos pmu register\n"); >> +} >> + >> +static void __init exynos_init_irq(void) >> +{ >> + irqchip_init(); >> + /* >> + * Since platsmp.c needs pmu base address by the time >> + * DT is not unflatten so we can't use DT APIs before Either "Since platsmp.c needs ... unflattened, we can't ..." or "platsmp.c needs ... unflattened, so we can't ..." >> + * init_irq >> + */ >> + exynos_map_pmu(); >> +} >> + >> static void __init exynos_dt_machine_init(void) >> { >> struct device_node *i2c_np; >> @@ -336,6 +372,7 @@ DT_MACHINE_START(EXYNOS_DT, "SAMSUNG EXYNOS (Flattened Device Tree)") >> .smp = smp_ops(exynos_smp_ops), >> .map_io = exynos_init_io, >> .init_early = exynos_firmware_init, >> + .init_irq = exynos_init_irq, >> .init_machine = exynos_dt_machine_init, >> .init_late = exynos_init_late, >> .dt_compat = exynos_dt_compat, >> -- >> 1.7.9.5 > > Looks good to me, will apply. Unfortunately this broke the boot on ODROID-XU: Neither is there a exynos_dt_pmu_match[] entry for 5410 nor is such a node defined in exynos5410.dtsi. Not having access to a TRM, should 5410 get a node like 5420? Might SoCs beyond 5420 also require changes? Regards, Andreas
diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h index 152b464..f8daa9c 100644 --- a/arch/arm/mach-exynos/common.h +++ b/arch/arm/mach-exynos/common.h @@ -113,6 +113,7 @@ IS_SAMSUNG_CPU(exynos5800, EXYNOS5800_SOC_ID, EXYNOS5_SOC_MASK) extern void __iomem *sysram_ns_base_addr; extern void __iomem *sysram_base_addr; +extern void __iomem *pmu_base_addr; void exynos_sysram_init(void); void exynos_firmware_init(void); diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c index 186f35d..173aac8 100644 --- a/arch/arm/mach-exynos/exynos.c +++ b/arch/arm/mach-exynos/exynos.c @@ -19,6 +19,7 @@ #include <linux/of_platform.h> #include <linux/platform_device.h> #include <linux/pm_domain.h> +#include <linux/irqchip.h> #include <asm/cacheflush.h> #include <asm/hardware/cache-l2x0.h> @@ -31,6 +32,8 @@ #include "regs-pmu.h" #include "regs-sys.h" +void __iomem *pmu_base_addr; + static struct map_desc exynos4_iodesc[] __initdata = { { .virtual = (unsigned long)S3C_VA_SYS, @@ -253,6 +256,39 @@ static void __init exynos_init_io(void) exynos_map_io(); } +static const struct of_device_id exynos_dt_pmu_match[] = { + { .compatible = "samsung,exynos3250-pmu" }, + { .compatible = "samsung,exynos4210-pmu" }, + { .compatible = "samsung,exynos4212-pmu" }, + { .compatible = "samsung,exynos4412-pmu" }, + { .compatible = "samsung,exynos5250-pmu" }, + { .compatible = "samsung,exynos5420-pmu" }, + { /*sentinel*/ }, +}; + +static void exynos_map_pmu(void) +{ + struct device_node *np; + + np = of_find_matching_node(NULL, exynos_dt_pmu_match); + if (np) + pmu_base_addr = of_iomap(np, 0); + + if (!pmu_base_addr) + panic("failed to find exynos pmu register\n"); +} + +static void __init exynos_init_irq(void) +{ + irqchip_init(); + /* + * Since platsmp.c needs pmu base address by the time + * DT is not unflatten so we can't use DT APIs before + * init_irq + */ + exynos_map_pmu(); +} + static void __init exynos_dt_machine_init(void) { struct device_node *i2c_np; @@ -336,6 +372,7 @@ DT_MACHINE_START(EXYNOS_DT, "SAMSUNG EXYNOS (Flattened Device Tree)") .smp = smp_ops(exynos_smp_ops), .map_io = exynos_init_io, .init_early = exynos_firmware_init, + .init_irq = exynos_init_irq, .init_machine = exynos_dt_machine_init, .init_late = exynos_init_late, .dt_compat = exynos_dt_compat,