summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/clock.c
diff options
context:
space:
mode:
authorJinyoung Park <jinyoungp@nvidia.com>2013-08-20 17:06:28 +0900
committerGabby Lee <galee@nvidia.com>2013-08-25 04:49:10 -0700
commit652a0736dbb6b24cc841d70c4ee3e5f3cfcec57b (patch)
tree0f68d10c676bd3861a3da37d9c21a7556d8281a6 /arch/arm/mach-tegra/clock.c
parentbdb8424de563a01dd37e53486c2297b4aa183cc7 (diff)
ARM: tegra: clock: Support EMC freq min/max constraints by PM QoS
Support EMC frequency min/max constraints by PM QoS Bug 1346293 Change-Id: I6987235c72921fdf8229a2411eb212dd7ffa66f0 Signed-off-by: Jinyoung Park <jinyoungp@nvidia.com> Reviewed-on: http://git-master/r/263784 GVS: Gerrit_Virtual_Submit Reviewed-by: Gabby Lee <galee@nvidia.com>
Diffstat (limited to 'arch/arm/mach-tegra/clock.c')
-rw-r--r--arch/arm/mach-tegra/clock.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/clock.c b/arch/arm/mach-tegra/clock.c
index 7e0428dc0faa..29de4d14f743 100644
--- a/arch/arm/mach-tegra/clock.c
+++ b/arch/arm/mach-tegra/clock.c
@@ -32,6 +32,7 @@
#include <linux/bitops.h>
#include <linux/io.h>
#include <linux/bug.h>
+#include <linux/pm_qos.h>
#include <trace/events/power.h>
#include <mach/clk.h>
@@ -988,6 +989,27 @@ static int __init tegra_dfll_cpu_start(void)
return 0;
}
+static int emc_freq_notify(struct notifier_block *nb, unsigned long val, void *p);
+
+static struct notifier_block min_emc_freq_notifier = {
+ .notifier_call = emc_freq_notify,
+};
+static struct notifier_block max_emc_freq_notifier = {
+ .notifier_call = emc_freq_notify,
+};
+
+static int emc_freq_notify(struct notifier_block *nb, unsigned long val,
+ void *p)
+{
+ struct clk *c = tegra_get_clock_by_name("emc");
+
+ pr_debug("%s: PM QoS %s %lu\n",
+ __func__, nb == &min_emc_freq_notifier ? "min" : "max", val);
+ tegra_clk_shared_bus_update(c);
+
+ return NOTIFY_OK;
+}
+
static int __init tegra_clk_late_init(void)
{
tegra_init_disable_boot_clocks(); /* must before dvfs late init */
@@ -995,6 +1017,14 @@ static int __init tegra_clk_late_init(void)
tegra_dfll_cpu_start(); /* after successful dvfs init only */
tegra_sync_cpu_clock(); /* after attempt to get dfll ready */
tegra_recalculate_cpu_edp_limits();
+
+ if (pm_qos_add_notifier(PM_QOS_EMC_FREQ_MIN, &min_emc_freq_notifier))
+ WARN(1, "%s: Failed to register min emc freq PM QoS notifier\n",
+ __func__);
+ if(pm_qos_add_notifier(PM_QOS_EMC_FREQ_MAX, &max_emc_freq_notifier))
+ WARN(1, "%s: Failed to register max emc freq PM QoS notifier\n",
+ __func__);
+
return 0;
}
late_initcall(tegra_clk_late_init);