Add the clock RCG, gate bit definitions, and frequency table needed
to enable and configure the SE0 (SPI) serial engine clock on QUPv3
wrapper 3, GCC_QUPV3_WRAP3_S0_CLK. This is required to bring up the
GENI SPI controller on QUPv3 wrapper 3, e.g. for SPI-NOR flash
attached to that wrapper.

Also add the wrapper's M-AHB/S-AHB clock gates, and the QSPI/AGGRE-NOC
gates that are auto-enabled alongside the SE0 clock.

The register offset, gate bits and frequency table are adapted from
the Linux GCC driver added in commit 08c51ceb12f7 ("clk: qcom: add
the GCC driver for sa8775p").

Reviewed-by: Balaji Selvanathan <[email protected]>
Signed-off-by: Vandhiadevan Karunamoorthy 
<[email protected]>
---
Changes in v3:
- Mention the Linux commit the clock data is taken from
- Add Reviewed-by from Balaji
- Link to v2: 
https://lore.kernel.org/u-boot/20261013-b4-sa8775p-qup3-spi-clk-v2-1-bd6365d81...@oss.qualcomm.com
---
 drivers/clk/qcom/clock-sa8775p.c | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/drivers/clk/qcom/clock-sa8775p.c b/drivers/clk/qcom/clock-sa8775p.c
index a7bd6c43004..9ac914802a3 100644
--- a/drivers/clk/qcom/clock-sa8775p.c
+++ b/drivers/clk/qcom/clock-sa8775p.c
@@ -18,6 +18,7 @@
 #define USB30_PRIM_MOCK_UTMI_CLK_CMD_RCGR      0x1b040
 #define USB30_PRIM_MASTER_CLK_CMD_RCGR         0x1b028
 #define USB3_PRIM_PHY_AUX_CMD_RCGR             0x1b06c
+#define QUPV3_WRAP3_S0_CLK_CMD_RCGR            0xc4154
 
 #define UFS_PHY_AXI_CLK_CMD_RCGR               0x8302c
 #define UFS_PHY_ICE_CORE_CLK_CMD_RCGR          0x83074
@@ -50,7 +51,27 @@
 #define GCC_QUPV3_WRAP2_S5_CLK_ENA_BIT BIT(9)
 #define GCC_QUPV3_WRAP2_S6_CLK_ENA_BIT BIT(29)
 
+#define GCC_QUPV3_WRAP_3_S_AHB_ENA_BIT BIT(20)
 #define GCC_QUPV3_WRAP3_S0_CLK_ENA_BIT BIT(25)
+#define GCC_QUPV3_WRAP3_QSPI_ENA_BIT BIT(26)
+#define GCC_QUPV3_WRAP_3_M_AHB_ENA_BIT BIT(27)
+#define GCC_AGGRE_NOC_QUPV3_AXI_ENA_BIT BIT(28)
+
+/* QUP Wrapper 3 SE0 (SPI) clock frequency table */
+static const struct freq_tbl ftbl_gcc_qupv3_wrap3_s0_clk_src[] = {
+       F(7372800,   CFG_CLK_SRC_GPLL0_EVEN, 1, 384, 15625),
+       F(14745600,  CFG_CLK_SRC_GPLL0_EVEN, 1, 768, 15625),
+       F(19200000,  CFG_CLK_SRC_CXO,        1,   0,     0),
+       F(29491200,  CFG_CLK_SRC_GPLL0_EVEN, 1, 1536, 15625),
+       F(32000000,  CFG_CLK_SRC_GPLL0_EVEN, 1,   8,    75),
+       F(48000000,  CFG_CLK_SRC_GPLL0,      2,   4,    25),
+       F(64000000,  CFG_CLK_SRC_GPLL0_EVEN, 1,  16,    75),
+       F(75000000,  CFG_CLK_SRC_GPLL0_EVEN, 4,   0,     0),
+       F(80000000,  CFG_CLK_SRC_GPLL0_EVEN, 1,   4,    15),
+       F(96000000,  CFG_CLK_SRC_GPLL0_EVEN, 1,   8,    25),
+       F(100000000, CFG_CLK_SRC_GPLL0,      6,   0,     0),
+       { }
+};
 
 /* UFS AXI clock frequency table */
 static const struct freq_tbl ftbl_gcc_ufs_phy_axi_clk_src[] = {
@@ -148,6 +169,12 @@ static ulong sa8775p_set_rate(struct clk *clk, ulong rate)
                clk_rcg_set_rate_mnd(priv->base, SDCC1_APPS_CLK_CMD_RCGR,
                                     freq->pre_div, freq->m, freq->n, 
freq->src, 8);
                return freq->freq;
+       case GCC_QUPV3_WRAP3_S0_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap3_s0_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP3_S0_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n,
+                                    freq->src, 16);
+               return freq->freq;
        default:
                return 0;
        }
@@ -190,7 +217,11 @@ static const struct gate_clk sa8775p_clks[] = {
        GATE_CLK(GCC_QUPV3_WRAP2_S6_CLK, 0x4b018, 
GCC_QUPV3_WRAP2_S6_CLK_ENA_BIT),
 
        /* QUP Wrapper 3 clocks */
+       GATE_CLK(GCC_QUPV3_WRAP_3_S_AHB_CLK, 0x4b000, 
GCC_QUPV3_WRAP_3_S_AHB_ENA_BIT),
        GATE_CLK(GCC_QUPV3_WRAP3_S0_CLK, 0x4b000, 
GCC_QUPV3_WRAP3_S0_CLK_ENA_BIT),
+       GATE_CLK(GCC_QUPV3_WRAP3_QSPI_CLK, 0x4b000, 
GCC_QUPV3_WRAP3_QSPI_ENA_BIT),
+       GATE_CLK(GCC_QUPV3_WRAP_3_M_AHB_CLK, 0x4b000, 
GCC_QUPV3_WRAP_3_M_AHB_ENA_BIT),
+       GATE_CLK(GCC_AGGRE_NOC_QUPV3_AXI_CLK, 0x4b000, 
GCC_AGGRE_NOC_QUPV3_AXI_ENA_BIT),
 
        /* UFS PHY clocks */
        GATE_CLK_POLLED(GCC_UFS_PHY_AXI_CLK, 0x83018, BIT(0), 0x83018),
@@ -230,6 +261,10 @@ static int sa8775p_enable(struct clk *clk)
                qcom_gate_clk_en(priv, GCC_USB3_PRIM_PHY_AUX_CLK);
                qcom_gate_clk_en(priv, GCC_USB3_PRIM_PHY_COM_AUX_CLK);
                break;
+       case GCC_QUPV3_WRAP3_S0_CLK:
+               qcom_gate_clk_en(priv, GCC_QUPV3_WRAP3_QSPI_CLK);
+               qcom_gate_clk_en(priv, GCC_AGGRE_NOC_QUPV3_AXI_CLK);
+               break;
        }
 
        return qcom_gate_clk_en(priv, clk->id);

---
base-commit: fed92546960a92177d67c0b8d7b22385f50fed29
change-id: 20260924-b4-sa8775p-qup3-spi-clk-6c01d31b33ea

Best regards,
--  
Vandhiadevan Karunamoorthy <[email protected]>

Reply via email to