diff options
author | Stephen Boyd <sboyd@codeaurora.org> | 2016-08-25 22:35:36 +0200 |
---|---|---|
committer | Stephen Boyd <sboyd@codeaurora.org> | 2016-08-26 21:28:27 +0200 |
commit | 74002fcde01d8acb4ce68878e9998fad51fe7925 (patch) | |
tree | 81e96a52108498fe32d5653933b92295bfd31c3a /drivers/clk/clk.c | |
parent | clk: return unsigned int in dummy non-OF of_clk_get_parent_count() (diff) | |
download | linux-74002fcde01d8acb4ce68878e9998fad51fe7925.tar.xz linux-74002fcde01d8acb4ce68878e9998fad51fe7925.zip |
clk: Simplify __of_clk_get_hw_from_provider()
__of_clk_get_hw_from_provider() is confusing because it will
return EPROBE_DEFER if there isn't a ->get() or ->get_hw()
function pointer in a provider. That's just a bug though, and we
used to NULL pointer exception when ->get() was missing anyway,
so let's make this more obvious that they're not optional. The
assumption is that most providers will implement ->get_hw() so we
only fallback to the ->get() function if necessary. This
clarifies the intent and removes any possibility of probe defer
happening if clk providers are buggy.
Reported-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Reviewed-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Diffstat (limited to 'drivers/clk/clk.c')
-rw-r--r-- | drivers/clk/clk.c | 17 |
1 files changed, 6 insertions, 11 deletions
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 71cc56712666..d3d26148cdfb 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -3174,19 +3174,14 @@ __of_clk_get_hw_from_provider(struct of_clk_provider *provider, struct of_phandle_args *clkspec) { struct clk *clk; - struct clk_hw *hw = ERR_PTR(-EPROBE_DEFER); - if (provider->get_hw) { - hw = provider->get_hw(clkspec, provider->data); - } else if (provider->get) { - clk = provider->get(clkspec, provider->data); - if (!IS_ERR(clk)) - hw = __clk_get_hw(clk); - else - hw = ERR_CAST(clk); - } + if (provider->get_hw) + return provider->get_hw(clkspec, provider->data); - return hw; + clk = provider->get(clkspec, provider->data); + if (IS_ERR(clk)) + return ERR_CAST(clk); + return __clk_get_hw(clk); } struct clk *__of_clk_get_from_provider(struct of_phandle_args *clkspec, |