]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
ARM: Tegra: Sample uS timer to measure LP resume
authorKamal Kannan Balagopalan <kbalagopalan@nvidia.com>
Tue, 9 Apr 2013 18:35:56 +0000 (11:35 -0700)
committerDan Willemsen <dwillemsen@nvidia.com>
Sat, 14 Sep 2013 20:08:16 +0000 (13:08 -0700)
Add framework to log microsecond timer for measuring suspend/deep-sleep
resume times from power-on to display-on

Bug 1252226

Change-Id: Icbf890f3766d38093eea485a7261303ae73d2567
Signed-off-by: Kamal Kannan Balagopalan <kbalagopalan@nvidia.com>
Reviewed-on: http://git-master/r/217939
(cherry picked from commit 4b495256ae27012f12d1b334ef5b965bf3dae8d0)
Reviewed-on: http://git-master/r/219448
Reviewed-by: Riham Haidar <rhaidar@nvidia.com>
Tested-by: Riham Haidar <rhaidar@nvidia.com>
arch/arm/mach-tegra/include/mach/dc.h
arch/arm/mach-tegra/pm.c

index a960767b5144e635c210b6a28b00e57fa228b9b8..ba5e786830f7db7d5072fc3048da600d56bf9641 100644 (file)
@@ -788,4 +788,10 @@ struct tegra_hdmi_out {
        struct tmds_config *tmds_config;
        int n_tmds_config;
 };
+
+#ifdef CONFIG_PM_SLEEP
+void tegra_log_resume_time(void);
+#else
+#define tegra_log_resume_time()
+#endif
 #endif
index ca2a5c032f7da831e86f3486b2deccc5b1b0ed40..64f1169391365fa26401dfc47f46b32a6123b0f3 100644 (file)
@@ -119,7 +119,10 @@ static void __iomem *pmc = IO_ADDRESS(TEGRA_PMC_BASE);
 #if defined(CONFIG_ARCH_TEGRA_14x_SOC)
 static void __iomem *tert_ictlr = IO_ADDRESS(TEGRA_TERTIARY_ICTLR_BASE);
 #endif
+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;
 #endif
 
 struct suspend_context tegra_sctx;
@@ -238,6 +241,15 @@ static const char *tegra_suspend_name[TEGRA_MAX_SUSPEND_MODE] = {
        [TEGRA_SUSPEND_LP0]     = "lp0",
 };
 
+void tegra_log_resume_time(void)
+{
+       u64 resume_end_time = readl(tmrus_reg_base + TIMERUS_CNTR_1US);
+
+       if (resume_entry_time > resume_end_time)
+               resume_end_time |= 1ull<<32;
+       resume_time = resume_end_time - resume_entry_time;
+}
+
 unsigned long tegra_cpu_power_good_time(void)
 {
        if (WARN_ON_ONCE(!pdata))
@@ -1100,6 +1112,10 @@ int tegra_suspend_dram(enum tegra_suspend_mode mode, unsigned int flags)
        else
                tegra_sleep_core(mode, PHYS_OFFSET - PAGE_OFFSET);
 
+       resume_entry_time = 0;
+       if (mode != TEGRA_SUSPEND_LP0)
+               resume_entry_time = readl(tmrus_reg_base + TIMERUS_CNTR_1US);
+
        tegra_init_cache(true);
 
 #if defined(CONFIG_ARCH_TEGRA_14x_SOC)
@@ -1263,6 +1279,16 @@ bad_name:
 static struct kobj_attribute suspend_mode_attribute =
        __ATTR(mode, 0644, suspend_mode_show, suspend_mode_store);
 
+static ssize_t suspend_resume_time_show(struct kobject *kobj,
+                                       struct kobj_attribute *attr,
+                                       char *buf)
+{
+       return sprintf(buf, "%ums\n", ((u32)resume_time / 1000));
+}
+
+static struct kobj_attribute suspend_resume_time_attribute =
+       __ATTR(resume_time, 0444, suspend_resume_time_show, 0);
+
 static struct kobject *suspend_kobj;
 
 static int tegra_pm_enter_suspend(void)
@@ -1464,6 +1490,10 @@ out:
                                                &suspend_mode_attribute.attr))
                        pr_err("%s: sysfs_create_file suspend type failed!\n",
                                                                __func__);
+               if (sysfs_create_file(suspend_kobj, \
+                                       &suspend_resume_time_attribute.attr))
+                       pr_err("%s: sysfs_create_file resume_time failed!\n",
+                                                               __func__);
        }
 
        iram_cpu_lp2_mask = tegra_cpu_lp2_mask;