Message ID | 20160825203536.27235-1-sboyd@codeaurora.org (mailing list archive) |
---|---|
State | Accepted, archived |
Delegated to: | Stephen Boyd |
Headers | show |
On 08/25/2016 10:35 PM, Stephen Boyd wrote: > __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> > Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> Reviewed-by: Sylwester Nawrocki <s.nawrocki@samsung.com> -- To unsubscribe from this list: send the line "unsubscribe linux-clk" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 08/25, Stephen Boyd wrote: > __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> > Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> > --- Applied to clk-next
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,
__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> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> --- drivers/clk/clk.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-)