mirror of
https://github.com/Ysurac/openmptcprouter.git
synced 2025-02-15 04:42:02 +00:00
77 lines
3.1 KiB
Diff
77 lines
3.1 KiB
Diff
From 4b7a4389846c44ff6a3590027d25aefd796b50f4 Mon Sep 17 00:00:00 2001
|
|
From: Maxime Ripard <maxime@cerno.tech>
|
|
Date: Wed, 22 Sep 2021 14:54:16 +0200
|
|
Subject: [PATCH 001/634] clk: bcm-2835: Remove rounding up the dividers
|
|
|
|
The driver, once it found a divider, tries to round it up by increasing
|
|
the least significant bit of the fractional part by one when the
|
|
round_up argument is set and there's a remainder.
|
|
|
|
However, since it increases the divider it will actually reduce the
|
|
clock rate below what we were asking for, leading to issues with
|
|
clk_set_min_rate() that will complain that our rounded clock rate is
|
|
below the minimum of the rate.
|
|
|
|
Since the dividers are fairly precise already, let's remove that part so
|
|
that we can have clk_set_min_rate() working.
|
|
|
|
This is effectively a revert of 9c95b32ca093 ("clk: bcm2835: add a round
|
|
up ability to the clock divisor").
|
|
|
|
Fixes: 9c95b32ca093 ("clk: bcm2835: add a round up ability to the clock divisor")
|
|
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
|
Acked-by: Stephen Boyd <sboyd@kernel.org>
|
|
Reviewed-by: Nicolas Saenz Julienne <nsaenz@kernel.org>
|
|
Tested-by: Nicolas Saenz Julienne <nsaenz@kernel.org> # boot and basic functionality
|
|
Tested-by: Michael Stapelberg <michael@stapelberg.ch>
|
|
Link: https://patchwork.freedesktop.org/patch/msgid/20210922125419.4125779-3-maxime@cerno.tech
|
|
---
|
|
drivers/clk/bcm/clk-bcm2835.c | 11 +++--------
|
|
1 file changed, 3 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c
|
|
index bf97b2b2a63f..3667b4d731e7 100644
|
|
--- a/drivers/clk/bcm/clk-bcm2835.c
|
|
+++ b/drivers/clk/bcm/clk-bcm2835.c
|
|
@@ -932,8 +932,7 @@ static int bcm2835_clock_is_on(struct clk_hw *hw)
|
|
|
|
static u32 bcm2835_clock_choose_div(struct clk_hw *hw,
|
|
unsigned long rate,
|
|
- unsigned long parent_rate,
|
|
- bool round_up)
|
|
+ unsigned long parent_rate)
|
|
{
|
|
struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
|
|
const struct bcm2835_clock_data *data = clock->data;
|
|
@@ -945,10 +944,6 @@ static u32 bcm2835_clock_choose_div(struct clk_hw *hw,
|
|
|
|
rem = do_div(temp, rate);
|
|
div = temp;
|
|
-
|
|
- /* Round up and mask off the unused bits */
|
|
- if (round_up && ((div & unused_frac_mask) != 0 || rem != 0))
|
|
- div += unused_frac_mask + 1;
|
|
div &= ~unused_frac_mask;
|
|
|
|
/* different clamping limits apply for a mash clock */
|
|
@@ -1079,7 +1074,7 @@ static int bcm2835_clock_set_rate(struct clk_hw *hw,
|
|
struct bcm2835_clock *clock = bcm2835_clock_from_hw(hw);
|
|
struct bcm2835_cprman *cprman = clock->cprman;
|
|
const struct bcm2835_clock_data *data = clock->data;
|
|
- u32 div = bcm2835_clock_choose_div(hw, rate, parent_rate, false);
|
|
+ u32 div = bcm2835_clock_choose_div(hw, rate, parent_rate);
|
|
u32 ctl;
|
|
|
|
spin_lock(&cprman->regs_lock);
|
|
@@ -1130,7 +1125,7 @@ static unsigned long bcm2835_clock_choose_div_and_prate(struct clk_hw *hw,
|
|
|
|
if (!(BIT(parent_idx) & data->set_rate_parent)) {
|
|
*prate = clk_hw_get_rate(parent);
|
|
- *div = bcm2835_clock_choose_div(hw, rate, *prate, true);
|
|
+ *div = bcm2835_clock_choose_div(hw, rate, *prate);
|
|
|
|
*avgrate = bcm2835_clock_rate_from_divisor(clock, *prate, *div);
|
|
|
|
--
|
|
2.33.1
|
|
|