diff mbox

clk: Simplify __of_clk_get_hw_from_provider()

Message ID 20160825203536.27235-1-sboyd@codeaurora.org (mailing list archive)
State Accepted, archived
Delegated to: Stephen Boyd
Headers show

Commit Message

Stephen Boyd Aug. 25, 2016, 8:35 p.m. UTC
__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(-)

Comments

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
Stephen Boyd Aug. 26, 2016, 7:28 p.m. UTC | #2
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 mbox

Patch

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,