From: Shawn Guo <shawn.guo@freescale.com>
To: Shengjiu Wang <shengjiu.wang@freescale.com>
Cc: <kernel@pengutronix.de>, <linux@arm.linux.org.uk>,
<robh+dt@kernel.org>, <pawel.moll@arm.com>,
<mark.rutland@arm.com>, <ijc+devicetree@hellion.org.uk>,
<galak@codeaurora.org>, <Guangyu.Chen@freescale.com>,
<linux-arm-kernel@lists.infradead.org>,
<linux-kernel@vger.kernel.org>
Subject: Re: [PATCH V1 3/3] ARM: imx6q: Add the clock route from external OSC to ESAI clock
Date: Tue, 5 Aug 2014 15:30:01 +0800 [thread overview]
Message-ID: <20140805073000.GI2167@dragon> (raw)
In-Reply-To: <f680e189741811194a8096c933b63a8b5ad83fae.1407148853.git.shengjiu.wang@freescale.com>
On Mon, Aug 04, 2014 at 07:11:15PM +0800, Shengjiu Wang wrote:
> This patch mainly adds the clock route from external 24.576MHz OSC to internal
> ESAI clock via analog clock2 PADs on the SoC and pll4 so that ESAI can get an
> entirely synchronous clock source against CS42888.
>
> [ 1, We found if using pll4 to generate a 24.576MHz from inernal 24.0MHz OSC,
> we would get noise during the audio playback via ESAI->CS42888 even though
> this generated clock's rate is equal to the external one statistically. It
> might be resulted from the tiny difference between two clock source, which
> might be crucial to the sensitive CODEC we use -- CS42888. So we here apply
> the old 3.0.35 way to feed ESAI the same clock source as CS42888.
>
> 2, Ideally, we should use bypass mode for pll4 since we only need to get
> the raw rate (24.576MHz) while currently bypass mode in clk-pllv3.c isn't
> entirely supported: The clock rate would be fixed to 24.0MHz if setting to
> bypass, which would cause child clock get an incorrect rate and the driver
> who uses the child clock fail to derive a needed clock rate, and it might
> be dangerous to involve the clk-pllv3.c driver to this fix. Thus we here
> apply 3.0.35 way provisionally. ]
Instead of hacking it around, I consider it's time to properly implement
PLL bypass mode. It's essentially just another multiplexer.
Shawn
>
> Expected result:
>
> anaclk2 0 1 24576000
> lvds2_in 0 1 24576000
> pll4_sel 0 1 24576000
> pll4_audio 0 1 786432000
> pll4_post_div 0 1 786432000
> pll4_audio_div 0 1 786432000
> esai_sel 0 1 786432000
> esai_pred 0 1 98304000
> esai_podf 0 1 24576000
> esai 0 1 24576000
>
> Signed-off-by: Nicolin Chen <Guangyu.Chen@freescale.com>
> Signed-off-by: Shengjiu Wang <shengjiu.wang@freescale.com>
> ---
> arch/arm/mach-imx/clk-imx6q.c | 5 +++++
> arch/arm/mach-imx/mach-imx6q.c | 28 ++++++++++++++++++++++++++++
> 2 files changed, 33 insertions(+)
>
> diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c
> index 927a062..2d3634f 100644
> --- a/arch/arm/mach-imx/clk-imx6q.c
> +++ b/arch/arm/mach-imx/clk-imx6q.c
> @@ -413,6 +413,10 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
> of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
>
> clk_register_clkdev(clk[IMX6QDL_CLK_ENET_REF], "enet_ref", NULL);
> + clk_register_clkdev(clk[IMX6QDL_CLK_PLL4_AUDIO_DIV], "pll4_audio_div", NULL);
> + clk_register_clkdev(clk[IMX6QDL_CLK_PLL4_SEL], "pll4_sel", NULL);
> + clk_register_clkdev(clk[IMX6QDL_CLK_LVDS2_IN], "lvds2_in", NULL);
> + clk_register_clkdev(clk[IMX6QDL_CLK_ESAI_EXTAL], "esai_extal", NULL);
>
> if ((imx_get_soc_revision() != IMX_CHIP_REVISION_1_0) ||
> cpu_is_imx6dl()) {
> @@ -456,6 +460,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
>
> /* Audio-related clocks configuration */
> clk_set_parent(clk[IMX6QDL_CLK_SPDIF_SEL], clk[IMX6QDL_CLK_PLL3_PFD3_454M]);
> + clk_set_parent(clk[IMX6QDL_CLK_ESAI_SEL], clk[IMX6QDL_CLK_PLL4_AUDIO_DIV]);
>
> /* All existing boards with PCIe use LVDS1 */
> if (IS_ENABLED(CONFIG_PCI_IMX6))
> diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c
> index d51c6e9..ea24a96 100644
> --- a/arch/arm/mach-imx/mach-imx6q.c
> +++ b/arch/arm/mach-imx/mach-imx6q.c
> @@ -362,6 +362,28 @@ put_node:
> of_node_put(np);
> }
>
> +#define ESAI_AUDIO_MCLK 24576000
> +
> +static void __init imx6q_audio_lvds2_init(void)
> +{
> + struct clk *pll4_sel, *lvds2_in, *pll4_audio_div, *esai_extal;
> +
> + pll4_audio_div = clk_get_sys(NULL, "pll4_audio_div");
> + pll4_sel = clk_get_sys(NULL, "pll4_sel");
> + lvds2_in = clk_get_sys(NULL, "lvds2_in");
> + esai_extal = clk_get_sys(NULL, "esai_extal");
> + if (IS_ERR(pll4_audio_div) || IS_ERR(pll4_sel) ||
> + IS_ERR(lvds2_in) || IS_ERR(esai_extal))
> + return;
> +
> + if (clk_get_rate(lvds2_in) != ESAI_AUDIO_MCLK)
> + return;
> +
> + clk_set_parent(pll4_sel, lvds2_in);
> + clk_set_rate(pll4_audio_div, 786432000);
> + clk_set_rate(esai_extal, ESAI_AUDIO_MCLK);
> +}
> +
> static struct platform_device imx6q_cpufreq_pdev = {
> .name = "imx6q-cpufreq",
> };
> @@ -379,6 +401,12 @@ static void __init imx6q_init_late(void)
> imx6q_opp_init();
> platform_device_register(&imx6q_cpufreq_pdev);
> }
> +
> + if (of_machine_is_compatible("fsl,imx6q-sabreauto")
> + || of_machine_is_compatible("fsl,imx6dl-sabreauto")) {
> + imx6q_audio_lvds2_init();
> + }
> +
> }
>
> static void __init imx6q_map_io(void)
> --
> 1.7.9.5
>
prev parent reply other threads:[~2014-08-05 7:30 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-04 11:11 [PATCH V1 0/3] refine clock tree for esai in imx6q Shengjiu Wang
2014-08-04 11:11 ` [PATCH V1 1/3] ARM: clk-imx6q: refine clock tree for ESAI Shengjiu Wang
2014-08-04 11:11 ` [PATCH V1 2/3] ARM: clk-imx6q: Add missing lvds2 clock to the clock tree Shengjiu Wang
2014-08-05 7:18 ` Shawn Guo
2014-08-04 11:11 ` [PATCH V1 3/3] ARM: imx6q: Add the clock route from external OSC to ESAI clock Shengjiu Wang
2014-08-05 7:30 ` Shawn Guo [this message]
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=20140805073000.GI2167@dragon \
--to=shawn.guo@freescale.com \
--cc=Guangyu.Chen@freescale.com \
--cc=galak@codeaurora.org \
--cc=ijc+devicetree@hellion.org.uk \
--cc=kernel@pengutronix.de \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=mark.rutland@arm.com \
--cc=pawel.moll@arm.com \
--cc=robh+dt@kernel.org \
--cc=shengjiu.wang@freescale.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).