summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorAndy Park <andyp@nvidia.com>2013-05-10 16:49:40 -0700
committerRiham Haidar <rhaidar@nvidia.com>2013-05-17 16:09:10 -0700
commit3a444813c7dd06b849c8ca1dc8a89a271800662a (patch)
treef37879dd01ce595976009d773909022c294c7233 /arch
parent92709bbd5ce3de7a36429da7d720ab06990886bf (diff)
ARM: tegra: add a sysfs to time to go suspend
measure the time from display control disabled to suspending core and open an access to the data through sysfs. tegra_log_suspend_time must be called from display control driver when disabled. Bug 1279339 Bug 1252226 Change-Id: If70135639b2e1eea72d1189f8c5cd32ba7d11bf1 Signed-off-by: Andy Park <andyp@nvidia.com> (cherry picked from commit 5e21c0030b60ab71ca610ad55b8cfeacee03a980) Reviewed-on: http://git-master/r/229105 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Kamal Balagopalan <kbalagopalan@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Venkata (Muni) Anda <vanda@nvidia.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-tegra/include/mach/dc.h2
-rw-r--r--arch/arm/mach-tegra/pm.c32
2 files changed, 34 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/include/mach/dc.h b/arch/arm/mach-tegra/include/mach/dc.h
index acabf4c2609b..ed4a3f74ffc2 100644
--- a/arch/arm/mach-tegra/include/mach/dc.h
+++ b/arch/arm/mach-tegra/include/mach/dc.h
@@ -772,8 +772,10 @@ struct tegra_hdmi_out {
#ifdef CONFIG_PM_SLEEP
void tegra_log_resume_time(void);
+void tegra_log_suspend_time(void);
#else
#define tegra_log_resume_time()
+#define tegra_log_suspend_time()
#endif
#endif
diff --git a/arch/arm/mach-tegra/pm.c b/arch/arm/mach-tegra/pm.c
index 2091aa8e9dcd..b0fb28e344d8 100644
--- a/arch/arm/mach-tegra/pm.c
+++ b/arch/arm/mach-tegra/pm.c
@@ -121,6 +121,8 @@ static void __iomem *tmrus_reg_base = IO_ADDRESS(TEGRA_TMR1_BASE);
static int tegra_last_pclk;
static u64 resume_time;
static u64 resume_entry_time;
+static u64 suspend_time;
+static u64 suspend_entry_time;
#endif
struct suspend_context tegra_sctx;
@@ -243,6 +245,21 @@ void tegra_log_resume_time(void)
resume_time = resume_end_time - resume_entry_time;
}
+void tegra_log_suspend_time(void)
+{
+ suspend_entry_time = readl(tmrus_reg_base + TIMERUS_CNTR_1US);
+}
+
+static void tegra_get_suspend_time(void)
+{
+ u64 suspend_end_time;
+ suspend_end_time = readl(tmrus_reg_base + TIMERUS_CNTR_1US);
+
+ if (suspend_entry_time > suspend_end_time)
+ suspend_end_time |= 1ull<<32;
+ suspend_time = suspend_end_time - suspend_entry_time;
+}
+
unsigned long tegra_cpu_power_good_time(void)
{
if (WARN_ON_ONCE(!pdata))
@@ -590,6 +607,7 @@ static void tegra_sleep_core(enum tegra_suspend_mode mode,
trace_smc_sleep_core(NVSEC_SMC_DONE);
#endif
+ tegra_get_suspend_time();
#ifdef CONFIG_ARCH_TEGRA_2x_SOC
cpu_suspend(v2p, tegra2_sleep_core_finish);
#else
@@ -1169,6 +1187,16 @@ static ssize_t suspend_resume_time_show(struct kobject *kobj,
static struct kobj_attribute suspend_resume_time_attribute =
__ATTR(resume_time, 0444, suspend_resume_time_show, 0);
+static ssize_t suspend_time_show(struct kobject *kobj,
+ struct kobj_attribute *attr,
+ char *buf)
+{
+ return sprintf(buf, "%ums\n", ((u32)suspend_time / 1000));
+}
+
+static struct kobj_attribute suspend_time_attribute =
+ __ATTR(suspend_time, 0444, suspend_time_show, 0);
+
static struct kobject *suspend_kobj;
static int tegra_pm_enter_suspend(void)
@@ -1369,6 +1397,10 @@ out:
&suspend_resume_time_attribute.attr))
pr_err("%s: sysfs_create_file resume_time failed!\n",
__func__);
+ if (sysfs_create_file(suspend_kobj, \
+ &suspend_time_attribute.attr))
+ pr_err("%s: sysfs_create_file suspend_time failed!\n",
+ __func__);
}
iram_cpu_lp2_mask = tegra_cpu_lp2_mask;