* [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
* 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
* [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
* 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
* [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
* 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
* [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
* 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
* [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
* 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
* [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 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
* 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
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 an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.