From b59b1c0040a052d5838d27047fab4bd19efb277a Mon Sep 17 00:00:00 2001 From: Alex Zhao Date: Wed, 6 Jan 2021 09:47:33 +0800 Subject: [PATCH] mmc: add a file to debugfs for changing host max clock at runtime Usage is as follows: rk3566_rgo:/ # cat /sys/kernel/debug/mmc1/max_clock 150000000 rk3566_rgo:/ # echo 200000000 > /sys/kernel/debug/mmc1/max_clock rk3566_rgo:/ # cat /sys/kernel/debug/mmc1/max_clock 200000000 rk3566_rgo:/ # echo 200000000 > /sys/kernel/debug/mmc1/clock rk3566_rgo:/ # dmesg -c [ 285.884348] mmc_host mmc1: Bus speed (slot 0) = 198000000Hz (slot req 200000000Hz, actual 198000000HZ div = 0) Signed-off-by: Alex Zhao Change-Id: I7ac9649b231c50b0c6c066407e28954e8c94510c --- drivers/mmc/core/debugfs.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/drivers/mmc/core/debugfs.c b/drivers/mmc/core/debugfs.c index d2275c5a2311..4ee261d9580e 100644 --- a/drivers/mmc/core/debugfs.c +++ b/drivers/mmc/core/debugfs.c @@ -225,6 +225,31 @@ static int mmc_clock_opt_set(void *data, u64 val) DEFINE_SIMPLE_ATTRIBUTE(mmc_clock_fops, mmc_clock_opt_get, mmc_clock_opt_set, "%llu\n"); +static int mmc_max_clock_opt_get(void *data, u64 *val) +{ + struct mmc_host *host = data; + + *val = host->f_max; + + return 0; +} + +static int mmc_max_clock_opt_set(void *data, u64 val) +{ + struct mmc_host *host = data; + + /* We need this check due to input value is u64 */ + if (val != 0 && (val > UHS_SDR104_MAX_DTR || val < host->f_min)) + return -EINVAL; + + host->f_max = (unsigned int) val; + + return 0; +} + +DEFINE_DEBUGFS_ATTRIBUTE(mmc_max_clock_fops, mmc_max_clock_opt_get, mmc_max_clock_opt_set, + "%llu\n"); + void mmc_add_host_debugfs(struct mmc_host *host) { struct dentry *root; @@ -253,6 +278,9 @@ void mmc_add_host_debugfs(struct mmc_host *host) &mmc_clock_fops)) goto err_node; + debugfs_create_file_unsafe("max_clock", S_IRUSR | S_IWUSR, root, host, + &mmc_max_clock_fops); + #ifdef CONFIG_FAIL_MMC_REQUEST if (fail_request) setup_fault_attr(&fail_default_attr, fail_request);