summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Dorfman <kdorfman@codeaurora.org>2015-02-25 16:23:50 +0200
committerSubhash Jadavani <subhashj@codeaurora.org>2016-05-31 15:26:17 -0700
commit70a7e671d5fade5b8b419a45262a880e27cc6773 (patch)
tree812af43f52613959059ce9cee0337cc6f07a043d
parent26f1875126f874580c8ef227547cff96185d0eb7 (diff)
mmc: sdhci-msm: Add tracepoints to enhance pm debugging
Instrument the sdhci-msm platform driver with tracepoints to aid in debugging issues and identifying latencies in the following paths: * System suspend/resume * Runtime suspend/resume Change-Id: I4fed1c2ccba7d5d7f978f161e7985c98e869d1d8 Signed-off-by: Konstantin Dorfman <kdorfman@codeaurora.org>
-rw-r--r--drivers/mmc/host/sdhci-msm.c20
-rw-r--r--include/trace/events/mmc.h15
2 files changed, 32 insertions, 3 deletions
diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
index e39a92051d40..e7fd0aea05cf 100644
--- a/drivers/mmc/host/sdhci-msm.c
+++ b/drivers/mmc/host/sdhci-msm.c
@@ -38,6 +38,7 @@
#include <linux/pinctrl/consumer.h>
#include <linux/msm-bus.h>
#include <linux/pm_runtime.h>
+#include <trace/events/mmc.h>
#include "sdhci-pltfm.h"
@@ -3318,6 +3319,7 @@ static int sdhci_msm_runtime_suspend(struct device *dev)
struct sdhci_host *host = dev_get_drvdata(dev);
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
struct sdhci_msm_host *msm_host = pltfm_host->priv;
+ ktime_t start = ktime_get();
disable_irq(host->irq);
disable_irq(msm_host->pwr_irq);
@@ -3331,6 +3333,8 @@ static int sdhci_msm_runtime_suspend(struct device *dev)
if (msm_host->msm_bus_vote.client_handle)
sdhci_msm_bus_cancel_work_and_set_vote(host, 0);
}
+ trace_sdhci_msm_runtime_suspend(mmc_hostname(host->mmc), 0,
+ ktime_to_us(ktime_sub(ktime_get(), start)));
return 0;
}
@@ -3340,10 +3344,13 @@ static int sdhci_msm_runtime_resume(struct device *dev)
struct sdhci_host *host = dev_get_drvdata(dev);
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
struct sdhci_msm_host *msm_host = pltfm_host->priv;
+ ktime_t start = ktime_get();
enable_irq(msm_host->pwr_irq);
enable_irq(host->irq);
+ trace_sdhci_msm_runtime_resume(mmc_hostname(host->mmc), 0,
+ ktime_to_us(ktime_sub(ktime_get(), start)));
return 0;
}
@@ -3352,6 +3359,8 @@ static int sdhci_msm_suspend(struct device *dev)
struct sdhci_host *host = dev_get_drvdata(dev);
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
struct sdhci_msm_host *msm_host = pltfm_host->priv;
+ int ret = 0;
+ ktime_t start = ktime_get();
if (gpio_is_valid(msm_host->pdata->status_gpio))
mmc_gpio_free_cd(msm_host->mmc);
@@ -3361,9 +3370,11 @@ static int sdhci_msm_suspend(struct device *dev)
mmc_hostname(host->mmc), __func__);
goto out;
}
- return sdhci_msm_runtime_suspend(dev);
+ ret = sdhci_msm_runtime_suspend(dev);
out:
- return 0;
+ trace_sdhci_msm_suspend(mmc_hostname(host->mmc), ret,
+ ktime_to_us(ktime_sub(ktime_get(), start)));
+ return ret;
}
static int sdhci_msm_resume(struct device *dev)
@@ -3372,6 +3383,7 @@ static int sdhci_msm_resume(struct device *dev)
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
struct sdhci_msm_host *msm_host = pltfm_host->priv;
int ret = 0;
+ ktime_t start = ktime_get();
if (gpio_is_valid(msm_host->pdata->status_gpio)) {
ret = mmc_gpio_request_cd(msm_host->mmc,
@@ -3386,8 +3398,10 @@ static int sdhci_msm_resume(struct device *dev)
goto out;
}
- return sdhci_msm_runtime_resume(dev);
+ ret = sdhci_msm_runtime_resume(dev);
out:
+ trace_sdhci_msm_resume(mmc_hostname(host->mmc), ret,
+ ktime_to_us(ktime_sub(ktime_get(), start)));
return ret;
}
diff --git a/include/trace/events/mmc.h b/include/trace/events/mmc.h
index 98a12711b572..30b2113ace6e 100644
--- a/include/trace/events/mmc.h
+++ b/include/trace/events/mmc.h
@@ -217,6 +217,21 @@ DEFINE_EVENT(mmc_pm_template, mmc_resume,
TP_PROTO(const char *dev_name, int err, s64 usecs),
TP_ARGS(dev_name, err, usecs));
+DEFINE_EVENT(mmc_pm_template, sdhci_msm_suspend,
+ TP_PROTO(const char *dev_name, int err, s64 usecs),
+ TP_ARGS(dev_name, err, usecs));
+
+DEFINE_EVENT(mmc_pm_template, sdhci_msm_resume,
+ TP_PROTO(const char *dev_name, int err, s64 usecs),
+ TP_ARGS(dev_name, err, usecs));
+
+DEFINE_EVENT(mmc_pm_template, sdhci_msm_runtime_suspend,
+ TP_PROTO(const char *dev_name, int err, s64 usecs),
+ TP_ARGS(dev_name, err, usecs));
+
+DEFINE_EVENT(mmc_pm_template, sdhci_msm_runtime_resume,
+ TP_PROTO(const char *dev_name, int err, s64 usecs),
+ TP_ARGS(dev_name, err, usecs));
#endif /* if !defined(_TRACE_MMC_H) || defined(TRACE_HEADER_MULTI_READ) */
/* This part must be outside protection */