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>
This commit is contained in:
Stephen Boyd 2016-08-25 13:35:36 -07:00
parent d42c047245
commit 74002fcde0
1 changed files with 6 additions and 11 deletions

View File

@ -3174,19 +3174,14 @@ __of_clk_get_hw_from_provider(struct of_clk_provider *provider,
struct of_phandle_args *clkspec) struct of_phandle_args *clkspec)
{ {
struct clk *clk; struct clk *clk;
struct clk_hw *hw = ERR_PTR(-EPROBE_DEFER);
if (provider->get_hw) { if (provider->get_hw)
hw = provider->get_hw(clkspec, provider->data); return provider->get_hw(clkspec, provider->data);
} else if (provider->get) {
clk = provider->get(clkspec, provider->data); clk = provider->get(clkspec, provider->data);
if (!IS_ERR(clk)) if (IS_ERR(clk))
hw = __clk_get_hw(clk); return ERR_CAST(clk);
else return __clk_get_hw(clk);
hw = ERR_CAST(clk);
}
return hw;
} }
struct clk *__of_clk_get_from_provider(struct of_phandle_args *clkspec, struct clk *__of_clk_get_from_provider(struct of_phandle_args *clkspec,