]> git.karo-electronics.de Git - linux-beck.git/commitdiff
ARM: EXYNOS: move restart code into pmu driver
authorPankaj Dubey <pankaj.dubey@samsung.com>
Sat, 22 Nov 2014 14:10:23 +0000 (23:10 +0900)
committerKukjin Kim <kgene.kim@samsung.com>
Sat, 22 Nov 2014 14:10:23 +0000 (23:10 +0900)
Let's register restart handler from PMU driver for restart
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>
Acked-by: Guenter Roeck <linux@roeck-us.net>
Tested-by: Vivek Gautam <gautam.vivek@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
arch/arm/mach-exynos/common.h
arch/arm/mach-exynos/exynos.c
arch/arm/mach-exynos/pmu.c

index 431be1bca2e801692949f8d631f1799a31885692..865f878063cc12d1b614d1874dbf74bed24681f4 100644 (file)
@@ -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
index 67cf65fd77bb50fed91bc522cb011c23b5333544..80d744db7dc7a646f60209f2ee2347889f01cb02 100644 (file)
@@ -137,11 +137,6 @@ static struct map_desc exynos5_iodesc[] __initdata = {
        },
 };
 
-static void exynos_restart(enum reboot_mode mode, const char *cmd)
-{
-       __raw_writel(0x1, pmu_base_addr + EXYNOS_SWRESET);
-}
-
 static struct platform_device exynos_cpuidle = {
        .name              = "exynos_cpuidle",
 #ifdef CONFIG_ARM_EXYNOS_CPUIDLE
@@ -366,7 +361,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
index fcb3b672e39b533cf1f796932690582da8ae995d..ccb012009cd8c2de6f0e70cf77e0637d4773311c 100644 (file)
 
 #include <linux/io.h>
 #include <linux/of.h>
+#include <linux/of_address.h>
 #include <linux/platform_device.h>
 #include <linux/delay.h>
+#include <linux/notifier.h>
+#include <linux/reboot.h>
 
 
 #include "exynos-pmu.h"
@@ -874,6 +877,13 @@ static void exynos5420_pmu_init(void)
        pr_info("EXYNOS5420 PMU initialized\n");
 }
 
+static int pmu_restart_notify(struct notifier_block *this,
+               unsigned long code, void *unused)
+{
+       pmu_raw_writel(0x1, EXYNOS_SWRESET);
+
+       return NOTIFY_DONE;
+}
 
 static const struct exynos_pmu_data exynos3250_pmu_data = {
        .pmu_config     = exynos3250_pmu_config,
@@ -932,11 +942,20 @@ static const struct of_device_id exynos_pmu_of_device_ids[] = {
        { /*sentinel*/ },
 };
 
+/*
+ * Exynos PMU restart notifier, handles restart functionality
+ */
+static struct notifier_block pmu_restart_handler = {
+       .notifier_call = pmu_restart_notify,
+       .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);
@@ -961,6 +980,10 @@ static int exynos_pmu_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, pmu_context);
 
+       ret = register_restart_handler(&pmu_restart_handler);
+       if (ret)
+               dev_warn(dev, "can't register restart handler err=%d\n", ret);
+
        dev_dbg(dev, "Exynos PMU Driver probe done\n");
        return 0;
 }