* [PATCH 0/2] Handle reboot for Exynos SoC via reboot_notifier @ 2014-10-01 5:48 Pankaj Dubey 2014-10-01 5:48 ` [PATCH 1/2] clk: samsung: exynos5440: move restart code into clock driver Pankaj Dubey 2014-10-01 5:49 ` [PATCH 2/2] ARM: EXYNOS: PMU: move restart code into pmu driver Pankaj Dubey 0 siblings, 2 replies; 6+ messages in thread From: Pankaj Dubey @ 2014-10-01 5:48 UTC (permalink / raw) To: linux-arm-kernel This patch removes restart hook from machine_desc of Exynos, and moves respective code into reboot_notifiers. Exynos5440 handles reboot via clock register so let's register a reboot_notifier in Exynos5440 clock driver. For reset Exynos SoC, reboot is handled via PMU SWRESET register so let's register a reboot_notifier in PMU driver for handling this. This patch is inspired and dependent on following patch series[1] from Geunter Roeck. Also this patch is dependent on PMU platform driver patch [2] by me, and has been prepared on top of it. [1]: kernel: Add support for kernel restart handler call chain https://lkml.org/lkml/2014/8/19/652 [2]: ARM: Exynos: Convert PMU implementation into a platform driver https://lkml.org/lkml/2014/9/30/219 I have tested reboot functionality on Exynos3250 based board, on kgene/for-next as well as linux-next's next-20140925 tag. Pankaj Dubey (2): clk: samsung: exynos5440: move restart code into clock driver ARM: EXYNOS: PMU: move restart code into pmu driver arch/arm/mach-exynos/common.h | 1 - arch/arm/mach-exynos/exynos.c | 23 --------------------- arch/arm/mach-exynos/pmu.c | 28 +++++++++++++++++++++++++ drivers/clk/samsung/clk-exynos5440.c | 37 ++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 24 deletions(-) -- 1.7.9.5 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] clk: samsung: exynos5440: move restart code into clock driver 2014-10-01 5:48 [PATCH 0/2] Handle reboot for Exynos SoC via reboot_notifier Pankaj Dubey @ 2014-10-01 5:48 ` Pankaj Dubey 2014-10-01 10:33 ` Tomasz Figa 2014-10-01 5:49 ` [PATCH 2/2] ARM: EXYNOS: PMU: move restart code into pmu driver Pankaj Dubey 1 sibling, 1 reply; 6+ messages in thread From: Pankaj Dubey @ 2014-10-01 5:48 UTC (permalink / raw) To: linux-arm-kernel Let's register reboot_notifier for Exynos5440 from it's clock driver for reboot functionality. So that we can cleanup restart hooks from machine specific file. CC: Sylwester Nawrocki <s.nawrocki@samsung.com> CC: Mike Turquette <mturquette@linaro.org> Signed-off-by: Pankaj Dubey <pankaj.dubey@samsung.com> --- arch/arm/mach-exynos/exynos.c | 13 ------------ drivers/clk/samsung/clk-exynos5440.c | 37 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c index 2f2f7b2..d56134a 100644 --- a/arch/arm/mach-exynos/exynos.c +++ b/arch/arm/mach-exynos/exynos.c @@ -143,19 +143,6 @@ static void exynos_restart(enum reboot_mode mode, const char *cmd) u32 val = 0x1; void __iomem *addr = pmu_base_addr + EXYNOS_SWRESET; - if (of_machine_is_compatible("samsung,exynos5440")) { - u32 status; - np = of_find_compatible_node(NULL, NULL, "samsung,exynos5440-clock"); - - addr = of_iomap(np, 0) + 0xbc; - status = __raw_readl(addr); - - addr = of_iomap(np, 0) + 0xcc; - val = __raw_readl(addr); - - val = (val & 0xffff0000) | (status & 0xffff); - } - __raw_writel(val, addr); } diff --git a/drivers/clk/samsung/clk-exynos5440.c b/drivers/clk/samsung/clk-exynos5440.c index 00d1d00..171d3af 100644 --- a/drivers/clk/samsung/clk-exynos5440.c +++ b/drivers/clk/samsung/clk-exynos5440.c @@ -15,6 +15,8 @@ #include <linux/clk-provider.h> #include <linux/of.h> #include <linux/of_address.h> +#include <linux/notifier.h> +#include <linux/reboot.h> #include "clk.h" #include "clk-pll.h" @@ -89,6 +91,38 @@ static const struct of_device_id ext_clk_match[] __initconst = { {}, }; +static int exynos5440_clk_reboot_notify_handler(struct notifier_block *this, + unsigned long code, void *unused) +{ + if (code == SYS_RESTART) { + struct device_node *np; + void __iomem *addr; + u32 val, status; + + np = of_find_compatible_node(NULL, NULL, + "samsung,exynos5440-clock"); + + addr = of_iomap(np, 0) + 0xbc; + status = readl_relaxed(addr); + + addr = of_iomap(np, 0) + 0xcc; + val = readl_relaxed(addr); + + val = (val & 0xffff0000) | (status & 0xffff); + + writel_relaxed(val, addr); + } + return NOTIFY_DONE; +} + +/* + * Exynos5440 Clock reboot notifier, handles reboot functionality + */ +static struct notifier_block exynos5440_clk_reboot_notifier = { + .notifier_call = exynos5440_clk_reboot_notify_handler, + .priority = 128, +}; + /* register exynos5440 clocks */ static void __init exynos5440_clk_init(struct device_node *np) { @@ -125,6 +159,9 @@ static void __init exynos5440_clk_init(struct device_node *np) samsung_clk_of_add_provider(np, ctx); + if (register_reboot_notifier(&exynos5440_clk_reboot_notifier)) + pr_err("exynos5440 clock can't register reboot notifier\n"); + pr_info("Exynos5440: arm_clk = %ldHz\n", _get_rate("arm_clk")); pr_info("exynos5440 clock initialization complete\n"); } -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 1/2] clk: samsung: exynos5440: move restart code into clock driver 2014-10-01 5:48 ` [PATCH 1/2] clk: samsung: exynos5440: move restart code into clock driver Pankaj Dubey @ 2014-10-01 10:33 ` Tomasz Figa 0 siblings, 0 replies; 6+ messages in thread From: Tomasz Figa @ 2014-10-01 10:33 UTC (permalink / raw) To: linux-arm-kernel Hi Pankaj, Please see my comments inline. On 01.10.2014 07:48, Pankaj Dubey wrote: > Let's register reboot_notifier for Exynos5440 from it's clock driver > for reboot functionality. So that we can cleanup restart hooks from > machine specific file. > > CC: Sylwester Nawrocki <s.nawrocki@samsung.com> > CC: Mike Turquette <mturquette@linaro.org> > Signed-off-by: Pankaj Dubey <pankaj.dubey@samsung.com> > --- > arch/arm/mach-exynos/exynos.c | 13 ------------ > drivers/clk/samsung/clk-exynos5440.c | 37 ++++++++++++++++++++++++++++++++++ > 2 files changed, 37 insertions(+), 13 deletions(-) > > diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c > index 2f2f7b2..d56134a 100644 > --- a/arch/arm/mach-exynos/exynos.c > +++ b/arch/arm/mach-exynos/exynos.c > @@ -143,19 +143,6 @@ static void exynos_restart(enum reboot_mode mode, const char *cmd) > u32 val = 0x1; > void __iomem *addr = pmu_base_addr + EXYNOS_SWRESET; You can remove the variables above as well... > > - if (of_machine_is_compatible("samsung,exynos5440")) { > - u32 status; > - np = of_find_compatible_node(NULL, NULL, "samsung,exynos5440-clock"); > - > - addr = of_iomap(np, 0) + 0xbc; > - status = __raw_readl(addr); > - > - addr = of_iomap(np, 0) + 0xcc; > - val = __raw_readl(addr); > - > - val = (val & 0xffff0000) | (status & 0xffff); > - } > - > __raw_writel(val, addr); and make this use the constants instead. > } > > diff --git a/drivers/clk/samsung/clk-exynos5440.c b/drivers/clk/samsung/clk-exynos5440.c > index 00d1d00..171d3af 100644 > --- a/drivers/clk/samsung/clk-exynos5440.c > +++ b/drivers/clk/samsung/clk-exynos5440.c > @@ -15,6 +15,8 @@ > #include <linux/clk-provider.h> > #include <linux/of.h> > #include <linux/of_address.h> > +#include <linux/notifier.h> > +#include <linux/reboot.h> > > #include "clk.h" > #include "clk-pll.h" > @@ -89,6 +91,38 @@ static const struct of_device_id ext_clk_match[] __initconst = { > {}, > }; > > +static int exynos5440_clk_reboot_notify_handler(struct notifier_block *this, > + unsigned long code, void *unused) > +{ > + if (code == SYS_RESTART) { > + struct device_node *np; > + void __iomem *addr; > + u32 val, status; > + > + np = of_find_compatible_node(NULL, NULL, > + "samsung,exynos5440-clock"); > + > + addr = of_iomap(np, 0) + 0xbc; You can just save the address in exynos5440_clk_init() and use it here without the whole dance with DT and ioremap. Best regards, Tomasz ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/2] ARM: EXYNOS: PMU: move restart code into pmu driver 2014-10-01 5:48 [PATCH 0/2] Handle reboot for Exynos SoC via reboot_notifier Pankaj Dubey 2014-10-01 5:48 ` [PATCH 1/2] clk: samsung: exynos5440: move restart code into clock driver Pankaj Dubey @ 2014-10-01 5:49 ` Pankaj Dubey 2014-10-01 10:36 ` Tomasz Figa 1 sibling, 1 reply; 6+ messages in thread From: Pankaj Dubey @ 2014-10-01 5:49 UTC (permalink / raw) To: linux-arm-kernel Let's register reboot_notifier from PMU driver for reboot functionality. So that we can remove restart hooks from machine specific file, and thus moving ahead when PMU moved to driver folder, this functionality can be reused for ARM64 based Exynos SoC's. Signed-off-by: Pankaj Dubey <pankaj.dubey@samsung.com> --- arch/arm/mach-exynos/common.h | 1 - arch/arm/mach-exynos/exynos.c | 10 ---------- arch/arm/mach-exynos/pmu.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h index 431be1b..865f878 100644 --- a/arch/arm/mach-exynos/common.h +++ b/arch/arm/mach-exynos/common.h @@ -12,7 +12,6 @@ #ifndef __ARCH_ARM_MACH_EXYNOS_COMMON_H #define __ARCH_ARM_MACH_EXYNOS_COMMON_H -#include <linux/reboot.h> #include <linux/of.h> #define EXYNOS3250_SOC_ID 0xE3472000 diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c index d56134a..3aa75b8e 100644 --- a/arch/arm/mach-exynos/exynos.c +++ b/arch/arm/mach-exynos/exynos.c @@ -137,15 +137,6 @@ static struct map_desc exynos5_iodesc[] __initdata = { }, }; -static void exynos_restart(enum reboot_mode mode, const char *cmd) -{ - struct device_node *np; - u32 val = 0x1; - void __iomem *addr = pmu_base_addr + EXYNOS_SWRESET; - - __raw_writel(val, addr); -} - static struct platform_device exynos_cpuidle = { .name = "exynos_cpuidle", #ifdef CONFIG_ARM_EXYNOS_CPUIDLE @@ -369,7 +360,6 @@ DT_MACHINE_START(EXYNOS_DT, "SAMSUNG EXYNOS (Flattened Device Tree)") .init_machine = exynos_dt_machine_init, .init_late = exynos_init_late, .dt_compat = exynos_dt_compat, - .restart = exynos_restart, .reserve = exynos_reserve, .dt_fixup = exynos_dt_fixup, MACHINE_END diff --git a/arch/arm/mach-exynos/pmu.c b/arch/arm/mach-exynos/pmu.c index 1993e08..56bb796 100644 --- a/arch/arm/mach-exynos/pmu.c +++ b/arch/arm/mach-exynos/pmu.c @@ -11,7 +11,10 @@ #include <linux/io.h> #include <linux/of.h> +#include <linux/of_address.h> #include <linux/platform_device.h> +#include <linux/notifier.h> +#include <linux/reboot.h> #include "exynos-pmu.h" #include "regs-pmu.h" @@ -439,6 +442,18 @@ static void exynos5250_pmu_init(void) pmu_raw_writel(value, EXYNOS5_MASK_WDTRESET_REQUEST); } +static int pmu_reboot_notify_handler(struct notifier_block *this, + unsigned long code, void *unused) +{ + if (code == SYS_RESTART) { + u32 val = 0x1; + + pmu_raw_writel(val, EXYNOS_SWRESET); + } + + return NOTIFY_DONE; +} + static const struct exynos_pmu_data exynos4210_pmu_data = { .pmu_config = exynos4210_pmu_config, }; @@ -478,11 +493,20 @@ static const struct of_device_id exynos_pmu_of_device_ids[] = { { /*sentinel*/ }, }; +/* + * Exynos PMU reboot notifier, handles reboot functionality + */ +static struct notifier_block pmu_reboot_notifier = { + .notifier_call = pmu_reboot_notify_handler, + .priority = 128, +}; + static int exynos_pmu_probe(struct platform_device *pdev) { const struct of_device_id *match; struct device *dev = &pdev->dev; struct resource *res; + int ret; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); pmu_base_addr = devm_ioremap_resource(dev, res); @@ -507,6 +531,10 @@ static int exynos_pmu_probe(struct platform_device *pdev) platform_set_drvdata(pdev, pmu_context); + ret = register_reboot_notifier(&pmu_reboot_notifier); + if (ret) + dev_err(dev, "can't register reboot notifier err=%d\n", ret); + dev_dbg(dev, "Exynos PMU Driver probe done\n"); return 0; } -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/2] ARM: EXYNOS: PMU: move restart code into pmu driver 2014-10-01 5:49 ` [PATCH 2/2] ARM: EXYNOS: PMU: move restart code into pmu driver Pankaj Dubey @ 2014-10-01 10:36 ` Tomasz Figa 2014-10-01 11:42 ` Pankaj Dubey 0 siblings, 1 reply; 6+ messages in thread From: Tomasz Figa @ 2014-10-01 10:36 UTC (permalink / raw) To: linux-arm-kernel Hi Pankaj, Please see my comments inline. On 01.10.2014 07:49, Pankaj Dubey wrote: > Let's register reboot_notifier from PMU driver for reboot > functionality. So that we can remove restart hooks from > machine specific file, and thus moving ahead when PMU moved > to driver folder, this functionality can be reused for ARM64 > based Exynos SoC's. [snip] > +static int pmu_reboot_notify_handler(struct notifier_block *this, > + unsigned long code, void *unused) > +{ > + if (code == SYS_RESTART) { > + u32 val = 0x1; > + > + pmu_raw_writel(val, EXYNOS_SWRESET); As already mentioned for patch 1, no need for the variable, because this is just a constant 1. Best regards, Tomasz ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/2] ARM: EXYNOS: PMU: move restart code into pmu driver 2014-10-01 10:36 ` Tomasz Figa @ 2014-10-01 11:42 ` Pankaj Dubey 0 siblings, 0 replies; 6+ messages in thread From: Pankaj Dubey @ 2014-10-01 11:42 UTC (permalink / raw) To: linux-arm-kernel Hi Tomasz, On Wednesday, October 01, 2014 4:07 PM, Tomasz Figa wrote, > To: Pankaj Dubey; linux-arm-kernel at lists.infradead.org; linux-samsung- > soc at vger.kernel.org > Cc: kgene.kim at samsung.com; linux at arm.linux.org.uk; thomas.ab at samsung.com; > vikas.sajjan at samsung.com; linux at roeck-us.net; naushad at samsung.com > Subject: Re: [PATCH 2/2] ARM: EXYNOS: PMU: move restart code into pmu > driver > > Hi Pankaj, > > Please see my comments inline. > > On 01.10.2014 07:49, Pankaj Dubey wrote: > > Let's register reboot_notifier from PMU driver for reboot > > functionality. So that we can remove restart hooks from machine > > specific file, and thus moving ahead when PMU moved to driver folder, > > this functionality can be reused for ARM64 based Exynos SoC's. > > [snip] > > > +static int pmu_reboot_notify_handler(struct notifier_block *this, > > + unsigned long code, void *unused) > > +{ > > + if (code == SYS_RESTART) { > > + u32 val = 0x1; > > + > > + pmu_raw_writel(val, EXYNOS_SWRESET); > > As already mentioned for patch 1, no need for the variable, because this is just a > constant 1. > Thanks for review. Addressed all your review comments for this patch series in v2. Thanks, Pankaj Dubey > Best regards, > Tomasz ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-10-01 11:42 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-10-01 5:48 [PATCH 0/2] Handle reboot for Exynos SoC via reboot_notifier Pankaj Dubey 2014-10-01 5:48 ` [PATCH 1/2] clk: samsung: exynos5440: move restart code into clock driver Pankaj Dubey 2014-10-01 10:33 ` Tomasz Figa 2014-10-01 5:49 ` [PATCH 2/2] ARM: EXYNOS: PMU: move restart code into pmu driver Pankaj Dubey 2014-10-01 10:36 ` Tomasz Figa 2014-10-01 11:42 ` Pankaj Dubey
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).