#include <linux/init.h>
#include <linux/of.h>
#include <linux/of_address.h>
+#include <linux/soc/samsung/exynos-pm.h>
#include <asm/cacheflush.h>
#include <asm/cputype.h>
#include <linux/of_address.h>
#include <linux/err.h>
#include <linux/regulator/machine.h>
+#include <linux/soc/samsung/exynos-pm.h>
#include <linux/soc/samsung/exynos-pmu.h>
#include <linux/soc/samsung/exynos-regs-pmu.h>
bool "Exynos PMU controller driver" if COMPILE_TEST
depends on ARCH_EXYNOS || ((ARM || ARM64) && COMPILE_TEST)
select EXYNOS_PMU_ARM_DRIVERS if ARM && ARCH_EXYNOS
+ select EXYNOS_PMU_ARM64_DRIVERS if ARM64 && ARCH_EXYNOS
# There is no need to enable these drivers for ARMv8
config EXYNOS_PMU_ARM_DRIVERS
bool "Exynos PMU ARMv7-specific driver extensions" if COMPILE_TEST
depends on EXYNOS_PMU
+# There is no need to enable these drivers for ARMv7
+config EXYNOS_PMU_ARM64_DRIVERS
+ bool "Exynos PMU ARMv8-specific driver extensions" if COMPILE_TEST
+ depends on EXYNOS_PMU
+
config EXYNOS_PM_DOMAINS
bool "Exynos PM domains" if COMPILE_TEST
depends on PM_GENERIC_DOMAINS || COMPILE_TEST
obj-$(CONFIG_EXYNOS_CHIPID) += exynos-chipid.o
-obj-$(CONFIG_EXYNOS_PMU) += exynos-pmu.o exynos-pm.o
+obj-$(CONFIG_EXYNOS_PMU) += exynos-pmu.o exynos-sysram.o
obj-$(CONFIG_EXYNOS_ASV) += exynos-asv.o
obj-$(CONFIG_EXYNOS_PMU_ARM_DRIVERS) += exynos3250-pmu.o exynos4-pmu.o \
- exynos5250-pmu.o exynos5420-pmu.o \
- exynos5433-pmu.o
+ exynos5250-pmu.o exynos5420-pmu.o
+obj-$(CONFIG_EXYNOS_PMU_ARM64_DRIVERS) += exynos-pm.o exynos5433-pmu.o
obj-$(CONFIG_EXYNOS_PM_DOMAINS) += pm_domains.o
static struct syscore_ops exynos_pm_syscore_ops;
static const struct exynos_pm_data *pm_data __ro_after_init;
-void __iomem *sysram_base_addr __ro_after_init;
-void __iomem *sysram_ns_base_addr __ro_after_init;
-
static int exynos_pm_prepare(void)
{
int ret;
* Split the data between ARM architectures because it is relatively big
* and useless on other arch.
*/
-#ifdef CONFIG_EXYNOS_PMU_ARM_DRIVERS
+#ifdef CONFIG_EXYNOS_PMU_ARM64_DRIVERS
#define exynos_pm_data_arm_ptr(data) (&data)
#else
#define exynos_pm_data_arm_ptr(data) NULL
{ /*sentinel*/ },
};
-void __init exynos_sysram_init(void)
-{
- struct device_node *np;
-
- for_each_compatible_node(np, NULL, "samsung,exynos4210-sysram") {
- if (!of_device_is_available(np))
- continue;
- sysram_base_addr = of_iomap(np, 0);
- break;
- }
-
- for_each_compatible_node(np, NULL, "samsung,exynos4210-sysram-ns") {
- if (!of_device_is_available(np))
- continue;
- sysram_ns_base_addr = of_iomap(np, 0);
- break;
- }
-}
-
static int __init exynos_pm_init(void)
{
const struct of_device_id *match;
#define exynos_pmu_data_arm_ptr(data) NULL
#endif
+#ifdef CONFIG_EXYNOS_PMU_ARM64_DRIVERS
+#define exynos_pmu_data_arm64_ptr(data) (&data)
+#else
+#define exynos_pmu_data_arm64_ptr(data) NULL
+#endif
+
/*
* PMU platform driver and devicetree bindings.
*/
.data = exynos_pmu_data_arm_ptr(exynos5420_pmu_data),
}, {
.compatible = "samsung,exynos5433-pmu",
- .data = exynos_pmu_data_arm_ptr(exynos5433_pmu_data),
+ .data = exynos_pmu_data_arm64_ptr(exynos5433_pmu_data),
},
{ /*sentinel*/ },
};
extern const struct exynos_pmu_data exynos4412_pmu_data;
extern const struct exynos_pmu_data exynos5250_pmu_data;
extern const struct exynos_pmu_data exynos5420_pmu_data;
+#endif
+
+#ifdef CONFIG_EXYNOS_PMU_ARM64_DRIVERS
extern const struct exynos_pmu_data exynos5433_pmu_data;
#endif
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0
+//
+// based on arch/arm/mach-exynos/suspend.c
+// Copyright (c) 2018 Samsung Electronics Co., Ltd.
+//
+// Exynos Power Management support driver
+
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/kernel.h>
+
+#include <asm/io.h>
+
+#include <linux/soc/samsung/exynos-pm.h>
+
+void __iomem *sysram_base_addr __ro_after_init;
+void __iomem *sysram_ns_base_addr __ro_after_init;
+
+void __init exynos_sysram_init(void)
+{
+ struct device_node *np;
+
+ for_each_compatible_node(np, NULL, "samsung,exynos4210-sysram") {
+ if (!of_device_is_available(np))
+ continue;
+ sysram_base_addr = of_iomap(np, 0);
+ break;
+ }
+
+ for_each_compatible_node(np, NULL, "samsung,exynos4210-sysram-ns") {
+ if (!of_device_is_available(np))
+ continue;
+ sysram_ns_base_addr = of_iomap(np, 0);
+ break;
+ }
+}
//
// EXYNOS5433 - CPU PMU (Power Management Unit) support
+#include <linux/io.h>
+
#include <linux/soc/samsung/exynos-regs-pmu.h>
#include <linux/soc/samsung/exynos-pmu.h>
+#include <linux/soc/samsung/exynos-pm.h>
#include "exynos-pmu.h"