diff options
author | Andy Park <andyp@nvidia.com> | 2013-05-10 16:49:40 -0700 |
---|---|---|
committer | Riham Haidar <rhaidar@nvidia.com> | 2013-05-17 16:09:10 -0700 |
commit | 3a444813c7dd06b849c8ca1dc8a89a271800662a (patch) | |
tree | f37879dd01ce595976009d773909022c294c7233 /arch | |
parent | 92709bbd5ce3de7a36429da7d720ab06990886bf (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.h | 2 | ||||
-rw-r--r-- | arch/arm/mach-tegra/pm.c | 32 |
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; |