diff mbox series

[v2,01/11] clk: aspeed: Get HCLK frequency support

Message ID 20220509072344.3968163-2-chin-ting_kuo@aspeedtech.com
State Superseded
Delegated to: Jagannadha Sutradharudu Teki
Headers show
Series Add ASPEED SPI controller driver | expand

Commit Message

Chin-Ting Kuo May 9, 2022, 7:23 a.m. UTC
User can get correct HCLK frequency during driver probe stage
by adding the following configuration in the device tree.
"clocks = <&scu ASPEED_CLK_AHB>".

Signed-off-by: Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>
---
 drivers/clk/aspeed/clk_ast2500.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

Comments

Cédric Le Goater May 17, 2022, 12:18 p.m. UTC | #1
On 5/9/22 09:23, Chin-Ting Kuo wrote:
> User can get correct HCLK frequency during driver probe stage
> by adding the following configuration in the device tree.
> "clocks = <&scu ASPEED_CLK_AHB>".
> 
> Signed-off-by: Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>
> ---
>   drivers/clk/aspeed/clk_ast2500.c | 24 ++++++++++++++++++++++++
>   1 file changed, 24 insertions(+)
> 
> diff --git a/drivers/clk/aspeed/clk_ast2500.c b/drivers/clk/aspeed/clk_ast2500.c
> index a1b4496ca2..d2a58a8462 100644
> --- a/drivers/clk/aspeed/clk_ast2500.c
> +++ b/drivers/clk/aspeed/clk_ast2500.c
> @@ -29,6 +29,12 @@
>   
>   #define D2PLL_DEFAULT_RATE	(250 * 1000 * 1000)
>   
> +/*
> + * AXI/AHB clock selection, taken from Aspeed SDK
> + */
> +#define SCU_HWSTRAP_AXIAHB_DIV_SHIFT    9
> +#define SCU_HWSTRAP_AXIAHB_DIV_MASK     (0x7 << SCU_HWSTRAP_AXIAHB_DIV_SHIFT)
> +
>   DECLARE_GLOBAL_DATA_PTR;
>   
>   /*
> @@ -85,6 +91,21 @@ static ulong ast2500_get_clkin(struct ast2500_scu *scu)
>   			? 25 * 1000 * 1000 : 24 * 1000 * 1000;
>   }
>   
> +static u32 ast2500_get_hclk(struct ast2500_scu *scu)
> +{
> +	ulong clkin = ast2500_get_clkin(scu);

you could avoid reading clkin and pass it as a parameter like the
other routines do : ast2500_get_hpll_rate() and ast2500_get_mpll_rate()

It's minor.

Reviewed-by: Cédric Le Goater <clg@kaod.org>

Thanks,

C.


> +	u32 hpll_reg = readl(&scu->h_pll_param);
> +	ulong axi_div = 2;
> +	u32 rate;
> +	ulong ahb_div = 1 + ((readl(&scu->hwstrap)
> +			      & SCU_HWSTRAP_AXIAHB_DIV_MASK)
> +			     >> SCU_HWSTRAP_AXIAHB_DIV_SHIFT);
> +
> +	rate = ast2500_get_hpll_rate(clkin, hpll_reg);
> +
> +	return (rate / axi_div / ahb_div);
> +}
> +
>   /**
>    * Get current rate or uart clock
>    *
> @@ -146,6 +167,9 @@ static ulong ast2500_clk_get_rate(struct clk *clk)
>   			rate = rate / apb_div;
>   		}
>   		break;
> +	case ASPEED_CLK_AHB:
> +		rate = ast2500_get_hclk(priv->scu);
> +		break;
>   	case ASPEED_CLK_SDIO:
>   		{
>   			ulong apb_div = 4 + 4 * ((readl(&priv->scu->clk_sel1)
Chin-Ting Kuo May 22, 2022, 12:02 p.m. UTC | #2
Hi Cédric,

Thanks for the review.

> -----Original Message-----
> From: Cédric Le Goater <clg@kaod.org>
> Sent: Tuesday, May 17, 2022 8:19 PM
> Subject: Re: [PATCH v2 01/11] clk: aspeed: Get HCLK frequency support
> 
> On 5/9/22 09:23, Chin-Ting Kuo wrote:
> > User can get correct HCLK frequency during driver probe stage by
> > adding the following configuration in the device tree.
> > "clocks = <&scu ASPEED_CLK_AHB>".
> >
> > Signed-off-by: Chin-Ting Kuo <chin-ting_kuo@aspeedtech.com>
> > ---
> >   drivers/clk/aspeed/clk_ast2500.c | 24 ++++++++++++++++++++++++
> >   1 file changed, 24 insertions(+)
> >
> > diff --git a/drivers/clk/aspeed/clk_ast2500.c
> > b/drivers/clk/aspeed/clk_ast2500.c
> > index a1b4496ca2..d2a58a8462 100644
> > --- a/drivers/clk/aspeed/clk_ast2500.c
> > +++ b/drivers/clk/aspeed/clk_ast2500.c
> > @@ -29,6 +29,12 @@
> >
> >   #define D2PLL_DEFAULT_RATE	(250 * 1000 * 1000)
> >
> > +/*
> > + * AXI/AHB clock selection, taken from Aspeed SDK  */
> > +#define SCU_HWSTRAP_AXIAHB_DIV_SHIFT    9
> > +#define SCU_HWSTRAP_AXIAHB_DIV_MASK     (0x7 <<
> SCU_HWSTRAP_AXIAHB_DIV_SHIFT)
> > +
> >   DECLARE_GLOBAL_DATA_PTR;
> >
> >   /*
> > @@ -85,6 +91,21 @@ static ulong ast2500_get_clkin(struct ast2500_scu
> *scu)
> >   			? 25 * 1000 * 1000 : 24 * 1000 * 1000;
> >   }
> >
> > +static u32 ast2500_get_hclk(struct ast2500_scu *scu) {
> > +	ulong clkin = ast2500_get_clkin(scu);
> 
> you could avoid reading clkin and pass it as a parameter like the other
> routines do : ast2500_get_hpll_rate() and ast2500_get_mpll_rate()
> 
> It's minor.
> 

I may need to change the other patch in this patch series, this part will also be included.


Chin-Ting

> Reviewed-by: Cédric Le Goater <clg@kaod.org>
> 
> Thanks,
> 
> C.
> 
> 
> > +	u32 hpll_reg = readl(&scu->h_pll_param);
> > +	ulong axi_div = 2;
> > +	u32 rate;
> > +	ulong ahb_div = 1 + ((readl(&scu->hwstrap)
> > +			      & SCU_HWSTRAP_AXIAHB_DIV_MASK)
> > +			     >> SCU_HWSTRAP_AXIAHB_DIV_SHIFT);
> > +
> > +	rate = ast2500_get_hpll_rate(clkin, hpll_reg);
> > +
> > +	return (rate / axi_div / ahb_div);
> > +}
> > +
> >   /**
> >    * Get current rate or uart clock
> >    *
> > @@ -146,6 +167,9 @@ static ulong ast2500_clk_get_rate(struct clk *clk)
> >   			rate = rate / apb_div;
> >   		}
> >   		break;
> > +	case ASPEED_CLK_AHB:
> > +		rate = ast2500_get_hclk(priv->scu);
> > +		break;
> >   	case ASPEED_CLK_SDIO:
> >   		{
> >   			ulong apb_div = 4 + 4 * ((readl(&priv->scu->clk_sel1)
diff mbox series

Patch

diff --git a/drivers/clk/aspeed/clk_ast2500.c b/drivers/clk/aspeed/clk_ast2500.c
index a1b4496ca2..d2a58a8462 100644
--- a/drivers/clk/aspeed/clk_ast2500.c
+++ b/drivers/clk/aspeed/clk_ast2500.c
@@ -29,6 +29,12 @@ 
 
 #define D2PLL_DEFAULT_RATE	(250 * 1000 * 1000)
 
+/*
+ * AXI/AHB clock selection, taken from Aspeed SDK
+ */
+#define SCU_HWSTRAP_AXIAHB_DIV_SHIFT    9
+#define SCU_HWSTRAP_AXIAHB_DIV_MASK     (0x7 << SCU_HWSTRAP_AXIAHB_DIV_SHIFT)
+
 DECLARE_GLOBAL_DATA_PTR;
 
 /*
@@ -85,6 +91,21 @@  static ulong ast2500_get_clkin(struct ast2500_scu *scu)
 			? 25 * 1000 * 1000 : 24 * 1000 * 1000;
 }
 
+static u32 ast2500_get_hclk(struct ast2500_scu *scu)
+{
+	ulong clkin = ast2500_get_clkin(scu);
+	u32 hpll_reg = readl(&scu->h_pll_param);
+	ulong axi_div = 2;
+	u32 rate;
+	ulong ahb_div = 1 + ((readl(&scu->hwstrap)
+			      & SCU_HWSTRAP_AXIAHB_DIV_MASK)
+			     >> SCU_HWSTRAP_AXIAHB_DIV_SHIFT);
+
+	rate = ast2500_get_hpll_rate(clkin, hpll_reg);
+
+	return (rate / axi_div / ahb_div);
+}
+
 /**
  * Get current rate or uart clock
  *
@@ -146,6 +167,9 @@  static ulong ast2500_clk_get_rate(struct clk *clk)
 			rate = rate / apb_div;
 		}
 		break;
+	case ASPEED_CLK_AHB:
+		rate = ast2500_get_hclk(priv->scu);
+		break;
 	case ASPEED_CLK_SDIO:
 		{
 			ulong apb_div = 4 + 4 * ((readl(&priv->scu->clk_sel1)