* [PATCH v2 0/7] qcom: qcs8300/monaco-evk: pinctrl, interconnect, RPMH clock and reboot-mode support
@ 2026-08-12 1:11 Balaji Selvanathan via U-Boot
2026-08-12 1:11 ` [PATCH v2 1/7] clk: qcom: Add shared RPMH clock driver for SM8550/SM8650/SA8775P Balaji Selvanathan via U-Boot
` (7 more replies)
0 siblings, 8 replies; 15+ messages in thread
From: Balaji Selvanathan via U-Boot @ 2026-08-12 1:11 UTC (permalink / raw)
To: Sumit Garg, u-boot, u-boot-qcom
Cc: Lukasz Majewski, Tom Rini, Casey Connolly, Neil Armstrong,
Johan Jonker, Luca Weiss, Biswapriyo Nath, Ilias Apalodimas,
Balaji Selvanathan
This series brings up the Monaco (QCS8300) EVK target with a dedicated
pinctrl driver, interconnect driver, a real sa8775p RPMH clock driver
(replacing the generic clk-stub no-op), and PON/SDAM-backed reboot-mode
support so "reboot bootloader" from Linux can be honored by U-Boot.
qcom_qcs8300_defconfig is switched over to the monaco-evk device tree.
Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
---
Changes in v2:
- clk: qcom: split RPMH clock support into a new standalone
clock-rpmh.c driver shared by SM8550/SM8650/SA8775P instead of
embedding it in the sa8775p GCC driver
- Link to v1: https://lore.kernel.org/r/20260806-b4-monaco-v1-0-8d7b4e2f4fe1@oss.qualcomm.com
---
Balaji Selvanathan (7):
clk: qcom: Add shared RPMH clock driver for SM8550/SM8650/SA8775P
clk: qcom: qcs8300: Extend GCC clock driver to full gate/RCG coverage
pinctrl: qcom: Add QCS8300 pinctrl driver
interconnect: qcom: Add QCS8300 interconnect driver
arm64: dts: monaco-evk: Add reboot-mode support via PON/SDAM
arm64: dts: monaco-evk: Force vreg_l8a always-on to protect UFS VCC
configs: qcom_qcs8300: Switch to monaco-evk DT and enable new drivers
arch/arm/dts/monaco-evk-u-boot.dtsi | 40 +++
configs/qcom_qcs8300_defconfig | 6 +-
drivers/clk/clk-stub.c | 3 -
drivers/clk/qcom/Kconfig | 12 +
drivers/clk/qcom/Makefile | 1 +
drivers/clk/qcom/clock-qcs8300.c | 545 +++++++++++++++++++++++++++++++--
drivers/clk/qcom/clock-rpmh.c | 61 ++++
drivers/interconnect/qcom/Kconfig | 6 +
drivers/interconnect/qcom/Makefile | 1 +
drivers/interconnect/qcom/qcs8300.c | 269 ++++++++++++++++
drivers/interconnect/qcom/qcs8300.h | 24 ++
drivers/pinctrl/qcom/Kconfig | 8 +
drivers/pinctrl/qcom/Makefile | 1 +
drivers/pinctrl/qcom/pinctrl-qcs8300.c | 468 ++++++++++++++++++++++++++++
14 files changed, 1421 insertions(+), 24 deletions(-)
---
base-commit: 3fb0c443c5b70f25168c98ad88f8a2c0123e2c82
change-id: 20260805-b4-monaco-26501bf7c863
Best regards,
--
Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 1/7] clk: qcom: Add shared RPMH clock driver for SM8550/SM8650/SA8775P
2026-08-12 1:11 [PATCH v2 0/7] qcom: qcs8300/monaco-evk: pinctrl, interconnect, RPMH clock and reboot-mode support Balaji Selvanathan via U-Boot
@ 2026-08-12 1:11 ` Balaji Selvanathan via U-Boot
2026-08-12 12:26 ` Neil Armstrong
2026-08-12 1:12 ` [PATCH v2 2/7] clk: qcom: qcs8300: Extend GCC clock driver to full gate/RCG coverage Balaji Selvanathan via U-Boot
` (6 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Balaji Selvanathan via U-Boot @ 2026-08-12 1:11 UTC (permalink / raw)
To: Sumit Garg, u-boot, u-boot-qcom
Cc: Lukasz Majewski, Tom Rini, Casey Connolly, Neil Armstrong,
Johan Jonker, Luca Weiss, Biswapriyo Nath, Ilias Apalodimas,
Balaji Selvanathan
sa8775p was being handled by the generic clock stub, which just
no-ops every request. The RPMH_CXO_CLK (bi_tcxo_div2) it exposes is
identical on SM8550, SM8650 and SA8775P, so rather than bury it in the
sa8775p GCC driver, add a dedicated standalone RPMH clock driver shared
by all three SoCs. It reports the fixed CXO rate and accepts no-op
enable/set_rate requests.
Monaco-evk also uses the same RPMH clock driver as sa8775p (it's
rpmhcc DTS node has compatible "qcom,sa8775p-rpmh-clk").
Drop the sm8550/sm8650/sa8775p rpmh-clk compatibles from the generic
clock stub now that they are handled by the real driver.
Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
---
drivers/clk/clk-stub.c | 3 ---
drivers/clk/qcom/Kconfig | 12 +++++++++
drivers/clk/qcom/Makefile | 1 +
drivers/clk/qcom/clock-rpmh.c | 61 +++++++++++++++++++++++++++++++++++++++++++
4 files changed, 74 insertions(+), 3 deletions(-)
diff --git a/drivers/clk/clk-stub.c b/drivers/clk/clk-stub.c
index 4a6c71016da..85e54841386 100644
--- a/drivers/clk/clk-stub.c
+++ b/drivers/clk/clk-stub.c
@@ -51,7 +51,6 @@ static struct clk_ops stub_clk_ops = {
static const struct udevice_id stub_clk_ids[] = {
{ .compatible = "qcom,qcs615-rpmh-clk" },
{ .compatible = "qcom,rpmcc" },
- { .compatible = "qcom,sa8775p-rpmh-clk" },
{ .compatible = "qcom,sc7180-rpmh-clk" },
{ .compatible = "qcom,sc7280-rpmh-clk" },
{ .compatible = "qcom,sdm670-rpmh-clk" },
@@ -59,8 +58,6 @@ static const struct udevice_id stub_clk_ids[] = {
{ .compatible = "qcom,sm6350-rpmh-clk" },
{ .compatible = "qcom,sm8150-rpmh-clk" },
{ .compatible = "qcom,sm8250-rpmh-clk" },
- { .compatible = "qcom,sm8550-rpmh-clk" },
- { .compatible = "qcom,sm8650-rpmh-clk" },
{ }
};
diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig
index 9ad233c83ac..8596b93d4c4 100644
--- a/drivers/clk/qcom/Kconfig
+++ b/drivers/clk/qcom/Kconfig
@@ -87,9 +87,19 @@ config CLK_QCOM_QCS8300
on the Snapdragon QCS8300 SoC. This driver supports the clocks
and resets exposed by the GCC hardware block.
+config CLK_QCOM_RPMH
+ bool "Qualcomm RPMh clock driver"
+ depends on CLK
+ help
+ Say Y here to enable support for the RPMh-managed clocks found on
+ SoCs such as SM8550, SM8650 and SA8775P. These clocks are owned by
+ the always-on subsystem; the driver only reports the fixed CXO rate
+ (bi_tcxo_div2) and accepts no-op enable/set_rate requests.
+
config CLK_QCOM_SA8775P
bool "Qualcomm SA8775 GCC"
select CLK_QCOM
+ select CLK_QCOM_RPMH
help
Say Y here to enable support for the Global Clock Controller
on the Snapdragon SA8775 SoC. This driver supports the clocks
@@ -153,6 +163,7 @@ config CLK_QCOM_SM8250
config CLK_QCOM_SM8550
bool "Qualcomm SM8550 GCC"
select CLK_QCOM
+ select CLK_QCOM_RPMH
help
Say Y here to enable support for the Global Clock Controller
on the Snapdragon SM8550 SoC. This driver supports the clocks
@@ -161,6 +172,7 @@ config CLK_QCOM_SM8550
config CLK_QCOM_SM8650
bool "Qualcomm SM8650 GCC"
select CLK_QCOM
+ select CLK_QCOM_RPMH
help
Say Y here to enable support for the Global Clock Controller
on the Snapdragon SM8650 SoC. This driver supports the clocks
diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile
index c0d95a6300e..f5630ae0f9c 100644
--- a/drivers/clk/qcom/Makefile
+++ b/drivers/clk/qcom/Makefile
@@ -14,6 +14,7 @@ obj-$(CONFIG_CLK_QCOM_QCM2290) += clock-qcm2290.o
obj-$(CONFIG_CLK_QCOM_QCS404) += clock-qcs404.o
obj-$(CONFIG_CLK_QCOM_QCS8300) += clock-qcs8300.o
obj-$(CONFIG_CLK_QCOM_QCS615) += clock-qcs615.o
+obj-$(CONFIG_CLK_QCOM_RPMH) += clock-rpmh.o
obj-$(CONFIG_CLK_QCOM_SA8775P) += clock-sa8775p.o
obj-$(CONFIG_CLK_QCOM_SC7280) += clock-sc7280.o
obj-$(CONFIG_CLK_QCOM_SM6115) += clock-sm6115.o
diff --git a/drivers/clk/qcom/clock-rpmh.c b/drivers/clk/qcom/clock-rpmh.c
new file mode 100644
index 00000000000..69f2a751441
--- /dev/null
+++ b/drivers/clk/qcom/clock-rpmh.c
@@ -0,0 +1,61 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * RPMh clock driver for Qualcomm SoCs
+ *
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+#include <clk-uclass.h>
+#include <dm.h>
+#include <errno.h>
+#include <dt-bindings/clock/qcom,rpmh.h>
+
+/* On-board TCXO */
+#define TCXO_RATE 38400000
+
+/* bi_tcxo_div2 divided after RPMh output */
+#define TCXO_DIV2_RATE (TCXO_RATE / 2)
+
+static ulong qcom_rpmh_clk_set_rate(struct clk *clk, ulong rate)
+{
+ return (clk->rate = rate);
+}
+
+static ulong qcom_rpmh_clk_get_rate(struct clk *clk)
+{
+ ulong cxo_rate = dev_get_driver_data(clk->dev);
+
+ switch (clk->id) {
+ case RPMH_CXO_CLK:
+ return cxo_rate;
+ default:
+ return clk->rate;
+ }
+}
+
+static int qcom_rpmh_clk_nop(struct clk *clk)
+{
+ return 0;
+}
+
+static struct clk_ops qcom_rpmh_clk_ops = {
+ .set_rate = qcom_rpmh_clk_set_rate,
+ .get_rate = qcom_rpmh_clk_get_rate,
+ .enable = qcom_rpmh_clk_nop,
+ .disable = qcom_rpmh_clk_nop,
+};
+
+static const struct udevice_id qcom_rpmh_clk_ids[] = {
+ { .compatible = "qcom,sa8775p-rpmh-clk", .data = TCXO_DIV2_RATE },
+ { .compatible = "qcom,sm8550-rpmh-clk", .data = TCXO_DIV2_RATE },
+ { .compatible = "qcom,sm8650-rpmh-clk", .data = TCXO_DIV2_RATE },
+ { }
+};
+
+U_BOOT_DRIVER(qcom_rpmh_clk) = {
+ .name = "qcom_rpmh_clk",
+ .id = UCLASS_CLK,
+ .of_match = qcom_rpmh_clk_ids,
+ .ops = &qcom_rpmh_clk_ops,
+ .flags = DM_FLAG_DEFAULT_PD_CTRL_OFF,
+};
--
2.34.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 2/7] clk: qcom: qcs8300: Extend GCC clock driver to full gate/RCG coverage
2026-08-12 1:11 [PATCH v2 0/7] qcom: qcs8300/monaco-evk: pinctrl, interconnect, RPMH clock and reboot-mode support Balaji Selvanathan via U-Boot
2026-08-12 1:11 ` [PATCH v2 1/7] clk: qcom: Add shared RPMH clock driver for SM8550/SM8650/SA8775P Balaji Selvanathan via U-Boot
@ 2026-08-12 1:12 ` Balaji Selvanathan via U-Boot
2026-10-19 11:54 ` Sumit Garg
2026-08-12 1:12 ` [PATCH v2 3/7] pinctrl: qcom: Add QCS8300 pinctrl driver Balaji Selvanathan via U-Boot
` (5 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Balaji Selvanathan via U-Boot @ 2026-08-12 1:12 UTC (permalink / raw)
To: Sumit Garg, u-boot, u-boot-qcom
Cc: Lukasz Majewski, Tom Rini, Casey Connolly, Neil Armstrong,
Johan Jonker, Luca Weiss, Biswapriyo Nath, Ilias Apalodimas,
Balaji Selvanathan
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 <balaji.selvanathan@oss.qualcomm.com>
---
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
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 3/7] pinctrl: qcom: Add QCS8300 pinctrl driver
2026-08-12 1:11 [PATCH v2 0/7] qcom: qcs8300/monaco-evk: pinctrl, interconnect, RPMH clock and reboot-mode support Balaji Selvanathan via U-Boot
2026-08-12 1:11 ` [PATCH v2 1/7] clk: qcom: Add shared RPMH clock driver for SM8550/SM8650/SA8775P Balaji Selvanathan via U-Boot
2026-08-12 1:12 ` [PATCH v2 2/7] clk: qcom: qcs8300: Extend GCC clock driver to full gate/RCG coverage Balaji Selvanathan via U-Boot
@ 2026-08-12 1:12 ` Balaji Selvanathan via U-Boot
2026-10-19 11:56 ` Sumit Garg
2026-08-12 1:12 ` [PATCH v2 4/7] interconnect: qcom: Add QCS8300 interconnect driver Balaji Selvanathan via U-Boot
` (4 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Balaji Selvanathan via U-Boot @ 2026-08-12 1:12 UTC (permalink / raw)
To: Sumit Garg, u-boot, u-boot-qcom
Cc: Lukasz Majewski, Tom Rini, Casey Connolly, Neil Armstrong,
Johan Jonker, Luca Weiss, Biswapriyo Nath, Ilias Apalodimas,
Balaji Selvanathan
Add pinctrl support for QCS8300.
Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
---
drivers/pinctrl/qcom/Kconfig | 8 +
drivers/pinctrl/qcom/Makefile | 1 +
drivers/pinctrl/qcom/pinctrl-qcs8300.c | 468 +++++++++++++++++++++++++++++++++
3 files changed, 477 insertions(+)
diff --git a/drivers/pinctrl/qcom/Kconfig b/drivers/pinctrl/qcom/Kconfig
index 0bea461fcc3..2af71945c4d 100644
--- a/drivers/pinctrl/qcom/Kconfig
+++ b/drivers/pinctrl/qcom/Kconfig
@@ -86,6 +86,14 @@ config PINCTRL_QCOM_QCS615
Say Y here to enable support for pinctrl on the Snapdragon QCS615 SoC,
as well as the associated GPIO driver.
+config PINCTRL_QCOM_QCS8300
+ bool "Qualcomm QCS8300 Pinctrl"
+ default y if PINCTRL_QCOM_GENERIC
+ select PINCTRL_QCOM
+ help
+ Say Y here to enable support for pinctrl on the Snapdragon QCS8300 SoC,
+ as well as the associated GPIO driver.
+
config PINCTRL_QCOM_SA8775P
bool "Qualcomm SA8775P Pinctrl"
default y if PINCTRL_QCOM_GENERIC
diff --git a/drivers/pinctrl/qcom/Makefile b/drivers/pinctrl/qcom/Makefile
index 87cb128c4d4..e10fbc3d3ec 100644
--- a/drivers/pinctrl/qcom/Makefile
+++ b/drivers/pinctrl/qcom/Makefile
@@ -12,6 +12,7 @@ obj-$(CONFIG_PINCTRL_QCOM_MILOS) += pinctrl-milos.o
obj-$(CONFIG_PINCTRL_QCOM_QCM2290) += pinctrl-qcm2290.o
obj-$(CONFIG_PINCTRL_QCOM_QCS404) += pinctrl-qcs404.o
obj-$(CONFIG_PINCTRL_QCOM_QCS615) += pinctrl-qcs615.o
+obj-$(CONFIG_PINCTRL_QCOM_QCS8300) += pinctrl-qcs8300.o
obj-$(CONFIG_PINCTRL_QCOM_SA8775P) += pinctrl-sa8775p.o
obj-$(CONFIG_PINCTRL_QCOM_SC7280) += pinctrl-sc7280.o
obj-$(CONFIG_PINCTRL_QCOM_SDM660) += pinctrl-sdm660.o
diff --git a/drivers/pinctrl/qcom/pinctrl-qcs8300.c b/drivers/pinctrl/qcom/pinctrl-qcs8300.c
new file mode 100644
index 00000000000..91f7c4fcf1e
--- /dev/null
+++ b/drivers/pinctrl/qcom/pinctrl-qcs8300.c
@@ -0,0 +1,468 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Qualcomm QCS8300 pinctrl
+ *
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ *
+ */
+
+#include <dm.h>
+
+#include "pinctrl-qcom.h"
+
+#define MAX_PIN_NAME_LEN 32
+#define MSM_PIN_FUNCTION_COUNT 12
+
+static char pin_name[MAX_PIN_NAME_LEN] __section(".data");
+
+typedef unsigned int msm_pin_function[MSM_PIN_FUNCTION_COUNT];
+
+#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11)\
+ {\
+ msm_mux_gpio, /* gpio mode */\
+ msm_mux_##f1,\
+ msm_mux_##f2,\
+ msm_mux_##f3,\
+ msm_mux_##f4,\
+ msm_mux_##f5,\
+ msm_mux_##f6,\
+ msm_mux_##f7,\
+ msm_mux_##f8,\
+ msm_mux_##f9,\
+ msm_mux_##f10,\
+ msm_mux_##f11 /* egpio mode */\
+ }
+
+#define SDC_QDSD_PINGROUP(pg_name, ctl, pull, drv)\
+ {\
+ .name = pg_name,\
+ .ctl_reg = ctl,\
+ .io_reg = 0,\
+ .pull_bit = pull,\
+ .drv_bit = drv,\
+ .oe_bit = -1,\
+ .in_bit = -1,\
+ .out_bit = -1,\
+ }
+
+#define UFS_RESET(pg_name, ctl)\
+ {\
+ .name = pg_name,\
+ .ctl_reg = ctl,\
+ .io_reg = ctl + 0x4,\
+ .pull_bit = 3,\
+ .drv_bit = 0,\
+ .oe_bit = -1,\
+ .in_bit = -1,\
+ .out_bit = 0,\
+ }
+
+enum qcs8300_functions {
+ msm_mux_gpio,
+ msm_mux_aoss_cti,
+ msm_mux_atest_char,
+ msm_mux_atest_usb2,
+ msm_mux_audio_ref,
+ msm_mux_cam_mclk,
+ msm_mux_cci_async,
+ msm_mux_cci_i2c_scl,
+ msm_mux_cci_i2c_sda,
+ msm_mux_cci_timer,
+ msm_mux_cri_trng,
+ msm_mux_dbg_out,
+ msm_mux_ddr_bist,
+ msm_mux_ddr_pxi0,
+ msm_mux_ddr_pxi1,
+ msm_mux_ddr_pxi2,
+ msm_mux_ddr_pxi3,
+ msm_mux_edp0_hot,
+ msm_mux_edp0_lcd,
+ msm_mux_edp1_lcd,
+ msm_mux_egpio,
+ msm_mux_emac0_mcg0,
+ msm_mux_emac0_mcg1,
+ msm_mux_emac0_mcg2,
+ msm_mux_emac0_mcg3,
+ msm_mux_emac0_mdc,
+ msm_mux_emac0_mdio,
+ msm_mux_emac0_ptp_aux,
+ msm_mux_emac0_ptp_pps,
+ msm_mux_gcc_gp1,
+ msm_mux_gcc_gp2,
+ msm_mux_gcc_gp3,
+ msm_mux_gcc_gp4,
+ msm_mux_gcc_gp5,
+ msm_mux_hs0_mi2s,
+ msm_mux_hs1_mi2s,
+ msm_mux_hs2_mi2s,
+ msm_mux_ibi_i3c,
+ msm_mux_jitter_bist,
+ msm_mux_mdp0_vsync0,
+ msm_mux_mdp0_vsync1,
+ msm_mux_mdp0_vsync3,
+ msm_mux_mdp0_vsync6,
+ msm_mux_mdp0_vsync7,
+ msm_mux_mdp_vsync,
+ msm_mux_mi2s1_data0,
+ msm_mux_mi2s1_data1,
+ msm_mux_mi2s1_sck,
+ msm_mux_mi2s1_ws,
+ msm_mux_mi2s2_data0,
+ msm_mux_mi2s2_data1,
+ msm_mux_mi2s2_sck,
+ msm_mux_mi2s2_ws,
+ msm_mux_mi2s_mclk0,
+ msm_mux_mi2s_mclk1,
+ msm_mux_pcie0_clkreq,
+ msm_mux_pcie1_clkreq,
+ msm_mux_phase_flag,
+ msm_mux_pll_bist,
+ msm_mux_pll_clk,
+ msm_mux_prng_rosc0,
+ msm_mux_prng_rosc1,
+ msm_mux_prng_rosc2,
+ msm_mux_prng_rosc3,
+ msm_mux_qdss_cti,
+ msm_mux_qdss_gpio,
+ msm_mux_qup0_se0,
+ msm_mux_qup0_se1,
+ msm_mux_qup0_se2,
+ msm_mux_qup0_se3,
+ msm_mux_qup0_se4,
+ msm_mux_qup0_se5,
+ msm_mux_qup0_se6,
+ msm_mux_qup0_se7,
+ msm_mux_qup1_se0,
+ msm_mux_qup1_se1,
+ msm_mux_qup1_se2,
+ msm_mux_qup1_se3,
+ msm_mux_qup1_se4,
+ msm_mux_qup1_se5,
+ msm_mux_qup1_se6,
+ msm_mux_qup1_se7,
+ msm_mux_qup2_se0,
+ msm_mux_sailss_emac0,
+ msm_mux_sailss_ospi,
+ msm_mux_sgmii_phy,
+ msm_mux_tb_trig,
+ msm_mux_tgu_ch0,
+ msm_mux_tgu_ch1,
+ msm_mux_tgu_ch2,
+ msm_mux_tgu_ch3,
+ msm_mux_tsense_pwm1,
+ msm_mux_tsense_pwm2,
+ msm_mux_tsense_pwm3,
+ msm_mux_tsense_pwm4,
+ msm_mux_usb2phy_ac,
+ msm_mux_vsense_trigger,
+ msm_mux__,
+};
+
+#define MSM_PIN_FUNCTION(fname)\
+ [msm_mux_##fname] = {#fname, msm_mux_##fname}
+
+static const struct pinctrl_function msm_pinctrl_functions[] = {
+ MSM_PIN_FUNCTION(gpio),
+ MSM_PIN_FUNCTION(aoss_cti),
+ MSM_PIN_FUNCTION(atest_char),
+ MSM_PIN_FUNCTION(atest_usb2),
+ MSM_PIN_FUNCTION(audio_ref),
+ MSM_PIN_FUNCTION(cam_mclk),
+ MSM_PIN_FUNCTION(cci_async),
+ MSM_PIN_FUNCTION(cci_i2c_scl),
+ MSM_PIN_FUNCTION(cci_i2c_sda),
+ MSM_PIN_FUNCTION(cci_timer),
+ MSM_PIN_FUNCTION(cri_trng),
+ MSM_PIN_FUNCTION(dbg_out),
+ MSM_PIN_FUNCTION(ddr_bist),
+ MSM_PIN_FUNCTION(ddr_pxi0),
+ MSM_PIN_FUNCTION(ddr_pxi1),
+ MSM_PIN_FUNCTION(ddr_pxi2),
+ MSM_PIN_FUNCTION(ddr_pxi3),
+ MSM_PIN_FUNCTION(edp0_hot),
+ MSM_PIN_FUNCTION(edp0_lcd),
+ MSM_PIN_FUNCTION(edp1_lcd),
+ MSM_PIN_FUNCTION(egpio),
+ MSM_PIN_FUNCTION(emac0_mcg0),
+ MSM_PIN_FUNCTION(emac0_mcg1),
+ MSM_PIN_FUNCTION(emac0_mcg2),
+ MSM_PIN_FUNCTION(emac0_mcg3),
+ MSM_PIN_FUNCTION(emac0_mdc),
+ MSM_PIN_FUNCTION(emac0_mdio),
+ MSM_PIN_FUNCTION(emac0_ptp_aux),
+ MSM_PIN_FUNCTION(emac0_ptp_pps),
+ MSM_PIN_FUNCTION(gcc_gp1),
+ MSM_PIN_FUNCTION(gcc_gp2),
+ MSM_PIN_FUNCTION(gcc_gp3),
+ MSM_PIN_FUNCTION(gcc_gp4),
+ MSM_PIN_FUNCTION(gcc_gp5),
+ MSM_PIN_FUNCTION(hs0_mi2s),
+ MSM_PIN_FUNCTION(hs1_mi2s),
+ MSM_PIN_FUNCTION(hs2_mi2s),
+ MSM_PIN_FUNCTION(ibi_i3c),
+ MSM_PIN_FUNCTION(jitter_bist),
+ MSM_PIN_FUNCTION(mdp0_vsync0),
+ MSM_PIN_FUNCTION(mdp0_vsync1),
+ MSM_PIN_FUNCTION(mdp0_vsync3),
+ MSM_PIN_FUNCTION(mdp0_vsync6),
+ MSM_PIN_FUNCTION(mdp0_vsync7),
+ MSM_PIN_FUNCTION(mdp_vsync),
+ MSM_PIN_FUNCTION(mi2s1_data0),
+ MSM_PIN_FUNCTION(mi2s1_data1),
+ MSM_PIN_FUNCTION(mi2s1_sck),
+ MSM_PIN_FUNCTION(mi2s1_ws),
+ MSM_PIN_FUNCTION(mi2s2_data0),
+ MSM_PIN_FUNCTION(mi2s2_data1),
+ MSM_PIN_FUNCTION(mi2s2_sck),
+ MSM_PIN_FUNCTION(mi2s2_ws),
+ MSM_PIN_FUNCTION(mi2s_mclk0),
+ MSM_PIN_FUNCTION(mi2s_mclk1),
+ MSM_PIN_FUNCTION(pcie0_clkreq),
+ MSM_PIN_FUNCTION(pcie1_clkreq),
+ MSM_PIN_FUNCTION(phase_flag),
+ MSM_PIN_FUNCTION(pll_bist),
+ MSM_PIN_FUNCTION(pll_clk),
+ MSM_PIN_FUNCTION(prng_rosc0),
+ MSM_PIN_FUNCTION(prng_rosc1),
+ MSM_PIN_FUNCTION(prng_rosc2),
+ MSM_PIN_FUNCTION(prng_rosc3),
+ MSM_PIN_FUNCTION(qdss_cti),
+ MSM_PIN_FUNCTION(qdss_gpio),
+ MSM_PIN_FUNCTION(qup0_se0),
+ MSM_PIN_FUNCTION(qup0_se1),
+ MSM_PIN_FUNCTION(qup0_se2),
+ MSM_PIN_FUNCTION(qup0_se3),
+ MSM_PIN_FUNCTION(qup0_se4),
+ MSM_PIN_FUNCTION(qup0_se5),
+ MSM_PIN_FUNCTION(qup0_se6),
+ MSM_PIN_FUNCTION(qup0_se7),
+ MSM_PIN_FUNCTION(qup1_se0),
+ MSM_PIN_FUNCTION(qup1_se1),
+ MSM_PIN_FUNCTION(qup1_se2),
+ MSM_PIN_FUNCTION(qup1_se3),
+ MSM_PIN_FUNCTION(qup1_se4),
+ MSM_PIN_FUNCTION(qup1_se5),
+ MSM_PIN_FUNCTION(qup1_se6),
+ MSM_PIN_FUNCTION(qup1_se7),
+ MSM_PIN_FUNCTION(qup2_se0),
+ MSM_PIN_FUNCTION(sailss_emac0),
+ MSM_PIN_FUNCTION(sailss_ospi),
+ MSM_PIN_FUNCTION(sgmii_phy),
+ MSM_PIN_FUNCTION(tb_trig),
+ MSM_PIN_FUNCTION(tgu_ch0),
+ MSM_PIN_FUNCTION(tgu_ch1),
+ MSM_PIN_FUNCTION(tgu_ch2),
+ MSM_PIN_FUNCTION(tgu_ch3),
+ MSM_PIN_FUNCTION(tsense_pwm1),
+ MSM_PIN_FUNCTION(tsense_pwm2),
+ MSM_PIN_FUNCTION(tsense_pwm3),
+ MSM_PIN_FUNCTION(tsense_pwm4),
+ MSM_PIN_FUNCTION(usb2phy_ac),
+ MSM_PIN_FUNCTION(vsense_trigger),
+};
+
+static const msm_pin_function qcs8300_pin_functions[] = {
+ [0] = PINGROUP(0, _, _, _, _, _, _, _, _, _, _, _),
+ [1] = PINGROUP(1, pcie0_clkreq, _, _, _, _, _, _, _, _, _, _),
+ [2] = PINGROUP(2, _, _, _, _, _, _, _, _, _, _, _),
+ [3] = PINGROUP(3, phase_flag, _, _, _, _, _, _, _, _, _, _),
+ [4] = PINGROUP(4, sgmii_phy, qdss_cti, _, _, _, _, _, _, _, _, _),
+ [5] = PINGROUP(5, emac0_mdc, qdss_cti, _, _, _, _, _, _, _, _, _),
+ [6] = PINGROUP(6, emac0_mdio, _, _, _, _, _, _, _, _, _, _),
+ [7] = PINGROUP(7, usb2phy_ac, _, _, _, _, _, _, _, _, _, _),
+ [8] = PINGROUP(8, usb2phy_ac, _, _, _, _, _, _, _, _, _, _),
+ [9] = PINGROUP(9, phase_flag, _, _, _, _, _, _, _, _, _, _),
+ [10] = PINGROUP(10, qup2_se0, emac0_mcg0, _, _, _, _, _, _, _, _, _),
+ [11] = PINGROUP(11, qup2_se0, emac0_mcg1, _, _, _, _, _, _, _, _, _),
+ [12] = PINGROUP(12, qup2_se0, _, _, _, _, _, _, _, _, _, _),
+ [13] = PINGROUP(13, qup2_se0, _, _, _, _, _, _, _, _, _, _),
+ [14] = PINGROUP(14, qup2_se0, tb_trig, _, _, _, _, _, _, _, _, _),
+ [15] = PINGROUP(15, qup2_se0, _, sailss_ospi, sailss_emac0, _, _, _, _, _, _, _),
+ [16] = PINGROUP(16, qup2_se0, _, _, sailss_ospi, sailss_emac0, _, _, _, _, _, _),
+ [17] = PINGROUP(17, qup0_se0, qup0_se1, ibi_i3c, _, _, _, _, _, _, _, _),
+ [18] = PINGROUP(18, qup0_se0, qup0_se1, ibi_i3c, _, _, _, _, _, _, _, _),
+ [19] = PINGROUP(19, qup0_se1, qup0_se0, cci_timer, ibi_i3c, _, _, _, _, _, _, _),
+ [20] = PINGROUP(20, qup0_se1, qup0_se0, cci_timer, ibi_i3c, _, _, _, _, _, _, _),
+ [21] = PINGROUP(21, qup0_se5, cci_timer, _, _, _, _, _, _, _, _, _),
+ [22] = PINGROUP(22, pcie1_clkreq, qup0_se5, cci_timer, _, _, _, _, _, _, _, _),
+ [23] = PINGROUP(23, qup0_se5, cci_timer, qdss_cti, _, _, _, _, _, _, _, _),
+ [24] = PINGROUP(24, qup0_se5, emac0_ptp_aux, emac0_ptp_pps, qdss_cti, emac0_mcg2, _, _, _, _, _, _),
+ [25] = PINGROUP(25, qup0_se3, phase_flag, _, _, _, _, _, _, _, _, _),
+ [26] = PINGROUP(26, qup0_se3, phase_flag, _, _, _, _, _, _, _, _, _),
+ [27] = PINGROUP(27, qup0_se3, _, _, _, _, _, _, _, _, _, _),
+ [28] = PINGROUP(28, qup0_se3, phase_flag, _, _, _, _, _, _, _, _, _),
+ [29] = PINGROUP(29, qup0_se4, cci_i2c_sda, cci_async, emac0_ptp_pps, tgu_ch2, _, _, _, _, _, _),
+ [30] = PINGROUP(30, qup0_se4, cci_i2c_scl, cci_async, emac0_ptp_pps, tgu_ch3, _, _, _, _, _, _),
+ [31] = PINGROUP(31, qup0_se4, cci_i2c_sda, cci_async, emac0_ptp_aux, _, _, _, _, _, _, _),
+ [32] = PINGROUP(32, qup0_se4, cci_i2c_scl, emac0_ptp_aux, mdp_vsync, _, _, _, _, _, _, _),
+ [33] = PINGROUP(33, qup0_se2, qdss_gpio, _, _, _, _, _, _, _, _, _),
+ [34] = PINGROUP(34, qup0_se2, qdss_gpio, _, _, _, _, _, _, _, _, _),
+ [35] = PINGROUP(35, qup0_se2, gcc_gp1, _, _, _, _, _, _, _, _, _),
+ [36] = PINGROUP(36, qup0_se2, gcc_gp2, qdss_gpio, _, _, _, _, _, _, _, _),
+ [37] = PINGROUP(37, qup1_se0, ibi_i3c, qup1_se1, aoss_cti, _, _, _, _, _, _, _),
+ [38] = PINGROUP(38, qup1_se0, ibi_i3c, qup1_se1, aoss_cti, _, _, _, _, _, _, _),
+ [39] = PINGROUP(39, qup1_se1, ibi_i3c, qup1_se0, aoss_cti, _, _, _, _, _, _, _),
+ [40] = PINGROUP(40, qup1_se1, ibi_i3c, qup1_se0, aoss_cti, _, _, _, _, _, _, _),
+ [41] = PINGROUP(41, qup1_se3, _, _, _, _, _, _, _, _, _, _),
+ [42] = PINGROUP(42, qup1_se3, _, mdp_vsync, _, _, _, _, _, _, _, _),
+ [43] = PINGROUP(43, qup0_se7, _, tgu_ch0, _, _, _, _, _, _, _, _),
+ [44] = PINGROUP(44, qup0_se7, _, tgu_ch1, _, _, _, _, _, _, _, _),
+ [45] = PINGROUP(45, qup1_se4, hs1_mi2s, _, _, _, _, _, _, _, _, _),
+ [46] = PINGROUP(46, qup1_se4, hs1_mi2s, _, _, _, _, _, _, _, _, _),
+ [47] = PINGROUP(47, qup1_se4, hs1_mi2s, _, _, _, _, _, _, _, _, _),
+ [48] = PINGROUP(48, qup1_se4, hs1_mi2s, edp0_lcd, _, _, _, _, _, _, _, _),
+ [49] = PINGROUP(49, qup1_se5, hs2_mi2s, cci_timer, qdss_cti, edp1_lcd, ddr_pxi1, _, _, _, _, _),
+ [50] = PINGROUP(50, qup1_se5, hs2_mi2s, cci_timer, qdss_cti, _, ddr_pxi1, _, _, _, _, _),
+ [51] = PINGROUP(51, qup1_se5, hs2_mi2s, qdss_cti, _, _, _, _, _, _, _, _),
+ [52] = PINGROUP(52, qup1_se5, hs2_mi2s, qdss_cti, mdp_vsync, ddr_pxi2, _, _, _, _, _, _),
+ [53] = PINGROUP(53, ddr_bist, _, _, _, _, _, _, _, _, _, _),
+ [54] = PINGROUP(54, cci_i2c_sda, phase_flag, ddr_bist, _, _, _, _, _, _, _, _),
+ [55] = PINGROUP(55, cci_i2c_scl, phase_flag, ddr_bist, _, _, _, _, _, _, _, _),
+ [56] = PINGROUP(56, phase_flag, ddr_bist, _, _, _, _, _, _, _, _, _),
+ [57] = PINGROUP(57, cci_i2c_sda, prng_rosc0, qdss_gpio, _, _, _, _, _, _, _, _),
+ [58] = PINGROUP(58, cci_i2c_scl, prng_rosc1, qdss_gpio, _, _, _, _, _, _, _, _),
+ [59] = PINGROUP(59, cci_i2c_sda, prng_rosc2, qdss_gpio, _, _, _, _, _, _, _, _),
+ [60] = PINGROUP(60, cci_i2c_scl, prng_rosc3, qdss_gpio, _, _, _, _, _, _, _, _),
+ [61] = PINGROUP(61, cci_i2c_sda, qdss_gpio, _, _, _, _, _, _, _, _, _),
+ [62] = PINGROUP(62, cci_i2c_scl, qdss_gpio, _, _, _, _, _, _, _, _, _),
+ [63] = PINGROUP(63, cci_timer, cci_async, qdss_gpio, atest_usb2, _, _, _, _, _, _, _),
+ [64] = PINGROUP(64, cci_timer, cci_async, qdss_gpio, atest_usb2, _, _, _, _, _, _, _),
+ [65] = PINGROUP(65, cci_timer, cci_async, qdss_gpio, atest_usb2, _, _, _, _, _, _, _),
+ [66] = PINGROUP(66, phase_flag, _, atest_char, _, _, _, _, _, _, _, _),
+ [67] = PINGROUP(67, cam_mclk, vsense_trigger, atest_usb2, _, _, _, _, _, _, _, _),
+ [68] = PINGROUP(68, cam_mclk, gcc_gp4, atest_usb2, ddr_pxi0, _, _, _, _, _, _, _),
+ [69] = PINGROUP(69, cam_mclk, gcc_gp3, atest_usb2, ddr_pxi0, _, _, _, _, _, _, _),
+ [70] = PINGROUP(70, qdss_gpio, atest_char, _, _, _, _, _, _, _, _, _),
+ [71] = PINGROUP(71, qdss_gpio, atest_char, _, _, _, _, _, _, _, _, _),
+ [72] = PINGROUP(72, qdss_gpio, atest_char, _, _, _, _, _, _, _, _, _),
+ [73] = PINGROUP(73, _, qdss_gpio, _, _, _, _, _, _, _, _, _),
+ [74] = PINGROUP(74, pll_clk, qdss_gpio, atest_usb2, _, _, _, _, _, _, _, _),
+ [75] = PINGROUP(75, _, dbg_out, qdss_gpio, atest_usb2, _, _, _, _, _, _, _),
+ [76] = PINGROUP(76, gcc_gp5, tsense_pwm4, _, _, _, _, _, _, _, _, _),
+ [77] = PINGROUP(77, gcc_gp5, tsense_pwm3, _, _, _, _, _, _, _, _, _),
+ [78] = PINGROUP(78, tsense_pwm2, _, _, _, _, _, _, _, _, _, _),
+ [79] = PINGROUP(79, emac0_ptp_aux, emac0_ptp_pps, emac0_mcg3, _, tsense_pwm1, _, _, _, _, _, _),
+ [80] = PINGROUP(80, qup0_se6, mdp0_vsync6, _, atest_usb2, ddr_pxi3, _, _, _, _, _, _),
+ [81] = PINGROUP(81, qup0_se6, mdp0_vsync7, gcc_gp2, _, atest_usb2, ddr_pxi3, _, _, _, _, _),
+ [82] = PINGROUP(82, qup0_se6, gcc_gp3, _, _, _, _, _, _, _, _, _),
+ [83] = PINGROUP(83, qup0_se6, gcc_gp4, _, atest_usb2, ddr_pxi2, _, _, _, _, _, _),
+ [84] = PINGROUP(84, qup1_se2, gcc_gp1, _, atest_usb2, _, _, _, _, _, _, _),
+ [85] = PINGROUP(85, qup1_se2, _, atest_usb2, _, _, _, _, _, _, _, _),
+ [86] = PINGROUP(86, qup1_se2, _, _, _, _, _, _, _, _, _, _),
+ [87] = PINGROUP(87, qup1_se2, _, atest_usb2, _, _, _, _, _, _, _, _),
+ [88] = PINGROUP(88, qup1_se2, _, _, _, _, _, _, _, _, _, _),
+ [89] = PINGROUP(89, qup1_se6, qup1_se7, mdp0_vsync0, _, _, _, _, _, _, _, _),
+ [90] = PINGROUP(90, qup1_se6, qup1_se7, mdp0_vsync1, cri_trng, _, _, _, _, _, _, _),
+ [91] = PINGROUP(91, qup1_se7, qup1_se6, mdp0_vsync3, cri_trng, _, _, _, _, _, _, _),
+ [92] = PINGROUP(92, qup1_se7, qup1_se6, cri_trng, _, atest_usb2, _, _, _, _, _, _),
+ [93] = PINGROUP(93, atest_char, _, _, _, _, _, _, _, _, _, _),
+ [94] = PINGROUP(94, edp0_hot, _, _, _, _, _, _, _, _, _, _),
+ [95] = PINGROUP(95, _, _, _, _, _, _, _, _, _, _, _),
+ [96] = PINGROUP(96, _, _, _, _, _, _, _, _, _, _, _),
+ [97] = PINGROUP(97, mi2s_mclk0, jitter_bist, qdss_gpio, _, _, _, _, _, _, _, _),
+ [98] = PINGROUP(98, mi2s1_sck, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
+ [99] = PINGROUP(99, mi2s1_ws, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
+ [100] = PINGROUP(100, mi2s1_data0, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
+ [101] = PINGROUP(101, mi2s1_data1, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
+ [102] = PINGROUP(102, mi2s2_sck, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
+ [103] = PINGROUP(103, mi2s2_ws, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
+ [104] = PINGROUP(104, mi2s2_data0, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
+ [105] = PINGROUP(105, mi2s2_data1, audio_ref, phase_flag, _, qdss_gpio, _, _, _, _, _, _),
+ [106] = PINGROUP(106, hs0_mi2s, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
+ [107] = PINGROUP(107, hs0_mi2s, pll_bist, phase_flag, _, qdss_gpio, _, _, _, _, _, _),
+ [108] = PINGROUP(108, hs0_mi2s, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
+ [109] = PINGROUP(109, hs0_mi2s, mi2s_mclk1, qdss_gpio, _, _, _, _, _, _, _, _),
+ [110] = PINGROUP(110, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _, egpio),
+ [111] = PINGROUP(111, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _, egpio),
+ [112] = PINGROUP(112, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _, egpio),
+ [113] = PINGROUP(113, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _, egpio),
+ [114] = PINGROUP(114, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _, egpio),
+ [115] = PINGROUP(115, _, _, _, _, _, _, _, _, _, _, egpio),
+ [116] = PINGROUP(116, phase_flag, _, _, _, _, _, _, _, _, _, egpio),
+ [117] = PINGROUP(117, phase_flag, _, _, _, _, _, _, _, _, _, egpio),
+ [118] = PINGROUP(118, phase_flag, _, _, _, _, _, _, _, _, _, egpio),
+ [119] = PINGROUP(119, _, _, _, _, _, _, _, _, _, _, egpio),
+ [120] = PINGROUP(120, phase_flag, _, _, _, _, _, _, _, _, _, egpio),
+ [121] = PINGROUP(121, phase_flag, _, _, _, _, _, _, _, _, _, egpio),
+ [122] = PINGROUP(122, phase_flag, _, _, _, _, _, _, _, _, _, egpio),
+ [123] = PINGROUP(123, _, _, _, _, _, _, _, _, _, _, egpio),
+ [124] = PINGROUP(124, _, _, _, _, _, _, _, _, _, _, egpio),
+ [125] = PINGROUP(125, phase_flag, _, _, _, _, _, _, _, _, _, egpio),
+ [126] = PINGROUP(126, _, _, _, _, _, _, _, _, _, _, egpio),
+ [127] = PINGROUP(127, _, _, _, _, _, _, _, _, _, _, egpio),
+ [128] = PINGROUP(128, _, _, _, _, _, _, _, _, _, _, egpio),
+ [129] = PINGROUP(129, _, _, _, _, _, _, _, _, _, _, egpio),
+ [130] = PINGROUP(130, _, _, _, _, _, _, _, _, _, _, egpio),
+ [131] = PINGROUP(131, _, _, _, _, _, _, _, _, _, _, egpio),
+ [132] = PINGROUP(132, _, _, _, _, _, _, _, _, _, _, egpio),
+};
+
+static const struct msm_special_pin_data qcs8300_special_pins_data[] = {
+ [0] = UFS_RESET("ufs_reset", 0x92000),
+ [1] = SDC_QDSD_PINGROUP("sdc1_rclk", 0x89000, 15, 0),
+ [2] = SDC_QDSD_PINGROUP("sdc1_clk", 0x89000, 13, 6),
+ [3] = SDC_QDSD_PINGROUP("sdc1_cmd", 0x89000, 11, 3),
+ [4] = SDC_QDSD_PINGROUP("sdc1_data", 0x89000, 9, 0),
+};
+
+static const char *qcs8300_get_function_name(struct udevice *dev,
+ unsigned int selector)
+{
+ return msm_pinctrl_functions[selector].name;
+}
+
+static const char *qcs8300_get_pin_name(struct udevice *dev,
+ unsigned int selector)
+{
+ if (selector >= 133 && selector <= 137)
+ snprintf(pin_name, MAX_PIN_NAME_LEN, "%s",
+ qcs8300_special_pins_data[selector - 133].name);
+ else
+ snprintf(pin_name, MAX_PIN_NAME_LEN, "gpio%u", selector);
+
+ return pin_name;
+}
+
+static int qcs8300_get_function_mux(__maybe_unused unsigned int pin,
+ unsigned int selector)
+{
+ unsigned int i;
+ const msm_pin_function *func = qcs8300_pin_functions + pin;
+
+ for (i = 0; i < MSM_PIN_FUNCTION_COUNT; i++)
+ if ((*func)[i] == selector)
+ return i;
+
+ pr_err("Can't find requested function for pin %u\n", pin);
+
+ return -EINVAL;
+}
+
+static const struct msm_pinctrl_data qcs8300_data = {
+ .pin_data = {
+ .pin_count = 138,
+ .special_pins_start = 133,
+ .special_pins_data = qcs8300_special_pins_data,
+ },
+ .functions_count = ARRAY_SIZE(msm_pinctrl_functions),
+ .get_function_name = qcs8300_get_function_name,
+ .get_function_mux = qcs8300_get_function_mux,
+ .get_pin_name = qcs8300_get_pin_name,
+};
+
+static const struct udevice_id msm_pinctrl_ids[] = {
+ {
+ .compatible = "qcom,qcs8300-tlmm",
+ .data = (ulong)&qcs8300_data
+ },
+ { /* Sentinel */ }
+};
+
+U_BOOT_DRIVER(pinctrl_qcs8300) = {
+ .name = "pinctrl_qcs8300",
+ .id = UCLASS_NOP,
+ .of_match = msm_pinctrl_ids,
+ .ops = &msm_pinctrl_ops,
+ .bind = msm_pinctrl_bind,
+ .flags = DM_FLAG_PRE_RELOC,
+};
--
2.34.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 4/7] interconnect: qcom: Add QCS8300 interconnect driver
2026-08-12 1:11 [PATCH v2 0/7] qcom: qcs8300/monaco-evk: pinctrl, interconnect, RPMH clock and reboot-mode support Balaji Selvanathan via U-Boot
` (2 preceding siblings ...)
2026-08-12 1:12 ` [PATCH v2 3/7] pinctrl: qcom: Add QCS8300 pinctrl driver Balaji Selvanathan via U-Boot
@ 2026-08-12 1:12 ` Balaji Selvanathan via U-Boot
2026-08-12 1:12 ` [PATCH v2 5/7] arm64: dts: monaco-evk: Add reboot-mode support via PON/SDAM Balaji Selvanathan via U-Boot
` (3 subsequent siblings)
7 siblings, 0 replies; 15+ messages in thread
From: Balaji Selvanathan via U-Boot @ 2026-08-12 1:12 UTC (permalink / raw)
To: Sumit Garg, u-boot, u-boot-qcom
Cc: Lukasz Majewski, Tom Rini, Casey Connolly, Neil Armstrong,
Johan Jonker, Luca Weiss, Biswapriyo Nath, Ilias Apalodimas,
Balaji Selvanathan
Add the interconnect (NoC) driver for QCS8300.
Acked-by: Neil Armstrong <neil.armstrong@linaro.org>
Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
---
drivers/interconnect/qcom/Kconfig | 6 +
drivers/interconnect/qcom/Makefile | 1 +
drivers/interconnect/qcom/qcs8300.c | 269 ++++++++++++++++++++++++++++++++++++
drivers/interconnect/qcom/qcs8300.h | 24 ++++
4 files changed, 300 insertions(+)
diff --git a/drivers/interconnect/qcom/Kconfig b/drivers/interconnect/qcom/Kconfig
index b105c3a1f9a..906f2fa604a 100644
--- a/drivers/interconnect/qcom/Kconfig
+++ b/drivers/interconnect/qcom/Kconfig
@@ -5,6 +5,12 @@ config INTERCONNECT_QCOM_RPMH
Enable support for the interconnect helpers to vote with
the RPMh subsystems in Qualcomm SoCs
+config INTERCONNECT_QCOM_QCS8300
+ bool "Enable interconnect support for QCS8300 SoC"
+ depends on INTERCONNECT_QCOM_RPMH
+ help
+ Enable support for the interconnect driver for the QCS8300 SoC.
+
config INTERCONNECT_QCOM_SM8650
bool "Enable interconnect support for SM8650 SoC"
depends on INTERCONNECT_QCOM_RPMH
diff --git a/drivers/interconnect/qcom/Makefile b/drivers/interconnect/qcom/Makefile
index a33a65bd82e..6ba69269621 100644
--- a/drivers/interconnect/qcom/Makefile
+++ b/drivers/interconnect/qcom/Makefile
@@ -4,4 +4,5 @@
#
obj-$(CONFIG_$(PHASE_)INTERCONNECT_QCOM_RPMH) += icc-rpmh.o bcm-voter.o
+obj-$(CONFIG_$(PHASE_)INTERCONNECT_QCOM_QCS8300) += qcs8300.o
obj-$(CONFIG_$(PHASE_)INTERCONNECT_QCOM_SM8650) += sm8650.o
diff --git a/drivers/interconnect/qcom/qcs8300.c b/drivers/interconnect/qcom/qcs8300.c
new file mode 100644
index 00000000000..db5316af2cb
--- /dev/null
+++ b/drivers/interconnect/qcom/qcs8300.c
@@ -0,0 +1,269 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ *
+ */
+
+#include <dm.h>
+#include <interconnect-uclass.h>
+#include <dt-bindings/interconnect/qcom,qcs8300-rpmh.h>
+
+#include "icc-rpmh.h"
+#include "qcs8300.h"
+
+static struct qcom_icc_node xm_ufs_mem = {
+ .name = "xm_ufs_mem",
+ .id = QCS8300_MASTER_UFS_MEM,
+ .channels = 1,
+ .buswidth = 8,
+ .num_links = 1,
+ .links = { QCS8300_SLAVE_A1NOC_SNOC },
+};
+
+static struct qcom_icc_node qns_a1noc_snoc = {
+ .name = "qns_a1noc_snoc",
+ .id = QCS8300_SLAVE_A1NOC_SNOC,
+ .channels = 1,
+ .buswidth = 32,
+ .num_links = 1,
+ .links = { QCS8300_MASTER_A1NOC_SNOC },
+};
+
+static struct qcom_icc_node qnm_aggre1_noc = {
+ .name = "qnm_aggre1_noc",
+ .id = QCS8300_MASTER_A1NOC_SNOC,
+ .channels = 1,
+ .buswidth = 32,
+ .num_links = 1,
+ .links = { QCS8300_SLAVE_SNOC_GEM_NOC_SF },
+};
+
+static struct qcom_icc_node qns_gemnoc_sf = {
+ .name = "qns_gemnoc_sf",
+ .id = QCS8300_SLAVE_SNOC_GEM_NOC_SF,
+ .channels = 1,
+ .buswidth = 16,
+ .num_links = 1,
+ .links = { QCS8300_MASTER_SNOC_SF_MEM_NOC },
+};
+
+static struct qcom_icc_node qnm_snoc_sf = {
+ .name = "qnm_snoc_sf",
+ .id = QCS8300_MASTER_SNOC_SF_MEM_NOC,
+ .channels = 1,
+ .buswidth = 16,
+ .num_links = 1,
+ .links = { QCS8300_SLAVE_LLCC },
+};
+
+static struct qcom_icc_node chm_apps = {
+ .name = "chm_apps",
+ .id = QCS8300_MASTER_APPSS_PROC,
+ .channels = 4,
+ .buswidth = 32,
+ .num_links = 1,
+ .links = { QCS8300_SLAVE_GEM_NOC_CNOC },
+};
+
+static struct qcom_icc_node qns_gem_noc_cnoc = {
+ .name = "qns_gem_noc_cnoc",
+ .id = QCS8300_SLAVE_GEM_NOC_CNOC,
+ .channels = 1,
+ .buswidth = 16,
+ .num_links = 1,
+ .links = { QCS8300_MASTER_GEM_NOC_CNOC },
+};
+
+static struct qcom_icc_node qns_llcc = {
+ .name = "qns_llcc",
+ .id = QCS8300_SLAVE_LLCC,
+ .channels = 4,
+ .buswidth = 16,
+ .num_links = 1,
+ .links = { QCS8300_MASTER_LLCC },
+};
+
+static struct qcom_icc_node llcc_mc = {
+ .name = "llcc_mc",
+ .id = QCS8300_MASTER_LLCC,
+ .channels = 8,
+ .buswidth = 4,
+ .num_links = 1,
+ .links = { QCS8300_SLAVE_EBI1 },
+};
+
+static struct qcom_icc_node ebi = {
+ .name = "ebi",
+ .id = QCS8300_SLAVE_EBI1,
+ .channels = 8,
+ .buswidth = 4,
+ .num_links = 0,
+};
+
+static struct qcom_icc_node qnm_gemnoc_cnoc = {
+ .name = "qnm_gemnoc_cnoc",
+ .id = QCS8300_MASTER_GEM_NOC_CNOC,
+ .channels = 1,
+ .buswidth = 16,
+ .num_links = 1,
+ .links = { QCS8300_SLAVE_UFS_MEM_CFG },
+};
+
+static struct qcom_icc_node qhs_ufs_mem_cfg = {
+ .name = "qhs_ufs_mem_cfg",
+ .id = QCS8300_SLAVE_UFS_MEM_CFG,
+ .channels = 1,
+ .buswidth = 4,
+ .num_links = 0,
+};
+
+static struct qcom_icc_bcm bcm_sn3 = {
+ .name = "SN3",
+ .num_nodes = 2,
+ .nodes = { &qns_a1noc_snoc, &qnm_aggre1_noc },
+};
+
+static struct qcom_icc_bcm bcm_sn0 = {
+ .name = "SN0",
+ .keepalive = true,
+ .num_nodes = 1,
+ .nodes = { &qns_gemnoc_sf },
+};
+
+static struct qcom_icc_bcm bcm_sh0 = {
+ .name = "SH0",
+ .keepalive = true,
+ .num_nodes = 1,
+ .nodes = { &qns_llcc },
+};
+
+static struct qcom_icc_bcm bcm_sh2 = {
+ .name = "SH2",
+ .num_nodes = 1,
+ .nodes = { &chm_apps },
+};
+
+static struct qcom_icc_bcm bcm_acv = {
+ .name = "ACV",
+ .enable_mask = BIT(3),
+ .num_nodes = 1,
+ .nodes = { &ebi },
+};
+
+static struct qcom_icc_bcm bcm_mc0 = {
+ .name = "MC0",
+ .keepalive = true,
+ .num_nodes = 1,
+ .nodes = { &ebi },
+};
+
+static struct qcom_icc_bcm bcm_cn0 = {
+ .name = "CN0",
+ .keepalive = true,
+ .num_nodes = 1,
+ .nodes = { &qnm_gemnoc_cnoc },
+};
+
+static struct qcom_icc_bcm * const aggre1_noc_bcms[] = {
+ &bcm_sn3,
+};
+
+static struct qcom_icc_node * const aggre1_noc_nodes[] = {
+ [MASTER_UFS_MEM] = &xm_ufs_mem,
+ [SLAVE_A1NOC_SNOC] = &qns_a1noc_snoc,
+};
+
+static const struct qcom_icc_desc qcs8300_aggre1_noc = {
+ .nodes = aggre1_noc_nodes,
+ .num_nodes = ARRAY_SIZE(aggre1_noc_nodes),
+ .bcms = aggre1_noc_bcms,
+ .num_bcms = ARRAY_SIZE(aggre1_noc_bcms),
+};
+
+static struct qcom_icc_bcm * const system_noc_bcms[] = {
+ &bcm_sn0,
+};
+
+static struct qcom_icc_node * const system_noc_nodes[] = {
+ [MASTER_A1NOC_SNOC] = &qnm_aggre1_noc,
+ [SLAVE_SNOC_GEM_NOC_SF] = &qns_gemnoc_sf,
+};
+
+static const struct qcom_icc_desc qcs8300_system_noc = {
+ .nodes = system_noc_nodes,
+ .num_nodes = ARRAY_SIZE(system_noc_nodes),
+ .bcms = system_noc_bcms,
+ .num_bcms = ARRAY_SIZE(system_noc_bcms),
+};
+
+static struct qcom_icc_bcm * const gem_noc_bcms[] = {
+ &bcm_sh0,
+ &bcm_sh2,
+};
+
+static struct qcom_icc_node * const gem_noc_nodes[] = {
+ [MASTER_APPSS_PROC] = &chm_apps,
+ [MASTER_SNOC_SF_MEM_NOC] = &qnm_snoc_sf,
+ [SLAVE_GEM_NOC_CNOC] = &qns_gem_noc_cnoc,
+ [SLAVE_LLCC] = &qns_llcc,
+};
+
+static const struct qcom_icc_desc qcs8300_gem_noc = {
+ .nodes = gem_noc_nodes,
+ .num_nodes = ARRAY_SIZE(gem_noc_nodes),
+ .bcms = gem_noc_bcms,
+ .num_bcms = ARRAY_SIZE(gem_noc_bcms),
+};
+
+static struct qcom_icc_bcm * const mc_virt_bcms[] = {
+ &bcm_acv,
+ &bcm_mc0,
+};
+
+static struct qcom_icc_node * const mc_virt_nodes[] = {
+ [MASTER_LLCC] = &llcc_mc,
+ [SLAVE_EBI1] = &ebi,
+};
+
+static const struct qcom_icc_desc qcs8300_mc_virt = {
+ .nodes = mc_virt_nodes,
+ .num_nodes = ARRAY_SIZE(mc_virt_nodes),
+ .bcms = mc_virt_bcms,
+ .num_bcms = ARRAY_SIZE(mc_virt_bcms),
+};
+
+static struct qcom_icc_bcm * const config_noc_bcms[] = {
+ &bcm_cn0,
+};
+
+static struct qcom_icc_node * const config_noc_nodes[] = {
+ [MASTER_GEM_NOC_CNOC] = &qnm_gemnoc_cnoc,
+ [SLAVE_UFS_MEM_CFG] = &qhs_ufs_mem_cfg,
+};
+
+static const struct qcom_icc_desc qcs8300_config_noc = {
+ .nodes = config_noc_nodes,
+ .num_nodes = ARRAY_SIZE(config_noc_nodes),
+ .bcms = config_noc_bcms,
+ .num_bcms = ARRAY_SIZE(config_noc_bcms),
+};
+
+static const struct udevice_id qnoc_of_match[] = {
+ { .compatible = "qcom,qcs8300-aggre1-noc", .data = (ulong)&qcs8300_aggre1_noc },
+ { .compatible = "qcom,qcs8300-system-noc", .data = (ulong)&qcs8300_system_noc },
+ { .compatible = "qcom,qcs8300-gem-noc", .data = (ulong)&qcs8300_gem_noc },
+ { .compatible = "qcom,qcs8300-mc-virt", .data = (ulong)&qcs8300_mc_virt },
+ { .compatible = "qcom,qcs8300-config-noc", .data = (ulong)&qcs8300_config_noc },
+ { }
+};
+
+U_BOOT_DRIVER(qnoc_qcs8300) = {
+ .name = "qnoc-qcs8300",
+ .id = UCLASS_INTERCONNECT,
+ .of_match = qnoc_of_match,
+ .probe = qcom_icc_rpmh_probe,
+ .bind = qcom_icc_rpmh_bind,
+ .unbind = qcom_icc_rpmh_unbind,
+ .ops = &qcom_icc_rpmh_ops,
+ .plat_auto = sizeof(struct qcom_icc_provider),
+};
diff --git a/drivers/interconnect/qcom/qcs8300.h b/drivers/interconnect/qcom/qcs8300.h
new file mode 100644
index 00000000000..2dc523d127e
--- /dev/null
+++ b/drivers/interconnect/qcom/qcs8300.h
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * QCS8300 interconnect IDs
+ *
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+#ifndef __DRIVERS_INTERCONNECT_QCOM_QCS8300_H
+#define __DRIVERS_INTERCONNECT_QCOM_QCS8300_H
+
+#define QCS8300_MASTER_UFS_MEM 0
+#define QCS8300_SLAVE_A1NOC_SNOC 1
+#define QCS8300_MASTER_A1NOC_SNOC 2
+#define QCS8300_SLAVE_SNOC_GEM_NOC_SF 3
+#define QCS8300_MASTER_SNOC_SF_MEM_NOC 4
+#define QCS8300_SLAVE_LLCC 5
+#define QCS8300_MASTER_APPSS_PROC 6
+#define QCS8300_SLAVE_GEM_NOC_CNOC 7
+#define QCS8300_MASTER_GEM_NOC_CNOC 8
+#define QCS8300_MASTER_LLCC 9
+#define QCS8300_SLAVE_EBI1 10
+#define QCS8300_SLAVE_UFS_MEM_CFG 11
+
+#endif
--
2.34.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 5/7] arm64: dts: monaco-evk: Add reboot-mode support via PON/SDAM
2026-08-12 1:11 [PATCH v2 0/7] qcom: qcs8300/monaco-evk: pinctrl, interconnect, RPMH clock and reboot-mode support Balaji Selvanathan via U-Boot
` (3 preceding siblings ...)
2026-08-12 1:12 ` [PATCH v2 4/7] interconnect: qcom: Add QCS8300 interconnect driver Balaji Selvanathan via U-Boot
@ 2026-08-12 1:12 ` Balaji Selvanathan via U-Boot
2026-10-19 11:58 ` Sumit Garg
2026-08-12 1:12 ` [PATCH v2 6/7] arm64: dts: monaco-evk: Force vreg_l8a always-on to protect UFS VCC Balaji Selvanathan via U-Boot
` (2 subsequent siblings)
7 siblings, 1 reply; 15+ messages in thread
From: Balaji Selvanathan via U-Boot @ 2026-08-12 1:12 UTC (permalink / raw)
To: Sumit Garg, u-boot, u-boot-qcom
Cc: Lukasz Majewski, Tom Rini, Casey Connolly, Neil Armstrong,
Johan Jonker, Luca Weiss, Biswapriyo Nath, Ilias Apalodimas,
Balaji Selvanathan
monaco-pmics.dtsi has no PON/SDAM reboot-reason storage, so
U-Boot can't read the reboot-reason to tell if it should stop in
fastboot instead of booting the kernel.
Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
---
arch/arm/dts/monaco-evk-u-boot.dtsi | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/arch/arm/dts/monaco-evk-u-boot.dtsi b/arch/arm/dts/monaco-evk-u-boot.dtsi
new file mode 100644
index 00000000000..5520d111864
--- /dev/null
+++ b/arch/arm/dts/monaco-evk-u-boot.dtsi
@@ -0,0 +1,36 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
+ */
+
+/ {
+ reboot-mode {
+ compatible = "nvmem-reboot-mode";
+ nvmem-cells = <&reboot_reason>;
+ nvmem-cell-names = "reboot-mode";
+
+ mode-bootloader = <0x02>;
+ mode-recovery = <0x01>;
+ };
+};
+
+&pmm8620au_0 {
+ pmm8620au_0_pon: pon@1200 {
+ compatible = "qcom,pmk8350-pon";
+ reg = <0x1200>, <0x800>;
+ reg-names = "hlos", "pbs";
+ };
+
+ pmm8620au_0_sdam_0: nvram@7100 {
+ compatible = "qcom,spmi-sdam";
+ reg = <0x7100>;
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges = <0x0 0x7100 0x100>;
+
+ reboot_reason: reboot-reason@48 {
+ reg = <0x48 0x1>;
+ bits = <1 7>;
+ };
+ };
+};
--
2.34.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 6/7] arm64: dts: monaco-evk: Force vreg_l8a always-on to protect UFS VCC
2026-08-12 1:11 [PATCH v2 0/7] qcom: qcs8300/monaco-evk: pinctrl, interconnect, RPMH clock and reboot-mode support Balaji Selvanathan via U-Boot
` (4 preceding siblings ...)
2026-08-12 1:12 ` [PATCH v2 5/7] arm64: dts: monaco-evk: Add reboot-mode support via PON/SDAM Balaji Selvanathan via U-Boot
@ 2026-08-12 1:12 ` Balaji Selvanathan via U-Boot
2026-10-19 12:01 ` Sumit Garg
2026-08-12 1:12 ` [PATCH v2 7/7] configs: qcom_qcs8300: Switch to monaco-evk DT and enable new drivers Balaji Selvanathan via U-Boot
2026-10-08 12:44 ` [PATCH v2 0/7] qcom: qcs8300/monaco-evk: pinctrl, interconnect, RPMH clock and reboot-mode support Neil Armstrong
7 siblings, 1 reply; 15+ messages in thread
From: Balaji Selvanathan via U-Boot @ 2026-08-12 1:12 UTC (permalink / raw)
To: Sumit Garg, u-boot, u-boot-qcom
Cc: Lukasz Majewski, Tom Rini, Casey Connolly, Neil Armstrong,
Johan Jonker, Luca Weiss, Biswapriyo Nath, Ilias Apalodimas,
Balaji Selvanathan
vreg_l8a is the shared VCC rail for UFS (ufs_mem_hc vcc-supply) and
eMMC (sdhc_1 vmmc-supply). UFS holds no regulator vote of its own in
U-Boot, so nothing stops other consumers from disabling the rail
while UFS still needs it.
eMMC's power-cycle runs after UFS has already linked up and started
transferring data. Its power-off fires a real disable vote on
vreg_l8a, glitching UFS VCC while the link is live. UFS has no
recovery from this: every following command fails (OCS errors, UTP
timeouts, "Card did not respond to voltage select! : -110").
Force the rail always-on so the disable vote is rejected in
regulator_set_enable() (-EACCES) before it reaches the RPMh driver.
eMMC is non-removable and does not need a real power-cycle.
Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
---
arch/arm/dts/monaco-evk-u-boot.dtsi | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/arch/arm/dts/monaco-evk-u-boot.dtsi b/arch/arm/dts/monaco-evk-u-boot.dtsi
index 5520d111864..8e9102eae4d 100644
--- a/arch/arm/dts/monaco-evk-u-boot.dtsi
+++ b/arch/arm/dts/monaco-evk-u-boot.dtsi
@@ -34,3 +34,7 @@
};
};
};
+
+&vreg_l8a {
+ regulator-always-on;
+};
--
2.34.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v2 7/7] configs: qcom_qcs8300: Switch to monaco-evk DT and enable new drivers
2026-08-12 1:11 [PATCH v2 0/7] qcom: qcs8300/monaco-evk: pinctrl, interconnect, RPMH clock and reboot-mode support Balaji Selvanathan via U-Boot
` (5 preceding siblings ...)
2026-08-12 1:12 ` [PATCH v2 6/7] arm64: dts: monaco-evk: Force vreg_l8a always-on to protect UFS VCC Balaji Selvanathan via U-Boot
@ 2026-08-12 1:12 ` Balaji Selvanathan via U-Boot
2026-10-19 12:03 ` Sumit Garg
2026-10-08 12:44 ` [PATCH v2 0/7] qcom: qcs8300/monaco-evk: pinctrl, interconnect, RPMH clock and reboot-mode support Neil Armstrong
7 siblings, 1 reply; 15+ messages in thread
From: Balaji Selvanathan via U-Boot @ 2026-08-12 1:12 UTC (permalink / raw)
To: Sumit Garg, u-boot, u-boot-qcom
Cc: Lukasz Majewski, Tom Rini, Casey Connolly, Neil Armstrong,
Johan Jonker, Luca Weiss, Biswapriyo Nath, Ilias Apalodimas,
Balaji Selvanathan
Point qcom_qcs8300_defconfig at the monaco-evk device tree and
turn on required drivers.
Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
---
configs/qcom_qcs8300_defconfig | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/configs/qcom_qcs8300_defconfig b/configs/qcom_qcs8300_defconfig
index 5fffcddc16e..c8c4ccb9ab2 100644
--- a/configs/qcom_qcs8300_defconfig
+++ b/configs/qcom_qcs8300_defconfig
@@ -18,4 +18,8 @@ CONFIG_DEBUG_UART_CLOCK=14745600
CONFIG_TEXT_BASE=0xaf000000
CONFIG_REMAKE_ELF=y
-CONFIG_DEFAULT_DEVICE_TREE="qcom/qcs8300-ride"
+CONFIG_DEFAULT_DEVICE_TREE="qcom/monaco-evk"
+CONFIG_PINCTRL_QCOM_QCS8300=y
+CONFIG_INTERCONNECT_QCOM_QCS8300=y
+
+CONFIG_WATCHDOG_AUTOSTART=y
--
2.34.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v2 1/7] clk: qcom: Add shared RPMH clock driver for SM8550/SM8650/SA8775P
2026-08-12 1:11 ` [PATCH v2 1/7] clk: qcom: Add shared RPMH clock driver for SM8550/SM8650/SA8775P Balaji Selvanathan via U-Boot
@ 2026-08-12 12:26 ` Neil Armstrong
0 siblings, 0 replies; 15+ messages in thread
From: Neil Armstrong @ 2026-08-12 12:26 UTC (permalink / raw)
To: Balaji Selvanathan, Sumit Garg, u-boot, u-boot-qcom
Cc: Lukasz Majewski, Tom Rini, Casey Connolly, Johan Jonker,
Luca Weiss, Biswapriyo Nath, Ilias Apalodimas
On 8/12/26 03:11, Balaji Selvanathan wrote:
> sa8775p was being handled by the generic clock stub, which just
> no-ops every request. The RPMH_CXO_CLK (bi_tcxo_div2) it exposes is
> identical on SM8550, SM8650 and SA8775P, so rather than bury it in the
> sa8775p GCC driver, add a dedicated standalone RPMH clock driver shared
> by all three SoCs. It reports the fixed CXO rate and accepts no-op
> enable/set_rate requests.
>
> Monaco-evk also uses the same RPMH clock driver as sa8775p (it's
> rpmhcc DTS node has compatible "qcom,sa8775p-rpmh-clk").
>
> Drop the sm8550/sm8650/sa8775p rpmh-clk compatibles from the generic
> clock stub now that they are handled by the real driver.
>
> Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
> ---
> drivers/clk/clk-stub.c | 3 ---
> drivers/clk/qcom/Kconfig | 12 +++++++++
> drivers/clk/qcom/Makefile | 1 +
> drivers/clk/qcom/clock-rpmh.c | 61 +++++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 74 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/clk/clk-stub.c b/drivers/clk/clk-stub.c
> index 4a6c71016da..85e54841386 100644
> --- a/drivers/clk/clk-stub.c
> +++ b/drivers/clk/clk-stub.c
> @@ -51,7 +51,6 @@ static struct clk_ops stub_clk_ops = {
> static const struct udevice_id stub_clk_ids[] = {
> { .compatible = "qcom,qcs615-rpmh-clk" },
> { .compatible = "qcom,rpmcc" },
> - { .compatible = "qcom,sa8775p-rpmh-clk" },
> { .compatible = "qcom,sc7180-rpmh-clk" },
> { .compatible = "qcom,sc7280-rpmh-clk" },
> { .compatible = "qcom,sdm670-rpmh-clk" },
> @@ -59,8 +58,6 @@ static const struct udevice_id stub_clk_ids[] = {
> { .compatible = "qcom,sm6350-rpmh-clk" },
> { .compatible = "qcom,sm8150-rpmh-clk" },
> { .compatible = "qcom,sm8250-rpmh-clk" },
> - { .compatible = "qcom,sm8550-rpmh-clk" },
> - { .compatible = "qcom,sm8650-rpmh-clk" },
> { }
> };
>
> diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig
> index 9ad233c83ac..8596b93d4c4 100644
> --- a/drivers/clk/qcom/Kconfig
> +++ b/drivers/clk/qcom/Kconfig
> @@ -87,9 +87,19 @@ config CLK_QCOM_QCS8300
> on the Snapdragon QCS8300 SoC. This driver supports the clocks
> and resets exposed by the GCC hardware block.
>
> +config CLK_QCOM_RPMH
> + bool "Qualcomm RPMh clock driver"
> + depends on CLK
> + help
> + Say Y here to enable support for the RPMh-managed clocks found on
> + SoCs such as SM8550, SM8650 and SA8775P. These clocks are owned by
> + the always-on subsystem; the driver only reports the fixed CXO rate
> + (bi_tcxo_div2) and accepts no-op enable/set_rate requests.
> +
> config CLK_QCOM_SA8775P
> bool "Qualcomm SA8775 GCC"
> select CLK_QCOM
> + select CLK_QCOM_RPMH
> help
> Say Y here to enable support for the Global Clock Controller
> on the Snapdragon SA8775 SoC. This driver supports the clocks
> @@ -153,6 +163,7 @@ config CLK_QCOM_SM8250
> config CLK_QCOM_SM8550
> bool "Qualcomm SM8550 GCC"
> select CLK_QCOM
> + select CLK_QCOM_RPMH
> help
> Say Y here to enable support for the Global Clock Controller
> on the Snapdragon SM8550 SoC. This driver supports the clocks
> @@ -161,6 +172,7 @@ config CLK_QCOM_SM8550
> config CLK_QCOM_SM8650
> bool "Qualcomm SM8650 GCC"
> select CLK_QCOM
> + select CLK_QCOM_RPMH
> help
> Say Y here to enable support for the Global Clock Controller
> on the Snapdragon SM8650 SoC. This driver supports the clocks
> diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile
> index c0d95a6300e..f5630ae0f9c 100644
> --- a/drivers/clk/qcom/Makefile
> +++ b/drivers/clk/qcom/Makefile
> @@ -14,6 +14,7 @@ obj-$(CONFIG_CLK_QCOM_QCM2290) += clock-qcm2290.o
> obj-$(CONFIG_CLK_QCOM_QCS404) += clock-qcs404.o
> obj-$(CONFIG_CLK_QCOM_QCS8300) += clock-qcs8300.o
> obj-$(CONFIG_CLK_QCOM_QCS615) += clock-qcs615.o
> +obj-$(CONFIG_CLK_QCOM_RPMH) += clock-rpmh.o
> obj-$(CONFIG_CLK_QCOM_SA8775P) += clock-sa8775p.o
> obj-$(CONFIG_CLK_QCOM_SC7280) += clock-sc7280.o
> obj-$(CONFIG_CLK_QCOM_SM6115) += clock-sm6115.o
> diff --git a/drivers/clk/qcom/clock-rpmh.c b/drivers/clk/qcom/clock-rpmh.c
> new file mode 100644
> index 00000000000..69f2a751441
> --- /dev/null
> +++ b/drivers/clk/qcom/clock-rpmh.c
> @@ -0,0 +1,61 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * RPMh clock driver for Qualcomm SoCs
> + *
> + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
> + */
> +
> +#include <clk-uclass.h>
> +#include <dm.h>
> +#include <errno.h>
> +#include <dt-bindings/clock/qcom,rpmh.h>
> +
> +/* On-board TCXO */
> +#define TCXO_RATE 38400000
> +
> +/* bi_tcxo_div2 divided after RPMh output */
> +#define TCXO_DIV2_RATE (TCXO_RATE / 2)
> +
> +static ulong qcom_rpmh_clk_set_rate(struct clk *clk, ulong rate)
> +{
> + return (clk->rate = rate);
> +}
> +
> +static ulong qcom_rpmh_clk_get_rate(struct clk *clk)
> +{
> + ulong cxo_rate = dev_get_driver_data(clk->dev);
> +
> + switch (clk->id) {
> + case RPMH_CXO_CLK:
> + return cxo_rate;
> + default:
> + return clk->rate;
> + }
> +}
> +
> +static int qcom_rpmh_clk_nop(struct clk *clk)
> +{
> + return 0;
> +}
> +
> +static struct clk_ops qcom_rpmh_clk_ops = {
> + .set_rate = qcom_rpmh_clk_set_rate,
> + .get_rate = qcom_rpmh_clk_get_rate,
> + .enable = qcom_rpmh_clk_nop,
> + .disable = qcom_rpmh_clk_nop,
> +};
> +
> +static const struct udevice_id qcom_rpmh_clk_ids[] = {
> + { .compatible = "qcom,sa8775p-rpmh-clk", .data = TCXO_DIV2_RATE },
> + { .compatible = "qcom,sm8550-rpmh-clk", .data = TCXO_DIV2_RATE },
> + { .compatible = "qcom,sm8650-rpmh-clk", .data = TCXO_DIV2_RATE },
> + { }
> +};
> +
> +U_BOOT_DRIVER(qcom_rpmh_clk) = {
> + .name = "qcom_rpmh_clk",
> + .id = UCLASS_CLK,
> + .of_match = qcom_rpmh_clk_ids,
> + .ops = &qcom_rpmh_clk_ops,
> + .flags = DM_FLAG_DEFAULT_PD_CTRL_OFF,
> +};
>
This looks better !
Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
Thanks,
Neil
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 0/7] qcom: qcs8300/monaco-evk: pinctrl, interconnect, RPMH clock and reboot-mode support
2026-08-12 1:11 [PATCH v2 0/7] qcom: qcs8300/monaco-evk: pinctrl, interconnect, RPMH clock and reboot-mode support Balaji Selvanathan via U-Boot
` (6 preceding siblings ...)
2026-08-12 1:12 ` [PATCH v2 7/7] configs: qcom_qcs8300: Switch to monaco-evk DT and enable new drivers Balaji Selvanathan via U-Boot
@ 2026-10-08 12:44 ` Neil Armstrong
7 siblings, 0 replies; 15+ messages in thread
From: Neil Armstrong @ 2026-10-08 12:44 UTC (permalink / raw)
To: Sumit Garg, u-boot-qcom, Balaji Selvanathan via U-Boot
Cc: Tom Rini, Casey Connolly, Johan Jonker, Luca Weiss,
Biswapriyo Nath, Ilias Apalodimas, Balaji Selvanathan,
Lukasz Majewski
Hi,
On Wed, 12 Aug 2026 06:41:58 +0530, Balaji Selvanathan via U-Boot wrote:
> This series brings up the Monaco (QCS8300) EVK target with a dedicated
> pinctrl driver, interconnect driver, a real sa8775p RPMH clock driver
> (replacing the generic clk-stub no-op), and PON/SDAM-backed reboot-mode
> support so "reboot bootloader" from Linux can be honored by U-Boot.
> qcom_qcs8300_defconfig is switched over to the monaco-evk device tree.
>
>
> [...]
Thanks, Applied to https://git.u-boot-project.org/u-boot/custodians/neil.armstrong/u-boot-ufs (main)
[1/7] clk: qcom: Add shared RPMH clock driver for SM8550/SM8650/SA8775P
(no commit info)
[2/7] clk: qcom: qcs8300: Extend GCC clock driver to full gate/RCG coverage
(no commit info)
[3/7] pinctrl: qcom: Add QCS8300 pinctrl driver
(no commit info)
[4/7] interconnect: qcom: Add QCS8300 interconnect driver
https://git.u-boot-project.org/u-boot/custodians/neil.armstrong/u-boot-ufs/-/commit/9db5fb79c2630e9b4fcb0d17dd8b5f383c783cfb
[5/7] arm64: dts: monaco-evk: Add reboot-mode support via PON/SDAM
(no commit info)
[6/7] arm64: dts: monaco-evk: Force vreg_l8a always-on to protect UFS VCC
(no commit info)
[7/7] configs: qcom_qcs8300: Switch to monaco-evk DT and enable new drivers
(no commit info)
--
Neil
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 2/7] clk: qcom: qcs8300: Extend GCC clock driver to full gate/RCG coverage
2026-08-12 1:12 ` [PATCH v2 2/7] clk: qcom: qcs8300: Extend GCC clock driver to full gate/RCG coverage Balaji Selvanathan via U-Boot
@ 2026-10-19 11:54 ` Sumit Garg
0 siblings, 0 replies; 15+ messages in thread
From: Sumit Garg @ 2026-10-19 11:54 UTC (permalink / raw)
To: Balaji Selvanathan
Cc: Sumit Garg, u-boot, u-boot-qcom, Lukasz Majewski, Tom Rini,
Casey Connolly, Neil Armstrong, Johan Jonker, Luca Weiss,
Biswapriyo Nath, Ilias Apalodimas
On Wed, 12 Aug 2026 at 06:42:00 +0530, Balaji Selvanathan wrote:
>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 <balaji.selvanathan@oss.qualcomm.com>
>---
> drivers/clk/qcom/clock-qcs8300.c | 545 +++++++++++++++++++++++++++++++++++++--
> 1 file changed, 525 insertions(+), 20 deletions(-)
>
Reviewed-by: Sumit Garg <sumit.garg@oss.qualcomm.com>
-Sumit
>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
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 3/7] pinctrl: qcom: Add QCS8300 pinctrl driver
2026-08-12 1:12 ` [PATCH v2 3/7] pinctrl: qcom: Add QCS8300 pinctrl driver Balaji Selvanathan via U-Boot
@ 2026-10-19 11:56 ` Sumit Garg
0 siblings, 0 replies; 15+ messages in thread
From: Sumit Garg @ 2026-10-19 11:56 UTC (permalink / raw)
To: Balaji Selvanathan
Cc: Sumit Garg, u-boot, u-boot-qcom, Lukasz Majewski, Tom Rini,
Casey Connolly, Neil Armstrong, Johan Jonker, Luca Weiss,
Biswapriyo Nath, Ilias Apalodimas
On Wed, 12 Aug 2026 at 06:42:01 +0530, Balaji Selvanathan wrote:
>Add pinctrl support for QCS8300.
>
>Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
>---
> drivers/pinctrl/qcom/Kconfig | 8 +
> drivers/pinctrl/qcom/Makefile | 1 +
> drivers/pinctrl/qcom/pinctrl-qcs8300.c | 468 +++++++++++++++++++++++++++++++++
> 3 files changed, 477 insertions(+)
Reviewed-by: Sumit Garg <sumit.garg@oss.qualcomm.com>
-Sumit
>
>diff --git a/drivers/pinctrl/qcom/Kconfig b/drivers/pinctrl/qcom/Kconfig
>index 0bea461fcc3..2af71945c4d 100644
>--- a/drivers/pinctrl/qcom/Kconfig
>+++ b/drivers/pinctrl/qcom/Kconfig
>@@ -86,6 +86,14 @@ config PINCTRL_QCOM_QCS615
> Say Y here to enable support for pinctrl on the Snapdragon QCS615 SoC,
> as well as the associated GPIO driver.
>
>+config PINCTRL_QCOM_QCS8300
>+ bool "Qualcomm QCS8300 Pinctrl"
>+ default y if PINCTRL_QCOM_GENERIC
>+ select PINCTRL_QCOM
>+ help
>+ Say Y here to enable support for pinctrl on the Snapdragon QCS8300 SoC,
>+ as well as the associated GPIO driver.
>+
> config PINCTRL_QCOM_SA8775P
> bool "Qualcomm SA8775P Pinctrl"
> default y if PINCTRL_QCOM_GENERIC
>diff --git a/drivers/pinctrl/qcom/Makefile b/drivers/pinctrl/qcom/Makefile
>index 87cb128c4d4..e10fbc3d3ec 100644
>--- a/drivers/pinctrl/qcom/Makefile
>+++ b/drivers/pinctrl/qcom/Makefile
>@@ -12,6 +12,7 @@ obj-$(CONFIG_PINCTRL_QCOM_MILOS) += pinctrl-milos.o
> obj-$(CONFIG_PINCTRL_QCOM_QCM2290) += pinctrl-qcm2290.o
> obj-$(CONFIG_PINCTRL_QCOM_QCS404) += pinctrl-qcs404.o
> obj-$(CONFIG_PINCTRL_QCOM_QCS615) += pinctrl-qcs615.o
>+obj-$(CONFIG_PINCTRL_QCOM_QCS8300) += pinctrl-qcs8300.o
> obj-$(CONFIG_PINCTRL_QCOM_SA8775P) += pinctrl-sa8775p.o
> obj-$(CONFIG_PINCTRL_QCOM_SC7280) += pinctrl-sc7280.o
> obj-$(CONFIG_PINCTRL_QCOM_SDM660) += pinctrl-sdm660.o
>diff --git a/drivers/pinctrl/qcom/pinctrl-qcs8300.c b/drivers/pinctrl/qcom/pinctrl-qcs8300.c
>new file mode 100644
>index 00000000000..91f7c4fcf1e
>--- /dev/null
>+++ b/drivers/pinctrl/qcom/pinctrl-qcs8300.c
>@@ -0,0 +1,468 @@
>+// SPDX-License-Identifier: GPL-2.0-only
>+/*
>+ * Qualcomm QCS8300 pinctrl
>+ *
>+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
>+ *
>+ */
>+
>+#include <dm.h>
>+
>+#include "pinctrl-qcom.h"
>+
>+#define MAX_PIN_NAME_LEN 32
>+#define MSM_PIN_FUNCTION_COUNT 12
>+
>+static char pin_name[MAX_PIN_NAME_LEN] __section(".data");
>+
>+typedef unsigned int msm_pin_function[MSM_PIN_FUNCTION_COUNT];
>+
>+#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11)\
>+ {\
>+ msm_mux_gpio, /* gpio mode */\
>+ msm_mux_##f1,\
>+ msm_mux_##f2,\
>+ msm_mux_##f3,\
>+ msm_mux_##f4,\
>+ msm_mux_##f5,\
>+ msm_mux_##f6,\
>+ msm_mux_##f7,\
>+ msm_mux_##f8,\
>+ msm_mux_##f9,\
>+ msm_mux_##f10,\
>+ msm_mux_##f11 /* egpio mode */\
>+ }
>+
>+#define SDC_QDSD_PINGROUP(pg_name, ctl, pull, drv)\
>+ {\
>+ .name = pg_name,\
>+ .ctl_reg = ctl,\
>+ .io_reg = 0,\
>+ .pull_bit = pull,\
>+ .drv_bit = drv,\
>+ .oe_bit = -1,\
>+ .in_bit = -1,\
>+ .out_bit = -1,\
>+ }
>+
>+#define UFS_RESET(pg_name, ctl)\
>+ {\
>+ .name = pg_name,\
>+ .ctl_reg = ctl,\
>+ .io_reg = ctl + 0x4,\
>+ .pull_bit = 3,\
>+ .drv_bit = 0,\
>+ .oe_bit = -1,\
>+ .in_bit = -1,\
>+ .out_bit = 0,\
>+ }
>+
>+enum qcs8300_functions {
>+ msm_mux_gpio,
>+ msm_mux_aoss_cti,
>+ msm_mux_atest_char,
>+ msm_mux_atest_usb2,
>+ msm_mux_audio_ref,
>+ msm_mux_cam_mclk,
>+ msm_mux_cci_async,
>+ msm_mux_cci_i2c_scl,
>+ msm_mux_cci_i2c_sda,
>+ msm_mux_cci_timer,
>+ msm_mux_cri_trng,
>+ msm_mux_dbg_out,
>+ msm_mux_ddr_bist,
>+ msm_mux_ddr_pxi0,
>+ msm_mux_ddr_pxi1,
>+ msm_mux_ddr_pxi2,
>+ msm_mux_ddr_pxi3,
>+ msm_mux_edp0_hot,
>+ msm_mux_edp0_lcd,
>+ msm_mux_edp1_lcd,
>+ msm_mux_egpio,
>+ msm_mux_emac0_mcg0,
>+ msm_mux_emac0_mcg1,
>+ msm_mux_emac0_mcg2,
>+ msm_mux_emac0_mcg3,
>+ msm_mux_emac0_mdc,
>+ msm_mux_emac0_mdio,
>+ msm_mux_emac0_ptp_aux,
>+ msm_mux_emac0_ptp_pps,
>+ msm_mux_gcc_gp1,
>+ msm_mux_gcc_gp2,
>+ msm_mux_gcc_gp3,
>+ msm_mux_gcc_gp4,
>+ msm_mux_gcc_gp5,
>+ msm_mux_hs0_mi2s,
>+ msm_mux_hs1_mi2s,
>+ msm_mux_hs2_mi2s,
>+ msm_mux_ibi_i3c,
>+ msm_mux_jitter_bist,
>+ msm_mux_mdp0_vsync0,
>+ msm_mux_mdp0_vsync1,
>+ msm_mux_mdp0_vsync3,
>+ msm_mux_mdp0_vsync6,
>+ msm_mux_mdp0_vsync7,
>+ msm_mux_mdp_vsync,
>+ msm_mux_mi2s1_data0,
>+ msm_mux_mi2s1_data1,
>+ msm_mux_mi2s1_sck,
>+ msm_mux_mi2s1_ws,
>+ msm_mux_mi2s2_data0,
>+ msm_mux_mi2s2_data1,
>+ msm_mux_mi2s2_sck,
>+ msm_mux_mi2s2_ws,
>+ msm_mux_mi2s_mclk0,
>+ msm_mux_mi2s_mclk1,
>+ msm_mux_pcie0_clkreq,
>+ msm_mux_pcie1_clkreq,
>+ msm_mux_phase_flag,
>+ msm_mux_pll_bist,
>+ msm_mux_pll_clk,
>+ msm_mux_prng_rosc0,
>+ msm_mux_prng_rosc1,
>+ msm_mux_prng_rosc2,
>+ msm_mux_prng_rosc3,
>+ msm_mux_qdss_cti,
>+ msm_mux_qdss_gpio,
>+ msm_mux_qup0_se0,
>+ msm_mux_qup0_se1,
>+ msm_mux_qup0_se2,
>+ msm_mux_qup0_se3,
>+ msm_mux_qup0_se4,
>+ msm_mux_qup0_se5,
>+ msm_mux_qup0_se6,
>+ msm_mux_qup0_se7,
>+ msm_mux_qup1_se0,
>+ msm_mux_qup1_se1,
>+ msm_mux_qup1_se2,
>+ msm_mux_qup1_se3,
>+ msm_mux_qup1_se4,
>+ msm_mux_qup1_se5,
>+ msm_mux_qup1_se6,
>+ msm_mux_qup1_se7,
>+ msm_mux_qup2_se0,
>+ msm_mux_sailss_emac0,
>+ msm_mux_sailss_ospi,
>+ msm_mux_sgmii_phy,
>+ msm_mux_tb_trig,
>+ msm_mux_tgu_ch0,
>+ msm_mux_tgu_ch1,
>+ msm_mux_tgu_ch2,
>+ msm_mux_tgu_ch3,
>+ msm_mux_tsense_pwm1,
>+ msm_mux_tsense_pwm2,
>+ msm_mux_tsense_pwm3,
>+ msm_mux_tsense_pwm4,
>+ msm_mux_usb2phy_ac,
>+ msm_mux_vsense_trigger,
>+ msm_mux__,
>+};
>+
>+#define MSM_PIN_FUNCTION(fname)\
>+ [msm_mux_##fname] = {#fname, msm_mux_##fname}
>+
>+static const struct pinctrl_function msm_pinctrl_functions[] = {
>+ MSM_PIN_FUNCTION(gpio),
>+ MSM_PIN_FUNCTION(aoss_cti),
>+ MSM_PIN_FUNCTION(atest_char),
>+ MSM_PIN_FUNCTION(atest_usb2),
>+ MSM_PIN_FUNCTION(audio_ref),
>+ MSM_PIN_FUNCTION(cam_mclk),
>+ MSM_PIN_FUNCTION(cci_async),
>+ MSM_PIN_FUNCTION(cci_i2c_scl),
>+ MSM_PIN_FUNCTION(cci_i2c_sda),
>+ MSM_PIN_FUNCTION(cci_timer),
>+ MSM_PIN_FUNCTION(cri_trng),
>+ MSM_PIN_FUNCTION(dbg_out),
>+ MSM_PIN_FUNCTION(ddr_bist),
>+ MSM_PIN_FUNCTION(ddr_pxi0),
>+ MSM_PIN_FUNCTION(ddr_pxi1),
>+ MSM_PIN_FUNCTION(ddr_pxi2),
>+ MSM_PIN_FUNCTION(ddr_pxi3),
>+ MSM_PIN_FUNCTION(edp0_hot),
>+ MSM_PIN_FUNCTION(edp0_lcd),
>+ MSM_PIN_FUNCTION(edp1_lcd),
>+ MSM_PIN_FUNCTION(egpio),
>+ MSM_PIN_FUNCTION(emac0_mcg0),
>+ MSM_PIN_FUNCTION(emac0_mcg1),
>+ MSM_PIN_FUNCTION(emac0_mcg2),
>+ MSM_PIN_FUNCTION(emac0_mcg3),
>+ MSM_PIN_FUNCTION(emac0_mdc),
>+ MSM_PIN_FUNCTION(emac0_mdio),
>+ MSM_PIN_FUNCTION(emac0_ptp_aux),
>+ MSM_PIN_FUNCTION(emac0_ptp_pps),
>+ MSM_PIN_FUNCTION(gcc_gp1),
>+ MSM_PIN_FUNCTION(gcc_gp2),
>+ MSM_PIN_FUNCTION(gcc_gp3),
>+ MSM_PIN_FUNCTION(gcc_gp4),
>+ MSM_PIN_FUNCTION(gcc_gp5),
>+ MSM_PIN_FUNCTION(hs0_mi2s),
>+ MSM_PIN_FUNCTION(hs1_mi2s),
>+ MSM_PIN_FUNCTION(hs2_mi2s),
>+ MSM_PIN_FUNCTION(ibi_i3c),
>+ MSM_PIN_FUNCTION(jitter_bist),
>+ MSM_PIN_FUNCTION(mdp0_vsync0),
>+ MSM_PIN_FUNCTION(mdp0_vsync1),
>+ MSM_PIN_FUNCTION(mdp0_vsync3),
>+ MSM_PIN_FUNCTION(mdp0_vsync6),
>+ MSM_PIN_FUNCTION(mdp0_vsync7),
>+ MSM_PIN_FUNCTION(mdp_vsync),
>+ MSM_PIN_FUNCTION(mi2s1_data0),
>+ MSM_PIN_FUNCTION(mi2s1_data1),
>+ MSM_PIN_FUNCTION(mi2s1_sck),
>+ MSM_PIN_FUNCTION(mi2s1_ws),
>+ MSM_PIN_FUNCTION(mi2s2_data0),
>+ MSM_PIN_FUNCTION(mi2s2_data1),
>+ MSM_PIN_FUNCTION(mi2s2_sck),
>+ MSM_PIN_FUNCTION(mi2s2_ws),
>+ MSM_PIN_FUNCTION(mi2s_mclk0),
>+ MSM_PIN_FUNCTION(mi2s_mclk1),
>+ MSM_PIN_FUNCTION(pcie0_clkreq),
>+ MSM_PIN_FUNCTION(pcie1_clkreq),
>+ MSM_PIN_FUNCTION(phase_flag),
>+ MSM_PIN_FUNCTION(pll_bist),
>+ MSM_PIN_FUNCTION(pll_clk),
>+ MSM_PIN_FUNCTION(prng_rosc0),
>+ MSM_PIN_FUNCTION(prng_rosc1),
>+ MSM_PIN_FUNCTION(prng_rosc2),
>+ MSM_PIN_FUNCTION(prng_rosc3),
>+ MSM_PIN_FUNCTION(qdss_cti),
>+ MSM_PIN_FUNCTION(qdss_gpio),
>+ MSM_PIN_FUNCTION(qup0_se0),
>+ MSM_PIN_FUNCTION(qup0_se1),
>+ MSM_PIN_FUNCTION(qup0_se2),
>+ MSM_PIN_FUNCTION(qup0_se3),
>+ MSM_PIN_FUNCTION(qup0_se4),
>+ MSM_PIN_FUNCTION(qup0_se5),
>+ MSM_PIN_FUNCTION(qup0_se6),
>+ MSM_PIN_FUNCTION(qup0_se7),
>+ MSM_PIN_FUNCTION(qup1_se0),
>+ MSM_PIN_FUNCTION(qup1_se1),
>+ MSM_PIN_FUNCTION(qup1_se2),
>+ MSM_PIN_FUNCTION(qup1_se3),
>+ MSM_PIN_FUNCTION(qup1_se4),
>+ MSM_PIN_FUNCTION(qup1_se5),
>+ MSM_PIN_FUNCTION(qup1_se6),
>+ MSM_PIN_FUNCTION(qup1_se7),
>+ MSM_PIN_FUNCTION(qup2_se0),
>+ MSM_PIN_FUNCTION(sailss_emac0),
>+ MSM_PIN_FUNCTION(sailss_ospi),
>+ MSM_PIN_FUNCTION(sgmii_phy),
>+ MSM_PIN_FUNCTION(tb_trig),
>+ MSM_PIN_FUNCTION(tgu_ch0),
>+ MSM_PIN_FUNCTION(tgu_ch1),
>+ MSM_PIN_FUNCTION(tgu_ch2),
>+ MSM_PIN_FUNCTION(tgu_ch3),
>+ MSM_PIN_FUNCTION(tsense_pwm1),
>+ MSM_PIN_FUNCTION(tsense_pwm2),
>+ MSM_PIN_FUNCTION(tsense_pwm3),
>+ MSM_PIN_FUNCTION(tsense_pwm4),
>+ MSM_PIN_FUNCTION(usb2phy_ac),
>+ MSM_PIN_FUNCTION(vsense_trigger),
>+};
>+
>+static const msm_pin_function qcs8300_pin_functions[] = {
>+ [0] = PINGROUP(0, _, _, _, _, _, _, _, _, _, _, _),
>+ [1] = PINGROUP(1, pcie0_clkreq, _, _, _, _, _, _, _, _, _, _),
>+ [2] = PINGROUP(2, _, _, _, _, _, _, _, _, _, _, _),
>+ [3] = PINGROUP(3, phase_flag, _, _, _, _, _, _, _, _, _, _),
>+ [4] = PINGROUP(4, sgmii_phy, qdss_cti, _, _, _, _, _, _, _, _, _),
>+ [5] = PINGROUP(5, emac0_mdc, qdss_cti, _, _, _, _, _, _, _, _, _),
>+ [6] = PINGROUP(6, emac0_mdio, _, _, _, _, _, _, _, _, _, _),
>+ [7] = PINGROUP(7, usb2phy_ac, _, _, _, _, _, _, _, _, _, _),
>+ [8] = PINGROUP(8, usb2phy_ac, _, _, _, _, _, _, _, _, _, _),
>+ [9] = PINGROUP(9, phase_flag, _, _, _, _, _, _, _, _, _, _),
>+ [10] = PINGROUP(10, qup2_se0, emac0_mcg0, _, _, _, _, _, _, _, _, _),
>+ [11] = PINGROUP(11, qup2_se0, emac0_mcg1, _, _, _, _, _, _, _, _, _),
>+ [12] = PINGROUP(12, qup2_se0, _, _, _, _, _, _, _, _, _, _),
>+ [13] = PINGROUP(13, qup2_se0, _, _, _, _, _, _, _, _, _, _),
>+ [14] = PINGROUP(14, qup2_se0, tb_trig, _, _, _, _, _, _, _, _, _),
>+ [15] = PINGROUP(15, qup2_se0, _, sailss_ospi, sailss_emac0, _, _, _, _, _, _, _),
>+ [16] = PINGROUP(16, qup2_se0, _, _, sailss_ospi, sailss_emac0, _, _, _, _, _, _),
>+ [17] = PINGROUP(17, qup0_se0, qup0_se1, ibi_i3c, _, _, _, _, _, _, _, _),
>+ [18] = PINGROUP(18, qup0_se0, qup0_se1, ibi_i3c, _, _, _, _, _, _, _, _),
>+ [19] = PINGROUP(19, qup0_se1, qup0_se0, cci_timer, ibi_i3c, _, _, _, _, _, _, _),
>+ [20] = PINGROUP(20, qup0_se1, qup0_se0, cci_timer, ibi_i3c, _, _, _, _, _, _, _),
>+ [21] = PINGROUP(21, qup0_se5, cci_timer, _, _, _, _, _, _, _, _, _),
>+ [22] = PINGROUP(22, pcie1_clkreq, qup0_se5, cci_timer, _, _, _, _, _, _, _, _),
>+ [23] = PINGROUP(23, qup0_se5, cci_timer, qdss_cti, _, _, _, _, _, _, _, _),
>+ [24] = PINGROUP(24, qup0_se5, emac0_ptp_aux, emac0_ptp_pps, qdss_cti, emac0_mcg2, _, _, _, _, _, _),
>+ [25] = PINGROUP(25, qup0_se3, phase_flag, _, _, _, _, _, _, _, _, _),
>+ [26] = PINGROUP(26, qup0_se3, phase_flag, _, _, _, _, _, _, _, _, _),
>+ [27] = PINGROUP(27, qup0_se3, _, _, _, _, _, _, _, _, _, _),
>+ [28] = PINGROUP(28, qup0_se3, phase_flag, _, _, _, _, _, _, _, _, _),
>+ [29] = PINGROUP(29, qup0_se4, cci_i2c_sda, cci_async, emac0_ptp_pps, tgu_ch2, _, _, _, _, _, _),
>+ [30] = PINGROUP(30, qup0_se4, cci_i2c_scl, cci_async, emac0_ptp_pps, tgu_ch3, _, _, _, _, _, _),
>+ [31] = PINGROUP(31, qup0_se4, cci_i2c_sda, cci_async, emac0_ptp_aux, _, _, _, _, _, _, _),
>+ [32] = PINGROUP(32, qup0_se4, cci_i2c_scl, emac0_ptp_aux, mdp_vsync, _, _, _, _, _, _, _),
>+ [33] = PINGROUP(33, qup0_se2, qdss_gpio, _, _, _, _, _, _, _, _, _),
>+ [34] = PINGROUP(34, qup0_se2, qdss_gpio, _, _, _, _, _, _, _, _, _),
>+ [35] = PINGROUP(35, qup0_se2, gcc_gp1, _, _, _, _, _, _, _, _, _),
>+ [36] = PINGROUP(36, qup0_se2, gcc_gp2, qdss_gpio, _, _, _, _, _, _, _, _),
>+ [37] = PINGROUP(37, qup1_se0, ibi_i3c, qup1_se1, aoss_cti, _, _, _, _, _, _, _),
>+ [38] = PINGROUP(38, qup1_se0, ibi_i3c, qup1_se1, aoss_cti, _, _, _, _, _, _, _),
>+ [39] = PINGROUP(39, qup1_se1, ibi_i3c, qup1_se0, aoss_cti, _, _, _, _, _, _, _),
>+ [40] = PINGROUP(40, qup1_se1, ibi_i3c, qup1_se0, aoss_cti, _, _, _, _, _, _, _),
>+ [41] = PINGROUP(41, qup1_se3, _, _, _, _, _, _, _, _, _, _),
>+ [42] = PINGROUP(42, qup1_se3, _, mdp_vsync, _, _, _, _, _, _, _, _),
>+ [43] = PINGROUP(43, qup0_se7, _, tgu_ch0, _, _, _, _, _, _, _, _),
>+ [44] = PINGROUP(44, qup0_se7, _, tgu_ch1, _, _, _, _, _, _, _, _),
>+ [45] = PINGROUP(45, qup1_se4, hs1_mi2s, _, _, _, _, _, _, _, _, _),
>+ [46] = PINGROUP(46, qup1_se4, hs1_mi2s, _, _, _, _, _, _, _, _, _),
>+ [47] = PINGROUP(47, qup1_se4, hs1_mi2s, _, _, _, _, _, _, _, _, _),
>+ [48] = PINGROUP(48, qup1_se4, hs1_mi2s, edp0_lcd, _, _, _, _, _, _, _, _),
>+ [49] = PINGROUP(49, qup1_se5, hs2_mi2s, cci_timer, qdss_cti, edp1_lcd, ddr_pxi1, _, _, _, _, _),
>+ [50] = PINGROUP(50, qup1_se5, hs2_mi2s, cci_timer, qdss_cti, _, ddr_pxi1, _, _, _, _, _),
>+ [51] = PINGROUP(51, qup1_se5, hs2_mi2s, qdss_cti, _, _, _, _, _, _, _, _),
>+ [52] = PINGROUP(52, qup1_se5, hs2_mi2s, qdss_cti, mdp_vsync, ddr_pxi2, _, _, _, _, _, _),
>+ [53] = PINGROUP(53, ddr_bist, _, _, _, _, _, _, _, _, _, _),
>+ [54] = PINGROUP(54, cci_i2c_sda, phase_flag, ddr_bist, _, _, _, _, _, _, _, _),
>+ [55] = PINGROUP(55, cci_i2c_scl, phase_flag, ddr_bist, _, _, _, _, _, _, _, _),
>+ [56] = PINGROUP(56, phase_flag, ddr_bist, _, _, _, _, _, _, _, _, _),
>+ [57] = PINGROUP(57, cci_i2c_sda, prng_rosc0, qdss_gpio, _, _, _, _, _, _, _, _),
>+ [58] = PINGROUP(58, cci_i2c_scl, prng_rosc1, qdss_gpio, _, _, _, _, _, _, _, _),
>+ [59] = PINGROUP(59, cci_i2c_sda, prng_rosc2, qdss_gpio, _, _, _, _, _, _, _, _),
>+ [60] = PINGROUP(60, cci_i2c_scl, prng_rosc3, qdss_gpio, _, _, _, _, _, _, _, _),
>+ [61] = PINGROUP(61, cci_i2c_sda, qdss_gpio, _, _, _, _, _, _, _, _, _),
>+ [62] = PINGROUP(62, cci_i2c_scl, qdss_gpio, _, _, _, _, _, _, _, _, _),
>+ [63] = PINGROUP(63, cci_timer, cci_async, qdss_gpio, atest_usb2, _, _, _, _, _, _, _),
>+ [64] = PINGROUP(64, cci_timer, cci_async, qdss_gpio, atest_usb2, _, _, _, _, _, _, _),
>+ [65] = PINGROUP(65, cci_timer, cci_async, qdss_gpio, atest_usb2, _, _, _, _, _, _, _),
>+ [66] = PINGROUP(66, phase_flag, _, atest_char, _, _, _, _, _, _, _, _),
>+ [67] = PINGROUP(67, cam_mclk, vsense_trigger, atest_usb2, _, _, _, _, _, _, _, _),
>+ [68] = PINGROUP(68, cam_mclk, gcc_gp4, atest_usb2, ddr_pxi0, _, _, _, _, _, _, _),
>+ [69] = PINGROUP(69, cam_mclk, gcc_gp3, atest_usb2, ddr_pxi0, _, _, _, _, _, _, _),
>+ [70] = PINGROUP(70, qdss_gpio, atest_char, _, _, _, _, _, _, _, _, _),
>+ [71] = PINGROUP(71, qdss_gpio, atest_char, _, _, _, _, _, _, _, _, _),
>+ [72] = PINGROUP(72, qdss_gpio, atest_char, _, _, _, _, _, _, _, _, _),
>+ [73] = PINGROUP(73, _, qdss_gpio, _, _, _, _, _, _, _, _, _),
>+ [74] = PINGROUP(74, pll_clk, qdss_gpio, atest_usb2, _, _, _, _, _, _, _, _),
>+ [75] = PINGROUP(75, _, dbg_out, qdss_gpio, atest_usb2, _, _, _, _, _, _, _),
>+ [76] = PINGROUP(76, gcc_gp5, tsense_pwm4, _, _, _, _, _, _, _, _, _),
>+ [77] = PINGROUP(77, gcc_gp5, tsense_pwm3, _, _, _, _, _, _, _, _, _),
>+ [78] = PINGROUP(78, tsense_pwm2, _, _, _, _, _, _, _, _, _, _),
>+ [79] = PINGROUP(79, emac0_ptp_aux, emac0_ptp_pps, emac0_mcg3, _, tsense_pwm1, _, _, _, _, _, _),
>+ [80] = PINGROUP(80, qup0_se6, mdp0_vsync6, _, atest_usb2, ddr_pxi3, _, _, _, _, _, _),
>+ [81] = PINGROUP(81, qup0_se6, mdp0_vsync7, gcc_gp2, _, atest_usb2, ddr_pxi3, _, _, _, _, _),
>+ [82] = PINGROUP(82, qup0_se6, gcc_gp3, _, _, _, _, _, _, _, _, _),
>+ [83] = PINGROUP(83, qup0_se6, gcc_gp4, _, atest_usb2, ddr_pxi2, _, _, _, _, _, _),
>+ [84] = PINGROUP(84, qup1_se2, gcc_gp1, _, atest_usb2, _, _, _, _, _, _, _),
>+ [85] = PINGROUP(85, qup1_se2, _, atest_usb2, _, _, _, _, _, _, _, _),
>+ [86] = PINGROUP(86, qup1_se2, _, _, _, _, _, _, _, _, _, _),
>+ [87] = PINGROUP(87, qup1_se2, _, atest_usb2, _, _, _, _, _, _, _, _),
>+ [88] = PINGROUP(88, qup1_se2, _, _, _, _, _, _, _, _, _, _),
>+ [89] = PINGROUP(89, qup1_se6, qup1_se7, mdp0_vsync0, _, _, _, _, _, _, _, _),
>+ [90] = PINGROUP(90, qup1_se6, qup1_se7, mdp0_vsync1, cri_trng, _, _, _, _, _, _, _),
>+ [91] = PINGROUP(91, qup1_se7, qup1_se6, mdp0_vsync3, cri_trng, _, _, _, _, _, _, _),
>+ [92] = PINGROUP(92, qup1_se7, qup1_se6, cri_trng, _, atest_usb2, _, _, _, _, _, _),
>+ [93] = PINGROUP(93, atest_char, _, _, _, _, _, _, _, _, _, _),
>+ [94] = PINGROUP(94, edp0_hot, _, _, _, _, _, _, _, _, _, _),
>+ [95] = PINGROUP(95, _, _, _, _, _, _, _, _, _, _, _),
>+ [96] = PINGROUP(96, _, _, _, _, _, _, _, _, _, _, _),
>+ [97] = PINGROUP(97, mi2s_mclk0, jitter_bist, qdss_gpio, _, _, _, _, _, _, _, _),
>+ [98] = PINGROUP(98, mi2s1_sck, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
>+ [99] = PINGROUP(99, mi2s1_ws, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
>+ [100] = PINGROUP(100, mi2s1_data0, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
>+ [101] = PINGROUP(101, mi2s1_data1, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
>+ [102] = PINGROUP(102, mi2s2_sck, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
>+ [103] = PINGROUP(103, mi2s2_ws, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
>+ [104] = PINGROUP(104, mi2s2_data0, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
>+ [105] = PINGROUP(105, mi2s2_data1, audio_ref, phase_flag, _, qdss_gpio, _, _, _, _, _, _),
>+ [106] = PINGROUP(106, hs0_mi2s, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
>+ [107] = PINGROUP(107, hs0_mi2s, pll_bist, phase_flag, _, qdss_gpio, _, _, _, _, _, _),
>+ [108] = PINGROUP(108, hs0_mi2s, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _),
>+ [109] = PINGROUP(109, hs0_mi2s, mi2s_mclk1, qdss_gpio, _, _, _, _, _, _, _, _),
>+ [110] = PINGROUP(110, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _, egpio),
>+ [111] = PINGROUP(111, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _, egpio),
>+ [112] = PINGROUP(112, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _, egpio),
>+ [113] = PINGROUP(113, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _, egpio),
>+ [114] = PINGROUP(114, phase_flag, _, qdss_gpio, _, _, _, _, _, _, _, egpio),
>+ [115] = PINGROUP(115, _, _, _, _, _, _, _, _, _, _, egpio),
>+ [116] = PINGROUP(116, phase_flag, _, _, _, _, _, _, _, _, _, egpio),
>+ [117] = PINGROUP(117, phase_flag, _, _, _, _, _, _, _, _, _, egpio),
>+ [118] = PINGROUP(118, phase_flag, _, _, _, _, _, _, _, _, _, egpio),
>+ [119] = PINGROUP(119, _, _, _, _, _, _, _, _, _, _, egpio),
>+ [120] = PINGROUP(120, phase_flag, _, _, _, _, _, _, _, _, _, egpio),
>+ [121] = PINGROUP(121, phase_flag, _, _, _, _, _, _, _, _, _, egpio),
>+ [122] = PINGROUP(122, phase_flag, _, _, _, _, _, _, _, _, _, egpio),
>+ [123] = PINGROUP(123, _, _, _, _, _, _, _, _, _, _, egpio),
>+ [124] = PINGROUP(124, _, _, _, _, _, _, _, _, _, _, egpio),
>+ [125] = PINGROUP(125, phase_flag, _, _, _, _, _, _, _, _, _, egpio),
>+ [126] = PINGROUP(126, _, _, _, _, _, _, _, _, _, _, egpio),
>+ [127] = PINGROUP(127, _, _, _, _, _, _, _, _, _, _, egpio),
>+ [128] = PINGROUP(128, _, _, _, _, _, _, _, _, _, _, egpio),
>+ [129] = PINGROUP(129, _, _, _, _, _, _, _, _, _, _, egpio),
>+ [130] = PINGROUP(130, _, _, _, _, _, _, _, _, _, _, egpio),
>+ [131] = PINGROUP(131, _, _, _, _, _, _, _, _, _, _, egpio),
>+ [132] = PINGROUP(132, _, _, _, _, _, _, _, _, _, _, egpio),
>+};
>+
>+static const struct msm_special_pin_data qcs8300_special_pins_data[] = {
>+ [0] = UFS_RESET("ufs_reset", 0x92000),
>+ [1] = SDC_QDSD_PINGROUP("sdc1_rclk", 0x89000, 15, 0),
>+ [2] = SDC_QDSD_PINGROUP("sdc1_clk", 0x89000, 13, 6),
>+ [3] = SDC_QDSD_PINGROUP("sdc1_cmd", 0x89000, 11, 3),
>+ [4] = SDC_QDSD_PINGROUP("sdc1_data", 0x89000, 9, 0),
>+};
>+
>+static const char *qcs8300_get_function_name(struct udevice *dev,
>+ unsigned int selector)
>+{
>+ return msm_pinctrl_functions[selector].name;
>+}
>+
>+static const char *qcs8300_get_pin_name(struct udevice *dev,
>+ unsigned int selector)
>+{
>+ if (selector >= 133 && selector <= 137)
>+ snprintf(pin_name, MAX_PIN_NAME_LEN, "%s",
>+ qcs8300_special_pins_data[selector - 133].name);
>+ else
>+ snprintf(pin_name, MAX_PIN_NAME_LEN, "gpio%u", selector);
>+
>+ return pin_name;
>+}
>+
>+static int qcs8300_get_function_mux(__maybe_unused unsigned int pin,
>+ unsigned int selector)
>+{
>+ unsigned int i;
>+ const msm_pin_function *func = qcs8300_pin_functions + pin;
>+
>+ for (i = 0; i < MSM_PIN_FUNCTION_COUNT; i++)
>+ if ((*func)[i] == selector)
>+ return i;
>+
>+ pr_err("Can't find requested function for pin %u\n", pin);
>+
>+ return -EINVAL;
>+}
>+
>+static const struct msm_pinctrl_data qcs8300_data = {
>+ .pin_data = {
>+ .pin_count = 138,
>+ .special_pins_start = 133,
>+ .special_pins_data = qcs8300_special_pins_data,
>+ },
>+ .functions_count = ARRAY_SIZE(msm_pinctrl_functions),
>+ .get_function_name = qcs8300_get_function_name,
>+ .get_function_mux = qcs8300_get_function_mux,
>+ .get_pin_name = qcs8300_get_pin_name,
>+};
>+
>+static const struct udevice_id msm_pinctrl_ids[] = {
>+ {
>+ .compatible = "qcom,qcs8300-tlmm",
>+ .data = (ulong)&qcs8300_data
>+ },
>+ { /* Sentinel */ }
>+};
>+
>+U_BOOT_DRIVER(pinctrl_qcs8300) = {
>+ .name = "pinctrl_qcs8300",
>+ .id = UCLASS_NOP,
>+ .of_match = msm_pinctrl_ids,
>+ .ops = &msm_pinctrl_ops,
>+ .bind = msm_pinctrl_bind,
>+ .flags = DM_FLAG_PRE_RELOC,
>+};
>
>--
>2.34.1
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 5/7] arm64: dts: monaco-evk: Add reboot-mode support via PON/SDAM
2026-08-12 1:12 ` [PATCH v2 5/7] arm64: dts: monaco-evk: Add reboot-mode support via PON/SDAM Balaji Selvanathan via U-Boot
@ 2026-10-19 11:58 ` Sumit Garg
0 siblings, 0 replies; 15+ messages in thread
From: Sumit Garg @ 2026-10-19 11:58 UTC (permalink / raw)
To: Balaji Selvanathan
Cc: Sumit Garg, u-boot, u-boot-qcom, Lukasz Majewski, Tom Rini,
Casey Connolly, Neil Armstrong, Johan Jonker, Luca Weiss,
Biswapriyo Nath, Ilias Apalodimas
On Wed, 12 Aug 2026 at 06:42:03 +0530, Balaji Selvanathan wrote:
>monaco-pmics.dtsi has no PON/SDAM reboot-reason storage, so
>U-Boot can't read the reboot-reason to tell if it should stop in
>fastboot instead of booting the kernel.
>
>Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
>---
> arch/arm/dts/monaco-evk-u-boot.dtsi | 36 ++++++++++++++++++++++++++++++++++++
> 1 file changed, 36 insertions(+)
Avoid adding DTS changes for targets that aren't yet accepted upstream.
Try to keep patch-sets independent such that they are easier to land.
-Sumit
>
>diff --git a/arch/arm/dts/monaco-evk-u-boot.dtsi b/arch/arm/dts/monaco-evk-u-boot.dtsi
>new file mode 100644
>index 00000000000..5520d111864
>--- /dev/null
>+++ b/arch/arm/dts/monaco-evk-u-boot.dtsi
>@@ -0,0 +1,36 @@
>+// SPDX-License-Identifier: BSD-3-Clause
>+/*
>+ * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
>+ */
>+
>+/ {
>+ reboot-mode {
>+ compatible = "nvmem-reboot-mode";
>+ nvmem-cells = <&reboot_reason>;
>+ nvmem-cell-names = "reboot-mode";
>+
>+ mode-bootloader = <0x02>;
>+ mode-recovery = <0x01>;
>+ };
>+};
>+
>+&pmm8620au_0 {
>+ pmm8620au_0_pon: pon@1200 {
>+ compatible = "qcom,pmk8350-pon";
>+ reg = <0x1200>, <0x800>;
>+ reg-names = "hlos", "pbs";
>+ };
>+
>+ pmm8620au_0_sdam_0: nvram@7100 {
>+ compatible = "qcom,spmi-sdam";
>+ reg = <0x7100>;
>+ #address-cells = <1>;
>+ #size-cells = <1>;
>+ ranges = <0x0 0x7100 0x100>;
>+
>+ reboot_reason: reboot-reason@48 {
>+ reg = <0x48 0x1>;
>+ bits = <1 7>;
>+ };
>+ };
>+};
>
>--
>2.34.1
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 6/7] arm64: dts: monaco-evk: Force vreg_l8a always-on to protect UFS VCC
2026-08-12 1:12 ` [PATCH v2 6/7] arm64: dts: monaco-evk: Force vreg_l8a always-on to protect UFS VCC Balaji Selvanathan via U-Boot
@ 2026-10-19 12:01 ` Sumit Garg
0 siblings, 0 replies; 15+ messages in thread
From: Sumit Garg @ 2026-10-19 12:01 UTC (permalink / raw)
To: Balaji Selvanathan
Cc: Sumit Garg, u-boot, u-boot-qcom, Lukasz Majewski, Tom Rini,
Casey Connolly, Neil Armstrong, Johan Jonker, Luca Weiss,
Biswapriyo Nath, Ilias Apalodimas
On Wed, 12 Aug 2026 at 06:42:04 +0530, Balaji Selvanathan wrote:
>vreg_l8a is the shared VCC rail for UFS (ufs_mem_hc vcc-supply) and
>eMMC (sdhc_1 vmmc-supply). UFS holds no regulator vote of its own in
>U-Boot, so nothing stops other consumers from disabling the rail
>while UFS still needs it.
Why not teach UFS driver to keep it's regulator vote intact? Don't add
DT workarounds for this.
-Sumit
>
>eMMC's power-cycle runs after UFS has already linked up and started
>transferring data. Its power-off fires a real disable vote on
>vreg_l8a, glitching UFS VCC while the link is live. UFS has no
>recovery from this: every following command fails (OCS errors, UTP
>timeouts, "Card did not respond to voltage select! : -110").
>
>Force the rail always-on so the disable vote is rejected in
>regulator_set_enable() (-EACCES) before it reaches the RPMh driver.
>eMMC is non-removable and does not need a real power-cycle.
>
>Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
>---
> arch/arm/dts/monaco-evk-u-boot.dtsi | 4 ++++
> 1 file changed, 4 insertions(+)
>
>diff --git a/arch/arm/dts/monaco-evk-u-boot.dtsi b/arch/arm/dts/monaco-evk-u-boot.dtsi
>index 5520d111864..8e9102eae4d 100644
>--- a/arch/arm/dts/monaco-evk-u-boot.dtsi
>+++ b/arch/arm/dts/monaco-evk-u-boot.dtsi
>@@ -34,3 +34,7 @@
> };
> };
> };
>+
>+&vreg_l8a {
>+ regulator-always-on;
>+};
>
>--
>2.34.1
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 7/7] configs: qcom_qcs8300: Switch to monaco-evk DT and enable new drivers
2026-08-12 1:12 ` [PATCH v2 7/7] configs: qcom_qcs8300: Switch to monaco-evk DT and enable new drivers Balaji Selvanathan via U-Boot
@ 2026-10-19 12:03 ` Sumit Garg
0 siblings, 0 replies; 15+ messages in thread
From: Sumit Garg @ 2026-10-19 12:03 UTC (permalink / raw)
To: Balaji Selvanathan
Cc: Sumit Garg, u-boot, u-boot-qcom, Lukasz Majewski, Tom Rini,
Casey Connolly, Neil Armstrong, Johan Jonker, Luca Weiss,
Biswapriyo Nath, Ilias Apalodimas
On Wed, 12 Aug 2026 at 06:42:05 +0530, Balaji Selvanathan wrote:
>Point qcom_qcs8300_defconfig at the monaco-evk device tree and
>turn on required drivers.
>
>Signed-off-by: Balaji Selvanathan <balaji.selvanathan@oss.qualcomm.com>
>---
> configs/qcom_qcs8300_defconfig | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
>diff --git a/configs/qcom_qcs8300_defconfig b/configs/qcom_qcs8300_defconfig
>index 5fffcddc16e..c8c4ccb9ab2 100644
>--- a/configs/qcom_qcs8300_defconfig
>+++ b/configs/qcom_qcs8300_defconfig
Why not rename this too as qcom_monaco_defconfig like you are doing for
lemans?
>@@ -18,4 +18,8 @@ CONFIG_DEBUG_UART_CLOCK=14745600
> CONFIG_TEXT_BASE=0xaf000000
> CONFIG_REMAKE_ELF=y
>
>-CONFIG_DEFAULT_DEVICE_TREE="qcom/qcs8300-ride"
>+CONFIG_DEFAULT_DEVICE_TREE="qcom/monaco-evk"
>+CONFIG_PINCTRL_QCOM_QCS8300=y
>+CONFIG_INTERCONNECT_QCOM_QCS8300=y
>+
>+CONFIG_WATCHDOG_AUTOSTART=y
I see another series dropping watchdog support, so why add it in the
first place?
-Sumit
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2026-10-19 12:03 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-12 1:11 [PATCH v2 0/7] qcom: qcs8300/monaco-evk: pinctrl, interconnect, RPMH clock and reboot-mode support Balaji Selvanathan via U-Boot
2026-08-12 1:11 ` [PATCH v2 1/7] clk: qcom: Add shared RPMH clock driver for SM8550/SM8650/SA8775P Balaji Selvanathan via U-Boot
2026-08-12 12:26 ` Neil Armstrong
2026-08-12 1:12 ` [PATCH v2 2/7] clk: qcom: qcs8300: Extend GCC clock driver to full gate/RCG coverage Balaji Selvanathan via U-Boot
2026-10-19 11:54 ` Sumit Garg
2026-08-12 1:12 ` [PATCH v2 3/7] pinctrl: qcom: Add QCS8300 pinctrl driver Balaji Selvanathan via U-Boot
2026-10-19 11:56 ` Sumit Garg
2026-08-12 1:12 ` [PATCH v2 4/7] interconnect: qcom: Add QCS8300 interconnect driver Balaji Selvanathan via U-Boot
2026-08-12 1:12 ` [PATCH v2 5/7] arm64: dts: monaco-evk: Add reboot-mode support via PON/SDAM Balaji Selvanathan via U-Boot
2026-10-19 11:58 ` Sumit Garg
2026-08-12 1:12 ` [PATCH v2 6/7] arm64: dts: monaco-evk: Force vreg_l8a always-on to protect UFS VCC Balaji Selvanathan via U-Boot
2026-10-19 12:01 ` Sumit Garg
2026-08-12 1:12 ` [PATCH v2 7/7] configs: qcom_qcs8300: Switch to monaco-evk DT and enable new drivers Balaji Selvanathan via U-Boot
2026-10-19 12:03 ` Sumit Garg
2026-10-08 12:44 ` [PATCH v2 0/7] qcom: qcs8300/monaco-evk: pinctrl, interconnect, RPMH clock and reboot-mode support Neil Armstrong
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox