From: david@lechnology.com (David Lechner)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/2] ARM: davinci: da850: use clk->set_parent for async3
Date: Sat, 16 Apr 2016 14:31:27 -0500 [thread overview]
Message-ID: <5712930F.7000902@lechnology.com> (raw)
In-Reply-To: <1460661217-7389-3-git-send-email-david@lechnology.com>
On 04/14/2016 02:13 PM, David Lechner wrote:
> The da850 family of processors has an async3 clock domain that can be
> muxed to either pll0_sysclk2 or pll1_sysclk2. Now that the davinci clocks
> have a set_parent callback, we can use this to control the async3 mux
> instead of a stand-alone function.
>
> This adds a new async3_clk and sets the appropriate child clocks. The
> default is use to pll1_sysclk2 since it is not affected by processor
> frequency scaling.
>
> Signed-off-by: David Lechner <david@lechnology.com>
> ---
>
> v4 changes:
>
> * Fixed strict checkpatch complaint about {} in if/else
>
>
> arch/arm/mach-davinci/da850.c | 82 ++++++++++++++++++-------------------------
> 1 file changed, 34 insertions(+), 48 deletions(-)
>
> diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c
> index 1f85bbc..ace7433 100644
> --- a/arch/arm/mach-davinci/da850.c
> +++ b/arch/arm/mach-davinci/da850.c
> @@ -34,9 +34,6 @@
> #include "clock.h"
> #include "mux.h"
>
> -/* SoC specific clock flags */
> -#define DA850_CLK_ASYNC3 BIT(16)
> -
> #define DA850_PLL1_BASE 0x01e1a000
> #define DA850_TIMER64P2_BASE 0x01f0c000
> #define DA850_TIMER64P3_BASE 0x01f0d000
> @@ -161,6 +158,33 @@ static struct clk pll1_sysclk3 = {
> .div_reg = PLLDIV3,
> };
>
> +static int da850_async3_set_parent(struct clk *clk, struct clk *parent)
> +{
> + u32 val;
> +
> + val = readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG));
> +
> + /* Set the USB 1.1 PHY clock mux based on the parent clock. */
I seem to have regressed here since the last revision, this is supposed
to read:
/* Set the async3 clock domain mux based on the parent clock. */
Although now that I am looking at it again, it doesn't really add
anything useful and could be omitted altogether.
> + if (parent == &pll0_sysclk2) {
> + val &= ~CFGCHIP3_ASYNC3_CLKSRC;
> + } else if (parent == &pll1_sysclk2) {
> + val |= CFGCHIP3_ASYNC3_CLKSRC;
> + } else {
> + pr_err("Bad parent on async3 clock mux\n");
> + return -EINVAL;
> + }
> +
> + writel(val, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG));
> +
> + return 0;
> +}
> +
> +static struct clk async3_clk = {
> + .name = "async3",
> + .parent = &pll1_sysclk2,
> + .set_parent = da850_async3_set_parent,
> +};
> +
> static struct clk i2c0_clk = {
> .name = "i2c0",
> .parent = &pll0_aux_clk,
> @@ -234,18 +258,16 @@ static struct clk uart0_clk = {
>
> static struct clk uart1_clk = {
> .name = "uart1",
> - .parent = &pll0_sysclk2,
> + .parent = &async3_clk,
> .lpsc = DA8XX_LPSC1_UART1,
> .gpsc = 1,
> - .flags = DA850_CLK_ASYNC3,
> };
>
> static struct clk uart2_clk = {
> .name = "uart2",
> - .parent = &pll0_sysclk2,
> + .parent = &async3_clk,
> .lpsc = DA8XX_LPSC1_UART2,
> .gpsc = 1,
> - .flags = DA850_CLK_ASYNC3,
> };
>
> static struct clk aintc_clk = {
> @@ -300,10 +322,9 @@ static struct clk emac_clk = {
>
> static struct clk mcasp_clk = {
> .name = "mcasp",
> - .parent = &pll0_sysclk2,
> + .parent = &async3_clk,
> .lpsc = DA8XX_LPSC1_McASP0,
> .gpsc = 1,
> - .flags = DA850_CLK_ASYNC3,
> };
>
> static struct clk lcdc_clk = {
> @@ -355,10 +376,9 @@ static struct clk spi0_clk = {
>
> static struct clk spi1_clk = {
> .name = "spi1",
> - .parent = &pll0_sysclk2,
> + .parent = &async3_clk,
> .lpsc = DA8XX_LPSC1_SPI1,
> .gpsc = 1,
> - .flags = DA850_CLK_ASYNC3,
> };
>
> static struct clk vpif_clk = {
> @@ -386,10 +406,9 @@ static struct clk dsp_clk = {
>
> static struct clk ehrpwm_clk = {
> .name = "ehrpwm",
> - .parent = &pll0_sysclk2,
> + .parent = &async3_clk,
> .lpsc = DA8XX_LPSC1_PWM,
> .gpsc = 1,
> - .flags = DA850_CLK_ASYNC3,
> };
>
> #define DA8XX_EHRPWM_TBCLKSYNC BIT(12)
> @@ -421,10 +440,9 @@ static struct clk ehrpwm_tbclk = {
>
> static struct clk ecap_clk = {
> .name = "ecap",
> - .parent = &pll0_sysclk2,
> + .parent = &async3_clk,
> .lpsc = DA8XX_LPSC1_ECAP,
> .gpsc = 1,
> - .flags = DA850_CLK_ASYNC3,
> };
>
> static struct clk_lookup da850_clks[] = {
> @@ -442,6 +460,7 @@ static struct clk_lookup da850_clks[] = {
> CLK(NULL, "pll1_aux", &pll1_aux_clk),
> CLK(NULL, "pll1_sysclk2", &pll1_sysclk2),
> CLK(NULL, "pll1_sysclk3", &pll1_sysclk3),
> + CLK(NULL, "async3", &async3_clk),
> CLK("i2c_davinci.1", NULL, &i2c0_clk),
> CLK(NULL, "timer0", &timerp64_0_clk),
> CLK("davinci-wdt", NULL, &timerp64_1_clk),
> @@ -909,30 +928,6 @@ static struct davinci_timer_info da850_timer_info = {
> .clocksource_id = T0_TOP,
> };
>
> -static void da850_set_async3_src(int pllnum)
> -{
> - struct clk *clk, *newparent = pllnum ? &pll1_sysclk2 : &pll0_sysclk2;
> - struct clk_lookup *c;
> - unsigned int v;
> - int ret;
> -
> - for (c = da850_clks; c->clk; c++) {
> - clk = c->clk;
> - if (clk->flags & DA850_CLK_ASYNC3) {
> - ret = clk_set_parent(clk, newparent);
> - WARN(ret, "DA850: unable to re-parent clock %s",
> - clk->name);
> - }
> - }
> -
> - v = __raw_readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG));
> - if (pllnum)
> - v |= CFGCHIP3_ASYNC3_CLKSRC;
> - else
> - v &= ~CFGCHIP3_ASYNC3_CLKSRC;
> - __raw_writel(v, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG));
> -}
> -
> #ifdef CONFIG_CPU_FREQ
> /*
> * Notes:
> @@ -1328,15 +1323,6 @@ void __init da850_init(void)
> if (WARN(!da8xx_syscfg1_base, "Unable to map syscfg1 module"))
> return;
>
> - /*
> - * Move the clock source of Async3 domain to PLL1 SYSCLK2.
> - * This helps keeping the peripherals on this domain insulated
> - * from CPU frequency changes caused by DVFS. The firmware sets
> - * both PLL0 and PLL1 to the same frequency so, there should not
> - * be any noticeable change even in non-DVFS use cases.
> - */
> - da850_set_async3_src(1);
> -
> /* Unlock writing to PLL0 registers */
> v = __raw_readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP0_REG));
> v &= ~CFGCHIP0_PLL_MASTER_LOCK;
>
WARNING: multiple messages have this Message-ID (diff)
From: David Lechner <david@lechnology.com>
To: Sekhar Nori <nsekhar@ti.com>
Cc: Kevin Hilman <khilman@kernel.org>,
Russell King <linux@arm.linux.org.uk>,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/2] ARM: davinci: da850: use clk->set_parent for async3
Date: Sat, 16 Apr 2016 14:31:27 -0500 [thread overview]
Message-ID: <5712930F.7000902@lechnology.com> (raw)
In-Reply-To: <1460661217-7389-3-git-send-email-david@lechnology.com>
On 04/14/2016 02:13 PM, David Lechner wrote:
> The da850 family of processors has an async3 clock domain that can be
> muxed to either pll0_sysclk2 or pll1_sysclk2. Now that the davinci clocks
> have a set_parent callback, we can use this to control the async3 mux
> instead of a stand-alone function.
>
> This adds a new async3_clk and sets the appropriate child clocks. The
> default is use to pll1_sysclk2 since it is not affected by processor
> frequency scaling.
>
> Signed-off-by: David Lechner <david@lechnology.com>
> ---
>
> v4 changes:
>
> * Fixed strict checkpatch complaint about {} in if/else
>
>
> arch/arm/mach-davinci/da850.c | 82 ++++++++++++++++++-------------------------
> 1 file changed, 34 insertions(+), 48 deletions(-)
>
> diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c
> index 1f85bbc..ace7433 100644
> --- a/arch/arm/mach-davinci/da850.c
> +++ b/arch/arm/mach-davinci/da850.c
> @@ -34,9 +34,6 @@
> #include "clock.h"
> #include "mux.h"
>
> -/* SoC specific clock flags */
> -#define DA850_CLK_ASYNC3 BIT(16)
> -
> #define DA850_PLL1_BASE 0x01e1a000
> #define DA850_TIMER64P2_BASE 0x01f0c000
> #define DA850_TIMER64P3_BASE 0x01f0d000
> @@ -161,6 +158,33 @@ static struct clk pll1_sysclk3 = {
> .div_reg = PLLDIV3,
> };
>
> +static int da850_async3_set_parent(struct clk *clk, struct clk *parent)
> +{
> + u32 val;
> +
> + val = readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG));
> +
> + /* Set the USB 1.1 PHY clock mux based on the parent clock. */
I seem to have regressed here since the last revision, this is supposed
to read:
/* Set the async3 clock domain mux based on the parent clock. */
Although now that I am looking at it again, it doesn't really add
anything useful and could be omitted altogether.
> + if (parent == &pll0_sysclk2) {
> + val &= ~CFGCHIP3_ASYNC3_CLKSRC;
> + } else if (parent == &pll1_sysclk2) {
> + val |= CFGCHIP3_ASYNC3_CLKSRC;
> + } else {
> + pr_err("Bad parent on async3 clock mux\n");
> + return -EINVAL;
> + }
> +
> + writel(val, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG));
> +
> + return 0;
> +}
> +
> +static struct clk async3_clk = {
> + .name = "async3",
> + .parent = &pll1_sysclk2,
> + .set_parent = da850_async3_set_parent,
> +};
> +
> static struct clk i2c0_clk = {
> .name = "i2c0",
> .parent = &pll0_aux_clk,
> @@ -234,18 +258,16 @@ static struct clk uart0_clk = {
>
> static struct clk uart1_clk = {
> .name = "uart1",
> - .parent = &pll0_sysclk2,
> + .parent = &async3_clk,
> .lpsc = DA8XX_LPSC1_UART1,
> .gpsc = 1,
> - .flags = DA850_CLK_ASYNC3,
> };
>
> static struct clk uart2_clk = {
> .name = "uart2",
> - .parent = &pll0_sysclk2,
> + .parent = &async3_clk,
> .lpsc = DA8XX_LPSC1_UART2,
> .gpsc = 1,
> - .flags = DA850_CLK_ASYNC3,
> };
>
> static struct clk aintc_clk = {
> @@ -300,10 +322,9 @@ static struct clk emac_clk = {
>
> static struct clk mcasp_clk = {
> .name = "mcasp",
> - .parent = &pll0_sysclk2,
> + .parent = &async3_clk,
> .lpsc = DA8XX_LPSC1_McASP0,
> .gpsc = 1,
> - .flags = DA850_CLK_ASYNC3,
> };
>
> static struct clk lcdc_clk = {
> @@ -355,10 +376,9 @@ static struct clk spi0_clk = {
>
> static struct clk spi1_clk = {
> .name = "spi1",
> - .parent = &pll0_sysclk2,
> + .parent = &async3_clk,
> .lpsc = DA8XX_LPSC1_SPI1,
> .gpsc = 1,
> - .flags = DA850_CLK_ASYNC3,
> };
>
> static struct clk vpif_clk = {
> @@ -386,10 +406,9 @@ static struct clk dsp_clk = {
>
> static struct clk ehrpwm_clk = {
> .name = "ehrpwm",
> - .parent = &pll0_sysclk2,
> + .parent = &async3_clk,
> .lpsc = DA8XX_LPSC1_PWM,
> .gpsc = 1,
> - .flags = DA850_CLK_ASYNC3,
> };
>
> #define DA8XX_EHRPWM_TBCLKSYNC BIT(12)
> @@ -421,10 +440,9 @@ static struct clk ehrpwm_tbclk = {
>
> static struct clk ecap_clk = {
> .name = "ecap",
> - .parent = &pll0_sysclk2,
> + .parent = &async3_clk,
> .lpsc = DA8XX_LPSC1_ECAP,
> .gpsc = 1,
> - .flags = DA850_CLK_ASYNC3,
> };
>
> static struct clk_lookup da850_clks[] = {
> @@ -442,6 +460,7 @@ static struct clk_lookup da850_clks[] = {
> CLK(NULL, "pll1_aux", &pll1_aux_clk),
> CLK(NULL, "pll1_sysclk2", &pll1_sysclk2),
> CLK(NULL, "pll1_sysclk3", &pll1_sysclk3),
> + CLK(NULL, "async3", &async3_clk),
> CLK("i2c_davinci.1", NULL, &i2c0_clk),
> CLK(NULL, "timer0", &timerp64_0_clk),
> CLK("davinci-wdt", NULL, &timerp64_1_clk),
> @@ -909,30 +928,6 @@ static struct davinci_timer_info da850_timer_info = {
> .clocksource_id = T0_TOP,
> };
>
> -static void da850_set_async3_src(int pllnum)
> -{
> - struct clk *clk, *newparent = pllnum ? &pll1_sysclk2 : &pll0_sysclk2;
> - struct clk_lookup *c;
> - unsigned int v;
> - int ret;
> -
> - for (c = da850_clks; c->clk; c++) {
> - clk = c->clk;
> - if (clk->flags & DA850_CLK_ASYNC3) {
> - ret = clk_set_parent(clk, newparent);
> - WARN(ret, "DA850: unable to re-parent clock %s",
> - clk->name);
> - }
> - }
> -
> - v = __raw_readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG));
> - if (pllnum)
> - v |= CFGCHIP3_ASYNC3_CLKSRC;
> - else
> - v &= ~CFGCHIP3_ASYNC3_CLKSRC;
> - __raw_writel(v, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG));
> -}
> -
> #ifdef CONFIG_CPU_FREQ
> /*
> * Notes:
> @@ -1328,15 +1323,6 @@ void __init da850_init(void)
> if (WARN(!da8xx_syscfg1_base, "Unable to map syscfg1 module"))
> return;
>
> - /*
> - * Move the clock source of Async3 domain to PLL1 SYSCLK2.
> - * This helps keeping the peripherals on this domain insulated
> - * from CPU frequency changes caused by DVFS. The firmware sets
> - * both PLL0 and PLL1 to the same frequency so, there should not
> - * be any noticeable change even in non-DVFS use cases.
> - */
> - da850_set_async3_src(1);
> -
> /* Unlock writing to PLL0 registers */
> v = __raw_readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP0_REG));
> v &= ~CFGCHIP0_PLL_MASTER_LOCK;
>
next prev parent reply other threads:[~2016-04-16 19:31 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-14 19:13 [PATCH 0/2] da8xx clocks (was part of "da8xx USB clocks") David Lechner
2016-04-14 19:13 ` David Lechner
2016-04-14 19:13 ` [PATCH 1/2] ARM: davinci: Move clock init after ioremap David Lechner
2016-04-14 19:13 ` David Lechner
2016-04-14 19:13 ` [PATCH 2/2] ARM: davinci: da850: use clk->set_parent for async3 David Lechner
2016-04-14 19:13 ` David Lechner
2016-04-16 19:31 ` David Lechner [this message]
2016-04-16 19:31 ` David Lechner
2016-04-18 4:55 ` Sekhar Nori
2016-04-18 4:55 ` Sekhar Nori
2016-04-14 19:26 ` [PATCH 0/2] da8xx clocks (was part of "da8xx USB clocks") David Lechner
2016-04-14 19:26 ` David Lechner
2016-04-15 6:36 ` Sekhar Nori
2016-04-15 6:36 ` Sekhar Nori
2016-04-15 10:09 ` Sekhar Nori
2016-04-15 10:09 ` Sekhar Nori
2016-04-15 16:21 ` David Lechner
2016-04-15 16:21 ` David Lechner
2016-04-27 13:39 ` Sekhar Nori
2016-04-27 13:39 ` Sekhar Nori
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=5712930F.7000902@lechnology.com \
--to=david@lechnology.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.