Extend the QCS8300 GCC driver with the remaining RCGs (USB2/USB3,
UFS PHY, SDCC1, QUPv3 wrap0/wrap1/wrap3 SE clocks, GP1-5, PDM2,
EMAC0, PCIe0/1) and their gate clocks.

Signed-off-by: Balaji Selvanathan <[email protected]>
---
 drivers/clk/qcom/clock-qcs8300.c | 545 +++++++++++++++++++++++++++++++++++++--
 1 file changed, 525 insertions(+), 20 deletions(-)

diff --git a/drivers/clk/qcom/clock-qcs8300.c b/drivers/clk/qcom/clock-qcs8300.c
index cd8aecdf788..cd47b384f1f 100644
--- a/drivers/clk/qcom/clock-qcs8300.c
+++ b/drivers/clk/qcom/clock-qcs8300.c
@@ -14,12 +14,210 @@
 #include <dt-bindings/clock/qcom,qcs8300-gcc.h>
 #include "clock-qcom.h"
 
-#define USB30_PRIM_MOCK_UTMI_CLK_CMD_RCGR 0xf038
-#define USB30_PRIM_MASTER_CLK_CMD_RCGR 0xf020
+#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 USB20_MASTER_CLK_CMD_RCGR              0x1c028
+#define USB20_MOCK_UTMI_CLK_CMD_RCGR           0x1c040
+
+#define UFS_PHY_AXI_CLK_CMD_RCGR               0x8302c
+#define UFS_PHY_ICE_CORE_CLK_CMD_RCGR          0x83074
+#define UFS_PHY_PHY_AUX_CLK_CMD_RCGR           0x830a8
+#define UFS_PHY_UNIPRO_CORE_CLK_CMD_RCGR       0x8308c
+
+#define SDCC1_APPS_CLK_CMD_RCGR                        0x20014
+#define SDCC1_ICE_CORE_CLK_CMD_RCGR            0x2002c
+
+#define QUPV3_WRAP0_S0_CLK_CMD_RCGR            0x23154
+#define QUPV3_WRAP0_S1_CLK_CMD_RCGR            0x23288
+#define QUPV3_WRAP0_S2_CLK_CMD_RCGR            0x233bc
+#define QUPV3_WRAP0_S3_CLK_CMD_RCGR            0x234f0
+#define QUPV3_WRAP0_S4_CLK_CMD_RCGR            0x23624
+#define QUPV3_WRAP0_S5_CLK_CMD_RCGR            0x23758
+#define QUPV3_WRAP0_S6_CLK_CMD_RCGR            0x2388c
+#define QUPV3_WRAP0_S7_CLK_CMD_RCGR            0x239c0
+#define QUPV3_WRAP1_S0_CLK_CMD_RCGR            0x24154
+#define QUPV3_WRAP1_S1_CLK_CMD_RCGR            0x24288
+#define QUPV3_WRAP1_S2_CLK_CMD_RCGR            0x243bc
+#define QUPV3_WRAP1_S3_CLK_CMD_RCGR            0x244f0
+#define QUPV3_WRAP1_S4_CLK_CMD_RCGR            0x24624
+#define QUPV3_WRAP1_S5_CLK_CMD_RCGR            0x24758
+#define QUPV3_WRAP1_S6_CLK_CMD_RCGR            0x2488c
+#define QUPV3_WRAP1_S7_CLK_CMD_RCGR            0x249c0
+#define QUPV3_WRAP3_S0_CLK_CMD_RCGR            0xc4158
+
+#define GP1_CLK_CMD_RCGR                       0x70004
+#define GP2_CLK_CMD_RCGR                       0x71004
+#define GP3_CLK_CMD_RCGR                       0x62004
+#define GP4_CLK_CMD_RCGR                       0x1e004
+#define GP5_CLK_CMD_RCGR                       0x1f004
+
+#define PDM2_CLK_CMD_RCGR                      0x3f010
+
+#define EMAC0_PHY_AUX_CLK_CMD_RCGR             0xb6028
+#define EMAC0_PTP_CLK_CMD_RCGR                 0xb6060
+#define EMAC0_RGMII_CLK_CMD_RCGR               0xb6048
+
+#define PCIE_0_AUX_CLK_CMD_RCGR                        0xa9078
+#define PCIE_0_PHY_RCHNG_CLK_CMD_RCGR          0xa9054
+#define PCIE_1_AUX_CLK_CMD_RCGR                        0x77078
+#define PCIE_1_PHY_RCHNG_CLK_CMD_RCGR          0x77054
+
+#define CFG_CLK_SRC_GPLL4_UFS_ICE_CORE         (3 << 8)
+#define CFG_CLK_SRC_GPLL7_EMAC0                        (2 << 8)
+
+static struct pll_vote_clk gpll4_vote_clk = {
+       .status = 0x4000,
+       .status_bit = BIT(31),
+       .ena_vote = 0x4b028,
+       .vote_bit = BIT(4),
+};
+
+static struct pll_vote_clk gpll7_vote_clk = {
+       .status = 0x7000,
+       .status_bit = BIT(31),
+       .ena_vote = 0x4b028,
+       .vote_bit = BIT(7),
+};
+
+static struct pll_vote_clk gpll9_vote_clk = {
+       .status = 0x9000,
+       .status_bit = BIT(31),
+       .ena_vote = 0x4b028,
+       .vote_bit = BIT(9),
+};
+
+static const struct freq_tbl ftbl_gcc_qupv3_wrap_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_EVEN, 1, 4, 25),
+       F(64000000, CFG_CLK_SRC_GPLL0_EVEN, 1, 16, 75),
+       F(80000000, CFG_CLK_SRC_GPLL0_EVEN, 1, 4, 15),
+       F(96000000, CFG_CLK_SRC_GPLL0_EVEN, 1, 8, 25),
+       F(120000000, CFG_CLK_SRC_GPLL0, 5, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_gcc_qupv3_wrap_s2_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_EVEN, 1, 4, 25),
+       F(64000000, CFG_CLK_SRC_GPLL0_EVEN, 1, 16, 75),
+       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),
+       { }
+};
+
+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_EVEN, 1, 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),
+       F(403200000, CFG_CLK_SRC_GPLL4, 2, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_gcc_gp_clk_src[] = {
+       F(100000000, CFG_CLK_SRC_GPLL0, 6, 0, 0),
+       F(200000000, CFG_CLK_SRC_GPLL0, 3, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_gcc_pdm2_clk_src[] = {
+       F(60000000, CFG_CLK_SRC_GPLL0, 10, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_gcc_emac0_ptp_clk_src[] = {
+       F(125000000, CFG_CLK_SRC_GPLL7_EMAC0, 8, 0, 0),
+       F(230400000, CFG_CLK_SRC_GPLL4, 3.5, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_gcc_emac0_rgmii_clk_src[] = {
+       F(5000000, CFG_CLK_SRC_GPLL0_EVEN, 10, 1, 6),
+       F(50000000, CFG_CLK_SRC_GPLL0_EVEN, 6, 0, 0),
+       F(125000000, CFG_CLK_SRC_GPLL7_EMAC0, 8, 0, 0),
+       F(250000000, CFG_CLK_SRC_GPLL7_EMAC0, 4, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_gcc_pcie_0_phy_rchng_clk_src[] = {
+       F(100000000, CFG_CLK_SRC_GPLL0, 6, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_gcc_sdcc1_apps_clk_src[] = {
+       F(144000, CFG_CLK_SRC_CXO, 16, 3, 25),
+       F(400000, CFG_CLK_SRC_CXO, 12, 1, 4),
+       F(19200000, CFG_CLK_SRC_CXO, 1, 0, 0),
+       F(20000000, CFG_CLK_SRC_GPLL0_EVEN, 5, 1, 3),
+       F(25000000, CFG_CLK_SRC_GPLL0_EVEN, 12, 0, 0),
+       F(50000000, CFG_CLK_SRC_GPLL0_EVEN, 6, 0, 0),
+       F(100000000, CFG_CLK_SRC_GPLL0_EVEN, 3, 0, 0),
+       F(192000000, CFG_CLK_SRC_GPLL9, 4, 0, 0),
+       F(384000000, CFG_CLK_SRC_GPLL9, 2, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_gcc_sdcc1_ice_core_clk_src[] = {
+       F(150000000, CFG_CLK_SRC_GPLL0, 4, 0, 0),
+       F(300000000, CFG_CLK_SRC_GPLL0, 2, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_gcc_ufs_phy_axi_clk_src[] = {
+       F(25000000, CFG_CLK_SRC_GPLL0_EVEN, 12, 0, 0),
+       F(75000000, CFG_CLK_SRC_GPLL0_EVEN, 4, 0, 0),
+       F(150000000, CFG_CLK_SRC_GPLL0, 4, 0, 0),
+       F(300000000, CFG_CLK_SRC_GPLL0, 2, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_gcc_ufs_phy_ice_core_clk_src[] = {
+       F(75000000, CFG_CLK_SRC_GPLL0_EVEN, 4, 0, 0),
+       F(201600000, CFG_CLK_SRC_GPLL4_UFS_ICE_CORE, 4, 0, 0),
+       F(403200000, CFG_CLK_SRC_GPLL4_UFS_ICE_CORE, 2, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_gcc_ufs_phy_unipro_core_clk_src[] = {
+       F(75000000, CFG_CLK_SRC_GPLL0_EVEN, 4, 0, 0),
+       F(150000000, CFG_CLK_SRC_GPLL0, 4, 0, 0),
+       F(300000000, CFG_CLK_SRC_GPLL0, 2, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_gcc_usb20_master_clk_src[] = {
+       F(120000000, CFG_CLK_SRC_GPLL0, 5, 0, 0),
+       { }
+};
+
+static const struct freq_tbl ftbl_gcc_usb30_prim_master_clk_src[] = {
+       F(133333333, CFG_CLK_SRC_GPLL0, 4.5, 0, 0),
+       F(200000000, CFG_CLK_SRC_GPLL0, 3, 0, 0),
+       F(240000000, CFG_CLK_SRC_GPLL0, 2.5, 0, 0),
+       { }
+};
 
 static ulong qcs8300_set_rate(struct clk *clk, ulong rate)
 {
        struct msm_clk_priv *priv = dev_get_priv(clk->dev);
+       const struct freq_tbl *freq;
 
        if (clk->id < priv->data->num_clks)
                debug("%s: %s, requested rate=%ld\n",
@@ -31,28 +229,315 @@ static ulong qcs8300_set_rate(struct clk *clk, ulong rate)
                clk_rcg_set_rate(priv->base, USB30_PRIM_MOCK_UTMI_CLK_CMD_RCGR, 
0, CFG_CLK_SRC_CXO);
                return rate;
        case GCC_USB30_PRIM_MASTER_CLK:
-               WARN(rate != 200000000, "Unexpected rate for 
USB30_PRIM_MASTER_CLK: %lu\n", rate);
+               freq = qcom_find_freq(ftbl_gcc_usb30_prim_master_clk_src, rate);
                clk_rcg_set_rate_mnd(priv->base, USB30_PRIM_MASTER_CLK_CMD_RCGR,
-                                    1, 0, 0, CFG_CLK_SRC_GPLL0_ODD, 8);
-               clk_rcg_set_rate(priv->base, 0xf064, 0, 0);
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 8);
+               clk_rcg_set_rate(priv->base, USB3_PRIM_PHY_AUX_CMD_RCGR, 0, 0);
+               return freq->freq;
+       case GCC_USB20_MASTER_CLK:
+               freq = qcom_find_freq(ftbl_gcc_usb20_master_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, USB20_MASTER_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 8);
+               return freq->freq;
+       case GCC_USB20_MOCK_UTMI_CLK:
+               WARN(rate != 19200000, "Unexpected rate for 
USB20_MOCK_UTMI_CLK: %lu\n", rate);
+               clk_rcg_set_rate(priv->base, USB20_MOCK_UTMI_CLK_CMD_RCGR, 0, 
CFG_CLK_SRC_CXO);
                return rate;
+       case GCC_UFS_PHY_AXI_CLK:
+               freq = qcom_find_freq(ftbl_gcc_ufs_phy_axi_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, UFS_PHY_AXI_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 8);
+               return freq->freq;
+       case GCC_UFS_PHY_UNIPRO_CORE_CLK:
+               freq = qcom_find_freq(ftbl_gcc_ufs_phy_unipro_core_clk_src, 
rate);
+               clk_rcg_set_rate(priv->base, UFS_PHY_UNIPRO_CORE_CLK_CMD_RCGR,
+                                freq->pre_div, freq->src);
+               return freq->freq;
+       case GCC_UFS_PHY_ICE_CORE_CLK:
+               clk_enable_gpll0(priv->base, &gpll4_vote_clk);
+               freq = qcom_find_freq(ftbl_gcc_ufs_phy_ice_core_clk_src, rate);
+               clk_rcg_set_rate(priv->base, UFS_PHY_ICE_CORE_CLK_CMD_RCGR,
+                                freq->pre_div, freq->src);
+               return freq->freq;
+       case GCC_UFS_PHY_PHY_AUX_CLK:
+               clk_rcg_set_rate(priv->base, UFS_PHY_PHY_AUX_CLK_CMD_RCGR, 0, 
CFG_CLK_SRC_CXO);
+               return 19200000;
+       case GCC_SDCC1_APPS_CLK:
+               clk_enable_gpll0(priv->base, &gpll9_vote_clk);
+               freq = qcom_find_freq(ftbl_gcc_sdcc1_apps_clk_src, 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_SDCC1_ICE_CORE_CLK:
+               freq = qcom_find_freq(ftbl_gcc_sdcc1_ice_core_clk_src, rate);
+               clk_rcg_set_rate(priv->base, SDCC1_ICE_CORE_CLK_CMD_RCGR,
+                                freq->pre_div, freq->src);
+               return freq->freq;
+       case GCC_QUPV3_WRAP0_S0_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s0_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP0_S0_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP0_S1_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s0_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP0_S1_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP0_S2_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s2_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP0_S2_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP0_S3_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s2_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP0_S3_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP0_S4_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s2_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP0_S4_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP0_S5_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s2_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP0_S5_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP0_S6_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s2_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP0_S6_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP0_S7_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s2_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP0_S7_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP1_S0_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s0_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP1_S0_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP1_S1_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s0_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP1_S1_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP1_S2_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s2_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP1_S2_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP1_S3_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s2_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP1_S3_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP1_S4_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s2_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP1_S4_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP1_S5_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s2_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP1_S5_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP1_S6_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s2_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP1_S6_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP1_S7_CLK:
+               freq = qcom_find_freq(ftbl_gcc_qupv3_wrap_s2_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, QUPV3_WRAP1_S7_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_QUPV3_WRAP3_S0_CLK:
+               clk_enable_gpll0(priv->base, &gpll4_vote_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;
+       case GCC_GP1_CLK:
+               freq = qcom_find_freq(ftbl_gcc_gp_clk_src, rate);
+               clk_rcg_set_rate(priv->base, GP1_CLK_CMD_RCGR, freq->pre_div, 
freq->src);
+               return freq->freq;
+       case GCC_GP2_CLK:
+               freq = qcom_find_freq(ftbl_gcc_gp_clk_src, rate);
+               clk_rcg_set_rate(priv->base, GP2_CLK_CMD_RCGR, freq->pre_div, 
freq->src);
+               return freq->freq;
+       case GCC_GP3_CLK:
+               freq = qcom_find_freq(ftbl_gcc_gp_clk_src, rate);
+               clk_rcg_set_rate(priv->base, GP3_CLK_CMD_RCGR, freq->pre_div, 
freq->src);
+               return freq->freq;
+       case GCC_GP4_CLK:
+               freq = qcom_find_freq(ftbl_gcc_gp_clk_src, rate);
+               clk_rcg_set_rate(priv->base, GP4_CLK_CMD_RCGR, freq->pre_div, 
freq->src);
+               return freq->freq;
+       case GCC_GP5_CLK:
+               freq = qcom_find_freq(ftbl_gcc_gp_clk_src, rate);
+               clk_rcg_set_rate(priv->base, GP5_CLK_CMD_RCGR, freq->pre_div, 
freq->src);
+               return freq->freq;
+       case GCC_PDM2_CLK:
+               freq = qcom_find_freq(ftbl_gcc_pdm2_clk_src, rate);
+               clk_rcg_set_rate(priv->base, PDM2_CLK_CMD_RCGR, freq->pre_div, 
freq->src);
+               return freq->freq;
+       case GCC_EMAC0_PHY_AUX_CLK:
+               clk_rcg_set_rate(priv->base, EMAC0_PHY_AUX_CLK_CMD_RCGR, 0, 
CFG_CLK_SRC_CXO);
+               return 19200000;
+       case GCC_EMAC0_PTP_CLK:
+               clk_enable_gpll0(priv->base, &gpll7_vote_clk);
+               clk_enable_gpll0(priv->base, &gpll4_vote_clk);
+               freq = qcom_find_freq(ftbl_gcc_emac0_ptp_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, EMAC0_PTP_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_EMAC0_RGMII_CLK:
+               clk_enable_gpll0(priv->base, &gpll7_vote_clk);
+               freq = qcom_find_freq(ftbl_gcc_emac0_rgmii_clk_src, rate);
+               clk_rcg_set_rate_mnd(priv->base, EMAC0_RGMII_CLK_CMD_RCGR,
+                                    freq->pre_div, freq->m, freq->n, 
freq->src, 16);
+               return freq->freq;
+       case GCC_PCIE_0_AUX_CLK:
+               clk_rcg_set_rate(priv->base, PCIE_0_AUX_CLK_CMD_RCGR, 0, 
CFG_CLK_SRC_CXO);
+               return 19200000;
+       case GCC_PCIE_0_PHY_RCHNG_CLK:
+               freq = qcom_find_freq(ftbl_gcc_pcie_0_phy_rchng_clk_src, rate);
+               clk_rcg_set_rate(priv->base, PCIE_0_PHY_RCHNG_CLK_CMD_RCGR,
+                                freq->pre_div, freq->src);
+               return freq->freq;
+       case GCC_PCIE_1_AUX_CLK:
+               clk_rcg_set_rate(priv->base, PCIE_1_AUX_CLK_CMD_RCGR, 0, 
CFG_CLK_SRC_CXO);
+               return 19200000;
+       case GCC_PCIE_1_PHY_RCHNG_CLK:
+               freq = qcom_find_freq(ftbl_gcc_pcie_0_phy_rchng_clk_src, rate);
+               clk_rcg_set_rate(priv->base, PCIE_1_PHY_RCHNG_CLK_CMD_RCGR,
+                                freq->pre_div, freq->src);
+               return freq->freq;
        default:
                return 0;
        }
 }
 
 static const struct gate_clk qcs8300_clks[] = {
-       GATE_CLK(GCC_CFG_NOC_USB3_PRIM_AXI_CLK, 0x1b088, BIT(0)),
-       GATE_CLK(GCC_USB30_PRIM_MASTER_CLK, 0x1b018, BIT(0)),
-       GATE_CLK(GCC_AGGRE_USB3_PRIM_AXI_CLK, 0x1b084, BIT(0)),
-       GATE_CLK(GCC_USB30_PRIM_SLEEP_CLK, 0x1b020, BIT(0)),
-       GATE_CLK(GCC_USB30_PRIM_MOCK_UTMI_CLK, 0x1b024, BIT(0)),
-       GATE_CLK(GCC_USB3_PRIM_PHY_AUX_CLK, 0x1b05c, BIT(0)),
-       GATE_CLK(GCC_USB3_PRIM_PHY_COM_AUX_CLK, 0x1b060, BIT(0)),
-       GATE_CLK(GCC_UFS_PHY_AHB_CLK, 0x83020, BIT(0)),
-       GATE_CLK(GCC_UFS_PHY_AXI_CLK, 0x83018, BIT(0)),
-       GATE_CLK(GCC_AGGRE_UFS_PHY_AXI_CLK, 0x830d4, BIT(0)),
-       GATE_CLK(GCC_UFS_PHY_UNIPRO_CORE_CLK, 0x83064, BIT(0)),
+       GATE_CLK_POLLED(GCC_AGGRE_NOC_QUPV3_AXI_CLK, 0x4b000, BIT(28), 0x8e200),
+       GATE_CLK_POLLED(GCC_AGGRE_UFS_PHY_AXI_CLK, 0x830d4, BIT(0), 0x830d4),
+       GATE_CLK_POLLED(GCC_AGGRE_USB2_PRIM_AXI_CLK, 0x1c05c, BIT(0), 0x1c05c),
+       GATE_CLK_POLLED(GCC_AGGRE_USB3_PRIM_AXI_CLK, 0x1b084, BIT(0), 0x1b084),
+       GATE_CLK_POLLED(GCC_AHB2PHY0_CLK, 0x76004, BIT(0), 0x76004),
+       GATE_CLK_POLLED(GCC_AHB2PHY2_CLK, 0x76008, BIT(0), 0x76008),
+       GATE_CLK_POLLED(GCC_AHB2PHY3_CLK, 0x7600c, BIT(0), 0x7600c),
+       GATE_CLK_POLLED(GCC_BOOT_ROM_AHB_CLK, 0x4b000, BIT(10), 0x44004),
+       GATE_CLK(GCC_CAMERA_HF_AXI_CLK, 0x32010, BIT(0)),
+       GATE_CLK(GCC_CAMERA_SF_AXI_CLK, 0x32018, BIT(0)),
+       GATE_CLK_POLLED(GCC_CAMERA_THROTTLE_XO_CLK, 0x32024, BIT(0), 0x32024),
+       GATE_CLK_POLLED(GCC_CFG_NOC_USB2_PRIM_AXI_CLK, 0x1c060, BIT(0), 
0x1c060),
+       GATE_CLK_POLLED(GCC_CFG_NOC_USB3_PRIM_AXI_CLK, 0x1b088, BIT(0), 
0x1b088),
+       GATE_CLK_POLLED(GCC_DDRSS_GPU_AXI_CLK, 0x7d164, BIT(0), 0x7d164),
+       GATE_CLK_POLLED(GCC_DISP_HF_AXI_CLK, 0x33010, BIT(0), 0x33010),
+       GATE_CLK(GCC_EDP_REF_CLKREF_EN, 0x97448, BIT(0)),
+       GATE_CLK_POLLED(GCC_EMAC0_AXI_CLK, 0xb6018, BIT(0), 0xb6018),
+       GATE_CLK_POLLED(GCC_EMAC0_PHY_AUX_CLK, 0xb6024, BIT(0), 0xb6024),
+       GATE_CLK_POLLED(GCC_EMAC0_PTP_CLK, 0xb6040, BIT(0), 0xb6040),
+       GATE_CLK_POLLED(GCC_EMAC0_RGMII_CLK, 0xb6044, BIT(0), 0xb6044),
+       GATE_CLK_POLLED(GCC_EMAC0_SLV_AHB_CLK, 0xb6020, BIT(0), 0xb6020),
+       GATE_CLK_POLLED(GCC_GP1_CLK, 0x70000, BIT(0), 0x70000),
+       GATE_CLK_POLLED(GCC_GP2_CLK, 0x71000, BIT(0), 0x71000),
+       GATE_CLK_POLLED(GCC_GP3_CLK, 0x62000, BIT(0), 0x62000),
+       GATE_CLK_POLLED(GCC_GP4_CLK, 0x1e000, BIT(0), 0x1e000),
+       GATE_CLK_POLLED(GCC_GP5_CLK, 0x1f000, BIT(0), 0x1f000),
+       GATE_CLK(GCC_GPU_GPLL0_CLK_SRC, 0x4b000, BIT(15)),
+       GATE_CLK(GCC_GPU_GPLL0_DIV_CLK_SRC, 0x4b000, BIT(16)),
+       GATE_CLK_POLLED(GCC_GPU_MEMNOC_GFX_CENTER_PIPELINE_CLK, 0x7d160, 
BIT(0), 0x7d160),
+       GATE_CLK_POLLED(GCC_GPU_MEMNOC_GFX_CLK, 0x7d010, BIT(0), 0x7d010),
+       GATE_CLK(GCC_GPU_SNOC_DVM_GFX_CLK, 0x7d01c, BIT(0)),
+       GATE_CLK_POLLED(GCC_GPU_TCU_THROTTLE_AHB_CLK, 0x7d008, BIT(0), 0x7d008),
+       GATE_CLK_POLLED(GCC_GPU_TCU_THROTTLE_CLK, 0x7d014, BIT(0), 0x7d014),
+       GATE_CLK_POLLED(GCC_PCIE_0_AUX_CLK, 0x4b010, BIT(16), 0xa9038),
+       GATE_CLK_POLLED(GCC_PCIE_0_CFG_AHB_CLK, 0x4b010, BIT(12), 0xa902c),
+       GATE_CLK_POLLED(GCC_PCIE_0_MSTR_AXI_CLK, 0x4b010, BIT(11), 0xa9024),
+       GATE_CLK_POLLED(GCC_PCIE_0_PHY_AUX_CLK, 0x4b010, BIT(13), 0xa9030),
+       GATE_CLK_POLLED(GCC_PCIE_0_PHY_RCHNG_CLK, 0x4b010, BIT(15), 0xa9050),
+       GATE_CLK(GCC_PCIE_0_PIPE_CLK, 0x4b010, BIT(14)),
+       GATE_CLK(GCC_PCIE_0_PIPEDIV2_CLK, 0x4b018, BIT(22)),
+       GATE_CLK_POLLED(GCC_PCIE_0_SLV_AXI_CLK, 0x4b010, BIT(10), 0xa901c),
+       GATE_CLK_POLLED(GCC_PCIE_0_SLV_Q2A_AXI_CLK, 0x4b018, BIT(12), 0xa9018),
+       GATE_CLK_POLLED(GCC_PCIE_1_AUX_CLK, 0x4b000, BIT(31), 0x77038),
+       GATE_CLK_POLLED(GCC_PCIE_1_CFG_AHB_CLK, 0x4b008, BIT(2), 0x7702c),
+       GATE_CLK_POLLED(GCC_PCIE_1_MSTR_AXI_CLK, 0x4b008, BIT(1), 0x77024),
+       GATE_CLK_POLLED(GCC_PCIE_1_PHY_AUX_CLK, 0x4b008, BIT(3), 0x77030),
+       GATE_CLK_POLLED(GCC_PCIE_1_PHY_RCHNG_CLK, 0x4b000, BIT(22), 0x77050),
+       GATE_CLK(GCC_PCIE_1_PIPE_CLK, 0x4b008, BIT(4)),
+       GATE_CLK(GCC_PCIE_1_PIPEDIV2_CLK, 0x4b018, BIT(16)),
+       GATE_CLK_POLLED(GCC_PCIE_1_SLV_AXI_CLK, 0x4b008, BIT(0), 0x7701c),
+       GATE_CLK_POLLED(GCC_PCIE_1_SLV_Q2A_AXI_CLK, 0x4b008, BIT(5), 0x77018),
+       GATE_CLK(GCC_PCIE_CLKREF_EN, 0x9746c, BIT(0)),
+       GATE_CLK_POLLED(GCC_PCIE_THROTTLE_CFG_CLK, 0x4b020, BIT(15), 0xb2034),
+       GATE_CLK_POLLED(GCC_PDM2_CLK, 0x3f00c, BIT(0), 0x3f00c),
+       GATE_CLK_POLLED(GCC_PDM_AHB_CLK, 0x3f004, BIT(0), 0x3f004),
+       GATE_CLK_POLLED(GCC_PDM_XO4_CLK, 0x3f008, BIT(0), 0x3f008),
+       GATE_CLK_POLLED(GCC_QMIP_CAMERA_NRT_AHB_CLK, 0x32008, BIT(0), 0x32008),
+       GATE_CLK_POLLED(GCC_QMIP_CAMERA_RT_AHB_CLK, 0x3200c, BIT(0), 0x3200c),
+       GATE_CLK_POLLED(GCC_QMIP_DISP_AHB_CLK, 0x33008, BIT(0), 0x33008),
+       GATE_CLK_POLLED(GCC_QMIP_DISP_ROT_AHB_CLK, 0x3300c, BIT(0), 0x3300c),
+       GATE_CLK_POLLED(GCC_QMIP_VIDEO_CVP_AHB_CLK, 0x34008, BIT(0), 0x34008),
+       GATE_CLK_POLLED(GCC_QMIP_VIDEO_VCODEC_AHB_CLK, 0x3400c, BIT(0), 
0x3400c),
+       GATE_CLK_POLLED(GCC_QMIP_VIDEO_VCPU_AHB_CLK, 0x34010, BIT(0), 0x34010),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP0_CORE_2X_CLK, 0x4b008, BIT(9), 0x23018),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP0_CORE_CLK, 0x4b008, BIT(8), 0x2300c),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP0_S0_CLK, 0x4b008, BIT(10), 0x2314c),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP0_S1_CLK, 0x4b008, BIT(11), 0x23280),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP0_S2_CLK, 0x4b008, BIT(12), 0x233b4),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP0_S3_CLK, 0x4b008, BIT(13), 0x234e8),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP0_S4_CLK, 0x4b008, BIT(14), 0x2361c),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP0_S5_CLK, 0x4b008, BIT(15), 0x23750),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP0_S6_CLK, 0x4b008, BIT(16), 0x23884),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP0_S7_CLK, 0x4b008, BIT(17), 0x239b8),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP1_CORE_2X_CLK, 0x4b008, BIT(18), 0x24018),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP1_CORE_CLK, 0x4b008, BIT(19), 0x2400c),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP1_S0_CLK, 0x4b008, BIT(22), 0x2414c),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP1_S1_CLK, 0x4b008, BIT(23), 0x24280),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP1_S2_CLK, 0x4b008, BIT(24), 0x243b4),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP1_S3_CLK, 0x4b008, BIT(25), 0x244e8),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP1_S4_CLK, 0x4b008, BIT(26), 0x2461c),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP1_S5_CLK, 0x4b008, BIT(27), 0x24750),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP1_S6_CLK, 0x4b018, BIT(27), 0x24884),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP1_S7_CLK, 0x4b018, BIT(28), 0x249b8),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP3_CORE_2X_CLK, 0x4b000, BIT(24), 0xc4018),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP3_CORE_CLK, 0x4b000, BIT(23), 0xc400c),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP3_QSPI_CLK, 0x4b000, BIT(26), 0xc4284),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP3_S0_CLK, 0x4b000, BIT(25), 0xc4150),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP_0_M_AHB_CLK, 0x4b008, BIT(6), 0x23004),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP_0_S_AHB_CLK, 0x4b008, BIT(7), 0x23008),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP_1_M_AHB_CLK, 0x4b008, BIT(20), 0x24004),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP_1_S_AHB_CLK, 0x4b008, BIT(21), 0x24008),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP_3_M_AHB_CLK, 0x4b000, BIT(27), 0xc4004),
+       GATE_CLK_POLLED(GCC_QUPV3_WRAP_3_S_AHB_CLK, 0x4b000, BIT(20), 0xc4008),
+       GATE_CLK_POLLED(GCC_SDCC1_AHB_CLK, 0x2000c, BIT(0), 0x2000c),
+       GATE_CLK_POLLED(GCC_SDCC1_APPS_CLK, 0x20004, BIT(0), 0x20004),
+       GATE_CLK_POLLED(GCC_SDCC1_ICE_CORE_CLK, 0x20044, BIT(0), 0x20044),
+       GATE_CLK(GCC_SGMI_CLKREF_EN, 0x97034, BIT(0)),
+       GATE_CLK_POLLED(GCC_UFS_PHY_AHB_CLK, 0x83020, BIT(0), 0x83020),
+       GATE_CLK_POLLED(GCC_UFS_PHY_AXI_CLK, 0x83018, BIT(0), 0x83018),
+       GATE_CLK_POLLED(GCC_UFS_PHY_ICE_CORE_CLK, 0x8306c, BIT(0), 0x8306c),
+       GATE_CLK_POLLED(GCC_UFS_PHY_PHY_AUX_CLK, 0x830a4, BIT(0), 0x830a4),
+       GATE_CLK(GCC_UFS_PHY_RX_SYMBOL_0_CLK, 0x83028, BIT(0)),
+       GATE_CLK(GCC_UFS_PHY_RX_SYMBOL_1_CLK, 0x830c0, BIT(0)),
+       GATE_CLK(GCC_UFS_PHY_TX_SYMBOL_0_CLK, 0x83024, BIT(0)),
+       GATE_CLK_POLLED(GCC_UFS_PHY_UNIPRO_CORE_CLK, 0x83064, BIT(0), 0x83064),
+       GATE_CLK_POLLED(GCC_USB20_MASTER_CLK, 0x1c018, BIT(0), 0x1c018),
+       GATE_CLK_POLLED(GCC_USB20_MOCK_UTMI_CLK, 0x1c024, BIT(0), 0x1c024),
+       GATE_CLK_POLLED(GCC_USB20_SLEEP_CLK, 0x1c020, BIT(0), 0x1c020),
+       GATE_CLK_POLLED(GCC_USB30_PRIM_MASTER_CLK, 0x1b018, BIT(0), 0x1b018),
+       GATE_CLK_POLLED(GCC_USB30_PRIM_MOCK_UTMI_CLK, 0x1b024, BIT(0), 0x1b024),
+       GATE_CLK_POLLED(GCC_USB30_PRIM_SLEEP_CLK, 0x1b020, BIT(0), 0x1b020),
+       GATE_CLK_POLLED(GCC_USB3_PRIM_PHY_AUX_CLK, 0x1b05c, BIT(0), 0x1b05c),
+       GATE_CLK_POLLED(GCC_USB3_PRIM_PHY_COM_AUX_CLK, 0x1b060, BIT(0), 
0x1b060),
+       GATE_CLK(GCC_USB3_PRIM_PHY_PIPE_CLK, 0x1b064, BIT(0)),
+       GATE_CLK(GCC_USB_CLKREF_EN, 0x97468, BIT(0)),
+       GATE_CLK_POLLED(GCC_VIDEO_AXI0_CLK, 0x34014, BIT(0), 0x34014),
+       GATE_CLK_POLLED(GCC_VIDEO_AXI1_CLK, 0x3401c, BIT(0), 0x3401c),
 };
 
 static int qcs8300_enable(struct clk *clk)
@@ -74,11 +559,27 @@ static int qcs8300_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_WRAP0_S0_CLK ... GCC_QUPV3_WRAP0_S7_CLK:
+               qcom_gate_clk_en(priv, GCC_QUPV3_WRAP_0_M_AHB_CLK);
+               qcom_gate_clk_en(priv, GCC_QUPV3_WRAP_0_S_AHB_CLK);
+               qcom_gate_clk_en(priv, GCC_QUPV3_WRAP0_CORE_CLK);
+               qcom_gate_clk_en(priv, GCC_QUPV3_WRAP0_CORE_2X_CLK);
+               break;
+       case GCC_QUPV3_WRAP1_S0_CLK ... GCC_QUPV3_WRAP1_S7_CLK:
+               qcom_gate_clk_en(priv, GCC_QUPV3_WRAP_1_M_AHB_CLK);
+               qcom_gate_clk_en(priv, GCC_QUPV3_WRAP_1_S_AHB_CLK);
+               qcom_gate_clk_en(priv, GCC_QUPV3_WRAP1_CORE_CLK);
+               qcom_gate_clk_en(priv, GCC_QUPV3_WRAP1_CORE_2X_CLK);
+               break;
+       case GCC_QUPV3_WRAP3_S0_CLK:
+               qcom_gate_clk_en(priv, GCC_QUPV3_WRAP_3_M_AHB_CLK);
+               qcom_gate_clk_en(priv, GCC_QUPV3_WRAP_3_S_AHB_CLK);
+               qcom_gate_clk_en(priv, GCC_QUPV3_WRAP3_CORE_CLK);
+               qcom_gate_clk_en(priv, GCC_QUPV3_WRAP3_CORE_2X_CLK);
+               break;
        }
 
-       qcom_gate_clk_en(priv, clk->id);
-
-       return 0;
+       return qcom_gate_clk_en(priv, clk->id);
 }
 
 static const struct qcom_reset_map qcs8300_gcc_resets[] = {
@@ -112,8 +613,12 @@ static const struct qcom_reset_map qcs8300_gcc_resets[] = {
 };
 
 static const struct qcom_power_map qcs8300_gdscs[] = {
+       [GCC_EMAC0_GDSC] = { 0xb6004 },
+       [GCC_PCIE_0_GDSC] = { 0xa9004 },
+       [GCC_PCIE_1_GDSC] = { 0x77004 },
        [GCC_UFS_PHY_GDSC] = { 0x83004 },
-       [GCC_USB30_PRIM_GDSC] = { 0x1B004 },
+       [GCC_USB20_PRIM_GDSC] = { 0x1c004 },
+       [GCC_USB30_PRIM_GDSC] = { 0x1b004 },
 };
 
 static struct msm_clk_data qcs8300_gcc_data = {

-- 
2.34.1

Reply via email to