]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
clk: aspeed: Get HCLK frequency support
authorChin-Ting Kuo <chin-ting_kuo@aspeedtech.com>
Fri, 19 Aug 2022 09:01:02 +0000 (17:01 +0800)
committerTom Rini <trini@konsulko.com>
Tue, 13 Sep 2022 16:08:40 +0000 (12:08 -0400)
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>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
drivers/clk/aspeed/clk_ast2500.c

index 623c6915b81f5ba1fef1dfa249503bd7880c5353..dc446ce9fb7dc6dfba0cc48b3bfd14c76411fabd 100644 (file)
 
 #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;
 
 /*
@@ -86,6 +92,20 @@ static ulong ast2500_get_clkin(struct ast2500_scu *scu)
                        ? 25 * 1000 * 1000 : 24 * 1000 * 1000;
 }
 
+static u32 ast2500_get_hclk(ulong clkin, struct ast2500_scu *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
  *
@@ -147,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(clkin, priv->scu);
+               break;
        case ASPEED_CLK_SDIO:
                {
                        ulong apb_div = 4 + 4 * ((readl(&priv->scu->clk_sel1)