summaryrefslogtreecommitdiff
path: root/drivers/soc/samsung
diff options
context:
space:
mode:
authorJonghwa Lee <jonghwa3.lee@samsung.com>2014-12-17 17:06:03 +0900
committerSeung-Woo Kim <sw0312.kim@samsung.com>2016-12-14 13:43:05 +0900
commit08b1bba5d0cc48198b9cbc191b96e91538e5ae7d (patch)
treec9a365b13b924a30cb4a9b23a56f473cef6c3df9 /drivers/soc/samsung
parentfcc37948f420b9966ea460e3352023fe1ae0ea60 (diff)
soc: samsung: Add support EXYNOS generic power management driver.
To enter suspend, EXYNOS requires some machine dependent procedures. This patch introduces new driver to support those requirements and generic interface for power state management. Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com>
Diffstat (limited to 'drivers/soc/samsung')
-rw-r--r--drivers/soc/samsung/Kconfig7
-rw-r--r--drivers/soc/samsung/Makefile1
-rw-r--r--drivers/soc/samsung/exynos-pm.c75
3 files changed, 83 insertions, 0 deletions
diff --git a/drivers/soc/samsung/Kconfig b/drivers/soc/samsung/Kconfig
index d8fe3a9b0f55..60a5bf58ebef 100644
--- a/drivers/soc/samsung/Kconfig
+++ b/drivers/soc/samsung/Kconfig
@@ -24,6 +24,13 @@ config EXYNOS5433_PMU
help
Say Y here to support pmu driver for Exynos5433.
+config EXYNOS_PM
+ bool "Support Exynos Low Power Management"
+ depends on ARCH_EXYNOS
+ help
+ This option supports Exynos to enter suspend with doing some SoC
+ specific requirements.
+
config EXYNOS_EXTRA_PWR_MODES
bool
help
diff --git a/drivers/soc/samsung/Makefile b/drivers/soc/samsung/Makefile
index 1713965aab94..817ce7425ded 100644
--- a/drivers/soc/samsung/Makefile
+++ b/drivers/soc/samsung/Makefile
@@ -1,2 +1,3 @@
obj-$(CONFIG_EXYNOS_PMU) += exynos-pmu.o
obj-$(CONFIG_EXYNOS5433_PMU) += exynos5433-pmu.o
+obj-$(CONFIG_EXYNOS_PM) += exynos-pm.o
diff --git a/drivers/soc/samsung/exynos-pm.c b/drivers/soc/samsung/exynos-pm.c
new file mode 100644
index 000000000000..e903be0901e2
--- /dev/null
+++ b/drivers/soc/samsung/exynos-pm.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * Exynos Power Management support driver
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include <linux/syscore_ops.h>
+#include <linux/soc/samsung/exynos-pmu.h>
+#include <linux/soc/samsung/exynos-pm.h>
+
+static struct exynos_pm_ops *pm_ops;
+
+static int exynos_suspend_prepare(void)
+{
+ if (pm_ops->prepare)
+ return pm_ops->prepare();
+
+ return 0;
+}
+
+static int exynos_suspend_enter(suspend_state_t state)
+{
+ int ret;
+
+ exynos_sys_powerdown_conf(SYS_SLEEP);
+
+ ret = pm_ops->suspend();
+ if (ret) {
+ pr_err("Failed to enter sleep\n");
+ return ret;
+ }
+
+ return 0;
+}
+
+static struct platform_suspend_ops exynos_suspend_ops = {
+ .valid = suspend_valid_only_mem,
+ .prepare = exynos_suspend_prepare,
+ .enter = exynos_suspend_enter,
+};
+
+static int exynos_pm_syscore_suspend(void)
+{
+ if (pm_ops->prepare_late)
+ return pm_ops->prepare_late();
+
+ return 0;
+}
+
+static void exynos_pm_syscore_resume(void)
+{
+ exynos_sys_powerup_conf(SYS_SLEEP);
+
+ if (pm_ops->finish)
+ pm_ops->finish();
+}
+
+static struct syscore_ops exynos_pm_syscore_ops = {
+ .suspend = exynos_pm_syscore_suspend,
+ .resume = exynos_pm_syscore_resume,
+};
+
+void __init exynos_pm_init(struct exynos_pm_ops *ops)
+{
+ /* Suspend callback is mandatory */
+ if (!ops || !ops->suspend)
+ return;
+
+ pm_ops = ops;
+ register_syscore_ops(&exynos_pm_syscore_ops);
+ suspend_set_ops(&exynos_suspend_ops);
+}