From: Jian Hu <jian.hu@amlogic.com>
To: Jerome Brunet <jbrunet@baylibre.com>,
Neil Armstrong <narmstrong@baylibre.com>
Cc: Rob Herring <robh@kernel.org>,
Victor Wan <victor.wan@amlogic.com>,
Jianxin Pan <jianxin.pan@amlogic.com>,
devicetree@vger.kernel.org,
Martin Blumenstingl <martin.blumenstingl@googlemail.com>,
Kevin Hilman <khilman@baylibre.com>,
Michael Turquette <mturquette@baylibre.com>,
linux-kernel@vger.kernel.org, Stephen Boyd <sboyd@kernel.org>,
Jian Hu <jian.hu@amlogic.com>,
linux-arm-kernel@lists.infradead.org,
Qiufang Dai <qiufang.dai@amlogic.com>,
linux-amlogic@lists.infradead.org, linux-clk@vger.kernel.org,
Chandle Zou <chandle.zou@amlogic.com>
Subject: [PATCH v2 2/3] clk: meson: add support for A1 PLL clock ops
Date: Fri, 18 Oct 2019 15:14:24 +0800 [thread overview]
Message-ID: <1571382865-41978-3-git-send-email-jian.hu@amlogic.com> (raw)
In-Reply-To: <1571382865-41978-1-git-send-email-jian.hu@amlogic.com>
The A1 PLL design is different with previous SoCs. The PLL
internal analog modules Power-on sequence is different
with previous, and thus requires a strict register sequence to
enable the PLL. Unlike the previous series, the maximum frequency
is 6G in G12A, for A1 the maximum is 1536M.
Signed-off-by: Jian Hu <jian.hu@amlogic.com>
---
drivers/clk/meson/clk-pll.c | 66 ++++++++++++++++++++++++++++++++++++++++-----
drivers/clk/meson/clk-pll.h | 1 +
2 files changed, 61 insertions(+), 6 deletions(-)
diff --git a/drivers/clk/meson/clk-pll.c b/drivers/clk/meson/clk-pll.c
index ddb1e56..b440e62 100644
--- a/drivers/clk/meson/clk-pll.c
+++ b/drivers/clk/meson/clk-pll.c
@@ -349,6 +349,56 @@ static void meson_clk_pll_disable(struct clk_hw *hw)
meson_parm_write(clk->map, &pll->en, 0);
}
+/*
+ * The A1 design is different with previous SoCs.The PLL
+ * internal analog modules Power-on sequence is different with
+ * previous, different PLL has the different sequence, and
+ * thus requires a strict register sequence to enable the PLL.
+ * When set a new target frequency, the sequence should keep
+ * the same with the initial sequence. Unlike the previous series,
+ * the maximum frequency is 6G in G12A, for A1 the maximum
+ * is 1536M.
+ */
+static void meson_params_update_with_init_seq(struct clk_regmap *clk,
+ struct meson_clk_pll_data *pll,
+ unsigned int m, unsigned int n,
+ unsigned int frac)
+{
+ struct parm *pm = &pll->m;
+ struct parm *pn = &pll->n;
+ struct parm *pfrac = &pll->frac;
+ const struct reg_sequence *init_regs = pll->init_regs;
+ unsigned int i, val;
+
+ for (i = 0; i < pll->init_count; i++) {
+ if (pn->reg_off == init_regs[i].reg) {
+ /* Clear M N bits and Update M N value */
+ val = init_regs[i].def;
+ val &= CLRPMASK(pn->width, pn->shift);
+ val &= CLRPMASK(pm->width, pm->shift);
+ val |= n << pn->shift;
+ val |= m << pm->shift;
+ regmap_write(clk->map, pn->reg_off, val);
+ } else if (MESON_PARM_APPLICABLE(&pll->frac) &&
+ (pfrac->reg_off == init_regs[i].reg)) {
+ /* Clear Frac bits and Update Frac value */
+ val = init_regs[i].def;
+ val &= CLRPMASK(pfrac->width, pfrac->shift);
+ val |= frac << pfrac->shift;
+ regmap_write(clk->map, pfrac->reg_off, val);
+ } else {
+ /*
+ * According to the PLL hardware constraint,
+ * the left registers should be setted again.
+ */
+ val = init_regs[i].def;
+ regmap_write(clk->map, init_regs[i].reg, val);
+ }
+ if (init_regs[i].delay_us)
+ udelay(init_regs[i].delay_us);
+ }
+}
+
static int meson_clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
unsigned long parent_rate)
{
@@ -366,16 +416,20 @@ static int meson_clk_pll_set_rate(struct clk_hw *hw, unsigned long rate,
if (ret)
return ret;
+ if (MESON_PARM_APPLICABLE(&pll->frac))
+ frac = __pll_params_with_frac(rate, parent_rate, m, n, pll);
+
enabled = meson_parm_read(clk->map, &pll->en);
if (enabled)
meson_clk_pll_disable(hw);
- meson_parm_write(clk->map, &pll->n, n);
- meson_parm_write(clk->map, &pll->m, m);
-
- if (MESON_PARM_APPLICABLE(&pll->frac)) {
- frac = __pll_params_with_frac(rate, parent_rate, m, n, pll);
- meson_parm_write(clk->map, &pll->frac, frac);
+ if (pll->strict_sequence)
+ meson_params_update_with_init_seq(clk, pll, m, n, frac);
+ else {
+ meson_parm_write(clk->map, &pll->n, n);
+ meson_parm_write(clk->map, &pll->m, m);
+ if (MESON_PARM_APPLICABLE(&pll->frac))
+ meson_parm_write(clk->map, &pll->frac, frac);
}
/* If the pll is stopped, bail out now */
diff --git a/drivers/clk/meson/clk-pll.h b/drivers/clk/meson/clk-pll.h
index 367efd0..d5789cef 100644
--- a/drivers/clk/meson/clk-pll.h
+++ b/drivers/clk/meson/clk-pll.h
@@ -41,6 +41,7 @@ struct meson_clk_pll_data {
const struct pll_params_table *table;
const struct pll_mult_range *range;
u8 flags;
+ bool strict_sequence;
};
extern const struct clk_ops meson_clk_pll_ro_ops;
--
1.9.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2019-10-18 7:15 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-18 7:14 [PATCH v2 0/3] add Amlogic A1 clock controller driver Jian Hu
2019-10-18 7:14 ` [PATCH v2 1/3] dt-bindings: clock: meson: add A1 clock controller bindings Jian Hu
2019-10-21 10:43 ` Jerome Brunet
2019-10-22 5:30 ` Jian Hu
2019-10-18 7:14 ` Jian Hu [this message]
2019-10-21 11:31 ` [PATCH v2 2/3] clk: meson: add support for A1 PLL clock ops Jerome Brunet
2019-10-25 6:47 ` Jian Hu
2019-10-18 7:14 ` [PATCH v2 3/3] clk: meson: a1: add support for Amlogic A1 clock driver Jian Hu
2019-10-21 11:41 ` Jerome Brunet
2019-10-25 11:32 ` Jian Hu
2019-11-04 8:24 ` Jerome Brunet
2019-11-09 11:16 ` Jian Hu
2019-11-12 16:59 ` Jerome Brunet
2019-11-13 14:21 ` Jian Hu
2019-11-20 9:28 ` Jian Hu
2019-11-20 15:35 ` Jerome Brunet
2019-11-21 3:21 ` Jian Hu
2019-11-25 10:14 ` Jerome Brunet
2019-11-25 12:01 ` Jian Hu
2019-11-25 12:30 ` Jerome Brunet
2019-11-25 13:51 ` Jian Hu
2019-11-26 2:35 ` Jian Hu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1571382865-41978-3-git-send-email-jian.hu@amlogic.com \
--to=jian.hu@amlogic.com \
--cc=chandle.zou@amlogic.com \
--cc=devicetree@vger.kernel.org \
--cc=jbrunet@baylibre.com \
--cc=jianxin.pan@amlogic.com \
--cc=khilman@baylibre.com \
--cc=linux-amlogic@lists.infradead.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=martin.blumenstingl@googlemail.com \
--cc=mturquette@baylibre.com \
--cc=narmstrong@baylibre.com \
--cc=qiufang.dai@amlogic.com \
--cc=robh@kernel.org \
--cc=sboyd@kernel.org \
--cc=victor.wan@amlogic.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).