clk: Add support for enabling/disabling clocks from debugfs
PATCH 1/1 clk: Add support for enabling/disabling clocks from debugfs
For test and debug purposes, it's often necessary to enable or disable clocks from shell. Add a new debugfs file (clk_prepare_enable) that calls clk_prepare_enable() when writing "1" and clk_disable_unprepare() when writing "0".
This can have security implications, so only support it when the code has been modified to #define CLOCK_ALLOW_WRITE_DEBUGS.
--- drivers/clk/clk.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-)
drivers/clk/clk.c +34 -4
@@ -3034,13 +3034,14 @@ static int clk_dump_show(struct seq_file *s, void *data) }DEFINE_SHOW_ATTRIBUTE (clk_dump); -#undef CLOCK_ALLOW_WRITE_DEBUGFS -#ifdef CLOCK_ALLOW_WRITE_DEBUGFS /* -* This can be dangerous, therefore don't provide any real compile time -* configuration option for this feature. +* These features can be dangerous, therefore don't provide any real compile +* time configuration option for them. * People who want to use this will need to modify the source code directly. */ +#undef CLOCK_ALLOW_WRITE_DEBUGFS +#ifdef CLOCK_ALLOW_WRITE_DEBUGFS +static int clk_rate_set (void *data,u64 val) {struct clk_core *core = data;
@@ -3054,6 +3055,31 @@ static int clk_rate_set(void *data, u64 val) }#define clk_rate_mode 0644 + +static int clk_prepare_enable_set (void *data,u64 val) +{ +struct clk_core *core = data; +int ret =0 ; + +if (val) + ret =clk_prepare_enable (core->hw->clk); +else +clk_disable_unprepare (core->hw->clk); + +return ret; +} + +static int clk_prepare_enable_get (void *data,u64 *val) +{ +struct clk_core *core = data; + + *val = core->enable_count && core->prepare_count; +return 0 ; +} + +DEFINE_DEBUGFS_ATTRIBUTE (clk_prepare_enable_fops, clk_prepare_enable_get, + clk_prepare_enable_set,"%llu\n" ); +#else #define clk_rate_set NULL#define clk_rate_mode 0444
@@ -3231,6 +3257,10 @@ static void clk_debug_create_one(struct clk_core *core, struct dentry *pdentry)debugfs_create_u32 ("clk_notifier_count" ,0444 , root, &core->notifier_count);debugfs_create_file ("clk_duty_cycle" ,0444 , root, core, &clk_duty_cycle_fops); +#ifdef CLOCK_ALLOW_WRITE_DEBUGFS +debugfs_create_file ("clk_prepare_enable" ,0644 , root, core, + &clk_prepare_enable_fops); +#endif if (core->num_parents >0 ) debugfs_create_file("clk_parent", 0444, root, core,
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
Quoted 5 lines · Mike Tipton
For test and debug purposes, it's often necessary to enable or disable clocks from shell. Add a new debugfs file (
clk_prepare_enable) that callsclk_prepare_enable()when writing "1" andclk_disable_unprepare()when writing "0".
Quoted 8 lines
This can have security implications, so only support it when the code has been modified to #define
CLOCK_ALLOW_WRITE_DEBUGS.Signed-off-by Mike Tipton <[email protected]>--- drivers/clk/clk.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-)
Friendly reminder.
Thanks,
Mike
Quoting Mike Tipton (2020-06-29 17:30:24)
Quoted 7 lines
For test and debug purposes, it's often necessary to enable or disable clocks from shell. Add a new debugfs file (
clk_prepare_enable) that callsclk_prepare_enable()when writing "1" andclk_disable_unprepare()when writing "0".This can have security implications, so only support it when the code has been modified to #define
CLOCK_ALLOW_WRITE_DEBUGS.
DEBUGFS
Quoted 11 lines
Signed-off-by Mike Tipton <[email protected]>--- drivers/clk/clk.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-)drivers/clk/clk.c +0
-0
drivers/clk/clk.c static int clk_dump_show(struct seq_file *s, void *data) · line 3038
Quoted 5 lines
drivers/clk/clk.c +0
-2@@ -3034,13 +3034,14 @@ static int clk_dump_show(struct seq_file *s, void *data) }DEFINE_SHOW_ATTRIBUTE (clk_dump); -#undef CLOCK_ALLOW_WRITE_DEBUGFS -#ifdef CLOCK_ALLOW_WRITE_DEBUGFS
This didn't need to change.
drivers/clk/clk.c static int clk_dump_show(struct seq_file *s, void *data) · line 3043
Quoted 9 lines
drivers/clk/clk.c +4
-2/* -* This can be dangerous, therefore don't provide any real compile time -* configuration option for this feature. +* These features can be dangerous, therefore don't provide any real compile +* time configuration option for them. * People who want to use this will need to modify the source code directly. */ +#undef CLOCK_ALLOW_WRITE_DEBUGFS +#ifdef CLOCK_ALLOW_WRITE_DEBUGFS
So I put it back and dropped your rewording.
Quoted 37 lines
drivers/clk/clk.c +26
-0+static int clk_rate_set (void *data,u64 val) {struct clk_core *core = data;@@ -3054,6 +3055,31 @@ static int clk_rate_set(void *data, u64 val) }#define clk_rate_mode 0644 + +static int clk_prepare_enable_set (void *data,u64 val) +{ +struct clk_core *core = data; +int ret =0 ; + +if (val) + ret =clk_prepare_enable (core->hw->clk); +else +clk_disable_unprepare (core->hw->clk); + +return ret; +} + +static int clk_prepare_enable_get (void *data,u64 *val) +{ +struct clk_core *core = data; + + *val = core->enable_count && core->prepare_count; +return 0 ; +} + +DEFINE_DEBUGFS_ATTRIBUTE (clk_prepare_enable_fops, clk_prepare_enable_get, + clk_prepare_enable_set,"%llu\n" ); +#else #define clk_rate_set NULL#define clk_rate_mode 0444
drivers/clk/clk.c static void clk_debug_create_one(struct clk_core *core, struct dentry *pdentry) · line 3260
Quoted 4 lines
drivers/clk/clk.c +1
-0@@ -3231,6 +3257,10 @@ static void clk_debug_create_one(struct clk_core *core, struct dentry *pdentry)debugfs_create_u32 ("clk_notifier_count" ,0444 , root, &core->notifier_count);debugfs_create_file ("clk_duty_cycle" ,0444 , root, core, &clk_duty_cycle_fops); +#ifdef CLOCK_ALLOW_WRITE_DEBUGFS
This is ugly but I guess we can't do much.
drivers/clk/clk.c static void clk_debug_create_one(struct clk_core *core, struct dentry *pdentry) · line 3264
Quoted 4 lines
drivers/clk/clk.c +3
-0+debugfs_create_file ("clk_prepare_enable" ,0644 , root, core, + &clk_prepare_enable_fops); +#endif
Applied to clk-next.