From: s.hauer@pengutronix.de (Sascha Hauer)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] ARM i.MX6: Fix ethernet PLL clocks
Date: Wed, 21 Nov 2012 15:11:24 +0100 [thread overview]
Message-ID: <20121121141124.GS10369@pengutronix.de> (raw)
In-Reply-To: <1353505652-28200-1-git-send-email-s.hauer@pengutronix.de>
On Wed, Nov 21, 2012 at 02:47:32PM +0100, Sascha Hauer wrote:
> In current code the ethernet PLL (according to code pll8, according to datasheet
> pll6) is not handled correctly. The PLL runs at 500MHz and has different outputs.
> Only the enet reference clock is implemented. This patch changes the PLL so that
> it outputs 500MHz and adds the additional outputs as dividers. This now matches
> the datasheet which says:
>
> > This PLL synthesizes a low jitter clock from 24 MHz reference clock.
> > The PLL outputs a 500 MHz clock. The reference clocks generated by this PLL are:
> > ? Ref_PCIe = 125 MHz
> > ? Ref_SATA = 100 MHz
> > ? Ref_ethernet, which is configurable based on the PLL_ENET[1:0] register field.
>
> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
> ---
> .../devicetree/bindings/clock/imx6q-clock.txt | 5 ++
> arch/arm/mach-imx/clk-imx6q.c | 18 +++++-
> arch/arm/mach-imx/clk-pllv3.c | 59 +-------------------
> 3 files changed, 24 insertions(+), 58 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/clock/imx6q-clock.txt b/Documentation/devicetree/bindings/clock/imx6q-clock.txt
> index 492bd99..94311e2 100644
> --- a/Documentation/devicetree/bindings/clock/imx6q-clock.txt
> +++ b/Documentation/devicetree/bindings/clock/imx6q-clock.txt
> @@ -198,6 +198,11 @@ clocks and IDs.
> usbphy2 183
> ldb_di0_div_3_5 184
> ldb_di1_div_3_5 185
> + sata_ref 186
> + sata_ref_100m 187
> + pcie_ref 188
> + pcie_ref_125m 189
> + enet_ref 190
>
> Examples:
>
> diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c
> index 3ec242f..95f8ea5 100644
> --- a/arch/arm/mach-imx/clk-imx6q.c
> +++ b/arch/arm/mach-imx/clk-imx6q.c
> @@ -153,7 +153,7 @@ enum mx6q_clks {
> usdhc4, vdo_axi, vpu_axi, cko1, pll1_sys, pll2_bus, pll3_usb_otg,
> pll4_audio, pll5_video, pll6_mlb, pll7_usb_host, pll8_enet, ssi1_ipg,
> ssi2_ipg, ssi3_ipg, rom, usbphy1, usbphy2, ldb_di0_div_3_5, ldb_di1_div_3_5,
> - clk_max
> + sata_ref, sata_ref_100m, pcie_ref, pcie_ref_125m, enet_ref, clk_max
> };
>
> static struct clk *clk[clk_max];
> @@ -163,6 +163,13 @@ static enum mx6q_clks const clks_init_on[] __initconst = {
> mmdc_ch0_axi, rom,
> };
>
> +static struct clk_div_table clk_enet_ref_table[] = {
> + { .val = 0, .div = 20, },
> + { .val = 1, .div = 10, },
> + { .val = 2, .div = 5, },
> + { .val = 3, .div = 4, },
> +};
> +
> int __init mx6q_clocks_init(void)
> {
> struct device_node *np;
> @@ -202,6 +209,15 @@ int __init mx6q_clocks_init(void)
> clk[usbphy1] = imx_clk_gate("usbphy1", "pll3_usb_otg", base + 0x10, 6);
> clk[usbphy2] = imx_clk_gate("usbphy2", "pll7_usb_host", base + 0x20, 6);
>
> + clk[sata_ref] = imx_clk_gate("sata_ref", "pll8_enet", base + 0x20, 20);
> + clk[pcie_ref] = imx_clk_gate("pcie_ref", "pll8_enet", base + 0x20, 19);
> + clk[sata_ref_100m] = imx_clk_fixed_factor("sata_ref_100m", "sata_ref", 1, 5);
> + clk[pcie_ref_125m] = imx_clk_fixed_factor("pcie_ref_100m", "pcie_ref", 1, 4);
> +
> + clk[enet_ref] = clk_register_divider_table(NULL, "enet_ref", "pll8_enet", 0,
> + base + 0x20, 0, 2, 0, clk_enet_ref_table,
> + &imx_ccm_lock);
> +
> /* name parent_name reg idx */
> clk[pll2_pfd0_352m] = imx_clk_pfd("pll2_pfd0_352m", "pll2_bus", base + 0x100, 0);
> clk[pll2_pfd1_594m] = imx_clk_pfd("pll2_pfd1_594m", "pll2_bus", base + 0x100, 1);
> diff --git a/arch/arm/mach-imx/clk-pllv3.c b/arch/arm/mach-imx/clk-pllv3.c
> index 36aac94..f5e210a 100644
> --- a/arch/arm/mach-imx/clk-pllv3.c
> +++ b/arch/arm/mach-imx/clk-pllv3.c
> @@ -287,66 +287,13 @@ static const struct clk_ops clk_pllv3_av_ops = {
> static unsigned long clk_pllv3_enet_recalc_rate(struct clk_hw *hw,
> unsigned long parent_rate)
> {
> - struct clk_pllv3 *pll = to_clk_pllv3(hw);
> - u32 div = readl_relaxed(pll->base) & pll->div_mask;
> -
> - switch (div) {
> - case 0:
> - return 25000000;
> - case 1:
> - return 50000000;
> - case 2:
> - return 100000000;
> - case 3:
> - return 125000000;
> - }
> -
> - return 0;
> + return 500000000;
> }
>
> static long clk_pllv3_enet_round_rate(struct clk_hw *hw, unsigned long rate,
> unsigned long *prate)
> {
This function should be removed completely. Will fix.
Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
next prev parent reply other threads:[~2012-11-21 14:11 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-21 13:47 [PATCH] ARM i.MX6: Fix ethernet PLL clocks Sascha Hauer
2012-11-21 14:11 ` Sascha Hauer [this message]
2012-11-22 8:42 ` Shawn Guo
2012-11-22 8:47 ` Sascha Hauer
2012-11-22 9:16 ` Shawn Guo
2012-11-22 8:54 ` Sascha Hauer
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=20121121141124.GS10369@pengutronix.de \
--to=s.hauer@pengutronix.de \
--cc=linux-arm-kernel@lists.infradead.org \
/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).