diff mbox

[U-Boot,3/4] mx25: Add function to set PER clocks

Message ID 1493805546-3567-3-git-send-email-benoit@wsystem.com
State Accepted
Commit 3e3aab3379d99f4c955ecca4992ad33ae70e71e4
Delegated to: Stefano Babic
Headers show

Commit Message

Benoît Thébaudeau May 3, 2017, 9:59 a.m. UTC
Introduce the imx_set_perclk() function to make it possible to set the
PER clocks.

Signed-off-by: Benoît Thébaudeau <benoit@wsystem.com>
---
 arch/arm/cpu/arm926ejs/mx25/generic.c  | 19 +++++++++++++++++++
 arch/arm/include/asm/arch-mx25/clock.h |  1 +
 2 files changed, 20 insertions(+)

Comments

Fabio Estevam May 29, 2017, 11:19 a.m. UTC | #1
On Wed, May 3, 2017 at 6:59 AM, Benoît Thébaudeau <benoit@wsystem.com> wrote:
> Introduce the imx_set_perclk() function to make it possible to set the
> PER clocks.
>
> Signed-off-by: Benoît Thébaudeau <benoit@wsystem.com>

Reviewed-by: Fabio Estevam <fabio.estevam@nxp.com>
Stefano Babic May 31, 2017, 8:50 a.m. UTC | #2
On 03/05/2017 11:59, Benoît Thébaudeau wrote:
> Introduce the imx_set_perclk() function to make it possible to set the
> PER clocks.
> 
> Signed-off-by: Benoît Thébaudeau <benoit@wsystem.com>
> ---
>  arch/arm/cpu/arm926ejs/mx25/generic.c  | 19 +++++++++++++++++++
>  arch/arm/include/asm/arch-mx25/clock.h |  1 +
>  2 files changed, 20 insertions(+)
> 
> diff --git a/arch/arm/cpu/arm926ejs/mx25/generic.c b/arch/arm/cpu/arm926ejs/mx25/generic.c
> index f02cffb..5d9bc6c 100644
> --- a/arch/arm/cpu/arm926ejs/mx25/generic.c
> +++ b/arch/arm/cpu/arm926ejs/mx25/generic.c
> @@ -113,6 +113,25 @@ static ulong imx_get_perclk(int clk)
>  	return fref / div;
>  }
>  
> +int imx_set_perclk(enum mxc_clock clk, bool from_upll, unsigned int freq)
> +{
> +	struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE;
> +	ulong fref = from_upll ? imx_get_upllclk() : imx_get_ahbclk();
> +	ulong div = (fref + freq - 1) / freq;
> +
> +	if (clk > MXC_UART_CLK || !div || --div > CCM_PERCLK_MASK)
> +		return -EINVAL;
> +
> +	clrsetbits_le32(&ccm->pcdr[CCM_PERCLK_REG(clk)],
> +			CCM_PERCLK_MASK << CCM_PERCLK_SHIFT(clk),
> +			div << CCM_PERCLK_SHIFT(clk));
> +	if (from_upll)
> +		setbits_le32(&ccm->mcr, 1 << clk);
> +	else
> +		clrbits_le32(&ccm->mcr, 1 << clk);
> +	return 0;
> +}
> +
>  unsigned int mxc_get_clock(enum mxc_clock clk)
>  {
>  	if (clk >= MXC_CLK_NUM)
> diff --git a/arch/arm/include/asm/arch-mx25/clock.h b/arch/arm/include/asm/arch-mx25/clock.h
> index 9fdaa9d..7753caf 100644
> --- a/arch/arm/include/asm/arch-mx25/clock.h
> +++ b/arch/arm/include/asm/arch-mx25/clock.h
> @@ -51,6 +51,7 @@ enum mxc_clock {
>  	MXC_CLK_NUM
>  };
>  
> +int imx_set_perclk(enum mxc_clock clk, bool from_upll, unsigned int freq);
>  unsigned int mxc_get_clock(enum mxc_clock clk);
>  
>  #define imx_get_uartclk()	mxc_get_clock(MXC_UART_CLK)
> 
Applied to u-boot-imx -master, thanks !

Best regards,
Stefano Babic
diff mbox

Patch

diff --git a/arch/arm/cpu/arm926ejs/mx25/generic.c b/arch/arm/cpu/arm926ejs/mx25/generic.c
index f02cffb..5d9bc6c 100644
--- a/arch/arm/cpu/arm926ejs/mx25/generic.c
+++ b/arch/arm/cpu/arm926ejs/mx25/generic.c
@@ -113,6 +113,25 @@  static ulong imx_get_perclk(int clk)
 	return fref / div;
 }
 
+int imx_set_perclk(enum mxc_clock clk, bool from_upll, unsigned int freq)
+{
+	struct ccm_regs *ccm = (struct ccm_regs *)IMX_CCM_BASE;
+	ulong fref = from_upll ? imx_get_upllclk() : imx_get_ahbclk();
+	ulong div = (fref + freq - 1) / freq;
+
+	if (clk > MXC_UART_CLK || !div || --div > CCM_PERCLK_MASK)
+		return -EINVAL;
+
+	clrsetbits_le32(&ccm->pcdr[CCM_PERCLK_REG(clk)],
+			CCM_PERCLK_MASK << CCM_PERCLK_SHIFT(clk),
+			div << CCM_PERCLK_SHIFT(clk));
+	if (from_upll)
+		setbits_le32(&ccm->mcr, 1 << clk);
+	else
+		clrbits_le32(&ccm->mcr, 1 << clk);
+	return 0;
+}
+
 unsigned int mxc_get_clock(enum mxc_clock clk)
 {
 	if (clk >= MXC_CLK_NUM)
diff --git a/arch/arm/include/asm/arch-mx25/clock.h b/arch/arm/include/asm/arch-mx25/clock.h
index 9fdaa9d..7753caf 100644
--- a/arch/arm/include/asm/arch-mx25/clock.h
+++ b/arch/arm/include/asm/arch-mx25/clock.h
@@ -51,6 +51,7 @@  enum mxc_clock {
 	MXC_CLK_NUM
 };
 
+int imx_set_perclk(enum mxc_clock clk, bool from_upll, unsigned int freq);
 unsigned int mxc_get_clock(enum mxc_clock clk);
 
 #define imx_get_uartclk()	mxc_get_clock(MXC_UART_CLK)