ARM: EXYNOS: move restart code into pmu driver

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>
This commit is contained in:
Pankaj Dubey
2014-11-22 23:10:23 +09:00
committed by Kukjin Kim
parent 5e6473f422
commit 8cfc7fdd33
3 changed files with 23 additions and 7 deletions

View File

@@ -12,7 +12,6 @@
#ifndef __ARCH_ARM_MACH_EXYNOS_COMMON_H #ifndef __ARCH_ARM_MACH_EXYNOS_COMMON_H
#define __ARCH_ARM_MACH_EXYNOS_COMMON_H #define __ARCH_ARM_MACH_EXYNOS_COMMON_H
#include <linux/reboot.h>
#include <linux/of.h> #include <linux/of.h>
#define EXYNOS3250_SOC_ID 0xE3472000 #define EXYNOS3250_SOC_ID 0xE3472000

View 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 = { static struct platform_device exynos_cpuidle = {
.name = "exynos_cpuidle", .name = "exynos_cpuidle",
#ifdef CONFIG_ARM_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_machine = exynos_dt_machine_init,
.init_late = exynos_init_late, .init_late = exynos_init_late,
.dt_compat = exynos_dt_compat, .dt_compat = exynos_dt_compat,
.restart = exynos_restart,
.reserve = exynos_reserve, .reserve = exynos_reserve,
.dt_fixup = exynos_dt_fixup, .dt_fixup = exynos_dt_fixup,
MACHINE_END MACHINE_END

View File

@@ -11,8 +11,11 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_address.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/notifier.h>
#include <linux/reboot.h>
#include "exynos-pmu.h" #include "exynos-pmu.h"
@@ -874,6 +877,13 @@ static void exynos5420_pmu_init(void)
pr_info("EXYNOS5420 PMU initialized\n"); 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 = { static const struct exynos_pmu_data exynos3250_pmu_data = {
.pmu_config = exynos3250_pmu_config, .pmu_config = exynos3250_pmu_config,
@@ -932,11 +942,20 @@ static const struct of_device_id exynos_pmu_of_device_ids[] = {
{ /*sentinel*/ }, { /*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) static int exynos_pmu_probe(struct platform_device *pdev)
{ {
const struct of_device_id *match; const struct of_device_id *match;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct resource *res; struct resource *res;
int ret;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
pmu_base_addr = devm_ioremap_resource(dev, res); 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); 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"); dev_dbg(dev, "Exynos PMU Driver probe done\n");
return 0; return 0;
} }