summaryrefslogtreecommitdiff
path: root/drivers/cpuidle
diff options
context:
space:
mode:
authorAdeel Raza <araza@nvidia.com>2013-10-16 11:56:12 -0700
committerTom Cherry <tcherry@nvidia.com>2014-01-21 20:27:38 -0800
commit6197431b4dc4eab79e8a829f047a1c3d2d62347d (patch)
tree846873f4050e3e097c13b14f6797bc2bfca6a580 /drivers/cpuidle
parent18ececa6445ca31f3ea43bf1986cb5b15f34dd03 (diff)
cpuidle: denver: add pmstate debugfs interface
Add denver cpuidle pmstate debugfs interface. This interface can be extended in the future with more functionality if required. Change-Id: I0c96b6080b4ce806fd5e27dbf6f3e4bd30644451 Signed-off-by: Adeel Raza <araza@nvidia.com> Reviewed-on: http://git-master/r/346709 Reviewed-by: Alexander Van Brunt <avanbrunt@nvidia.com> Tested-by: Alexander Van Brunt <avanbrunt@nvidia.com>
Diffstat (limited to 'drivers/cpuidle')
-rw-r--r--drivers/cpuidle/cpuidle-denver.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/drivers/cpuidle/cpuidle-denver.c b/drivers/cpuidle/cpuidle-denver.c
index 95adbdca46c6..9091390bb400 100644
--- a/drivers/cpuidle/cpuidle-denver.c
+++ b/drivers/cpuidle/cpuidle-denver.c
@@ -23,20 +23,18 @@
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/of_platform.h>
+#include <linux/debugfs.h>
void tegra_pd_in_idle(bool enable) {}
-static int pmstate_map[CPUIDLE_STATE_MAX] = { -1 };
+static u32 pmstate_map[CPUIDLE_STATE_MAX] = { -1 };
static int denver_enter_c_state(
struct cpuidle_device *dev,
struct cpuidle_driver *drv,
int index)
{
- uintptr_t pmstate = pmstate_map[index];
- BUG_ON(pmstate < 0);
-
- asm volatile("msr actlr_el1, %0\n" : : "r" (pmstate));
+ asm volatile("msr actlr_el1, %0\n" : : "r" (pmstate_map[index]));
asm volatile("wfi\n");
local_irq_enable();
@@ -55,9 +53,19 @@ static int __init denver_power_states_init(void)
struct device_node *child;
struct cpuidle_state *state;
const char *name;
+ struct dentry *cpuidle_denver_dir;
+ struct dentry *idle_node;
u32 state_count = 0;
u32 prop;
+ cpuidle_denver_dir = debugfs_create_dir("cpuidle_denver", NULL);
+ if (!cpuidle_denver_dir) {
+ pr_err("%s: Couldn't create the \"cpuidle_denver\" debugfs "
+ "node.\n",
+ __func__);
+ return -1;
+ }
+
of_states = of_find_node_by_name(NULL, "denver_power_states");
if (!of_states)
return -ENODEV;
@@ -85,6 +93,19 @@ static int __init denver_power_states_init(void)
continue;
pmstate_map[state_count] = prop;
+ /* Create a debugfs node for the idle state */
+ idle_node = debugfs_create_dir(child->name,
+ cpuidle_denver_dir);
+ if (!idle_node) {
+ return -1;
+ }
+ if (!debugfs_create_x32("pmstate", S_IRUGO | S_IWUSR, idle_node,
+ &pmstate_map[state_count])) {
+ pr_err("%s: Couldn't create the pmstate debugfs node"
+ "for %s.\n",__func__, child->name);
+ return -1;
+ }
+
state_count++;
}