mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-23 07:11:26 +00:00
370 lines
12 KiB
Diff
370 lines
12 KiB
Diff
From 8ef4d5e976df3c15453b827e5fdcb4c3fb3598dd Mon Sep 17 00:00:00 2001
|
|
From: Chen-Yu Tsai <wens@csie.org>
|
|
Date: Fri, 24 Mar 2017 16:33:05 +0800
|
|
Subject: [PATCH] clk: sunxi-ng: use 1 as fallback for minimum multiplier
|
|
|
|
A zero multiplier does not make sense for clocks.
|
|
|
|
Use 1 as the minimum when a multiplier minimum isn't specified.
|
|
|
|
Fixes: 2beaa601c849 ("clk: sunxi-ng: Implement minimum for multipliers")
|
|
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
|
|
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
|
|
---
|
|
drivers/clk/sunxi-ng/ccu_nk.c | 8 ++++----
|
|
drivers/clk/sunxi-ng/ccu_nkm.c | 8 ++++----
|
|
drivers/clk/sunxi-ng/ccu_nkmp.c | 4 ++--
|
|
drivers/clk/sunxi-ng/ccu_nm.c | 2 +-
|
|
4 files changed, 11 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/drivers/clk/sunxi-ng/ccu_nk.c b/drivers/clk/sunxi-ng/ccu_nk.c
|
|
index b9e9b8a..2485bda 100644
|
|
--- a/drivers/clk/sunxi-ng/ccu_nk.c
|
|
+++ b/drivers/clk/sunxi-ng/ccu_nk.c
|
|
@@ -102,9 +102,9 @@ static long ccu_nk_round_rate(struct clk_hw *hw, unsigned long rate,
|
|
if (nk->common.features & CCU_FEATURE_FIXED_POSTDIV)
|
|
rate *= nk->fixed_post_div;
|
|
|
|
- _nk.min_n = nk->n.min;
|
|
+ _nk.min_n = nk->n.min ?: 1;
|
|
_nk.max_n = nk->n.max ?: 1 << nk->n.width;
|
|
- _nk.min_k = nk->k.min;
|
|
+ _nk.min_k = nk->k.min ?: 1;
|
|
_nk.max_k = nk->k.max ?: 1 << nk->k.width;
|
|
|
|
ccu_nk_find_best(*parent_rate, rate, &_nk);
|
|
@@ -127,9 +127,9 @@ static int ccu_nk_set_rate(struct clk_hw *hw, unsigned long rate,
|
|
if (nk->common.features & CCU_FEATURE_FIXED_POSTDIV)
|
|
rate = rate * nk->fixed_post_div;
|
|
|
|
- _nk.min_n = nk->n.min;
|
|
+ _nk.min_n = nk->n.min ?: 1;
|
|
_nk.max_n = nk->n.max ?: 1 << nk->n.width;
|
|
- _nk.min_k = nk->k.min;
|
|
+ _nk.min_k = nk->k.min ?: 1;
|
|
_nk.max_k = nk->k.max ?: 1 << nk->k.width;
|
|
|
|
ccu_nk_find_best(parent_rate, rate, &_nk);
|
|
diff --git a/drivers/clk/sunxi-ng/ccu_nkm.c b/drivers/clk/sunxi-ng/ccu_nkm.c
|
|
index 71f81e9..cba84af 100644
|
|
--- a/drivers/clk/sunxi-ng/ccu_nkm.c
|
|
+++ b/drivers/clk/sunxi-ng/ccu_nkm.c
|
|
@@ -109,9 +109,9 @@ static unsigned long ccu_nkm_round_rate(struct ccu_mux_internal *mux,
|
|
struct ccu_nkm *nkm = data;
|
|
struct _ccu_nkm _nkm;
|
|
|
|
- _nkm.min_n = nkm->n.min;
|
|
+ _nkm.min_n = nkm->n.min ?: 1;
|
|
_nkm.max_n = nkm->n.max ?: 1 << nkm->n.width;
|
|
- _nkm.min_k = nkm->k.min;
|
|
+ _nkm.min_k = nkm->k.min ?: 1;
|
|
_nkm.max_k = nkm->k.max ?: 1 << nkm->k.width;
|
|
_nkm.min_m = 1;
|
|
_nkm.max_m = nkm->m.max ?: 1 << nkm->m.width;
|
|
@@ -138,9 +138,9 @@ static int ccu_nkm_set_rate(struct clk_hw *hw, unsigned long rate,
|
|
unsigned long flags;
|
|
u32 reg;
|
|
|
|
- _nkm.min_n = nkm->n.min;
|
|
+ _nkm.min_n = nkm->n.min ?: 1;
|
|
_nkm.max_n = nkm->n.max ?: 1 << nkm->n.width;
|
|
- _nkm.min_k = nkm->k.min;
|
|
+ _nkm.min_k = nkm->k.min ?: 1;
|
|
_nkm.max_k = nkm->k.max ?: 1 << nkm->k.width;
|
|
_nkm.min_m = 1;
|
|
_nkm.max_m = nkm->m.max ?: 1 << nkm->m.width;
|
|
diff --git a/drivers/clk/sunxi-ng/ccu_nkmp.c b/drivers/clk/sunxi-ng/ccu_nkmp.c
|
|
index 488055e..162ff26 100644
|
|
--- a/drivers/clk/sunxi-ng/ccu_nkmp.c
|
|
+++ b/drivers/clk/sunxi-ng/ccu_nkmp.c
|
|
@@ -116,9 +116,9 @@ static long ccu_nkmp_round_rate(struct clk_hw *hw, unsigned long rate,
|
|
struct ccu_nkmp *nkmp = hw_to_ccu_nkmp(hw);
|
|
struct _ccu_nkmp _nkmp;
|
|
|
|
- _nkmp.min_n = nkmp->n.min;
|
|
+ _nkmp.min_n = nkmp->n.min ?: 1;
|
|
_nkmp.max_n = nkmp->n.max ?: 1 << nkmp->n.width;
|
|
- _nkmp.min_k = nkmp->k.min;
|
|
+ _nkmp.min_k = nkmp->k.min ?: 1;
|
|
_nkmp.max_k = nkmp->k.max ?: 1 << nkmp->k.width;
|
|
_nkmp.min_m = 1;
|
|
_nkmp.max_m = nkmp->m.max ?: 1 << nkmp->m.width;
|
|
diff --git a/drivers/clk/sunxi-ng/ccu_nm.c b/drivers/clk/sunxi-ng/ccu_nm.c
|
|
index af71b19..f312c92 100644
|
|
--- a/drivers/clk/sunxi-ng/ccu_nm.c
|
|
+++ b/drivers/clk/sunxi-ng/ccu_nm.c
|
|
@@ -99,7 +99,7 @@ static long ccu_nm_round_rate(struct clk_hw *hw, unsigned long rate,
|
|
struct ccu_nm *nm = hw_to_ccu_nm(hw);
|
|
struct _ccu_nm _nm;
|
|
|
|
- _nm.min_n = nm->n.min;
|
|
+ _nm.min_n = nm->n.min ?: 1;
|
|
_nm.max_n = nm->n.max ?: 1 << nm->n.width;
|
|
_nm.min_m = 1;
|
|
_nm.max_m = nm->m.max ?: 1 << nm->m.width;
|
|
From bafee6723b1c425dee1c415463b7386ea923d2cd Mon Sep 17 00:00:00 2001
|
|
From: Chen-Yu Tsai <wens@csie.org>
|
|
Date: Fri, 24 Mar 2017 16:33:06 +0800
|
|
Subject: [PATCH] clk: sunxi-ng: Fix round_rate/set_rate multiplier minimum
|
|
mismatch
|
|
|
|
In commit 2beaa601c849 ("clk: sunxi-ng: Implement minimum for
|
|
multipliers"), the multiplier minimums in the set_rate callback
|
|
for NM and NKMP style clocks were not updated.
|
|
|
|
This patch fixes them to match their round_rate callbacks.
|
|
|
|
Fixes: 2beaa601c849 ("clk: sunxi-ng: Implement minimum for multipliers")
|
|
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
|
|
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
|
|
---
|
|
drivers/clk/sunxi-ng/ccu_nkmp.c | 4 ++--
|
|
drivers/clk/sunxi-ng/ccu_nm.c | 2 +-
|
|
2 files changed, 3 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/drivers/clk/sunxi-ng/ccu_nkmp.c b/drivers/clk/sunxi-ng/ccu_nkmp.c
|
|
index 162ff26..e58c9578 100644
|
|
--- a/drivers/clk/sunxi-ng/ccu_nkmp.c
|
|
+++ b/drivers/clk/sunxi-ng/ccu_nkmp.c
|
|
@@ -138,9 +138,9 @@ static int ccu_nkmp_set_rate(struct clk_hw *hw, unsigned long rate,
|
|
unsigned long flags;
|
|
u32 reg;
|
|
|
|
- _nkmp.min_n = 1;
|
|
+ _nkmp.min_n = nkmp->n.min ?: 1;
|
|
_nkmp.max_n = nkmp->n.max ?: 1 << nkmp->n.width;
|
|
- _nkmp.min_k = 1;
|
|
+ _nkmp.min_k = nkmp->k.min ?: 1;
|
|
_nkmp.max_k = nkmp->k.max ?: 1 << nkmp->k.width;
|
|
_nkmp.min_m = 1;
|
|
_nkmp.max_m = nkmp->m.max ?: 1 << nkmp->m.width;
|
|
diff --git a/drivers/clk/sunxi-ng/ccu_nm.c b/drivers/clk/sunxi-ng/ccu_nm.c
|
|
index f312c92..5e5e90a 100644
|
|
--- a/drivers/clk/sunxi-ng/ccu_nm.c
|
|
+++ b/drivers/clk/sunxi-ng/ccu_nm.c
|
|
@@ -122,7 +122,7 @@ static int ccu_nm_set_rate(struct clk_hw *hw, unsigned long rate,
|
|
else
|
|
ccu_frac_helper_disable(&nm->common, &nm->frac);
|
|
|
|
- _nm.min_n = 1;
|
|
+ _nm.min_n = nm->n.min ?: 1;
|
|
_nm.max_n = nm->n.max ?: 1 << nm->n.width;
|
|
_nm.min_m = 1;
|
|
_nm.max_m = nm->m.max ?: 1 << nm->m.width;
|
|
From 43b883c1d002fa910e88e5776a0c42c733bb151f Mon Sep 17 00:00:00 2001
|
|
From: Chen-Yu Tsai <wens@csie.org>
|
|
Date: Fri, 24 Mar 2017 16:33:07 +0800
|
|
Subject: [PATCH] clk: sunxi-ng: a80: Fix audio PLL comment not matching actual
|
|
code
|
|
|
|
We ignore the d1 and d2 dividers in the audio PLL, and force them to
|
|
1 (register value 0) at probe time. However the comment preceding the
|
|
audio PLL definition says we enforce the default value, which is not
|
|
the same.
|
|
|
|
Fix the preceding comment to match what we do in code.
|
|
|
|
Fixes: b8eb71dcdd08 ("clk: sunxi-ng: Add A80 CCU")
|
|
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
|
|
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
|
|
---
|
|
drivers/clk/sunxi-ng/ccu-sun9i-a80.c | 3 +--
|
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
|
|
|
diff --git a/drivers/clk/sunxi-ng/ccu-sun9i-a80.c b/drivers/clk/sunxi-ng/ccu-sun9i-a80.c
|
|
index e13e313..a031bee 100644
|
|
--- a/drivers/clk/sunxi-ng/ccu-sun9i-a80.c
|
|
+++ b/drivers/clk/sunxi-ng/ccu-sun9i-a80.c
|
|
@@ -70,8 +70,7 @@ static struct ccu_nm pll_c1cpux_clk = {
|
|
/*
|
|
* The Audio PLL has d1, d2 dividers in addition to the usual N, M
|
|
* factors. Since we only need 2 frequencies from this PLL: 22.5792 MHz
|
|
- * and 24.576 MHz, ignore them for now. Enforce the default for them,
|
|
- * which is d1 = 0, d2 = 1.
|
|
+ * and 24.576 MHz, ignore them for now. Enforce d1 = 0 and d2 = 0.
|
|
*/
|
|
#define SUN9I_A80_PLL_AUDIO_REG 0x008
|
|
|
|
From 9594d638564896ac0f40cfd316e87a55c8d30570 Mon Sep 17 00:00:00 2001
|
|
From: Chen-Yu Tsai <wens@csie.org>
|
|
Date: Tue, 14 Feb 2017 11:35:23 +0800
|
|
Subject: [PATCH] clk: sunxi-ng: gate: Support common pre-dividers
|
|
|
|
Some clock gates have a pre-divider between the source input and the
|
|
gate itself. A notable example is the HSIC 12 MHz clock found on the
|
|
A83T, which has the 24 MHz main oscillator as its input, and a /2
|
|
pre-divider.
|
|
|
|
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
|
|
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
|
|
---
|
|
drivers/clk/sunxi-ng/ccu_gate.c | 47 +++++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 47 insertions(+)
|
|
|
|
diff --git a/drivers/clk/sunxi-ng/ccu_gate.c b/drivers/clk/sunxi-ng/ccu_gate.c
|
|
index 8a81f9d..cd069d5 100644
|
|
--- a/drivers/clk/sunxi-ng/ccu_gate.c
|
|
+++ b/drivers/clk/sunxi-ng/ccu_gate.c
|
|
@@ -75,8 +75,55 @@ static int ccu_gate_is_enabled(struct clk_hw *hw)
|
|
return ccu_gate_helper_is_enabled(&cg->common, cg->enable);
|
|
}
|
|
|
|
+static unsigned long ccu_gate_recalc_rate(struct clk_hw *hw,
|
|
+ unsigned long parent_rate)
|
|
+{
|
|
+ struct ccu_gate *cg = hw_to_ccu_gate(hw);
|
|
+ unsigned long rate = parent_rate;
|
|
+
|
|
+ if (cg->common.features & CCU_FEATURE_ALL_PREDIV)
|
|
+ rate /= cg->common.prediv;
|
|
+
|
|
+ return rate;
|
|
+}
|
|
+
|
|
+static long ccu_gate_round_rate(struct clk_hw *hw, unsigned long rate,
|
|
+ unsigned long *prate)
|
|
+{
|
|
+ struct ccu_gate *cg = hw_to_ccu_gate(hw);
|
|
+ int div = 1;
|
|
+
|
|
+ if (cg->common.features & CCU_FEATURE_ALL_PREDIV)
|
|
+ div = cg->common.prediv;
|
|
+
|
|
+ if (clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT) {
|
|
+ unsigned long best_parent = rate;
|
|
+
|
|
+ if (cg->common.features & CCU_FEATURE_ALL_PREDIV)
|
|
+ best_parent *= div;
|
|
+ *prate = clk_hw_round_rate(clk_hw_get_parent(hw), best_parent);
|
|
+ }
|
|
+
|
|
+ return *prate / div;
|
|
+}
|
|
+
|
|
+static int ccu_gate_set_rate(struct clk_hw *hw, unsigned long rate,
|
|
+ unsigned long parent_rate)
|
|
+{
|
|
+ /*
|
|
+ * We must report success but we can do so unconditionally because
|
|
+ * clk_factor_round_rate returns values that ensure this call is a
|
|
+ * nop.
|
|
+ */
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
const struct clk_ops ccu_gate_ops = {
|
|
.disable = ccu_gate_disable,
|
|
.enable = ccu_gate_enable,
|
|
.is_enabled = ccu_gate_is_enabled,
|
|
+ .round_rate = ccu_gate_round_rate,
|
|
+ .set_rate = ccu_gate_set_rate,
|
|
+ .recalc_rate = ccu_gate_recalc_rate,
|
|
};
|
|
From 272bce4ab673fca0e42add73189e559acbf8e0ca Mon Sep 17 00:00:00 2001
|
|
From: Peter Robinson <pbrobinson@gmail.com>
|
|
Date: Thu, 2 Mar 2017 17:43:57 +0000
|
|
Subject: [PATCH] clk: sunxi-ng: tighten SoC deps on explicit AllWinner SoCs
|
|
|
|
Tighten the depends on the various AllWinn SoCs so we don't
|
|
inadvertantly get clock drivers when we're not wanting them
|
|
like 32 bit SoC clocks for 64 bit configs. Ensure there's
|
|
still test coverage though.
|
|
|
|
Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
|
|
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
|
|
---
|
|
drivers/clk/sunxi-ng/Kconfig | 8 ++++++++
|
|
1 file changed, 8 insertions(+)
|
|
|
|
diff --git a/drivers/clk/sunxi-ng/Kconfig b/drivers/clk/sunxi-ng/Kconfig
|
|
index 6b347d4..cf8dc27 100644
|
|
--- a/drivers/clk/sunxi-ng/Kconfig
|
|
+++ b/drivers/clk/sunxi-ng/Kconfig
|
|
@@ -64,6 +64,7 @@ config SUN50I_A64_CCU
|
|
select SUNXI_CCU_MP
|
|
select SUNXI_CCU_PHASE
|
|
default ARM64 && ARCH_SUNXI
|
|
+ depends on (ARM64 && ARCH_SUNXI) || COMPILE_TEST
|
|
|
|
config SUN5I_CCU
|
|
bool "Support for the Allwinner sun5i family CCM"
|
|
@@ -75,6 +76,7 @@ config SUN5I_CCU
|
|
select SUNXI_CCU_MP
|
|
select SUNXI_CCU_PHASE
|
|
default MACH_SUN5I
|
|
+ depends on MACH_SUN5I || COMPILE_TEST
|
|
|
|
config SUN6I_A31_CCU
|
|
bool "Support for the Allwinner A31/A31s CCU"
|
|
@@ -86,6 +88,7 @@ config SUN6I_A31_CCU
|
|
select SUNXI_CCU_MP
|
|
select SUNXI_CCU_PHASE
|
|
default MACH_SUN6I
|
|
+ depends on MACH_SUN6I || COMPILE_TEST
|
|
|
|
config SUN8I_A23_CCU
|
|
bool "Support for the Allwinner A23 CCU"
|
|
@@ -98,6 +101,7 @@ config SUN8I_A23_CCU
|
|
select SUNXI_CCU_MP
|
|
select SUNXI_CCU_PHASE
|
|
default MACH_SUN8I
|
|
+ depends on MACH_SUN8I || COMPILE_TEST
|
|
|
|
config SUN8I_A33_CCU
|
|
bool "Support for the Allwinner A33 CCU"
|
|
@@ -110,6 +114,7 @@ config SUN8I_A33_CCU
|
|
select SUNXI_CCU_MP
|
|
select SUNXI_CCU_PHASE
|
|
default MACH_SUN8I
|
|
+ depends on MACH_SUN8I || COMPILE_TEST
|
|
|
|
config SUN8I_H3_CCU
|
|
bool "Support for the Allwinner H3 CCU"
|
|
@@ -121,6 +126,7 @@ config SUN8I_H3_CCU
|
|
select SUNXI_CCU_MP
|
|
select SUNXI_CCU_PHASE
|
|
default MACH_SUN8I || (ARM64 && ARCH_SUNXI)
|
|
+ depends on MACH_SUN8I || (ARM64 && ARCH_SUNXI) || COMPILE_TEST
|
|
|
|
config SUN8I_V3S_CCU
|
|
bool "Support for the Allwinner V3s CCU"
|
|
@@ -132,6 +138,7 @@ config SUN8I_V3S_CCU
|
|
select SUNXI_CCU_MP
|
|
select SUNXI_CCU_PHASE
|
|
default MACH_SUN8I
|
|
+ depends on MACH_SUN8I || COMPILE_TEST
|
|
|
|
config SUN9I_A80_CCU
|
|
bool "Support for the Allwinner A80 CCU"
|
|
@@ -143,5 +150,6 @@ config SUN9I_A80_CCU
|
|
select SUNXI_CCU_MP
|
|
select SUNXI_CCU_PHASE
|
|
default MACH_SUN9I
|
|
+ depends on MACH_SUN9I || COMPILE_TEST
|
|
|
|
endif
|
|
From 5e38e4e910c70d15d53d3d9221d0397986591e14 Mon Sep 17 00:00:00 2001
|
|
From: Ondrej Jirman <megous@megous.com>
|
|
Date: Mon, 21 Nov 2016 01:58:49 +0100
|
|
Subject: [PATCH] clk: sunxi-ng: Fix "BUG: schedule in idle" while waiting for
|
|
PLL lock
|
|
|
|
---
|
|
drivers/clk/sunxi-ng/ccu_common.c | 3 ++-
|
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/clk/sunxi-ng/ccu_common.c b/drivers/clk/sunxi-ng/ccu_common.c
|
|
index 9d87247..9518c0e 100644
|
|
--- a/drivers/clk/sunxi-ng/ccu_common.c
|
|
+++ b/drivers/clk/sunxi-ng/ccu_common.c
|
|
@@ -38,7 +38,8 @@ void ccu_helper_wait_for_lock(struct ccu_common *common, u32 lock)
|
|
else
|
|
addr = common->base + common->reg;
|
|
|
|
- WARN_ON(readl_relaxed_poll_timeout(addr, reg, reg & lock, 100, 70000));
|
|
+ WARN_ON(readl_relaxed_poll_timeout_atomic(addr, reg,
|
|
+ reg & lock, 5, 70000));
|
|
}
|
|
|
|
/*
|