2022-05-03 00:34:18

by Christian Marangi

[permalink] [raw]
Subject: [PATCH 0/4] Small fixes/improvement for hfpll and krait

This series has small fixes/improvement to the hfpll and krait clk
driver.

This comes from another series that got split to better facilitate the
merge since it was grown to 21 patches and was getting hard to review.

For hfpll, a conversion to read_poll macro and introduction
of a timeout to prevent a stall.
For krait, a fix for the mux sel logic, an extra check for
div2_rount_rate and an introduction for 8064 errata.

Ansuel Smith (4):
clk: qcom: clk-hfpll: use poll_timeout macro
clk: qcom: clk-krait: unlock spin after mux completion
clk: qcom: clk-krait: add hw_parent check for div2_round_rate
clk: qcom: clk-krait: add apq/ipq8064 errata workaround

drivers/clk/qcom/clk-hfpll.c | 15 +++++++++------
drivers/clk/qcom/clk-krait.c | 30 ++++++++++++++++++++++++++++--
drivers/clk/qcom/clk-krait.h | 1 +
drivers/clk/qcom/krait-cc.c | 1 +
4 files changed, 39 insertions(+), 8 deletions(-)

--
2.34.1


2022-05-03 01:10:00

by Christian Marangi

[permalink] [raw]
Subject: [PATCH 4/4] clk: qcom: clk-krait: add apq/ipq8064 errata workaround

Add apq/ipq8064 errata workaround where the sec_src clock gating needs to
be disabled during switching. To enable this set disable_sec_src_gating
in the mux struct.

Signed-off-by: Ansuel Smith <[email protected]>
---
drivers/clk/qcom/clk-krait.c | 16 ++++++++++++++++
drivers/clk/qcom/clk-krait.h | 1 +
drivers/clk/qcom/krait-cc.c | 1 +
3 files changed, 18 insertions(+)

diff --git a/drivers/clk/qcom/clk-krait.c b/drivers/clk/qcom/clk-krait.c
index 6c367ad6506a..4a9b3296c45b 100644
--- a/drivers/clk/qcom/clk-krait.c
+++ b/drivers/clk/qcom/clk-krait.c
@@ -18,13 +18,23 @@
static DEFINE_SPINLOCK(krait_clock_reg_lock);

#define LPL_SHIFT 8
+#define SECCLKAGD BIT(4)
+
static void __krait_mux_set_sel(struct krait_mux_clk *mux, int sel)
{
unsigned long flags;
u32 regval;

spin_lock_irqsave(&krait_clock_reg_lock, flags);
+
regval = krait_get_l2_indirect_reg(mux->offset);
+
+ /* apq/ipq8064 Errata: disable sec_src clock gating during switch. */
+ if (mux->disable_sec_src_gating) {
+ regval |= SECCLKAGD;
+ krait_set_l2_indirect_reg(mux->offset, regval);
+ }
+
regval &= ~(mux->mask << mux->shift);
regval |= (sel & mux->mask) << mux->shift;
if (mux->lpl) {
@@ -33,6 +43,12 @@ static void __krait_mux_set_sel(struct krait_mux_clk *mux, int sel)
}
krait_set_l2_indirect_reg(mux->offset, regval);

+ /* apq/ipq8064 Errata: re-enabled sec_src clock gating. */
+ if (mux->disable_sec_src_gating) {
+ regval &= ~SECCLKAGD;
+ krait_set_l2_indirect_reg(mux->offset, regval);
+ }
+
/* Wait for switch to complete. */
mb();
udelay(1);
diff --git a/drivers/clk/qcom/clk-krait.h b/drivers/clk/qcom/clk-krait.h
index 9120bd2f5297..f930538c539e 100644
--- a/drivers/clk/qcom/clk-krait.h
+++ b/drivers/clk/qcom/clk-krait.h
@@ -15,6 +15,7 @@ struct krait_mux_clk {
u8 safe_sel;
u8 old_index;
bool reparent;
+ bool disable_sec_src_gating;

struct clk_hw hw;
struct notifier_block clk_nb;
diff --git a/drivers/clk/qcom/krait-cc.c b/drivers/clk/qcom/krait-cc.c
index 4d4b657d33c3..0f88bf41ec6e 100644
--- a/drivers/clk/qcom/krait-cc.c
+++ b/drivers/clk/qcom/krait-cc.c
@@ -138,6 +138,7 @@ krait_add_sec_mux(struct device *dev, int id, const char *s,
mux->parent_map = sec_mux_map;
mux->hw.init = &init;
mux->safe_sel = 0;
+ mux->disable_sec_src_gating = true;

init.name = kasprintf(GFP_KERNEL, "krait%s_sec_mux", s);
if (!init.name)
--
2.34.1