[PATCH] clk: at91: optimize clk_round_rate() for AUDIO_PLL

Subsystems: common clk framework, the rest

STALE2786d

4 messages, 3 authors, 2018-12-18 · open the first message on its own page

[PATCH] clk: at91: optimize clk_round_rate() for AUDIO_PLL

From: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Date: 2018-12-17 19:37:09

This makes for 3 clk_round_rate() calls instead of 64 of them on
SAMA5D2-based board when searching for 12.288MHz clock.

Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
---
 drivers/clk/at91/clk-audio-pll.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/clk/at91/clk-audio-pll.c b/drivers/clk/at91/clk-audio-pll.c
index 36d77146a3bd..3a358282784e 100644
--- a/drivers/clk/at91/clk-audio-pll.c
+++ b/drivers/clk/at91/clk-audio-pll.c
@@ -340,7 +340,11 @@ static long clk_audio_pll_pmc_round_rate(struct clk_hw *hw, unsigned long rate,
 	pr_debug("A PLL/PMC: %s, rate = %lu (parent_rate = %lu)\n", __func__,
 		 rate, *parent_rate);
 
-	for (div = 1; div <= AUDIO_PLL_QDPMC_MAX; div++) {
+	if (!rate)
+		return 0;
+
+	best_parent_rate = clk_round_rate(pclk->clk, 1);
+	for (div = max(best_parent_rate / rate, 1ul); div <= AUDIO_PLL_QDPMC_MAX; div++) {
 		best_parent_rate = clk_round_rate(pclk->clk, rate * div);
 		tmp_rate = best_parent_rate / div;
 		tmp_diff = abs(rate - tmp_rate);
@@ -350,6 +354,8 @@ static long clk_audio_pll_pmc_round_rate(struct clk_hw *hw, unsigned long rate,
 			best_rate = tmp_rate;
 			best_diff = tmp_diff;
 			tmp_qd = div;
+			if (!best_diff)
+				break;	/* got exact match */
 		}
 	}
 
-- 
2.19.2


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Re: [PATCH] clk: at91: optimize clk_round_rate() for AUDIO_PLL

From: Stephen Boyd <sboyd@kernel.org>
Date: 2018-12-17 23:23:08

Quoting Michał Mirosław (2018-12-17 11:37:05)
This makes for 3 clk_round_rate() calls instead of 64 of them on
SAMA5D2-based board when searching for 12.288MHz clock.
Ok, but is that better? Worse? Can you more clearly describe what you're
doing here? And it's not breaking some other corner case?
Signed-off-by: Micha\u0142 Miros\u0142aw <mirq-linux@rere.qmqm.pl>
This got all broken. Something on your end?
quoted hunk
---
 drivers/clk/at91/clk-audio-pll.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/drivers/clk/at91/clk-audio-pll.c b/drivers/clk/at91/clk-audio-pll.c
index 36d77146a3bd..3a358282784e 100644
--- a/drivers/clk/at91/clk-audio-pll.c
+++ b/drivers/clk/at91/clk-audio-pll.c
@@ -340,7 +340,11 @@ static long clk_audio_pll_pmc_round_rate(struct clk_hw *hw, unsigned long rate,
        pr_debug("A PLL/PMC: %s, rate = %lu (parent_rate = %lu)\n", __func__,
                 rate, *parent_rate);
 
-       for (div = 1; div <= AUDIO_PLL_QDPMC_MAX; div++) {
+       if (!rate)
+               return 0;
+
+       best_parent_rate = clk_round_rate(pclk->clk, 1);
+       for (div = max(best_parent_rate / rate, 1ul); div <= AUDIO_PLL_QDPMC_MAX; div++) {
Nitpick: Style is usually 1UL instead of lowercase 1ul.
quoted hunk
                best_parent_rate = clk_round_rate(pclk->clk, rate * div);
                tmp_rate = best_parent_rate / div;
                tmp_diff = abs(rate - tmp_rate);
@@ -350,6 +354,8 @@ static long clk_audio_pll_pmc_round_rate(struct clk_hw *hw, unsigned long rate,
                        best_rate = tmp_rate;
                        best_diff = tmp_diff;
                        tmp_qd = div;
+                       if (!best_diff)
+                               break;  /* got exact match */
Seems sensible to break immediately if exact match is found.
`

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Re: [PATCH] clk: at91: optimize clk_round_rate() for AUDIO_PLL

From: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Date: 2018-12-18 10:55:39

On Mon, Dec 17, 2018 at 03:22:50PM -0800, Stephen Boyd wrote:
Quoting Michał Mirosław (2018-12-17 11:37:05)
quoted
This makes for 3 clk_round_rate() calls instead of 64 of them on
SAMA5D2-based board when searching for 12.288MHz clock.
Ok, but is that better? Worse? Can you more clearly describe what you're
doing here? And it's not breaking some other corner case?
quoted
Signed-off-by: Micha\u0142 Miros\u0142aw <mirq-linux@rere.qmqm.pl>
This got all broken. Something on your end?
[...]

linux-clk archives got it right:

https://lore.kernel.org/linux-clk/772b3869cc992d894d8c1b4296f21100bcbed30d.1545075103.git.mirq-linux@rere.qmqm.pl/T/#u

Best Regards,
Michał Mirosław

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

Re: [PATCH] clk: at91: optimize clk_round_rate() for AUDIO_PLL

From: Uwe Kleine-König <hidden>
Date: 2018-12-18 11:18:21

Hello,

On Mon, Dec 17, 2018 at 03:22:50PM -0800, Stephen Boyd wrote:
Quoting Michał Mirosław (2018-12-17 11:37:05)
quoted
This makes for 3 clk_round_rate() calls instead of 64 of them on
SAMA5D2-based board when searching for 12.288MHz clock.
Ok, but is that better? Worse? Can you more clearly describe what you're
doing here? And it's not breaking some other corner case?
I think there isn't even a policy how clk_round_rate() actually behaves,
is there? If you could rely on it to (say) always round down cases like
these could maybe be handled easier? (But I didn't really look at the
patch, so this might not be one of these cases.)

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-König            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help