From b4b98fb480f72639d3a4166cdb2f1015b4c331f9 Mon Sep 17 00:00:00 2001 From: Sujit Reddy Thumma Date: Thu, 14 Feb 2013 08:13:52 +0530 Subject: [PATCH] mmc: core: Log MMC clock frequency transitions Use kernel's ftrace support to capture MMC clock frequency transitions which can be useful for debugging issues related to power consumption. Usage: mount -t debugfs none /sys/kernel/debug echo 1 > /sys/kernel/debug/tracing/events/mmc/mmc_clk/enable cat /sys/kernel/debug/tracing/trace_pipe Change-Id: I25c4ee39dcbe30e7665902a9f723a5a421b55ca3 Signed-off-by: Sujit Reddy Thumma --- drivers/mmc/core/core.c | 13 +++++++++++++ include/linux/mmc/host.h | 2 ++ include/trace/events/mmc.h | 20 +++++++++++++++++++- 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index 150dbb2a7d8a..b085b34f703c 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -1122,6 +1122,19 @@ void mmc_set_ios(struct mmc_host *host) if (ios->clock > 0) mmc_set_ungated(host); host->ops->set_ios(host, ios); + if (ios->old_rate != ios->clock) { + if (likely(ios->clk_ts)) { + char trace_info[80]; + snprintf(trace_info, 80, + "%s: freq_KHz %d --> %d | t = %d", + mmc_hostname(host), ios->old_rate / 1000, + ios->clock / 1000, jiffies_to_msecs( + (long)jiffies - (long)ios->clk_ts)); + trace_mmc_clk(trace_info); + } + ios->old_rate = ios->clock; + ios->clk_ts = jiffies; + } } EXPORT_SYMBOL(mmc_set_ios); diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index dd68bc9a805d..246151e79477 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -23,6 +23,8 @@ struct mmc_ios { unsigned int clock; /* clock rate */ + unsigned int old_rate; /* saved clock rate */ + unsigned long clk_ts; /* time stamp of last updated clock */ unsigned short vdd; /* vdd stores the bit number of the selected voltage range from below. */ diff --git a/include/trace/events/mmc.h b/include/trace/events/mmc.h index 22cf81b2d9ff..9606997a8f2e 100644 --- a/include/trace/events/mmc.h +++ b/include/trace/events/mmc.h @@ -158,7 +158,25 @@ DEFINE_EVENT(mmc_adma_class, mmc_adma_table_post, TP_PROTO(unsigned int cmd, unsigned int len), TP_ARGS(cmd, len)); -#endif /* _TRACE_MMC_H */ +TRACE_EVENT(mmc_clk, + TP_PROTO(char *print_info), + + TP_ARGS(print_info), + + TP_STRUCT__entry( + __string(print_info, print_info) + ), + + TP_fast_assign( + __assign_str(print_info, print_info); + ), + + TP_printk("%s", + __get_str(print_info) + ) +); + +#endif /* if !defined(_TRACE_MMC_H) || defined(TRACE_HEADER_MULTI_READ) */ /* This part must be outside protection */ #include