diff options
| author | Konstantin Dorfman <kdorfman@codeaurora.org> | 2015-02-25 16:23:50 +0200 |
|---|---|---|
| committer | Subhash Jadavani <subhashj@codeaurora.org> | 2016-05-31 15:26:17 -0700 |
| commit | 70a7e671d5fade5b8b419a45262a880e27cc6773 (patch) | |
| tree | 812af43f52613959059ce9cee0337cc6f07a043d | |
| parent | 26f1875126f874580c8ef227547cff96185d0eb7 (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.c | 20 | ||||
| -rw-r--r-- | include/trace/events/mmc.h | 15 |
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 */ |
