summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/soc/qcom/Kconfig8
-rw-r--r--drivers/soc/qcom/Makefile1
-rw-r--r--drivers/soc/qcom/core_ctl_helper.c62
-rw-r--r--include/soc/qcom/core_ctl.h25
4 files changed, 96 insertions, 0 deletions
diff --git a/drivers/soc/qcom/Kconfig b/drivers/soc/qcom/Kconfig
index 1ce67325188b..39cb4b96deb7 100644
--- a/drivers/soc/qcom/Kconfig
+++ b/drivers/soc/qcom/Kconfig
@@ -543,4 +543,12 @@ config MSM_KERNEL_PROTECT_TEST
read-only. This test is FATAL whether it passes or fails!
Success is signaled by a stage-2 fault.
+config MSM_CORE_CTL_HELPER
+ tristate "Core control helper functions for dynamically hotplug CPUs"
+ help
+ Provide helper functions for core control driver. Core control
+ driver dynamically hotplugs CPUs from kernel based on current
+ system load and state. It also supports limiting min and
+ max online CPUs from userspace.
+
source "drivers/soc/qcom/memshare/Kconfig"
diff --git a/drivers/soc/qcom/Makefile b/drivers/soc/qcom/Makefile
index 97e823d53244..d90a929bc95f 100644
--- a/drivers/soc/qcom/Makefile
+++ b/drivers/soc/qcom/Makefile
@@ -30,6 +30,7 @@ obj-$(CONFIG_MEM_SHARE_QMI_SERVICE) += memshare/
obj-$(CONFIG_MSM_PIL_SSR_GENERIC) += subsys-pil-tz.o
obj-$(CONFIG_MSM_PIL_MSS_QDSP6V5) += pil-q6v5.o pil-msa.o pil-q6v5-mss.o
obj-$(CONFIG_MSM_PIL) += peripheral-loader.o
+obj-$(CONFIG_MSM_CORE_CTL_HELPER) += core_ctl_helper.o
ifdef CONFIG_MSM_SUBSYSTEM_RESTART
obj-y += subsystem_notif.o
diff --git a/drivers/soc/qcom/core_ctl_helper.c b/drivers/soc/qcom/core_ctl_helper.c
new file mode 100644
index 000000000000..3b25d9811cf7
--- /dev/null
+++ b/drivers/soc/qcom/core_ctl_helper.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/cpu.h>
+#include <linux/cpufreq.h>
+#include <linux/ktime.h>
+#include <linux/hrtimer.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <soc/qcom/core_ctl.h>
+
+void core_ctl_block_hotplug(void)
+{
+ get_online_cpus();
+}
+EXPORT_SYMBOL(core_ctl_block_hotplug);
+
+void core_ctl_unblock_hotplug(void)
+{
+ put_online_cpus();
+}
+EXPORT_SYMBOL(core_ctl_unblock_hotplug);
+
+s64 core_ctl_get_time(void)
+{
+ return ktime_to_ms(ktime_get());
+}
+EXPORT_SYMBOL(core_ctl_get_time);
+
+struct cpufreq_policy *core_ctl_get_policy(int cpu)
+{
+ return cpufreq_cpu_get(cpu);
+}
+EXPORT_SYMBOL(core_ctl_get_policy);
+
+void core_ctl_put_policy(struct cpufreq_policy *policy)
+{
+ cpufreq_cpu_put(policy);
+}
+EXPORT_SYMBOL(core_ctl_put_policy);
+
+struct device *core_ctl_find_cpu_device(unsigned cpu)
+{
+ return get_cpu_device(cpu);
+}
+EXPORT_SYMBOL(core_ctl_find_cpu_device);
+
+int __ref core_ctl_online_core(unsigned int cpu)
+{
+ return cpu_up(cpu);
+}
+EXPORT_SYMBOL(core_ctl_online_core);
diff --git a/include/soc/qcom/core_ctl.h b/include/soc/qcom/core_ctl.h
new file mode 100644
index 000000000000..01f55e53cd47
--- /dev/null
+++ b/include/soc/qcom/core_ctl.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __SOC_QCOM_CORE_CTL_H
+#define __SOC_QCOM_CORE_CTL_H
+
+extern void core_ctl_block_hotplug(void);
+extern void core_ctl_unblock_hotplug(void);
+extern s64 core_ctl_get_time(void);
+extern struct cpufreq_policy *core_ctl_get_policy(int cpu);
+extern void core_ctl_put_policy(struct cpufreq_policy *policy);
+extern struct device *core_ctl_find_cpu_device(unsigned cpu);
+extern int core_ctl_online_core(unsigned int cpu);
+
+#endif