diff options
Diffstat (limited to 'drivers/clk/clk.c')
-rw-r--r-- | drivers/clk/clk.c | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index bf61e5db94..cb94755c5a 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -43,6 +43,12 @@ int clk_enable(struct clk *clk) { int ret; + if (IS_ERR(clk)) + return PTR_ERR(clk); + + if (clk->flags & CLK_ALWAYS_ENABLED) + return 0; + if (!clk->enable_count) { ret = clk_parent_enable(clk); if (ret) @@ -64,6 +70,12 @@ int clk_enable(struct clk *clk) void clk_disable(struct clk *clk) { + if (IS_ERR(clk)) + return; + + if (clk->flags & CLK_ALWAYS_ENABLED) + return; + if (!clk->enable_count) return; @@ -82,6 +94,9 @@ unsigned long clk_get_rate(struct clk *clk) struct clk *parent; unsigned long parent_rate = 0; + if (IS_ERR(clk)) + return 0; + parent = clk_get_parent(clk); if (!IS_ERR_OR_NULL(parent)) parent_rate = clk_get_rate(parent); @@ -94,6 +109,9 @@ unsigned long clk_get_rate(struct clk *clk) long clk_round_rate(struct clk *clk, unsigned long rate) { + if (IS_ERR(clk)) + return 0; + return clk_get_rate(clk); } @@ -102,6 +120,9 @@ int clk_set_rate(struct clk *clk, unsigned long rate) struct clk *parent; unsigned long parent_rate = 0; + if (IS_ERR(clk)) + return PTR_ERR(clk); + parent = clk_get_parent(clk); if (parent) parent_rate = clk_get_rate(parent); @@ -131,6 +152,11 @@ int clk_set_parent(struct clk *clk, struct clk *parent) { int i; + if (IS_ERR(clk)) + return PTR_ERR(clk); + if (IS_ERR(parent)) + return PTR_ERR(parent); + if (!clk->num_parents) return -EINVAL; if (!clk->ops->set_parent) @@ -155,6 +181,9 @@ struct clk *clk_get_parent(struct clk *clk) { int idx; + if (IS_ERR(clk)) + return clk; + if (!clk->num_parents) return ERR_PTR(-ENODEV); @@ -182,15 +211,23 @@ int clk_register(struct clk *clk) list_add_tail(&clk->list, &clks); + if (clk->flags & CLK_ALWAYS_ENABLED) { + clk->enable_count = 1; + } + return 0; } static void dump_one(struct clk *clk, int verbose, int indent) { struct clk *c; + char *always = ""; + + if (clk->flags & CLK_ALWAYS_ENABLED) + always = "always "; - printf("%*s%s (rate %ld, %sabled)\n", indent * 4, "", clk->name, clk_get_rate(clk), - clk->enable_count ? "en" : "dis"); + printf("%*s%s (rate %ld, %s%sabled)\n", indent * 4, "", clk->name, clk_get_rate(clk), + always, clk->enable_count ? "en" : "dis"); if (verbose) { if (clk->num_parents > 1) { |