summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2020-02-24 12:09:35 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2020-02-25 09:21:57 +0100
commit5bf3e793ccef72e11a03ab3066a4893883249c5b (patch)
treec19ff4c6eb58195ff1f71fba751b87154054a001 /drivers
parentf0b531594f0e7c133fc80ff050171d8ce5f8192a (diff)
downloadbarebox-5bf3e793ccef72e11a03ab3066a4893883249c5b.tar.gz
clk: print more consistent clock states
In clk_dump we only print the state of clk_is_enabled(). Depending on the clock this can mean different things. When the clock provides an is_enabled() callback it will print its result, so the enabled state matches the hardware state of that clock, but doesn't necessarily mean its parents are enabled. If a clock does not provide an is_enabled() callback then we rely on our internal enable_count tracker. Change this to always print the hardware state of the current clock. It can be: - disabled: The clock is disabled (as provided by is_enabled()) - enabled: The clock is enabled (as provided by is_enabled()) - always enabled: The clock can't be disabled (no is_enabled callback and can't be enabled/disabled) - unknown: no is_enabled callback but can be enabled/disabled Additionally we print the enable_count variable, so from enable_count != 0 we can know that barebox has enabled the clock. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/clk/clk.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 5777c9c..b27ad6d 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -632,12 +632,40 @@ int of_clk_init(struct device_node *root, const struct of_device_id *matches)
}
#endif
+static const char *clk_hw_stat(struct clk *clk)
+{
+ if (clk->ops->is_enabled) {
+ if (clk->ops->is_enabled(clk))
+ return "enabled";
+ else
+ return "disabled";
+ }
+
+ if (!clk->ops->enable)
+ return "always enabled";
+
+ return "unknown";
+}
+
static void dump_one(struct clk *clk, int verbose, int indent)
{
struct clk *c;
+ int enabled = clk_is_enabled(clk);
+ const char *hwstat, *stat;
+
+ hwstat = clk_hw_stat(clk);
+
+ if (enabled == 0)
+ stat = "disabled";
+ else
+ stat = "enabled";
+
+ printf("%*s%s (rate %lu, enable_count: %d, %s)\n", indent * 4, "",
+ clk->name,
+ clk_get_rate(clk),
+ clk->enable_count,
+ hwstat);
- printf("%*s%s (rate %lu, %sabled)\n", indent * 4, "", clk->name, clk_get_rate(clk),
- clk_is_enabled(clk) ? "en" : "dis");
if (verbose) {
if (clk->num_parents > 1) {