* [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC
@ 2026-10-21 16:04 Aswin Murugan
2026-10-21 16:04 ` [PATCH v3 1/8] clk: qcom: add GCC driver for nord Aswin Murugan
` (8 more replies)
0 siblings, 9 replies; 21+ messages in thread
From: Aswin Murugan @ 2026-10-21 16:04 UTC (permalink / raw)
To: casey.connolly, neil.armstrong, sumit.garg, trini, lukma,
marek.vasut+usb, aswin.murugan, Michael.Srba, nathbappai, nikroks,
luca.weiss, jbx6244, u-boot-qcom, u-boot
This series adds foundational support for the Qualcomm Nord SoC in
U-Boot, including clock, pinctrl, USB HS PHY, and configuration updates
required for early platform enablement.
The series includes:
- Clock driver support for Nord
- Pinctrl driver support for Nord TLMM
- USB HS PHY support for Nord
- Configuration updates required for platform enablement
Changes in v3:
- Drop the DT binding patch since it is now available upstream.
Link to v2: https://lore.kernel.org/u-boot/20260928120209.1064781-1-aswin.murugan@oss.qualcomm.com/
Changes in v2:
- Drop DT patches; they will be synced once the corresponding changes
land in the upstream Linux kernel
- Drop Nord-specific defconfig
- Drop ELF 4K-alignment support changes
- Add USB HS PHY support for Nord
- Retain only clock, pinctrl, USB, and platform enablement changes
- Address review comments from v1
Link to v1: https://marc.info/?l=u-boot&m=178695918491771&w=2
Aswin Murugan (8):
clk: qcom: add GCC driver for nord
clk: qcom: add NEGCC driver for nord
clk: qcom: add SEGCC driver for nord
clk: qcom: add NWGCC driver for nord
clk: qcom: add TCSRCC driver for nord
configs: qcom_defconfig: enable nord clock drivers
pinctrl: qcom: add TLMM driver for nord
phy: qcom: snps-eusb2: add Nord compatible
configs/qcom_defconfig | 5 +
drivers/clk/qcom/Kconfig | 43 ++
drivers/clk/qcom/Makefile | 5 +
drivers/clk/qcom/clock-nord-gcc.c | 165 +++++++
drivers/clk/qcom/clock-nord-negcc.c | 186 ++++++++
drivers/clk/qcom/clock-nord-nwgcc.c | 91 ++++
drivers/clk/qcom/clock-nord-segcc.c | 137 ++++++
drivers/clk/qcom/clock-nord-tcsrcc.c | 88 ++++
drivers/phy/qcom/phy-qcom-snps-eusb2.c | 3 +
drivers/pinctrl/qcom/Kconfig | 8 +
drivers/pinctrl/qcom/Makefile | 1 +
drivers/pinctrl/qcom/pinctrl-nord.c | 626 +++++++++++++++++++++++++
12 files changed, 1358 insertions(+)
create mode 100644 drivers/clk/qcom/clock-nord-gcc.c
create mode 100644 drivers/clk/qcom/clock-nord-negcc.c
create mode 100644 drivers/clk/qcom/clock-nord-nwgcc.c
create mode 100644 drivers/clk/qcom/clock-nord-segcc.c
create mode 100644 drivers/clk/qcom/clock-nord-tcsrcc.c
create mode 100644 drivers/pinctrl/qcom/pinctrl-nord.c
--
2.34.1
^ permalink raw reply [flat|nested] 21+ messages in thread* [PATCH v3 1/8] clk: qcom: add GCC driver for nord 2026-10-21 16:04 [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC Aswin Murugan @ 2026-10-21 16:04 ` Aswin Murugan 2026-10-22 7:50 ` neil.armstrong 2026-10-22 21:33 ` Tyler Baker 2026-10-21 16:04 ` [PATCH v3 2/8] clk: qcom: add NEGCC " Aswin Murugan ` (7 subsequent siblings) 8 siblings, 2 replies; 21+ messages in thread From: Aswin Murugan @ 2026-10-21 16:04 UTC (permalink / raw) To: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, aswin.murugan, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot Add support for the nord Global Clock Controller (GCC). Implement the qcom,nord-gcc driver to provide clocks, resets and power domains required by nord peripherals. Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com> --- drivers/clk/qcom/Kconfig | 8 ++ drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/clock-nord-gcc.c | 165 ++++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+) create mode 100644 drivers/clk/qcom/clock-nord-gcc.c diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig index 1a7957e2201..7228d5ecbf9 100644 --- a/drivers/clk/qcom/Kconfig +++ b/drivers/clk/qcom/Kconfig @@ -55,6 +55,14 @@ config CLK_QCOM_MILOS on the Snapdragon Milos SoC. This driver supports the clocks and resets exposed by the GCC hardware block. +config CLK_QCOM_NORD + bool "Qualcomm Nord GCC" + select CLK_QCOM + help + Say Y here to enable support for the Global Clock Controller + on the Snapdragon Nord SoC. This driver supports the clocks + and resets exposed by the GCC hardware block. + config CLK_QCOM_QCM2290 bool "Qualcomm QCM2290 GCC" select CLK_QCOM diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile index 58d8166072d..193740682aa 100644 --- a/drivers/clk/qcom/Makefile +++ b/drivers/clk/qcom/Makefile @@ -10,6 +10,7 @@ obj-$(CONFIG_CLK_QCOM_IPQ4019) += clock-ipq4019.o obj-$(CONFIG_CLK_QCOM_IPQ5424) += clock-ipq5424.o obj-$(CONFIG_CLK_QCOM_IPQ9574) += clock-ipq9574.o obj-$(CONFIG_CLK_QCOM_MILOS) += clock-milos.o +obj-$(CONFIG_CLK_QCOM_NORD) += clock-nord-gcc.o obj-$(CONFIG_CLK_QCOM_QCM2290) += clock-qcm2290.o obj-$(CONFIG_CLK_QCOM_QCS404) += clock-qcs404.o obj-$(CONFIG_CLK_QCOM_QCS8300) += clock-qcs8300.o diff --git a/drivers/clk/qcom/clock-nord-gcc.c b/drivers/clk/qcom/clock-nord-gcc.c new file mode 100644 index 00000000000..af38b3b1daa --- /dev/null +++ b/drivers/clk/qcom/clock-nord-gcc.c @@ -0,0 +1,165 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * + */ + +#include <linux/types.h> +#include <clk-uclass.h> +#include <dm.h> +#include <linux/delay.h> +#include <asm/io.h> +#include <linux/bug.h> +#include <linux/bitops.h> +#include <dt-bindings/clock/qcom,nord-gcc.h> +#include "clock-qcom.h" + +static const struct gate_clk nord_gcc_clks[] = { + GATE_CLK_POLLED(GCC_MMU_0_TCU_VOTE_CLK, 0x7d094, BIT(0), 0x7d094), + GATE_CLK_POLLED(GCC_PCIE_A_AUX_CLK, 0x9d008, BIT(14), 0x49058), + GATE_CLK_POLLED(GCC_PCIE_A_CFG_AHB_CLK, 0x9d008, BIT(13), 0x49054), + GATE_CLK_POLLED(GCC_PCIE_A_PHY_AUX_CLK, 0x9d010, BIT(12), 0x4d01c), + GATE_CLK_POLLED(GCC_PCIE_A_PHY_RCHNG_CLK, 0x9d008, BIT(16), 0x49078), + GATE_CLK_POLLED(GCC_PCIE_A_SLV_AXI_CLK, 0x9d008, BIT(11), 0x4902c), + GATE_CLK_POLLED(GCC_PCIE_A_SLV_Q2A_AXI_CLK, 0x9d008, BIT(10), 0x49024), + GATE_CLK_POLLED(GCC_PCIE_B_AUX_CLK, 0x9d008, BIT(23), 0x4a058), + GATE_CLK_POLLED(GCC_PCIE_B_CFG_AHB_CLK, 0x9d008, BIT(22), 0x4a054), + GATE_CLK_POLLED(GCC_PCIE_B_PHY_AUX_CLK, 0x9d010, BIT(13), 0x4e01c), + GATE_CLK_POLLED(GCC_PCIE_B_PHY_RCHNG_CLK, 0x9d008, BIT(25), 0x4a078), + GATE_CLK_POLLED(GCC_PCIE_B_SLV_AXI_CLK, 0x9d008, BIT(20), 0x4a02c), + GATE_CLK_POLLED(GCC_PCIE_B_SLV_Q2A_AXI_CLK, 0x9d008, BIT(19), 0x4a024), + GATE_CLK_POLLED(GCC_PCIE_C_AUX_CLK, 0x9d010, BIT(0), 0x4b058), + GATE_CLK_POLLED(GCC_PCIE_C_CFG_AHB_CLK, 0x9d008, BIT(31), 0x4b054), + GATE_CLK_POLLED(GCC_PCIE_C_PHY_AUX_CLK, 0x9d010, BIT(14), 0x4f01c), + GATE_CLK_POLLED(GCC_PCIE_C_PHY_RCHNG_CLK, 0x9d010, BIT(2), 0x4b078), + GATE_CLK_POLLED(GCC_PCIE_C_SLV_AXI_CLK, 0x9d008, BIT(29), 0x4b02c), + GATE_CLK_POLLED(GCC_PCIE_C_SLV_Q2A_AXI_CLK, 0x9d008, BIT(28), 0x4b024), + GATE_CLK_POLLED(GCC_PCIE_D_AUX_CLK, 0x9d010, BIT(9), 0x4c058), + GATE_CLK_POLLED(GCC_PCIE_D_CFG_AHB_CLK, 0x9d010, BIT(8), 0x4c054), + GATE_CLK_POLLED(GCC_PCIE_D_PHY_AUX_CLK, 0x9d010, BIT(16), 0x5001c), + GATE_CLK_POLLED(GCC_PCIE_D_PHY_RCHNG_CLK, 0x9d010, BIT(11), 0x4c078), + GATE_CLK_POLLED(GCC_PCIE_D_SLV_AXI_CLK, 0x9d010, BIT(6), 0x4c02c), + GATE_CLK_POLLED(GCC_PCIE_D_SLV_Q2A_AXI_CLK, 0x9d010, BIT(5), 0x4c024), + GATE_CLK_POLLED(GCC_PCIE_NOC_CNOC_SF_QX_CLK, 0x9d010, BIT(24), 0x52040), + GATE_CLK_POLLED(GCC_PCIE_NOC_M_CFG_CLK, 0x9d018, BIT(4), 0x52060), + GATE_CLK_POLLED(GCC_PCIE_NOC_M_PDB_CLK, 0x9d018, BIT(8), 0x52084), + GATE_CLK_POLLED(GCC_PCIE_NOC_PWRCTL_CLK, 0x9d018, BIT(7), 0x52080), + GATE_CLK_POLLED(GCC_PCIE_NOC_QOSGEN_EXTREF_CLK, 0x9d010, BIT(19), 0x52074), + GATE_CLK_POLLED(GCC_PCIE_NOC_SLAVE_AXI_CLK, 0x9d010, BIT(26), 0x52058), + GATE_CLK_POLLED(GCC_PCIE_NOC_S_CFG_CLK, 0x9d018, BIT(5), 0x52064), + GATE_CLK_POLLED(GCC_PCIE_NOC_S_PDB_CLK, 0x9d018, BIT(9), 0x5208c), + GATE_CLK_POLLED(GCC_PCIE_NOC_TSCTR_CLK, 0x9d010, BIT(18), 0x52070), + GATE_CLK_POLLED(GCC_PCIE_NOC_XO_CLK, 0x9d018, BIT(6), 0x52068), + GATE_CLK_POLLED(GCC_PDM_AHB_CLK, 0x1a004, BIT(0), 0x1a004), + GATE_CLK_POLLED(GCC_QUPV3_WRAP3_CORE_2X_CLK, 0x9d000, BIT(24), 0x23020), + GATE_CLK_POLLED(GCC_QUPV3_WRAP3_CORE_CLK, 0x9d000, BIT(23), 0x2300c), + GATE_CLK_POLLED(GCC_QUPV3_WRAP3_M_CLK, 0x9d000, BIT(22), 0x23004), + GATE_CLK_POLLED(GCC_QUPV3_WRAP3_QSPI_REF_CLK, 0x9d000, BIT(26), 0x23170), + GATE_CLK_POLLED(GCC_QUPV3_WRAP3_S0_CLK, 0x9d000, BIT(25), 0x2315c), + GATE_CLK_POLLED(GCC_QUPV3_WRAP3_S_AHB_CLK, 0x9d010, BIT(15), 0x23008), + GATE_CLK_POLLED(GCC_SMMU_PCIE_QTC_VOTE_CLK, 0x7d0b8, BIT(0), 0x7d0b8), + + GATE_CLK(GCC_BOOT_ROM_AHB_CLK, 0x1f004, BIT(0)), + GATE_CLK(GCC_GP1_CLK, 0x30000, BIT(0)), + GATE_CLK(GCC_GP2_CLK, 0x31000, BIT(0)), + GATE_CLK(GCC_PCIE_A_DTI_QTC_CLK, 0x9d008, BIT(8)), + GATE_CLK(GCC_PCIE_A_MSTR_AXI_CLK, 0x9d008, BIT(12)), + GATE_CLK(GCC_PCIE_A_PIPE_CLK, 0x9d008, BIT(15)), + GATE_CLK(GCC_PCIE_B_DTI_QTC_CLK, 0x9d008, BIT(17)), + GATE_CLK(GCC_PCIE_B_MSTR_AXI_CLK, 0x9d008, BIT(21)), + GATE_CLK(GCC_PCIE_B_PIPE_CLK, 0x9d008, BIT(24)), + GATE_CLK(GCC_PCIE_C_DTI_QTC_CLK, 0x9d008, BIT(26)), + GATE_CLK(GCC_PCIE_C_MSTR_AXI_CLK, 0x9d008, BIT(30)), + GATE_CLK(GCC_PCIE_C_PIPE_CLK, 0x9d010, BIT(1)), + GATE_CLK(GCC_PCIE_D_DTI_QTC_CLK, 0x9d010, BIT(3)), + GATE_CLK(GCC_PCIE_D_MSTR_AXI_CLK, 0x9d010, BIT(7)), + GATE_CLK(GCC_PCIE_D_PIPE_CLK, 0x9d010, BIT(10)), + GATE_CLK(GCC_PCIE_NOC_ASYNC_BRIDGE_CLK, 0x9d018, BIT(18)), + GATE_CLK(GCC_PCIE_NOC_MSTR_AXI_CLK, 0x9d010, BIT(25)), + GATE_CLK(GCC_PCIE_NOC_REFGEN_CLK, 0x52078, BIT(0)), + GATE_CLK(GCC_PCIE_NOC_SAFETY_CLK, 0x5207c, BIT(0)), + GATE_CLK(GCC_PDM2_CLK, 0x1a00c, BIT(0)), + GATE_CLK(GCC_PDM_XO4_CLK, 0x1a008, BIT(0)), +}; + +static int nord_gcc_enable(struct clk *clk) +{ + struct msm_clk_priv *priv = dev_get_priv(clk->dev); + + return qcom_gate_clk_en(priv, clk->id); +} + +static const struct qcom_reset_map nord_gcc_resets[] = { + [GCC_PCIE_A_BCR] = { 0x49000 }, + [GCC_PCIE_A_LINK_DOWN_BCR] = { 0xb9000 }, + [GCC_PCIE_A_NOCSR_COM_PHY_BCR] = { 0xb900c }, + [GCC_PCIE_A_PHY_BCR] = { 0x4d000 }, + [GCC_PCIE_A_PHY_CFG_AHB_BCR] = { 0xb9014 }, + [GCC_PCIE_A_PHY_COM_BCR] = { 0xb9018 }, + [GCC_PCIE_A_PHY_NOCSR_COM_PHY_BCR] = { 0xb9010 }, + [GCC_PCIE_B_BCR] = { 0x4a000 }, + [GCC_PCIE_B_LINK_DOWN_BCR] = { 0xba000 }, + [GCC_PCIE_B_NOCSR_COM_PHY_BCR] = { 0xba008 }, + [GCC_PCIE_B_PHY_BCR] = { 0x4e000 }, + [GCC_PCIE_B_PHY_CFG_AHB_BCR] = { 0xba010 }, + [GCC_PCIE_B_PHY_COM_BCR] = { 0xba014 }, + [GCC_PCIE_B_PHY_NOCSR_COM_PHY_BCR] = { 0xba00c }, + [GCC_PCIE_C_BCR] = { 0x4b000 }, + [GCC_PCIE_C_LINK_DOWN_BCR] = { 0xbb07c }, + [GCC_PCIE_C_NOCSR_COM_PHY_BCR] = { 0xbb084 }, + [GCC_PCIE_C_PHY_BCR] = { 0x4f000 }, + [GCC_PCIE_C_PHY_CFG_AHB_BCR] = { 0xbb08c }, + [GCC_PCIE_C_PHY_COM_BCR] = { 0xbb090 }, + [GCC_PCIE_C_PHY_NOCSR_COM_PHY_BCR] = { 0xbb088 }, + [GCC_PCIE_D_BCR] = { 0x4c000 }, + [GCC_PCIE_D_LINK_DOWN_BCR] = { 0xbc000 }, + [GCC_PCIE_D_NOCSR_COM_PHY_BCR] = { 0xbc008 }, + [GCC_PCIE_D_PHY_BCR] = { 0x50000 }, + [GCC_PCIE_D_PHY_CFG_AHB_BCR] = { 0xbc010 }, + [GCC_PCIE_D_PHY_COM_BCR] = { 0xbc014 }, + [GCC_PCIE_D_PHY_NOCSR_COM_PHY_BCR] = { 0xbc00c }, + [GCC_PCIE_NOC_BCR] = { 0x52000 }, + [GCC_PDM_BCR] = { 0x1a000 }, + [GCC_QUPV3_WRAPPER_3_BCR] = { 0x23000 }, + [GCC_TCSR_PCIE_BCR] = { 0xb901c }, +}; + +static const struct qcom_power_map nord_gcc_gdscs[] = { + [GCC_PCIE_A_GDSC] = { 0x49004 }, + [GCC_PCIE_A_PHY_GDSC] = { 0x4d004 }, + [GCC_PCIE_B_GDSC] = { 0x4a004 }, + [GCC_PCIE_B_PHY_GDSC] = { 0x4e004 }, + [GCC_PCIE_C_GDSC] = { 0x4b004 }, + [GCC_PCIE_C_PHY_GDSC] = { 0x4f004 }, + [GCC_PCIE_D_GDSC] = { 0x4c004 }, + [GCC_PCIE_D_PHY_GDSC] = { 0x50004 }, + [GCC_PCIE_NOC_GDSC] = { 0x52004 }, +}; + +static struct msm_clk_data nord_gcc_data = { + .resets = nord_gcc_resets, + .num_resets = ARRAY_SIZE(nord_gcc_resets), + .clks = nord_gcc_clks, + .num_clks = ARRAY_SIZE(nord_gcc_clks), + + .power_domains = nord_gcc_gdscs, + .num_power_domains = ARRAY_SIZE(nord_gcc_gdscs), + + .enable = nord_gcc_enable, +}; + +static const struct udevice_id gcc_nord_of_match[] = { + { + .compatible = "qcom,nord-gcc", + .data = (ulong)&nord_gcc_data, + }, + { } +}; + +U_BOOT_DRIVER(gcc_nord) = { + .name = "gcc_nord", + .id = UCLASS_NOP, + .of_match = gcc_nord_of_match, + .bind = qcom_cc_bind, + .flags = DM_FLAG_PRE_RELOC | DM_FLAG_DEFAULT_PD_CTRL_OFF, +}; -- 2.34.1 ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v3 1/8] clk: qcom: add GCC driver for nord 2026-10-21 16:04 ` [PATCH v3 1/8] clk: qcom: add GCC driver for nord Aswin Murugan @ 2026-10-22 7:50 ` neil.armstrong 2026-10-22 21:33 ` Tyler Baker 1 sibling, 0 replies; 21+ messages in thread From: neil.armstrong @ 2026-10-22 7:50 UTC (permalink / raw) To: Aswin Murugan, casey.connolly, sumit.garg, trini, lukma, marek.vasut+usb, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot On 10/21/26 18:04, Aswin Murugan wrote: > Add support for the nord Global Clock Controller (GCC). > > Implement the qcom,nord-gcc driver to provide clocks, resets and > power domains required by nord peripherals. > > Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com> > --- > drivers/clk/qcom/Kconfig | 8 ++ > drivers/clk/qcom/Makefile | 1 + > drivers/clk/qcom/clock-nord-gcc.c | 165 ++++++++++++++++++++++++++++++ > 3 files changed, 174 insertions(+) > create mode 100644 drivers/clk/qcom/clock-nord-gcc.c > > diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig > index 1a7957e2201..7228d5ecbf9 100644 > --- a/drivers/clk/qcom/Kconfig > +++ b/drivers/clk/qcom/Kconfig > @@ -55,6 +55,14 @@ config CLK_QCOM_MILOS > on the Snapdragon Milos SoC. This driver supports the clocks > and resets exposed by the GCC hardware block. > > +config CLK_QCOM_NORD > + bool "Qualcomm Nord GCC" > + select CLK_QCOM > + help > + Say Y here to enable support for the Global Clock Controller > + on the Snapdragon Nord SoC. This driver supports the clocks > + and resets exposed by the GCC hardware block. > + > config CLK_QCOM_QCM2290 > bool "Qualcomm QCM2290 GCC" > select CLK_QCOM > diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile > index 58d8166072d..193740682aa 100644 > --- a/drivers/clk/qcom/Makefile > +++ b/drivers/clk/qcom/Makefile > @@ -10,6 +10,7 @@ obj-$(CONFIG_CLK_QCOM_IPQ4019) += clock-ipq4019.o > obj-$(CONFIG_CLK_QCOM_IPQ5424) += clock-ipq5424.o > obj-$(CONFIG_CLK_QCOM_IPQ9574) += clock-ipq9574.o > obj-$(CONFIG_CLK_QCOM_MILOS) += clock-milos.o > +obj-$(CONFIG_CLK_QCOM_NORD) += clock-nord-gcc.o > obj-$(CONFIG_CLK_QCOM_QCM2290) += clock-qcm2290.o > obj-$(CONFIG_CLK_QCOM_QCS404) += clock-qcs404.o > obj-$(CONFIG_CLK_QCOM_QCS8300) += clock-qcs8300.o > diff --git a/drivers/clk/qcom/clock-nord-gcc.c b/drivers/clk/qcom/clock-nord-gcc.c > new file mode 100644 > index 00000000000..af38b3b1daa > --- /dev/null > +++ b/drivers/clk/qcom/clock-nord-gcc.c > @@ -0,0 +1,165 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. > + * > + */ > + > +#include <linux/types.h> > +#include <clk-uclass.h> > +#include <dm.h> > +#include <linux/delay.h> > +#include <asm/io.h> > +#include <linux/bug.h> > +#include <linux/bitops.h> > +#include <dt-bindings/clock/qcom,nord-gcc.h> > +#include "clock-qcom.h" > + > +static const struct gate_clk nord_gcc_clks[] = { > + GATE_CLK_POLLED(GCC_MMU_0_TCU_VOTE_CLK, 0x7d094, BIT(0), 0x7d094), > + GATE_CLK_POLLED(GCC_PCIE_A_AUX_CLK, 0x9d008, BIT(14), 0x49058), > + GATE_CLK_POLLED(GCC_PCIE_A_CFG_AHB_CLK, 0x9d008, BIT(13), 0x49054), > + GATE_CLK_POLLED(GCC_PCIE_A_PHY_AUX_CLK, 0x9d010, BIT(12), 0x4d01c), > + GATE_CLK_POLLED(GCC_PCIE_A_PHY_RCHNG_CLK, 0x9d008, BIT(16), 0x49078), > + GATE_CLK_POLLED(GCC_PCIE_A_SLV_AXI_CLK, 0x9d008, BIT(11), 0x4902c), > + GATE_CLK_POLLED(GCC_PCIE_A_SLV_Q2A_AXI_CLK, 0x9d008, BIT(10), 0x49024), > + GATE_CLK_POLLED(GCC_PCIE_B_AUX_CLK, 0x9d008, BIT(23), 0x4a058), > + GATE_CLK_POLLED(GCC_PCIE_B_CFG_AHB_CLK, 0x9d008, BIT(22), 0x4a054), > + GATE_CLK_POLLED(GCC_PCIE_B_PHY_AUX_CLK, 0x9d010, BIT(13), 0x4e01c), > + GATE_CLK_POLLED(GCC_PCIE_B_PHY_RCHNG_CLK, 0x9d008, BIT(25), 0x4a078), > + GATE_CLK_POLLED(GCC_PCIE_B_SLV_AXI_CLK, 0x9d008, BIT(20), 0x4a02c), > + GATE_CLK_POLLED(GCC_PCIE_B_SLV_Q2A_AXI_CLK, 0x9d008, BIT(19), 0x4a024), > + GATE_CLK_POLLED(GCC_PCIE_C_AUX_CLK, 0x9d010, BIT(0), 0x4b058), > + GATE_CLK_POLLED(GCC_PCIE_C_CFG_AHB_CLK, 0x9d008, BIT(31), 0x4b054), > + GATE_CLK_POLLED(GCC_PCIE_C_PHY_AUX_CLK, 0x9d010, BIT(14), 0x4f01c), > + GATE_CLK_POLLED(GCC_PCIE_C_PHY_RCHNG_CLK, 0x9d010, BIT(2), 0x4b078), > + GATE_CLK_POLLED(GCC_PCIE_C_SLV_AXI_CLK, 0x9d008, BIT(29), 0x4b02c), > + GATE_CLK_POLLED(GCC_PCIE_C_SLV_Q2A_AXI_CLK, 0x9d008, BIT(28), 0x4b024), > + GATE_CLK_POLLED(GCC_PCIE_D_AUX_CLK, 0x9d010, BIT(9), 0x4c058), > + GATE_CLK_POLLED(GCC_PCIE_D_CFG_AHB_CLK, 0x9d010, BIT(8), 0x4c054), > + GATE_CLK_POLLED(GCC_PCIE_D_PHY_AUX_CLK, 0x9d010, BIT(16), 0x5001c), > + GATE_CLK_POLLED(GCC_PCIE_D_PHY_RCHNG_CLK, 0x9d010, BIT(11), 0x4c078), > + GATE_CLK_POLLED(GCC_PCIE_D_SLV_AXI_CLK, 0x9d010, BIT(6), 0x4c02c), > + GATE_CLK_POLLED(GCC_PCIE_D_SLV_Q2A_AXI_CLK, 0x9d010, BIT(5), 0x4c024), > + GATE_CLK_POLLED(GCC_PCIE_NOC_CNOC_SF_QX_CLK, 0x9d010, BIT(24), 0x52040), > + GATE_CLK_POLLED(GCC_PCIE_NOC_M_CFG_CLK, 0x9d018, BIT(4), 0x52060), > + GATE_CLK_POLLED(GCC_PCIE_NOC_M_PDB_CLK, 0x9d018, BIT(8), 0x52084), > + GATE_CLK_POLLED(GCC_PCIE_NOC_PWRCTL_CLK, 0x9d018, BIT(7), 0x52080), > + GATE_CLK_POLLED(GCC_PCIE_NOC_QOSGEN_EXTREF_CLK, 0x9d010, BIT(19), 0x52074), > + GATE_CLK_POLLED(GCC_PCIE_NOC_SLAVE_AXI_CLK, 0x9d010, BIT(26), 0x52058), > + GATE_CLK_POLLED(GCC_PCIE_NOC_S_CFG_CLK, 0x9d018, BIT(5), 0x52064), > + GATE_CLK_POLLED(GCC_PCIE_NOC_S_PDB_CLK, 0x9d018, BIT(9), 0x5208c), > + GATE_CLK_POLLED(GCC_PCIE_NOC_TSCTR_CLK, 0x9d010, BIT(18), 0x52070), > + GATE_CLK_POLLED(GCC_PCIE_NOC_XO_CLK, 0x9d018, BIT(6), 0x52068), > + GATE_CLK_POLLED(GCC_PDM_AHB_CLK, 0x1a004, BIT(0), 0x1a004), > + GATE_CLK_POLLED(GCC_QUPV3_WRAP3_CORE_2X_CLK, 0x9d000, BIT(24), 0x23020), > + GATE_CLK_POLLED(GCC_QUPV3_WRAP3_CORE_CLK, 0x9d000, BIT(23), 0x2300c), > + GATE_CLK_POLLED(GCC_QUPV3_WRAP3_M_CLK, 0x9d000, BIT(22), 0x23004), > + GATE_CLK_POLLED(GCC_QUPV3_WRAP3_QSPI_REF_CLK, 0x9d000, BIT(26), 0x23170), > + GATE_CLK_POLLED(GCC_QUPV3_WRAP3_S0_CLK, 0x9d000, BIT(25), 0x2315c), > + GATE_CLK_POLLED(GCC_QUPV3_WRAP3_S_AHB_CLK, 0x9d010, BIT(15), 0x23008), > + GATE_CLK_POLLED(GCC_SMMU_PCIE_QTC_VOTE_CLK, 0x7d0b8, BIT(0), 0x7d0b8), > + > + GATE_CLK(GCC_BOOT_ROM_AHB_CLK, 0x1f004, BIT(0)), > + GATE_CLK(GCC_GP1_CLK, 0x30000, BIT(0)), > + GATE_CLK(GCC_GP2_CLK, 0x31000, BIT(0)), > + GATE_CLK(GCC_PCIE_A_DTI_QTC_CLK, 0x9d008, BIT(8)), > + GATE_CLK(GCC_PCIE_A_MSTR_AXI_CLK, 0x9d008, BIT(12)), > + GATE_CLK(GCC_PCIE_A_PIPE_CLK, 0x9d008, BIT(15)), > + GATE_CLK(GCC_PCIE_B_DTI_QTC_CLK, 0x9d008, BIT(17)), > + GATE_CLK(GCC_PCIE_B_MSTR_AXI_CLK, 0x9d008, BIT(21)), > + GATE_CLK(GCC_PCIE_B_PIPE_CLK, 0x9d008, BIT(24)), > + GATE_CLK(GCC_PCIE_C_DTI_QTC_CLK, 0x9d008, BIT(26)), > + GATE_CLK(GCC_PCIE_C_MSTR_AXI_CLK, 0x9d008, BIT(30)), > + GATE_CLK(GCC_PCIE_C_PIPE_CLK, 0x9d010, BIT(1)), > + GATE_CLK(GCC_PCIE_D_DTI_QTC_CLK, 0x9d010, BIT(3)), > + GATE_CLK(GCC_PCIE_D_MSTR_AXI_CLK, 0x9d010, BIT(7)), > + GATE_CLK(GCC_PCIE_D_PIPE_CLK, 0x9d010, BIT(10)), > + GATE_CLK(GCC_PCIE_NOC_ASYNC_BRIDGE_CLK, 0x9d018, BIT(18)), > + GATE_CLK(GCC_PCIE_NOC_MSTR_AXI_CLK, 0x9d010, BIT(25)), > + GATE_CLK(GCC_PCIE_NOC_REFGEN_CLK, 0x52078, BIT(0)), > + GATE_CLK(GCC_PCIE_NOC_SAFETY_CLK, 0x5207c, BIT(0)), > + GATE_CLK(GCC_PDM2_CLK, 0x1a00c, BIT(0)), > + GATE_CLK(GCC_PDM_XO4_CLK, 0x1a008, BIT(0)), > +}; > + > +static int nord_gcc_enable(struct clk *clk) > +{ > + struct msm_clk_priv *priv = dev_get_priv(clk->dev); > + > + return qcom_gate_clk_en(priv, clk->id); > +} > + > +static const struct qcom_reset_map nord_gcc_resets[] = { > + [GCC_PCIE_A_BCR] = { 0x49000 }, > + [GCC_PCIE_A_LINK_DOWN_BCR] = { 0xb9000 }, > + [GCC_PCIE_A_NOCSR_COM_PHY_BCR] = { 0xb900c }, > + [GCC_PCIE_A_PHY_BCR] = { 0x4d000 }, > + [GCC_PCIE_A_PHY_CFG_AHB_BCR] = { 0xb9014 }, > + [GCC_PCIE_A_PHY_COM_BCR] = { 0xb9018 }, > + [GCC_PCIE_A_PHY_NOCSR_COM_PHY_BCR] = { 0xb9010 }, > + [GCC_PCIE_B_BCR] = { 0x4a000 }, > + [GCC_PCIE_B_LINK_DOWN_BCR] = { 0xba000 }, > + [GCC_PCIE_B_NOCSR_COM_PHY_BCR] = { 0xba008 }, > + [GCC_PCIE_B_PHY_BCR] = { 0x4e000 }, > + [GCC_PCIE_B_PHY_CFG_AHB_BCR] = { 0xba010 }, > + [GCC_PCIE_B_PHY_COM_BCR] = { 0xba014 }, > + [GCC_PCIE_B_PHY_NOCSR_COM_PHY_BCR] = { 0xba00c }, > + [GCC_PCIE_C_BCR] = { 0x4b000 }, > + [GCC_PCIE_C_LINK_DOWN_BCR] = { 0xbb07c }, > + [GCC_PCIE_C_NOCSR_COM_PHY_BCR] = { 0xbb084 }, > + [GCC_PCIE_C_PHY_BCR] = { 0x4f000 }, > + [GCC_PCIE_C_PHY_CFG_AHB_BCR] = { 0xbb08c }, > + [GCC_PCIE_C_PHY_COM_BCR] = { 0xbb090 }, > + [GCC_PCIE_C_PHY_NOCSR_COM_PHY_BCR] = { 0xbb088 }, > + [GCC_PCIE_D_BCR] = { 0x4c000 }, > + [GCC_PCIE_D_LINK_DOWN_BCR] = { 0xbc000 }, > + [GCC_PCIE_D_NOCSR_COM_PHY_BCR] = { 0xbc008 }, > + [GCC_PCIE_D_PHY_BCR] = { 0x50000 }, > + [GCC_PCIE_D_PHY_CFG_AHB_BCR] = { 0xbc010 }, > + [GCC_PCIE_D_PHY_COM_BCR] = { 0xbc014 }, > + [GCC_PCIE_D_PHY_NOCSR_COM_PHY_BCR] = { 0xbc00c }, > + [GCC_PCIE_NOC_BCR] = { 0x52000 }, > + [GCC_PDM_BCR] = { 0x1a000 }, > + [GCC_QUPV3_WRAPPER_3_BCR] = { 0x23000 }, > + [GCC_TCSR_PCIE_BCR] = { 0xb901c }, > +}; > + > +static const struct qcom_power_map nord_gcc_gdscs[] = { > + [GCC_PCIE_A_GDSC] = { 0x49004 }, > + [GCC_PCIE_A_PHY_GDSC] = { 0x4d004 }, > + [GCC_PCIE_B_GDSC] = { 0x4a004 }, > + [GCC_PCIE_B_PHY_GDSC] = { 0x4e004 }, > + [GCC_PCIE_C_GDSC] = { 0x4b004 }, > + [GCC_PCIE_C_PHY_GDSC] = { 0x4f004 }, > + [GCC_PCIE_D_GDSC] = { 0x4c004 }, > + [GCC_PCIE_D_PHY_GDSC] = { 0x50004 }, > + [GCC_PCIE_NOC_GDSC] = { 0x52004 }, > +}; > + > +static struct msm_clk_data nord_gcc_data = { > + .resets = nord_gcc_resets, > + .num_resets = ARRAY_SIZE(nord_gcc_resets), > + .clks = nord_gcc_clks, > + .num_clks = ARRAY_SIZE(nord_gcc_clks), > + > + .power_domains = nord_gcc_gdscs, > + .num_power_domains = ARRAY_SIZE(nord_gcc_gdscs), > + > + .enable = nord_gcc_enable, > +}; > + > +static const struct udevice_id gcc_nord_of_match[] = { > + { > + .compatible = "qcom,nord-gcc", > + .data = (ulong)&nord_gcc_data, > + }, > + { } > +}; > + > +U_BOOT_DRIVER(gcc_nord) = { > + .name = "gcc_nord", > + .id = UCLASS_NOP, > + .of_match = gcc_nord_of_match, > + .bind = qcom_cc_bind, > + .flags = DM_FLAG_PRE_RELOC | DM_FLAG_DEFAULT_PD_CTRL_OFF, > +}; Looks good Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org> Thanks, Neil ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 1/8] clk: qcom: add GCC driver for nord 2026-10-21 16:04 ` [PATCH v3 1/8] clk: qcom: add GCC driver for nord Aswin Murugan 2026-10-22 7:50 ` neil.armstrong @ 2026-10-22 21:33 ` Tyler Baker 1 sibling, 0 replies; 21+ messages in thread From: Tyler Baker @ 2026-10-22 21:33 UTC (permalink / raw) To: Aswin Murugan Cc: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot On Wed, 21 Oct 2026 at 21:34, Aswin Murugan wrote: [...] > + GATE_CLK(GCC_BOOT_ROM_AHB_CLK, 0x1f004, BIT(0)), 7 of these are CBCR-backed in Linux, use GATE_CLK_POLLED like the recent sa8775p/sc7280/qcs615 conversions. With that: Reviewed-by: Tyler Baker <tyler.baker@oss.qualcomm.com> ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 2/8] clk: qcom: add NEGCC driver for nord 2026-10-21 16:04 [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC Aswin Murugan 2026-10-21 16:04 ` [PATCH v3 1/8] clk: qcom: add GCC driver for nord Aswin Murugan @ 2026-10-21 16:04 ` Aswin Murugan 2026-10-22 21:34 ` Tyler Baker 2026-10-21 16:04 ` [PATCH v3 3/8] clk: qcom: add SEGCC " Aswin Murugan ` (6 subsequent siblings) 8 siblings, 1 reply; 21+ messages in thread From: Aswin Murugan @ 2026-10-21 16:04 UTC (permalink / raw) To: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, aswin.murugan, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot Add support for the nord NE Global Clock Controller (NEGCC). Implement the qcom,nord-negcc driver to provide clocks, resets and power domains required by nord peripherals during initialization. Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com> --- drivers/clk/qcom/Kconfig | 9 ++ drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/clock-nord-negcc.c | 186 ++++++++++++++++++++++++++++ 3 files changed, 196 insertions(+) create mode 100644 drivers/clk/qcom/clock-nord-negcc.c diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig index 7228d5ecbf9..3cc5e453f66 100644 --- a/drivers/clk/qcom/Kconfig +++ b/drivers/clk/qcom/Kconfig @@ -63,6 +63,15 @@ config CLK_QCOM_NORD on the Snapdragon Nord SoC. This driver supports the clocks and resets exposed by the GCC hardware block. +config CLK_QCOM_NORD_NEGCC + bool "Qualcomm Nord NEGCC" + select CLK_QCOM + help + Say Y here to enable support for the North-East Global Clock + Controller on the Snapdragon Nord SoC. This driver supports the + UFS, USB, and QUPv3 clocks and resets exposed by the NEGCC + hardware block. + config CLK_QCOM_QCM2290 bool "Qualcomm QCM2290 GCC" select CLK_QCOM diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile index 193740682aa..c369909c44d 100644 --- a/drivers/clk/qcom/Makefile +++ b/drivers/clk/qcom/Makefile @@ -11,6 +11,7 @@ obj-$(CONFIG_CLK_QCOM_IPQ5424) += clock-ipq5424.o obj-$(CONFIG_CLK_QCOM_IPQ9574) += clock-ipq9574.o obj-$(CONFIG_CLK_QCOM_MILOS) += clock-milos.o obj-$(CONFIG_CLK_QCOM_NORD) += clock-nord-gcc.o +obj-$(CONFIG_CLK_QCOM_NORD_NEGCC) += clock-nord-negcc.o obj-$(CONFIG_CLK_QCOM_QCM2290) += clock-qcm2290.o obj-$(CONFIG_CLK_QCOM_QCS404) += clock-qcs404.o obj-$(CONFIG_CLK_QCOM_QCS8300) += clock-qcs8300.o diff --git a/drivers/clk/qcom/clock-nord-negcc.c b/drivers/clk/qcom/clock-nord-negcc.c new file mode 100644 index 00000000000..82340749ffa --- /dev/null +++ b/drivers/clk/qcom/clock-nord-negcc.c @@ -0,0 +1,186 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * + */ + +#include <linux/types.h> +#include <clk-uclass.h> +#include <dm.h> +#include <linux/delay.h> +#include <asm/io.h> +#include <linux/bug.h> +#include <linux/bitops.h> +#include <dt-bindings/clock/qcom,nord-negcc.h> +#include "clock-qcom.h" + +#define NE_GCC_QUPV3_WRAP2_S1_CLK_CMD_RCGR 0x382a8 +#define NE_GCC_USB31_PRIM_MASTER_CLK_CMD_RCGR 0x2a038 +#define NE_GCC_USB31_PRIM_MOCK_UTMI_CLK_CMD_RCGR 0x2a050 +#define NE_GCC_USB20_MASTER_CLK_CMD_RCGR 0x31030 +#define NE_GCC_USB20_MOCK_UTMI_CLK_CMD_RCGR 0x31048 + +/* + * negcc-nord.c calls qcom_branch_set_force_mem_core() on + * NE_GCC_UFS_PHY_ICE_CORE_CLK and NE_GCC_UFS_PHY_AXI_CLK. This U-Boot clock + * framework has no FORCE_MEM_CORE_ON primitive (confirmed absent from + * clock-qcom.h/.c) — flagged as a YELLOW residual risk, not worked around. + */ + +static ulong nord_negcc_set_rate(struct clk *clk, ulong rate) +{ + struct msm_clk_priv *priv = dev_get_priv(clk->dev); + + if (clk->id < priv->data->num_clks) + debug("%s: %s, requested rate=%ld\n", __func__, + priv->data->clks[clk->id].name, rate); + + switch (clk->id) { + case NE_GCC_QUPV3_WRAP2_S1_CLK: + WARN(rate != 14745600, + "Unexpected rate for NE_GCC_QUPV3_WRAP2_S1_CLK: %lu\n", rate); + clk_rcg_set_rate_mnd(priv->base, NE_GCC_QUPV3_WRAP2_S1_CLK_CMD_RCGR, + 1, 384, 15625, CFG_CLK_SRC_GPLL0, 16); + return rate; + case NE_GCC_USB31_PRIM_MASTER_CLK: + clk_rcg_set_rate_mnd(priv->base, NE_GCC_USB31_PRIM_MASTER_CLK_CMD_RCGR, + 3, 0, 0, CFG_CLK_SRC_GPLL0, 8); + return rate; + case NE_GCC_USB31_PRIM_MOCK_UTMI_CLK: + clk_rcg_set_rate_mnd(priv->base, NE_GCC_USB31_PRIM_MOCK_UTMI_CLK_CMD_RCGR, + 1, 0, 0, CFG_CLK_SRC_CXO, 0); + return rate; + case NE_GCC_USB20_MASTER_CLK: + clk_rcg_set_rate_mnd(priv->base, NE_GCC_USB20_MASTER_CLK_CMD_RCGR, + 5, 0, 0, CFG_CLK_SRC_GPLL0, 8); + return rate; + case NE_GCC_USB20_MOCK_UTMI_CLK: + clk_rcg_set_rate_mnd(priv->base, NE_GCC_USB20_MOCK_UTMI_CLK_CMD_RCGR, + 1, 0, 0, CFG_CLK_SRC_CXO, 0); + return rate; + default: + return 0; + } +} + +static const struct gate_clk nord_negcc_clks[] = { + GATE_CLK_POLLED(NE_GCC_AGGRE_NOC_UFS_PHY_AXI_CLK, 0x330f4, BIT(0), 0x330f4), + GATE_CLK_POLLED(NE_GCC_AGGRE_NOC_USB2_AXI_CLK, 0x31068, BIT(0), 0x31068), + GATE_CLK_POLLED(NE_GCC_AGGRE_NOC_USB3_PRIM_AXI_CLK, 0x2a098, BIT(0), 0x2a098), + GATE_CLK_POLLED(NE_GCC_AGGRE_NOC_USB3_SEC_AXI_CLK, 0x2c098, BIT(0), 0x2c098), + GATE_CLK_POLLED(NE_GCC_AHB2PHY_CLK, 0x30004, BIT(0), 0x30004), + GATE_CLK_POLLED(NE_GCC_CNOC_USB2_AXI_CLK, 0x31064, BIT(0), 0x31064), + GATE_CLK_POLLED(NE_GCC_CNOC_USB3_PRIM_AXI_CLK, 0x2a094, BIT(0), 0x2a094), + GATE_CLK_POLLED(NE_GCC_CNOC_USB3_SEC_AXI_CLK, 0x2c094, BIT(0), 0x2c094), + GATE_CLK_POLLED(NE_GCC_GPU_2_HSCNOC_GFX_CLK, 0x34014, BIT(0), 0x34014), + GATE_CLK_POLLED(NE_GCC_GPU_2_SMMU_VOTE_CLK, 0x57028, BIT(0), 0x57028), + GATE_CLK_POLLED(NE_GCC_QUPV3_WRAP2_CORE_2X_CLK, 0x57008, BIT(1), 0x38020), + GATE_CLK_POLLED(NE_GCC_QUPV3_WRAP2_CORE_CLK, 0x57008, BIT(0), 0x3800c), + GATE_CLK_POLLED(NE_GCC_QUPV3_WRAP2_M_AHB_CLK, 0x57000, BIT(30), 0x38004), + GATE_CLK_POLLED(NE_GCC_QUPV3_WRAP2_S0_CLK, 0x57008, BIT(2), 0x3815c), + GATE_CLK_POLLED(NE_GCC_QUPV3_WRAP2_S1_CLK, 0x57008, BIT(3), 0x38298), + GATE_CLK_POLLED(NE_GCC_QUPV3_WRAP2_S2_CLK, 0x57008, BIT(4), 0x383d4), + GATE_CLK_POLLED(NE_GCC_QUPV3_WRAP2_S3_CLK, 0x57008, BIT(5), 0x38510), + GATE_CLK_POLLED(NE_GCC_QUPV3_WRAP2_S4_CLK, 0x57008, BIT(6), 0x3864c), + GATE_CLK_POLLED(NE_GCC_QUPV3_WRAP2_S5_CLK, 0x57008, BIT(7), 0x38788), + GATE_CLK_POLLED(NE_GCC_QUPV3_WRAP2_S6_CLK, 0x57008, BIT(8), 0x388c4), + GATE_CLK_POLLED(NE_GCC_QUPV3_WRAP2_S_AHB_CLK, 0x57000, BIT(31), 0x38008), + GATE_CLK_POLLED(NE_GCC_UFS_PHY_AHB_CLK, 0x33028, BIT(0), 0x33028), + GATE_CLK_POLLED(NE_GCC_UFS_PHY_AXI_CLK, 0x33018, BIT(0), 0x33018), + GATE_CLK_POLLED(NE_GCC_UFS_PHY_ICE_CORE_CLK, 0x3307c, BIT(0), 0x3307c), + GATE_CLK_POLLED(NE_GCC_UFS_PHY_PHY_AUX_CLK, 0x330bc, BIT(0), 0x330bc), + GATE_CLK_POLLED(NE_GCC_UFS_PHY_UNIPRO_CORE_CLK, 0x3306c, BIT(0), 0x3306c), + GATE_CLK_POLLED(NE_GCC_USB31_PRIM_ATB_CLK, 0x2a018, BIT(0), 0x2a018), + GATE_CLK_POLLED(NE_GCC_USB31_PRIM_EUD_AHB_CLK, 0x2a02c, BIT(0), 0x2a02c), + GATE_CLK_POLLED(NE_GCC_USB31_SEC_ATB_CLK, 0x2c018, BIT(0), 0x2c018), + GATE_CLK_POLLED(NE_GCC_USB31_SEC_EUD_AHB_CLK, 0x2c02c, BIT(0), 0x2c02c), + + GATE_CLK(NE_GCC_FRQ_MEASURE_REF_CLK, 0x20008, BIT(0)), + GATE_CLK(NE_GCC_GP1_CLK, 0x21000, BIT(0)), + GATE_CLK(NE_GCC_GP2_CLK, 0x22000, BIT(0)), + GATE_CLK(NE_GCC_GPU_2_GPLL0_CLK_SRC, 0x57000, BIT(19)), + GATE_CLK(NE_GCC_GPU_2_GPLL0_DIV_CLK_SRC, 0x57000, BIT(20)), + GATE_CLK(NE_GCC_SDCC4_APPS_CLK, 0x18004, BIT(0)), + GATE_CLK(NE_GCC_SDCC4_AXI_CLK, 0x18014, BIT(0)), + GATE_CLK(NE_GCC_UFS_PHY_RX_SYMBOL_0_CLK, 0x33030, BIT(0)), + GATE_CLK(NE_GCC_UFS_PHY_RX_SYMBOL_1_CLK, 0x330d8, BIT(0)), + GATE_CLK(NE_GCC_UFS_PHY_TX_SYMBOL_0_CLK, 0x3302c, BIT(0)), + GATE_CLK(NE_GCC_USB20_MASTER_CLK, 0x31018, BIT(0)), + GATE_CLK(NE_GCC_USB20_MOCK_UTMI_CLK, 0x3102c, BIT(0)), + GATE_CLK(NE_GCC_USB20_SLEEP_CLK, 0x31028, BIT(0)), + GATE_CLK(NE_GCC_USB31_PRIM_MASTER_CLK, 0x2a01c, BIT(0)), + GATE_CLK(NE_GCC_USB31_PRIM_MOCK_UTMI_CLK, 0x2a034, BIT(0)), + GATE_CLK(NE_GCC_USB31_PRIM_SLEEP_CLK, 0x2a030, BIT(0)), + GATE_CLK(NE_GCC_USB31_SEC_MASTER_CLK, 0x2c01c, BIT(0)), + GATE_CLK(NE_GCC_USB31_SEC_MOCK_UTMI_CLK, 0x2c034, BIT(0)), + GATE_CLK(NE_GCC_USB31_SEC_SLEEP_CLK, 0x2c030, BIT(0)), + GATE_CLK(NE_GCC_USB3_PRIM_PHY_AUX_CLK, 0x2a06c, BIT(0)), + GATE_CLK(NE_GCC_USB3_PRIM_PHY_COM_AUX_CLK, 0x2a070, BIT(0)), + GATE_CLK(NE_GCC_USB3_PRIM_PHY_PIPE_CLK, 0x2a074, BIT(0)), + GATE_CLK(NE_GCC_USB3_SEC_PHY_AUX_CLK, 0x2c06c, BIT(0)), + GATE_CLK(NE_GCC_USB3_SEC_PHY_COM_AUX_CLK, 0x2c070, BIT(0)), + GATE_CLK(NE_GCC_USB3_SEC_PHY_PIPE_CLK, 0x2c074, BIT(0)), +}; + +static int nord_negcc_enable(struct clk *clk) +{ + struct msm_clk_priv *priv = dev_get_priv(clk->dev); + + return qcom_gate_clk_en(priv, clk->id); +} + +static const struct qcom_reset_map nord_negcc_resets[] = { + [NE_GCC_GPU_2_BCR] = { 0x34000 }, + [NE_GCC_QUPV3_WRAPPER_2_BCR] = { 0x38000 }, + [NE_GCC_SDCC4_BCR] = { 0x18000 }, + [NE_GCC_UFS_PHY_BCR] = { 0x33000 }, + [NE_GCC_USB20_PRIM_BCR] = { 0x31000 }, + [NE_GCC_USB31_PRIM_BCR] = { 0x2a000 }, + [NE_GCC_USB31_SEC_BCR] = { 0x2c000 }, + [NE_GCC_USB3_DP_PHY_PRIM_BCR] = { 0x2b008 }, + [NE_GCC_USB3_DP_PHY_SEC_BCR] = { 0x2d008 }, + [NE_GCC_USB3_PHY_PRIM_BCR] = { 0x2b000 }, + [NE_GCC_USB3_PHY_SEC_BCR] = { 0x2d000 }, + [NE_GCC_USB3PHY_PHY_PRIM_BCR] = { 0x2b004 }, + [NE_GCC_USB3PHY_PHY_SEC_BCR] = { 0x2d004 }, + [NE_GCC_QUSB2PHY_PRIM_BCR] = { 0x2e000 }, +}; + +static const struct qcom_power_map nord_negcc_gdscs[] = { + [NE_GCC_UFS_MEM_PHY_GDSC] = { 0x32000 }, + [NE_GCC_UFS_PHY_GDSC] = { 0x33004 }, + [NE_GCC_USB20_PRIM_GDSC] = { 0x31004 }, + [NE_GCC_USB31_PRIM_GDSC] = { 0x2a004 }, + [NE_GCC_USB31_SEC_GDSC] = { 0x2c004 }, + [NE_GCC_USB3_PHY_GDSC] = { 0x2b00c }, + [NE_GCC_USB3_SEC_PHY_GDSC] = { 0x2d00c }, +}; + +static struct msm_clk_data nord_negcc_data = { + .resets = nord_negcc_resets, + .num_resets = ARRAY_SIZE(nord_negcc_resets), + .clks = nord_negcc_clks, + .num_clks = ARRAY_SIZE(nord_negcc_clks), + + .power_domains = nord_negcc_gdscs, + .num_power_domains = ARRAY_SIZE(nord_negcc_gdscs), + + .enable = nord_negcc_enable, + .set_rate = nord_negcc_set_rate, +}; + +static const struct udevice_id gcc_nord_negcc_of_match[] = { + { + .compatible = "qcom,nord-negcc", + .data = (ulong)&nord_negcc_data, + }, + { } +}; + +U_BOOT_DRIVER(gcc_nord_negcc) = { + .name = "gcc_nord_negcc", + .id = UCLASS_NOP, + .of_match = gcc_nord_negcc_of_match, + .bind = qcom_cc_bind, + .flags = DM_FLAG_PRE_RELOC | DM_FLAG_DEFAULT_PD_CTRL_OFF, +}; -- 2.34.1 ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v3 2/8] clk: qcom: add NEGCC driver for nord 2026-10-21 16:04 ` [PATCH v3 2/8] clk: qcom: add NEGCC " Aswin Murugan @ 2026-10-22 21:34 ` Tyler Baker 0 siblings, 0 replies; 21+ messages in thread From: Tyler Baker @ 2026-10-22 21:34 UTC (permalink / raw) To: Aswin Murugan Cc: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot On Wed, 21 Oct 2026 at 21:34, Aswin Murugan wrote: [...] > + * negcc-nord.c calls qcom_branch_set_force_mem_core() on Leftover note, drop it. [...] > + WARN(rate != 14745600, > + "Unexpected rate for NE_GCC_QUPV3_WRAP2_S1_CLK: %lu\n", rate); > + clk_rcg_set_rate_mnd(priv->base, NE_GCC_QUPV3_WRAP2_S1_CLK_CMD_RCGR, > + 1, 384, 15625, CFG_CLK_SRC_GPLL0, 16); > + return rate; The UART asks for 7372800 at 115200, so this sets 14.7456 MHz, returns 7372800 and the baud doubles. Use a freq table and return the real rate. Same in segcc. > + 3, 0, 0, CFG_CLK_SRC_GPLL0, 8); div is the raw field (2 * div - 1): 3 is /2, 300 MHz. Linux max is 240. USB20 master below gets 200 MHz, Linux max 120. > + 1, 0, 0, CFG_CLK_SRC_CXO, 0); No MND here, use clk_rcg_set_rate(). Also 20 CBCR-backed gates here use GATE_CLK, see 1/8. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 3/8] clk: qcom: add SEGCC driver for nord 2026-10-21 16:04 [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC Aswin Murugan 2026-10-21 16:04 ` [PATCH v3 1/8] clk: qcom: add GCC driver for nord Aswin Murugan 2026-10-21 16:04 ` [PATCH v3 2/8] clk: qcom: add NEGCC " Aswin Murugan @ 2026-10-21 16:04 ` Aswin Murugan 2026-10-22 21:34 ` Tyler Baker 2026-10-21 16:04 ` [PATCH v3 4/8] clk: qcom: add NWGCC " Aswin Murugan ` (5 subsequent siblings) 8 siblings, 1 reply; 21+ messages in thread From: Aswin Murugan @ 2026-10-21 16:04 UTC (permalink / raw) To: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, aswin.murugan, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot Add support for the nord SE Global Clock Controller (SEGCC). Implement the qcom,nord-segcc driver to provide clocks, resets and power domains required by nord peripherals during boot. Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com> --- drivers/clk/qcom/Kconfig | 9 ++ drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/clock-nord-segcc.c | 137 ++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 drivers/clk/qcom/clock-nord-segcc.c diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig index 3cc5e453f66..943405863ba 100644 --- a/drivers/clk/qcom/Kconfig +++ b/drivers/clk/qcom/Kconfig @@ -72,6 +72,15 @@ config CLK_QCOM_NORD_NEGCC UFS, USB, and QUPv3 clocks and resets exposed by the NEGCC hardware block. +config CLK_QCOM_NORD_SEGCC + bool "Qualcomm Nord SEGCC" + select CLK_QCOM + help + Say Y here to enable support for the South-East Global Clock + Controller on the Snapdragon Nord SoC. This driver supports the + EMAC and QUPv3 clocks and resets exposed by the SEGCC hardware + block. + config CLK_QCOM_QCM2290 bool "Qualcomm QCM2290 GCC" select CLK_QCOM diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile index c369909c44d..7ae39fa2026 100644 --- a/drivers/clk/qcom/Makefile +++ b/drivers/clk/qcom/Makefile @@ -12,6 +12,7 @@ obj-$(CONFIG_CLK_QCOM_IPQ9574) += clock-ipq9574.o obj-$(CONFIG_CLK_QCOM_MILOS) += clock-milos.o obj-$(CONFIG_CLK_QCOM_NORD) += clock-nord-gcc.o obj-$(CONFIG_CLK_QCOM_NORD_NEGCC) += clock-nord-negcc.o +obj-$(CONFIG_CLK_QCOM_NORD_SEGCC) += clock-nord-segcc.o obj-$(CONFIG_CLK_QCOM_QCM2290) += clock-qcm2290.o obj-$(CONFIG_CLK_QCOM_QCS404) += clock-qcs404.o obj-$(CONFIG_CLK_QCOM_QCS8300) += clock-qcs8300.o diff --git a/drivers/clk/qcom/clock-nord-segcc.c b/drivers/clk/qcom/clock-nord-segcc.c new file mode 100644 index 00000000000..53a8732c646 --- /dev/null +++ b/drivers/clk/qcom/clock-nord-segcc.c @@ -0,0 +1,137 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * + */ + +#include <linux/types.h> +#include <clk-uclass.h> +#include <dm.h> +#include <linux/delay.h> +#include <asm/io.h> +#include <linux/bug.h> +#include <linux/bitops.h> +#include <dt-bindings/clock/qcom,nord-segcc.h> +#include "clock-qcom.h" + +#define SE_GCC_QUPV3_WRAP0_S4_CLK_CMD_RCGR 0x2665c + +static ulong nord_segcc_set_rate(struct clk *clk, ulong rate) +{ + struct msm_clk_priv *priv = dev_get_priv(clk->dev); + + if (clk->id < priv->data->num_clks) + debug("%s: %s, requested rate=%ld\n", __func__, + priv->data->clks[clk->id].name, rate); + + switch (clk->id) { + case SE_GCC_QUPV3_WRAP0_S4_CLK: + WARN(rate != 14745600, + "Unexpected rate for SE_GCC_QUPV3_WRAP0_S4_CLK: %lu\n", rate); + clk_rcg_set_rate_mnd(priv->base, SE_GCC_QUPV3_WRAP0_S4_CLK_CMD_RCGR, + 1, 384, 15625, CFG_CLK_SRC_GPLL0, 16); + return rate; + default: + return 0; + } +} + +static const struct gate_clk nord_segcc_clks[] = { + GATE_CLK_POLLED(SE_GCC_EMAC0_AXI_CLK, 0x2401c, BIT(0), 0x2401c), + GATE_CLK_POLLED(SE_GCC_EMAC1_AXI_CLK, 0x2501c, BIT(0), 0x2501c), + GATE_CLK_POLLED(SE_GCC_MMU_2_TCU_VOTE_CLK, 0x57040, BIT(0), 0x57040), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP0_CORE_2X_CLK, 0x57000, BIT(15), 0x26020), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP0_CORE_CLK, 0x57000, BIT(14), 0x2600c), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP0_M_AHB_CLK, 0x57000, BIT(12), 0x26004), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP0_S0_CLK, 0x57000, BIT(16), 0x2615c), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP0_S1_CLK, 0x57000, BIT(17), 0x26298), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP0_S2_CLK, 0x57000, BIT(18), 0x263d4), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP0_S3_CLK, 0x57000, BIT(19), 0x26510), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP0_S4_CLK, 0x57000, BIT(20), 0x2664c), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP0_S5_CLK, 0x57000, BIT(21), 0x26788), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP0_S6_CLK, 0x57000, BIT(22), 0x268c4), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP0_S_AHB_CLK, 0x57000, BIT(13), 0x26008), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP1_CORE_2X_CLK, 0x57000, BIT(26), 0x27020), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP1_CORE_CLK, 0x57000, BIT(25), 0x2700c), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP1_M_AHB_CLK, 0x57000, BIT(23), 0x27004), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP1_S0_CLK, 0x57000, BIT(27), 0x2715c), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP1_S1_CLK, 0x57000, BIT(28), 0x27298), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP1_S2_CLK, 0x57000, BIT(29), 0x273d4), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP1_S3_CLK, 0x57000, BIT(30), 0x27510), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP1_S4_CLK, 0x57000, BIT(31), 0x2764c), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP1_S5_CLK, 0x57008, BIT(0), 0x27788), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP1_S6_CLK, 0x57008, BIT(1), 0x278c4), + GATE_CLK_POLLED(SE_GCC_QUPV3_WRAP1_S_AHB_CLK, 0x57000, BIT(24), 0x27008), + + GATE_CLK(SE_GCC_EEE_EMAC0_CLK, 0x240b4, BIT(0)), + GATE_CLK(SE_GCC_EEE_EMAC1_CLK, 0x250b4, BIT(0)), + GATE_CLK(SE_GCC_EMAC0_CC_SGMIIPHY_RX_CLK, 0x24064, BIT(0)), + GATE_CLK(SE_GCC_EMAC0_CC_SGMIIPHY_TX_CLK, 0x2405c, BIT(0)), + GATE_CLK(SE_GCC_EMAC0_PHY_AUX_CLK, 0x2402c, BIT(0)), + GATE_CLK(SE_GCC_EMAC0_PTP_CLK, 0x24048, BIT(0)), + GATE_CLK(SE_GCC_EMAC0_RGMII_CLK, 0x24058, BIT(0)), + GATE_CLK(SE_GCC_EMAC0_RPCS_RX_CLK, 0x240a8, BIT(0)), + GATE_CLK(SE_GCC_EMAC0_RPCS_TX_CLK, 0x240a4, BIT(0)), + GATE_CLK(SE_GCC_EMAC0_XGXS_RX_CLK, 0x240b0, BIT(0)), + GATE_CLK(SE_GCC_EMAC0_XGXS_TX_CLK, 0x240ac, BIT(0)), + GATE_CLK(SE_GCC_EMAC1_CC_SGMIIPHY_RX_CLK, 0x25064, BIT(0)), + GATE_CLK(SE_GCC_EMAC1_CC_SGMIIPHY_TX_CLK, 0x2505c, BIT(0)), + GATE_CLK(SE_GCC_EMAC1_PHY_AUX_CLK, 0x2502c, BIT(0)), + GATE_CLK(SE_GCC_EMAC1_PTP_CLK, 0x25048, BIT(0)), + GATE_CLK(SE_GCC_EMAC1_RGMII_CLK, 0x25058, BIT(0)), + GATE_CLK(SE_GCC_EMAC1_RPCS_RX_CLK, 0x250a8, BIT(0)), + GATE_CLK(SE_GCC_EMAC1_RPCS_TX_CLK, 0x250a4, BIT(0)), + GATE_CLK(SE_GCC_EMAC1_XGXS_RX_CLK, 0x250b0, BIT(0)), + GATE_CLK(SE_GCC_EMAC1_XGXS_TX_CLK, 0x250ac, BIT(0)), + GATE_CLK(SE_GCC_FRQ_MEASURE_REF_CLK, 0x18008, BIT(0)), + GATE_CLK(SE_GCC_GP1_CLK, 0x19000, BIT(0)), + GATE_CLK(SE_GCC_GP2_CLK, 0x1a000, BIT(0)), +}; + +static int nord_segcc_enable(struct clk *clk) +{ + struct msm_clk_priv *priv = dev_get_priv(clk->dev); + + return qcom_gate_clk_en(priv, clk->id); +} + +static const struct qcom_reset_map nord_segcc_resets[] = { + [SE_GCC_EMAC0_BCR] = { 0x24000 }, + [SE_GCC_EMAC1_BCR] = { 0x25000 }, + [SE_GCC_QUPV3_WRAPPER_0_BCR] = { 0x26000 }, + [SE_GCC_QUPV3_WRAPPER_1_BCR] = { 0x27000 }, +}; + +static const struct qcom_power_map nord_segcc_gdscs[] = { + [SE_GCC_EMAC0_GDSC] = { 0x24004 }, + [SE_GCC_EMAC1_GDSC] = { 0x25004 }, +}; + +static struct msm_clk_data nord_segcc_data = { + .resets = nord_segcc_resets, + .num_resets = ARRAY_SIZE(nord_segcc_resets), + .clks = nord_segcc_clks, + .num_clks = ARRAY_SIZE(nord_segcc_clks), + + .power_domains = nord_segcc_gdscs, + .num_power_domains = ARRAY_SIZE(nord_segcc_gdscs), + + .enable = nord_segcc_enable, + .set_rate = nord_segcc_set_rate, +}; + +static const struct udevice_id gcc_nord_segcc_of_match[] = { + { + .compatible = "qcom,nord-segcc", + .data = (ulong)&nord_segcc_data, + }, + { } +}; + +U_BOOT_DRIVER(gcc_nord_segcc) = { + .name = "gcc_nord_segcc", + .id = UCLASS_NOP, + .of_match = gcc_nord_segcc_of_match, + .bind = qcom_cc_bind, + .flags = DM_FLAG_PRE_RELOC | DM_FLAG_DEFAULT_PD_CTRL_OFF, +}; -- 2.34.1 ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v3 3/8] clk: qcom: add SEGCC driver for nord 2026-10-21 16:04 ` [PATCH v3 3/8] clk: qcom: add SEGCC " Aswin Murugan @ 2026-10-22 21:34 ` Tyler Baker 0 siblings, 0 replies; 21+ messages in thread From: Tyler Baker @ 2026-10-22 21:34 UTC (permalink / raw) To: Aswin Murugan Cc: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot On Wed, 21 Oct 2026 at 21:34, Aswin Murugan wrote: [...] > + WARN(rate != 14745600, > + "Unexpected rate for SE_GCC_QUPV3_WRAP0_S4_CLK: %lu\n", rate); Same UART rate bug as negcc, and 23 CBCR-backed gates use GATE_CLK. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 4/8] clk: qcom: add NWGCC driver for nord 2026-10-21 16:04 [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC Aswin Murugan ` (2 preceding siblings ...) 2026-10-21 16:04 ` [PATCH v3 3/8] clk: qcom: add SEGCC " Aswin Murugan @ 2026-10-21 16:04 ` Aswin Murugan 2026-10-22 21:34 ` Tyler Baker 2026-10-21 16:04 ` [PATCH v3 5/8] clk: qcom: add TCSRCC " Aswin Murugan ` (4 subsequent siblings) 8 siblings, 1 reply; 21+ messages in thread From: Aswin Murugan @ 2026-10-21 16:04 UTC (permalink / raw) To: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, aswin.murugan, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot Add support for the nord NW Global Clock Controller (NWGCC). Implement the qcom,nord-nwgcc driver to provide clocks, resets and power domains required by nord peripherals. Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com> --- drivers/clk/qcom/Kconfig | 9 +++ drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/clock-nord-nwgcc.c | 91 +++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 drivers/clk/qcom/clock-nord-nwgcc.c diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig index 943405863ba..78acc9dd42b 100644 --- a/drivers/clk/qcom/Kconfig +++ b/drivers/clk/qcom/Kconfig @@ -81,6 +81,15 @@ config CLK_QCOM_NORD_SEGCC EMAC and QUPv3 clocks and resets exposed by the SEGCC hardware block. +config CLK_QCOM_NORD_NWGCC + bool "Qualcomm Nord NWGCC" + select CLK_QCOM + help + Say Y here to enable support for the North-West Global Clock + Controller on the Snapdragon Nord SoC. This driver supports the + camera, display, EVA, video, and GPU clocks and resets exposed by + the NWGCC hardware block. + config CLK_QCOM_QCM2290 bool "Qualcomm QCM2290 GCC" select CLK_QCOM diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile index 7ae39fa2026..1ca23a0e022 100644 --- a/drivers/clk/qcom/Makefile +++ b/drivers/clk/qcom/Makefile @@ -13,6 +13,7 @@ obj-$(CONFIG_CLK_QCOM_MILOS) += clock-milos.o obj-$(CONFIG_CLK_QCOM_NORD) += clock-nord-gcc.o obj-$(CONFIG_CLK_QCOM_NORD_NEGCC) += clock-nord-negcc.o obj-$(CONFIG_CLK_QCOM_NORD_SEGCC) += clock-nord-segcc.o +obj-$(CONFIG_CLK_QCOM_NORD_NWGCC) += clock-nord-nwgcc.o obj-$(CONFIG_CLK_QCOM_QCM2290) += clock-qcm2290.o obj-$(CONFIG_CLK_QCOM_QCS404) += clock-qcs404.o obj-$(CONFIG_CLK_QCOM_QCS8300) += clock-qcs8300.o diff --git a/drivers/clk/qcom/clock-nord-nwgcc.c b/drivers/clk/qcom/clock-nord-nwgcc.c new file mode 100644 index 00000000000..f5345238c9f --- /dev/null +++ b/drivers/clk/qcom/clock-nord-nwgcc.c @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * + */ + +#include <linux/types.h> +#include <clk-uclass.h> +#include <dm.h> +#include <linux/delay.h> +#include <asm/io.h> +#include <linux/bitops.h> +#include <dt-bindings/clock/qcom,nord-nwgcc.h> +#include "clock-qcom.h" + +static const struct gate_clk nord_nwgcc_clks[] = { + GATE_CLK_POLLED(NW_GCC_CAMERA_TRIG_CLK, 0x16034, BIT(0), 0x16034), + GATE_CLK_POLLED(NW_GCC_DISP_0_TRIG_CLK, 0x1801c, BIT(0), 0x1801c), + GATE_CLK_POLLED(NW_GCC_DISP_1_TRIG_CLK, 0x1901c, BIT(0), 0x1901c), + GATE_CLK_POLLED(NW_GCC_EVA_TRIG_CLK, 0x1b028, BIT(0), 0x1b028), + GATE_CLK_POLLED(NW_GCC_GPU_2_GPLL0_CLK_SRC, 0x76000, BIT(6), 0x24150), + GATE_CLK_POLLED(NW_GCC_GPU_2_GPLL0_DIV_CLK_SRC, 0x76000, BIT(7), 0x24158), + GATE_CLK_POLLED(NW_GCC_GPU_2_HSCNOC_GFX_CLK, 0x2400c, BIT(0), 0x2400c), + GATE_CLK_POLLED(NW_GCC_GPU_GPLL0_CLK_SRC, 0x76000, BIT(4), 0x23150), + GATE_CLK_POLLED(NW_GCC_GPU_GPLL0_DIV_CLK_SRC, 0x76000, BIT(5), 0x23158), + GATE_CLK_POLLED(NW_GCC_GPU_SMMU_VOTE_CLK, 0x86038, BIT(0), 0x86038), + GATE_CLK_POLLED(NW_GCC_MMU_1_TCU_VOTE_CLK, 0x86040, BIT(0), 0x86040), + + GATE_CLK(NW_GCC_ACMU_MUX_CLK, 0x1f01c, BIT(0)), + GATE_CLK(NW_GCC_CAMERA_HF_AXI_CLK, 0x16008, BIT(0)), + GATE_CLK(NW_GCC_CAMERA_SF_AXI_CLK, 0x1601c, BIT(0)), + GATE_CLK(NW_GCC_DISP_0_HF_AXI_CLK, 0x18008, BIT(0)), + GATE_CLK(NW_GCC_DISP_1_HF_AXI_CLK, 0x19008, BIT(0)), + GATE_CLK(NW_GCC_DPRX0_AXI_HF_CLK, 0x29004, BIT(0)), + GATE_CLK(NW_GCC_DPRX1_AXI_HF_CLK, 0x2a004, BIT(0)), + GATE_CLK(NW_GCC_EVA_AXI0C_CLK, 0x1b01c, BIT(0)), + GATE_CLK(NW_GCC_EVA_AXI0_CLK, 0x1b008, BIT(0)), + GATE_CLK(NW_GCC_FRQ_MEASURE_REF_CLK, 0x1f008, BIT(0)), + GATE_CLK(NW_GCC_GP1_CLK, 0x20000, BIT(0)), + GATE_CLK(NW_GCC_GP2_CLK, 0x21000, BIT(0)), + GATE_CLK(NW_GCC_GPU_HSCNOC_GFX_CLK, 0x2300c, BIT(0)), + GATE_CLK(NW_GCC_HSCNOC_GPU_2_AXI_CLK, 0x24160, BIT(0)), + GATE_CLK(NW_GCC_HSCNOC_GPU_AXI_CLK, 0x23160, BIT(0)), + GATE_CLK(NW_GCC_VIDEO_AXI0C_CLK, 0x1a01c, BIT(0)), + GATE_CLK(NW_GCC_VIDEO_AXI0_CLK, 0x1a008, BIT(0)), + GATE_CLK(NW_GCC_VIDEO_AXI1_CLK, 0x1a030, BIT(0)), +}; + +static int nord_nwgcc_enable(struct clk *clk) +{ + struct msm_clk_priv *priv = dev_get_priv(clk->dev); + + return qcom_gate_clk_en(priv, clk->id); +} + +static const struct qcom_reset_map nord_nwgcc_resets[] = { + [NW_GCC_CAMERA_BCR] = { 0x16000 }, + [NW_GCC_DISPLAY_0_BCR] = { 0x18000 }, + [NW_GCC_DISPLAY_1_BCR] = { 0x19000 }, + [NW_GCC_DPRX0_BCR] = { 0x29000 }, + [NW_GCC_DPRX1_BCR] = { 0x2a000 }, + [NW_GCC_EVA_BCR] = { 0x1b000 }, + [NW_GCC_GPU_2_BCR] = { 0x24000 }, + [NW_GCC_GPU_BCR] = { 0x23000 }, + [NW_GCC_VIDEO_BCR] = { 0x1a000 }, +}; + +static struct msm_clk_data nord_nwgcc_data = { + .resets = nord_nwgcc_resets, + .num_resets = ARRAY_SIZE(nord_nwgcc_resets), + .clks = nord_nwgcc_clks, + .num_clks = ARRAY_SIZE(nord_nwgcc_clks), + + .enable = nord_nwgcc_enable, +}; + +static const struct udevice_id gcc_nord_nwgcc_of_match[] = { + { + .compatible = "qcom,nord-nwgcc", + .data = (ulong)&nord_nwgcc_data, + }, + { } +}; + +U_BOOT_DRIVER(gcc_nord_nwgcc) = { + .name = "gcc_nord_nwgcc", + .id = UCLASS_NOP, + .of_match = gcc_nord_nwgcc_of_match, + .bind = qcom_cc_bind, + .flags = DM_FLAG_PRE_RELOC | DM_FLAG_DEFAULT_PD_CTRL_OFF, +}; -- 2.34.1 ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v3 4/8] clk: qcom: add NWGCC driver for nord 2026-10-21 16:04 ` [PATCH v3 4/8] clk: qcom: add NWGCC " Aswin Murugan @ 2026-10-22 21:34 ` Tyler Baker 0 siblings, 0 replies; 21+ messages in thread From: Tyler Baker @ 2026-10-22 21:34 UTC (permalink / raw) To: Aswin Murugan Cc: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot On Wed, 21 Oct 2026 at 21:34, Aswin Murugan wrote: > Add support for the nord NW Global Clock Controller (NWGCC). Nothing in U-Boot uses these clocks. Drop it until something does. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 5/8] clk: qcom: add TCSRCC driver for nord 2026-10-21 16:04 [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC Aswin Murugan ` (3 preceding siblings ...) 2026-10-21 16:04 ` [PATCH v3 4/8] clk: qcom: add NWGCC " Aswin Murugan @ 2026-10-21 16:04 ` Aswin Murugan 2026-10-21 16:04 ` [PATCH v3 6/8] configs: qcom_defconfig: enable nord clock drivers Aswin Murugan ` (3 subsequent siblings) 8 siblings, 0 replies; 21+ messages in thread From: Aswin Murugan @ 2026-10-21 16:04 UTC (permalink / raw) To: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, aswin.murugan, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot Add support for the nord TCSR Clock Controller (TCSRCC). Implement the qcom,nord-tcsrcc driver to provide the clocks and resets required by nord platform peripherals. Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com> --- drivers/clk/qcom/Kconfig | 8 +++ drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/clock-nord-tcsrcc.c | 88 ++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 drivers/clk/qcom/clock-nord-tcsrcc.c diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig index 78acc9dd42b..ad88f4cfdf8 100644 --- a/drivers/clk/qcom/Kconfig +++ b/drivers/clk/qcom/Kconfig @@ -90,6 +90,14 @@ config CLK_QCOM_NORD_NWGCC camera, display, EVA, video, and GPU clocks and resets exposed by the NWGCC hardware block. +config CLK_QCOM_NORD_TCSRCC + bool "Qualcomm Nord TCSRCC" + select CLK_QCOM + help + Say Y here to enable support for the TCSR Clock Controller on the + Snapdragon Nord SoC. This driver supports the CLKREF enable gates + exposed by the TCSRCC hardware block. + config CLK_QCOM_QCM2290 bool "Qualcomm QCM2290 GCC" select CLK_QCOM diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile index 1ca23a0e022..2027c4bd7fa 100644 --- a/drivers/clk/qcom/Makefile +++ b/drivers/clk/qcom/Makefile @@ -14,6 +14,7 @@ obj-$(CONFIG_CLK_QCOM_NORD) += clock-nord-gcc.o obj-$(CONFIG_CLK_QCOM_NORD_NEGCC) += clock-nord-negcc.o obj-$(CONFIG_CLK_QCOM_NORD_SEGCC) += clock-nord-segcc.o obj-$(CONFIG_CLK_QCOM_NORD_NWGCC) += clock-nord-nwgcc.o +obj-$(CONFIG_CLK_QCOM_NORD_TCSRCC) += clock-nord-tcsrcc.o obj-$(CONFIG_CLK_QCOM_QCM2290) += clock-qcm2290.o obj-$(CONFIG_CLK_QCOM_QCS404) += clock-qcs404.o obj-$(CONFIG_CLK_QCOM_QCS8300) += clock-qcs8300.o diff --git a/drivers/clk/qcom/clock-nord-tcsrcc.c b/drivers/clk/qcom/clock-nord-tcsrcc.c new file mode 100644 index 00000000000..cd89e1b34ba --- /dev/null +++ b/drivers/clk/qcom/clock-nord-tcsrcc.c @@ -0,0 +1,88 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * + */ + +#include <linux/types.h> +#include <clk-uclass.h> +#include <dm.h> +#include <linux/delay.h> +#include <asm/io.h> +#include <linux/bitops.h> +#include <dt-bindings/clock/qcom,nord-tcsrcc.h> +#include "clock-qcom.h" + +#define TCXO_RATE 38400000 + +static const struct gate_clk nord_tcsrcc_clks[] = { + GATE_CLK(TCSR_DP_RX_0_CLKREF_EN, 0xa008, BIT(0)), + GATE_CLK(TCSR_DP_RX_1_CLKREF_EN, 0xb008, BIT(0)), + GATE_CLK(TCSR_DP_TX_0_CLKREF_EN, 0xc008, BIT(0)), + GATE_CLK(TCSR_DP_TX_1_CLKREF_EN, 0xd008, BIT(0)), + GATE_CLK(TCSR_DP_TX_2_CLKREF_EN, 0xe008, BIT(0)), + GATE_CLK(TCSR_DP_TX_3_CLKREF_EN, 0xf008, BIT(0)), + GATE_CLK(TCSR_PCIE_CLKREF_EN, 0x8, BIT(0)), + GATE_CLK(TCSR_UFS_CLKREF_EN, 0x3008, BIT(0)), + GATE_CLK(TCSR_USB2_0_CLKREF_EN, 0x4008, BIT(0)), + GATE_CLK(TCSR_USB2_1_CLKREF_EN, 0x5008, BIT(0)), + GATE_CLK(TCSR_USB2_2_CLKREF_EN, 0x6008, BIT(0)), + GATE_CLK(TCSR_USB3_0_CLKREF_EN, 0x8008, BIT(0)), + GATE_CLK(TCSR_USB3_1_CLKREF_EN, 0x7008, BIT(0)), + GATE_CLK(TCSR_UX_SGMII_0_CLKREF_EN, 0x1008, BIT(0)), + GATE_CLK(TCSR_UX_SGMII_1_CLKREF_EN, 0x2008, BIT(0)), +}; + +static struct msm_clk_data nord_tcsrcc_data = { + .clks = nord_tcsrcc_clks, + .num_clks = ARRAY_SIZE(nord_tcsrcc_clks), +}; + +static int nord_tcsrcc_enable(struct clk *clk) +{ + struct msm_clk_priv *priv = dev_get_priv(clk->dev); + + return qcom_gate_clk_en(priv, clk->id); +} + +static ulong nord_tcsrcc_get_rate(struct clk *clk) +{ + return TCXO_RATE; +} + +static int nord_tcsrcc_probe(struct udevice *dev) +{ + struct msm_clk_data *data = (struct msm_clk_data *)dev_get_driver_data(dev); + struct msm_clk_priv *priv = dev_get_priv(dev); + + priv->base = dev_read_addr(dev); + if (priv->base == FDT_ADDR_T_NONE) + return -EINVAL; + + priv->data = data; + + return 0; +} + +static struct clk_ops nord_tcsrcc_clk_ops = { + .enable = nord_tcsrcc_enable, + .get_rate = nord_tcsrcc_get_rate, +}; + +static const struct udevice_id gcc_nord_tcsrcc_of_match[] = { + { + .compatible = "qcom,nord-tcsrcc", + .data = (ulong)&nord_tcsrcc_data, + }, + { } +}; + +U_BOOT_DRIVER(gcc_nord_tcsrcc) = { + .name = "gcc_nord_tcsrcc", + .id = UCLASS_CLK, + .of_match = gcc_nord_tcsrcc_of_match, + .ops = &nord_tcsrcc_clk_ops, + .priv_auto = sizeof(struct msm_clk_priv), + .probe = nord_tcsrcc_probe, + .flags = DM_FLAG_PRE_RELOC | DM_FLAG_DEFAULT_PD_CTRL_OFF, +}; -- 2.34.1 ^ permalink raw reply related [flat|nested] 21+ messages in thread
* [PATCH v3 6/8] configs: qcom_defconfig: enable nord clock drivers 2026-10-21 16:04 [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC Aswin Murugan ` (4 preceding siblings ...) 2026-10-21 16:04 ` [PATCH v3 5/8] clk: qcom: add TCSRCC " Aswin Murugan @ 2026-10-21 16:04 ` Aswin Murugan 2026-10-22 21:34 ` Tyler Baker 2026-10-21 16:04 ` [PATCH v3 7/8] pinctrl: qcom: add TLMM driver for nord Aswin Murugan ` (2 subsequent siblings) 8 siblings, 1 reply; 21+ messages in thread From: Aswin Murugan @ 2026-10-21 16:04 UTC (permalink / raw) To: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, aswin.murugan, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot Enable the GCC, NEGCC, SEGCC, NWGCC and TCSRCC clock controller drivers in qcom_defconfig so support for the nord platform is built as part of the shared Qualcomm target configuration. Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com> --- configs/qcom_defconfig | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/configs/qcom_defconfig b/configs/qcom_defconfig index 2655eaece1d..55d182a66b3 100644 --- a/configs/qcom_defconfig +++ b/configs/qcom_defconfig @@ -57,6 +57,11 @@ CONFIG_CLK_STUB=y CONFIG_CLK_QCOM_APQ8016=y CONFIG_CLK_QCOM_APQ8096=y CONFIG_CLK_QCOM_MILOS=y +CONFIG_CLK_QCOM_NORD=y +CONFIG_CLK_QCOM_NORD_NEGCC=y +CONFIG_CLK_QCOM_NORD_SEGCC=y +CONFIG_CLK_QCOM_NORD_NWGCC=y +CONFIG_CLK_QCOM_NORD_TCSRCC=y CONFIG_CLK_QCOM_QCM2290=y CONFIG_CLK_QCOM_QCS404=y CONFIG_CLK_QCOM_QCS615=y -- 2.34.1 ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v3 6/8] configs: qcom_defconfig: enable nord clock drivers 2026-10-21 16:04 ` [PATCH v3 6/8] configs: qcom_defconfig: enable nord clock drivers Aswin Murugan @ 2026-10-22 21:34 ` Tyler Baker 0 siblings, 0 replies; 21+ messages in thread From: Tyler Baker @ 2026-10-22 21:34 UTC (permalink / raw) To: Aswin Murugan Cc: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot On Wed, 21 Oct 2026 at 21:34, Aswin Murugan wrote: > Enable the GCC, NEGCC, SEGCC, NWGCC and TCSRCC clock controller One CLK_QCOM_NORD for all five, like sm8650/x1e80100. None of them is useful alone. ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 7/8] pinctrl: qcom: add TLMM driver for nord 2026-10-21 16:04 [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC Aswin Murugan ` (5 preceding siblings ...) 2026-10-21 16:04 ` [PATCH v3 6/8] configs: qcom_defconfig: enable nord clock drivers Aswin Murugan @ 2026-10-21 16:04 ` Aswin Murugan 2026-10-22 21:34 ` Tyler Baker 2026-10-21 16:04 ` [PATCH v3 8/8] phy: qcom: snps-eusb2: add Nord compatible Aswin Murugan 2026-10-22 21:33 ` [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC Tyler Baker 8 siblings, 1 reply; 21+ messages in thread From: Aswin Murugan @ 2026-10-21 16:04 UTC (permalink / raw) To: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, aswin.murugan, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot Add support for the nord Top Level Mode Multiplexer (TLMM). Implement the qcom,nord-tlmm pinctrl driver to provide pin configuration support required by nord peripherals. Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com> --- drivers/pinctrl/qcom/Kconfig | 8 + drivers/pinctrl/qcom/Makefile | 1 + drivers/pinctrl/qcom/pinctrl-nord.c | 626 ++++++++++++++++++++++++++++ 3 files changed, 635 insertions(+) create mode 100644 drivers/pinctrl/qcom/pinctrl-nord.c diff --git a/drivers/pinctrl/qcom/Kconfig b/drivers/pinctrl/qcom/Kconfig index 6e786917809..b72af640c4b 100644 --- a/drivers/pinctrl/qcom/Kconfig +++ b/drivers/pinctrl/qcom/Kconfig @@ -62,6 +62,14 @@ config PINCTRL_QCOM_MILOS Say Y here to enable support for pinctrl on the Snapdragon Milos SoC, as well as the associated GPIO driver. +config PINCTRL_QCOM_NORD + bool "Qualcomm Nord Pinctrl" + default y if PINCTRL_QCOM_GENERIC + select PINCTRL_QCOM + help + Say Y here to enable support for pinctrl on the Snapdragon Nord SoC, + as well as the associated GPIO driver. + config PINCTRL_QCOM_QCM2290 bool "Qualcomm QCM2290 Pinctrl" default y if PINCTRL_QCOM_GENERIC diff --git a/drivers/pinctrl/qcom/Makefile b/drivers/pinctrl/qcom/Makefile index e12e62beb57..90d6bfae0ae 100644 --- a/drivers/pinctrl/qcom/Makefile +++ b/drivers/pinctrl/qcom/Makefile @@ -9,6 +9,7 @@ obj-$(CONFIG_PINCTRL_QCOM_IPQ5424) += pinctrl-ipq5424.o obj-$(CONFIG_PINCTRL_QCOM_IPQ9574) += pinctrl-ipq9574.o obj-$(CONFIG_PINCTRL_QCOM_APQ8096) += pinctrl-apq8096.o obj-$(CONFIG_PINCTRL_QCOM_MILOS) += pinctrl-milos.o +obj-$(CONFIG_PINCTRL_QCOM_NORD) += pinctrl-nord.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 diff --git a/drivers/pinctrl/qcom/pinctrl-nord.c b/drivers/pinctrl/qcom/pinctrl-nord.c new file mode 100644 index 00000000000..8f622165ec0 --- /dev/null +++ b/drivers/pinctrl/qcom/pinctrl-nord.c @@ -0,0 +1,626 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Qualcomm Nord pinctrl + * + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * + */ + +#include <dm.h> + +#include "pinctrl-qcom.h" + +#define MAX_PIN_NAME_LEN 32 +static char pin_name[MAX_PIN_NAME_LEN] __section(".data"); + +typedef unsigned int msm_pin_function[10]; + +#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7, f8, f9)\ + { \ + 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 \ + } + +#define UFS_RESET(pg_name, ctl, io) \ + { \ + .name = #pg_name, \ + .ctl_reg = ctl, \ + .io_reg = io, \ + .pull_bit = 3, \ + .drv_bit = 0, \ + .oe_bit = -1, \ + .in_bit = -1, \ + .out_bit = 0, \ + } + +enum nord_functions { + msm_mux_aoss_cti, + msm_mux_atest_char, + msm_mux_atest_usb20, + msm_mux_atest_usb21, + msm_mux_aud_intfc0_clk, + msm_mux_aud_intfc0_data, + msm_mux_aud_intfc0_ws, + msm_mux_aud_intfc10_clk, + msm_mux_aud_intfc10_data, + msm_mux_aud_intfc10_ws, + msm_mux_aud_intfc1_clk, + msm_mux_aud_intfc1_data, + msm_mux_aud_intfc1_ws, + msm_mux_aud_intfc2_clk, + msm_mux_aud_intfc2_data, + msm_mux_aud_intfc2_ws, + msm_mux_aud_intfc3_clk, + msm_mux_aud_intfc3_data, + msm_mux_aud_intfc3_ws, + msm_mux_aud_intfc4_clk, + msm_mux_aud_intfc4_data, + msm_mux_aud_intfc4_ws, + msm_mux_aud_intfc5_clk, + msm_mux_aud_intfc5_data, + msm_mux_aud_intfc5_ws, + msm_mux_aud_intfc6_clk, + msm_mux_aud_intfc6_data, + msm_mux_aud_intfc6_ws, + msm_mux_aud_intfc7_clk, + msm_mux_aud_intfc7_data, + msm_mux_aud_intfc7_ws, + msm_mux_aud_intfc8_clk, + msm_mux_aud_intfc8_data, + msm_mux_aud_intfc8_ws, + msm_mux_aud_intfc9_clk, + msm_mux_aud_intfc9_data, + msm_mux_aud_intfc9_ws, + msm_mux_aud_mclk0_mira, + msm_mux_aud_mclk0_mirb, + msm_mux_aud_mclk1_mira, + msm_mux_aud_mclk1_mirb, + msm_mux_aud_mclk2_mira, + msm_mux_aud_mclk2_mirb, + msm_mux_aud_refclk0, + msm_mux_aud_refclk1, + msm_mux_bist_done, + msm_mux_ccu_async_in, + msm_mux_ccu_i2c_scl, + msm_mux_ccu_i2c_sda, + msm_mux_ccu_timer, + msm_mux_clink_debug, + msm_mux_dbg_out, + msm_mux_dbg_out_clk, + msm_mux_ddr_bist_complete, + msm_mux_ddr_bist_fail, + msm_mux_ddr_bist_start, + msm_mux_ddr_bist_stop, + msm_mux_ddr_pxi, + msm_mux_dp_rx0, + msm_mux_dp_rx00, + msm_mux_dp_rx01, + msm_mux_dp_rx0_mute, + msm_mux_dp_rx1, + msm_mux_dp_rx10, + msm_mux_dp_rx11, + msm_mux_dp_rx1_mute, + msm_mux_edp0_hot, + msm_mux_edp0_lcd, + msm_mux_edp1_hot, + msm_mux_edp1_lcd, + msm_mux_edp2_hot, + msm_mux_edp2_lcd, + msm_mux_edp3_hot, + msm_mux_edp3_lcd, + msm_mux_emac0_mcg, + msm_mux_emac0_mdc, + msm_mux_emac0_mdio, + msm_mux_emac0_ptp, + msm_mux_emac1_mcg, + msm_mux_emac1_mdc, + msm_mux_emac1_mdio, + msm_mux_emac1_ptp, + msm_mux_gcc_gp1_clk, + msm_mux_gcc_gp2_clk, + msm_mux_gcc_gp3_clk, + msm_mux_gcc_gp4_clk, + msm_mux_gcc_gp5_clk, + msm_mux_gcc_gp6_clk, + msm_mux_gcc_gp7_clk, + msm_mux_gcc_gp8_clk, + msm_mux_gpio, + msm_mux_jitter_bist, + msm_mux_lbist_pass, + msm_mux_mbist_pass, + msm_mux_mdp0_vsync_out, + msm_mux_mdp1_vsync_out, + msm_mux_mdp_vsync_e, + msm_mux_mdp_vsync_p, + msm_mux_mdp_vsync_s, + msm_mux_pcie0_clk_req_n, + msm_mux_pcie1_clk_req_n, + msm_mux_pcie2_clk_req_n, + msm_mux_pcie3_clk_req_n, + msm_mux_phase_flag, + msm_mux_pll_bist_sync, + msm_mux_pll_clk_aux, + msm_mux_prng_rosc0, + msm_mux_prng_rosc1, + msm_mux_pwrbrk_i_n, + msm_mux_qdss, + msm_mux_qdss_cti, + msm_mux_qspi, + 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_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_qup2_se0, + msm_mux_qup2_se1, + msm_mux_qup2_se2, + msm_mux_qup2_se3, + msm_mux_qup2_se4, + msm_mux_qup2_se5, + msm_mux_qup2_se6, + msm_mux_qup3_se0_mira, + msm_mux_qup3_se0_mirb, + msm_mux_sailss_ospi, + msm_mux_sdc4_clk, + msm_mux_sdc4_cmd, + msm_mux_sdc4_data, + msm_mux_smb_alert, + msm_mux_smb_alert_n, + msm_mux_smb_clk, + msm_mux_smb_dat, + msm_mux_tb_trig_sdc4, + msm_mux_tmess_prng0, + msm_mux_tmess_prng1, + msm_mux_tsc_timer, + msm_mux_tsense_pwm, + msm_mux_usb0_hs, + msm_mux_usb0_phy_ps, + msm_mux_usb1_hs, + msm_mux_usb1_phy_ps, + msm_mux_usb2_hs, + msm_mux_usxgmii0_phy, + msm_mux_usxgmii1_phy, + msm_mux_vsense_trigger_mirnat, + msm_mux_wcn_sw, + msm_mux_wcn_sw_ctrl, + 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(aoss_cti), + MSM_PIN_FUNCTION(atest_char), + MSM_PIN_FUNCTION(atest_usb20), + MSM_PIN_FUNCTION(atest_usb21), + MSM_PIN_FUNCTION(aud_intfc0_clk), + MSM_PIN_FUNCTION(aud_intfc0_data), + MSM_PIN_FUNCTION(aud_intfc0_ws), + MSM_PIN_FUNCTION(aud_intfc10_clk), + MSM_PIN_FUNCTION(aud_intfc10_data), + MSM_PIN_FUNCTION(aud_intfc10_ws), + MSM_PIN_FUNCTION(aud_intfc1_clk), + MSM_PIN_FUNCTION(aud_intfc1_data), + MSM_PIN_FUNCTION(aud_intfc1_ws), + MSM_PIN_FUNCTION(aud_intfc2_clk), + MSM_PIN_FUNCTION(aud_intfc2_data), + MSM_PIN_FUNCTION(aud_intfc2_ws), + MSM_PIN_FUNCTION(aud_intfc3_clk), + MSM_PIN_FUNCTION(aud_intfc3_data), + MSM_PIN_FUNCTION(aud_intfc3_ws), + MSM_PIN_FUNCTION(aud_intfc4_clk), + MSM_PIN_FUNCTION(aud_intfc4_data), + MSM_PIN_FUNCTION(aud_intfc4_ws), + MSM_PIN_FUNCTION(aud_intfc5_clk), + MSM_PIN_FUNCTION(aud_intfc5_data), + MSM_PIN_FUNCTION(aud_intfc5_ws), + MSM_PIN_FUNCTION(aud_intfc6_clk), + MSM_PIN_FUNCTION(aud_intfc6_data), + MSM_PIN_FUNCTION(aud_intfc6_ws), + MSM_PIN_FUNCTION(aud_intfc7_clk), + MSM_PIN_FUNCTION(aud_intfc7_data), + MSM_PIN_FUNCTION(aud_intfc7_ws), + MSM_PIN_FUNCTION(aud_intfc8_clk), + MSM_PIN_FUNCTION(aud_intfc8_data), + MSM_PIN_FUNCTION(aud_intfc8_ws), + MSM_PIN_FUNCTION(aud_intfc9_clk), + MSM_PIN_FUNCTION(aud_intfc9_data), + MSM_PIN_FUNCTION(aud_intfc9_ws), + MSM_PIN_FUNCTION(aud_mclk0_mira), + MSM_PIN_FUNCTION(aud_mclk0_mirb), + MSM_PIN_FUNCTION(aud_mclk1_mira), + MSM_PIN_FUNCTION(aud_mclk1_mirb), + MSM_PIN_FUNCTION(aud_mclk2_mira), + MSM_PIN_FUNCTION(aud_mclk2_mirb), + MSM_PIN_FUNCTION(aud_refclk0), + MSM_PIN_FUNCTION(aud_refclk1), + MSM_PIN_FUNCTION(bist_done), + MSM_PIN_FUNCTION(ccu_async_in), + MSM_PIN_FUNCTION(ccu_i2c_scl), + MSM_PIN_FUNCTION(ccu_i2c_sda), + MSM_PIN_FUNCTION(ccu_timer), + MSM_PIN_FUNCTION(clink_debug), + MSM_PIN_FUNCTION(dbg_out), + MSM_PIN_FUNCTION(dbg_out_clk), + MSM_PIN_FUNCTION(ddr_bist_complete), + MSM_PIN_FUNCTION(ddr_bist_fail), + MSM_PIN_FUNCTION(ddr_bist_start), + MSM_PIN_FUNCTION(ddr_bist_stop), + MSM_PIN_FUNCTION(ddr_pxi), + MSM_PIN_FUNCTION(dp_rx0), + MSM_PIN_FUNCTION(dp_rx00), + MSM_PIN_FUNCTION(dp_rx01), + MSM_PIN_FUNCTION(dp_rx0_mute), + MSM_PIN_FUNCTION(dp_rx1), + MSM_PIN_FUNCTION(dp_rx10), + MSM_PIN_FUNCTION(dp_rx11), + MSM_PIN_FUNCTION(dp_rx1_mute), + MSM_PIN_FUNCTION(edp0_hot), + MSM_PIN_FUNCTION(edp0_lcd), + MSM_PIN_FUNCTION(edp1_hot), + MSM_PIN_FUNCTION(edp1_lcd), + MSM_PIN_FUNCTION(edp2_hot), + MSM_PIN_FUNCTION(edp2_lcd), + MSM_PIN_FUNCTION(edp3_hot), + MSM_PIN_FUNCTION(edp3_lcd), + MSM_PIN_FUNCTION(emac0_mcg), + MSM_PIN_FUNCTION(emac0_mdc), + MSM_PIN_FUNCTION(emac0_mdio), + MSM_PIN_FUNCTION(emac0_ptp), + MSM_PIN_FUNCTION(emac1_mcg), + MSM_PIN_FUNCTION(emac1_mdc), + MSM_PIN_FUNCTION(emac1_mdio), + MSM_PIN_FUNCTION(emac1_ptp), + MSM_PIN_FUNCTION(gcc_gp1_clk), + MSM_PIN_FUNCTION(gcc_gp2_clk), + MSM_PIN_FUNCTION(gcc_gp3_clk), + MSM_PIN_FUNCTION(gcc_gp4_clk), + MSM_PIN_FUNCTION(gcc_gp5_clk), + MSM_PIN_FUNCTION(gcc_gp6_clk), + MSM_PIN_FUNCTION(gcc_gp7_clk), + MSM_PIN_FUNCTION(gcc_gp8_clk), + MSM_PIN_FUNCTION(gpio), + MSM_PIN_FUNCTION(jitter_bist), + MSM_PIN_FUNCTION(lbist_pass), + MSM_PIN_FUNCTION(mbist_pass), + MSM_PIN_FUNCTION(mdp0_vsync_out), + MSM_PIN_FUNCTION(mdp1_vsync_out), + MSM_PIN_FUNCTION(mdp_vsync_e), + MSM_PIN_FUNCTION(mdp_vsync_p), + MSM_PIN_FUNCTION(mdp_vsync_s), + MSM_PIN_FUNCTION(pcie0_clk_req_n), + MSM_PIN_FUNCTION(pcie1_clk_req_n), + MSM_PIN_FUNCTION(pcie2_clk_req_n), + MSM_PIN_FUNCTION(pcie3_clk_req_n), + MSM_PIN_FUNCTION(phase_flag), + MSM_PIN_FUNCTION(pll_bist_sync), + MSM_PIN_FUNCTION(pll_clk_aux), + MSM_PIN_FUNCTION(prng_rosc0), + MSM_PIN_FUNCTION(prng_rosc1), + MSM_PIN_FUNCTION(pwrbrk_i_n), + MSM_PIN_FUNCTION(qdss), + MSM_PIN_FUNCTION(qdss_cti), + MSM_PIN_FUNCTION(qspi), + 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(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(qup2_se0), + MSM_PIN_FUNCTION(qup2_se1), + MSM_PIN_FUNCTION(qup2_se2), + MSM_PIN_FUNCTION(qup2_se3), + MSM_PIN_FUNCTION(qup2_se4), + MSM_PIN_FUNCTION(qup2_se5), + MSM_PIN_FUNCTION(qup2_se6), + MSM_PIN_FUNCTION(qup3_se0_mira), + MSM_PIN_FUNCTION(qup3_se0_mirb), + MSM_PIN_FUNCTION(sailss_ospi), + MSM_PIN_FUNCTION(sdc4_clk), + MSM_PIN_FUNCTION(sdc4_cmd), + MSM_PIN_FUNCTION(sdc4_data), + MSM_PIN_FUNCTION(smb_alert), + MSM_PIN_FUNCTION(smb_alert_n), + MSM_PIN_FUNCTION(smb_clk), + MSM_PIN_FUNCTION(smb_dat), + MSM_PIN_FUNCTION(tb_trig_sdc4), + MSM_PIN_FUNCTION(tmess_prng0), + MSM_PIN_FUNCTION(tmess_prng1), + MSM_PIN_FUNCTION(tsc_timer), + MSM_PIN_FUNCTION(tsense_pwm), + MSM_PIN_FUNCTION(usb0_hs), + MSM_PIN_FUNCTION(usb0_phy_ps), + MSM_PIN_FUNCTION(usb1_hs), + MSM_PIN_FUNCTION(usb1_phy_ps), + MSM_PIN_FUNCTION(usb2_hs), + MSM_PIN_FUNCTION(usxgmii0_phy), + MSM_PIN_FUNCTION(usxgmii1_phy), + MSM_PIN_FUNCTION(vsense_trigger_mirnat), + MSM_PIN_FUNCTION(wcn_sw), + MSM_PIN_FUNCTION(wcn_sw_ctrl), +}; + +static const msm_pin_function nord_pin_functions[] = { + [0] = PINGROUP(0, _, _, _, _, _, _, _, _, _), + [1] = PINGROUP(1, pcie0_clk_req_n, _, _, _, _, _, _, _, _), + [2] = PINGROUP(2, _, _, _, _, _, _, _, _, _), + [3] = PINGROUP(3, _, _, _, _, _, _, _, _, _), + [4] = PINGROUP(4, pcie1_clk_req_n, _, _, _, _, _, _, _, _), + [5] = PINGROUP(5, _, _, _, _, _, _, _, _, _), + [6] = PINGROUP(6, _, _, _, _, _, _, _, _, _), + [7] = PINGROUP(7, pcie2_clk_req_n, _, _, _, _, _, _, _, _), + [8] = PINGROUP(8, _, _, _, _, _, _, _, _, _), + [9] = PINGROUP(9, _, _, _, _, _, _, _, _, _), + [10] = PINGROUP(10, pcie3_clk_req_n, _, _, _, _, _, _, _, _), + [11] = PINGROUP(11, _, _, _, _, _, _, _, _, _), + [12] = PINGROUP(12, usb0_hs, clink_debug, _, _, _, _, _, _, _), + [13] = PINGROUP(13, usb1_hs, clink_debug, gcc_gp7_clk, _, _, _, _, _, _), + [14] = PINGROUP(14, usb2_hs, clink_debug, gcc_gp8_clk, _, _, _, _, _, _), + [15] = PINGROUP(15, ccu_i2c_sda, _, _, _, _, _, _, _, _), + [16] = PINGROUP(16, ccu_i2c_scl, emac0_mcg, _, _, _, _, _, _, _), + [17] = PINGROUP(17, ccu_i2c_sda, emac0_mcg, _, _, _, _, _, _, _), + [18] = PINGROUP(18, ccu_i2c_scl, emac0_mcg, _, _, _, _, _, _, _), + [19] = PINGROUP(19, ccu_i2c_sda, emac0_mcg, _, _, _, _, _, _, _), + [20] = PINGROUP(20, ccu_i2c_scl, emac1_mcg, _, _, _, _, _, _, _), + [21] = PINGROUP(21, ccu_i2c_sda, emac1_mcg, _, _, _, _, _, _, _), + [22] = PINGROUP(22, ccu_i2c_scl, emac1_mcg, _, _, _, _, _, _, _), + [23] = PINGROUP(23, ccu_i2c_sda, emac1_mcg, _, _, _, _, _, _, _), + [24] = PINGROUP(24, ccu_i2c_scl, _, _, _, _, _, _, _, _), + [25] = PINGROUP(25, ccu_timer, tsc_timer, _, _, _, _, _, _, _), + [26] = PINGROUP(26, ccu_timer, tsc_timer, _, _, _, _, _, _, _), + [27] = PINGROUP(27, ccu_timer, tsc_timer, _, _, _, _, _, _, _), + [28] = PINGROUP(28, ccu_timer, tsc_timer, _, _, _, _, _, _, _), + [29] = PINGROUP(29, ccu_timer, tsc_timer, _, _, _, _, _, _, _), + [30] = PINGROUP(30, ccu_timer, tsc_timer, _, _, _, _, _, _, _), + [31] = PINGROUP(31, ccu_timer, tsc_timer, _, _, _, _, _, _, _), + [32] = PINGROUP(32, ccu_timer, tsc_timer, _, _, _, _, _, _, _), + [33] = PINGROUP(33, ccu_timer, tsc_timer, _, _, _, _, _, _, _), + [34] = PINGROUP(34, ccu_timer, tsc_timer, _, _, _, _, _, _, _), + [35] = PINGROUP(35, dp_rx0_mute, _, _, _, _, _, _, _, _), + [36] = PINGROUP(36, dp_rx1_mute, ddr_bist_start, _, _, _, _, _, _, _), + [37] = PINGROUP(37, emac1_ptp, ddr_bist_complete, _, _, _, _, _, _, _), + [38] = PINGROUP(38, emac1_ptp, ddr_bist_stop, _, _, _, _, _, _, _), + [39] = PINGROUP(39, emac1_ptp, ddr_bist_fail, _, _, _, _, _, _, _), + [40] = PINGROUP(40, emac1_ptp, _, _, _, _, _, _, _, _), + [41] = PINGROUP(41, emac1_ptp, qdss_cti, _, _, _, _, _, _, _), + [42] = PINGROUP(42, emac1_ptp, qdss_cti, gcc_gp3_clk, _, _, _, _, _, _), + [43] = PINGROUP(43, emac1_ptp, gcc_gp4_clk, tsense_pwm, _, _, _, _, _, _), + [44] = PINGROUP(44, emac1_ptp, tsense_pwm, _, _, _, _, _, _, _), + [45] = PINGROUP(45, usxgmii0_phy, ccu_async_in, tsense_pwm, _, _, _, _, _, _), + [46] = PINGROUP(46, usxgmii1_phy, tsense_pwm, _, _, _, _, _, _, _), + [47] = PINGROUP(47, emac0_mdc, edp0_lcd, tsense_pwm, _, _, _, _, _, _), + [48] = PINGROUP(48, emac0_mdio, edp1_lcd, tsense_pwm, _, _, _, _, _, _), + [49] = PINGROUP(49, emac1_mdc, edp2_lcd, tsense_pwm, _, _, _, _, _, _), + [50] = PINGROUP(50, emac1_mdio, edp3_lcd, tsense_pwm, _, _, _, _, _, _), + [51] = PINGROUP(51, edp0_hot, clink_debug, gcc_gp1_clk, _, _, _, _, _, _), + [52] = PINGROUP(52, edp1_hot, clink_debug, gcc_gp2_clk, _, _, _, _, _, _), + [53] = PINGROUP(53, edp2_hot, clink_debug, _, _, _, _, _, _, _), + [54] = PINGROUP(54, edp3_hot, clink_debug, _, _, _, _, _, _, _), + [55] = PINGROUP(55, dp_rx0, clink_debug, _, _, _, _, _, _, _), + [56] = PINGROUP(56, dp_rx1, _, _, _, _, _, _, _, _), + [57] = PINGROUP(57, aud_intfc0_clk, _, _, _, _, _, _, _, _), + [58] = PINGROUP(58, aud_intfc0_ws, _, _, _, _, _, _, _, _), + [59] = PINGROUP(59, aud_intfc0_data, _, _, _, _, _, _, _, _), + [60] = PINGROUP(60, aud_intfc0_data, _, _, _, _, _, _, _, _), + [61] = PINGROUP(61, aud_intfc0_data, aud_intfc10_clk, _, _, _, _, _, _, _), + [62] = PINGROUP(62, aud_intfc0_data, aud_intfc10_ws, _, _, _, _, _, _, _), + [63] = PINGROUP(63, aud_intfc0_data, aud_intfc7_clk, _, _, _, _, _, _, _), + [64] = PINGROUP(64, aud_intfc0_data, aud_intfc7_ws, _, _, _, _, _, _, _), + [65] = PINGROUP(65, aud_intfc0_data, aud_intfc7_data, _, _, _, _, _, _, _), + [66] = PINGROUP(66, aud_intfc0_data, aud_intfc7_data, _, _, _, _, _, _, _), + [67] = PINGROUP(67, aud_intfc1_clk, phase_flag, _, qdss, _, _, _, _, _), + [68] = PINGROUP(68, aud_intfc1_ws, phase_flag, _, qdss, _, _, _, _, _), + [69] = PINGROUP(69, aud_intfc1_data, phase_flag, _, qdss, _, _, _, _, _), + [70] = PINGROUP(70, aud_intfc1_data, aud_intfc9_clk, phase_flag, _, qdss, _, _, _, _), + [71] = PINGROUP(71, aud_intfc1_data, aud_intfc9_ws, phase_flag, _, qdss, _, _, _, _), + [72] = PINGROUP(72, aud_intfc1_data, aud_intfc9_data, phase_flag, _, qdss, _, _, _, _), + [73] = PINGROUP(73, aud_intfc1_data, aud_intfc8_clk, phase_flag, _, qdss, _, _, _, _), + [74] = PINGROUP(74, aud_intfc1_data, aud_intfc8_ws, phase_flag, _, qdss, _, _, _, _), + [75] = PINGROUP(75, aud_intfc1_data, aud_intfc8_data, phase_flag, _, qdss, _, _, _, _), + [76] = PINGROUP(76, aud_intfc1_data, aud_intfc8_data, phase_flag, _, qdss, _, _, _, _), + [77] = PINGROUP(77, aud_intfc2_clk, phase_flag, _, qdss, _, _, _, _, _), + [78] = PINGROUP(78, aud_intfc2_ws, phase_flag, _, qdss, _, _, _, _, _), + [79] = PINGROUP(79, aud_intfc2_data, phase_flag, _, qdss, _, _, _, _, _), + [80] = PINGROUP(80, aud_intfc2_data, phase_flag, _, _, qdss, _, _, _, _), + [81] = PINGROUP(81, aud_intfc2_data, aud_intfc10_data, phase_flag, _, _, qdss, _, _, _), + [82] = PINGROUP(82, aud_intfc2_data, aud_intfc10_data, phase_flag, _, qdss, _, _, _, _), + [83] = PINGROUP(83, aud_intfc3_clk, dp_rx0, aoss_cti, phase_flag, _, qdss, _, _, _), + [84] = PINGROUP(84, aud_intfc3_ws, dp_rx0, aoss_cti, phase_flag, _, qdss, _, _, _), + [85] = PINGROUP(85, aud_intfc3_data, dp_rx0, aoss_cti, phase_flag, _, qdss, _, _, _), + [86] = PINGROUP(86, aud_intfc3_data, aud_mclk0_mirb, dp_rx0, aoss_cti, phase_flag, _, qdss, + _, _), + [87] = PINGROUP(87, aud_intfc4_clk, phase_flag, _, qdss, _, _, _, _, _), + [88] = PINGROUP(88, aud_intfc4_ws, dp_rx0, phase_flag, _, qdss, _, _, _, _), + [89] = PINGROUP(89, aud_intfc4_data, dp_rx0, phase_flag, _, qdss, _, _, _, _), + [90] = PINGROUP(90, aud_intfc4_data, aud_mclk1_mirb, phase_flag, _, qdss, _, _, _, _), + [91] = PINGROUP(91, aud_intfc5_clk, phase_flag, _, qdss, _, _, _, _, _), + [92] = PINGROUP(92, aud_intfc5_ws, dp_rx1, phase_flag, _, qdss, _, _, _, _), + [93] = PINGROUP(93, aud_intfc5_data, dp_rx1, phase_flag, _, qdss, _, _, _, _), + [94] = PINGROUP(94, aud_intfc5_data, aud_mclk2_mirb, phase_flag, tmess_prng0, _, qdss, _, + _, _), + [95] = PINGROUP(95, aud_intfc6_clk, dp_rx1, phase_flag, tmess_prng1, _, qdss, _, _, _), + [96] = PINGROUP(96, aud_intfc6_ws, dp_rx1, phase_flag, _, qdss, _, _, _, _), + [97] = PINGROUP(97, aud_intfc6_data, dp_rx1, qdss, _, _, _, _, _, _), + [98] = PINGROUP(98, aud_intfc6_data, dp_rx1, phase_flag, _, qdss, _, _, _, _), + [99] = PINGROUP(99, aud_mclk0_mira, qdss, dp_rx00, ddr_pxi, _, _, _, _, _), + [100] = PINGROUP(100, aud_mclk1_mira, aud_refclk0, pll_clk_aux, qdss, dp_rx01, ddr_pxi, _, + _, _), + [101] = PINGROUP(101, aud_mclk2_mira, aud_refclk1, phase_flag, _, qdss, _, _, _, _), + [102] = PINGROUP(102, qspi, qup3_se0_mira, qup3_se0_mirb, _, _, _, _, _, _), + [103] = PINGROUP(103, qspi, qup3_se0_mira, qup3_se0_mirb, _, _, _, _, _, _), + [104] = PINGROUP(104, qspi, qup3_se0_mira, _, _, _, _, _, _, _), + [105] = PINGROUP(105, qspi, qup3_se0_mira, gcc_gp5_clk, _, _, _, _, _, _), + [106] = PINGROUP(106, qspi, qup3_se0_mira, gcc_gp6_clk, _, _, _, _, _, _), + [107] = PINGROUP(107, qspi, qup3_se0_mira, _, _, _, _, _, _, _), + [108] = PINGROUP(108, qspi, qup3_se0_mira, qdss, _, _, _, _, _, _), + [109] = PINGROUP(109, qup0_se0, qup0_se1, qup0_se5, mdp_vsync_e, smb_alert_n, _, ddr_pxi, + _, _), + [110] = PINGROUP(110, qup0_se0, qup0_se1, qup0_se5, qdss_cti, mdp_vsync_p, smb_alert, _, + ddr_pxi, _), + [111] = PINGROUP(111, qup0_se1, qup0_se0, smb_dat, _, _, _, _, _, _), + [112] = PINGROUP(112, qup0_se1, qup0_se0, smb_clk, _, _, _, _, _, _), + [113] = PINGROUP(113, qup0_se2, qup0_se3, ccu_i2c_sda, mdp0_vsync_out, dbg_out, ddr_pxi, _, + _, _), + [114] = PINGROUP(114, qup0_se2, qup0_se3, ccu_i2c_scl, mdp0_vsync_out, _, ddr_pxi, _, _, _), + [115] = PINGROUP(115, qup0_se3, qup0_se2, ccu_i2c_sda, mdp0_vsync_out, _, ddr_pxi, _, _, _), + [116] = PINGROUP(116, qup0_se3, qup0_se2, ccu_i2c_scl, mdp0_vsync_out, _, ddr_pxi, _, _, _), + [117] = PINGROUP(117, qup0_se4, prng_rosc0, _, ddr_pxi, _, _, _, _, _), + [118] = PINGROUP(118, qup0_se4, prng_rosc1, _, ddr_pxi, _, _, _, _, _), + [119] = PINGROUP(119, qup0_se4, _, ddr_pxi, _, _, _, _, _, _), + [120] = PINGROUP(120, qup0_se4, _, ddr_pxi, _, _, _, _, _, _), + [121] = PINGROUP(121, qup0_se5, lbist_pass, mdp0_vsync_out, _, dp_rx10, ddr_pxi, _, _, _), + [122] = PINGROUP(122, qup0_se5, mbist_pass, mdp0_vsync_out, _, dp_rx11, ddr_pxi, _, _, _), + [123] = PINGROUP(123, qup1_se0, qup1_se1, mdp1_vsync_out, jitter_bist, _, _, _, _, _), + [124] = PINGROUP(124, qup1_se0, qup1_se1, mdp1_vsync_out, _, _, _, _, _, _), + [125] = PINGROUP(125, qup1_se1, qup1_se0, ccu_i2c_sda, mdp1_vsync_out, _, _, _, _, _), + [126] = PINGROUP(126, qup1_se1, qup1_se0, ccu_i2c_scl, mdp1_vsync_out, _, atest_usb20, + ddr_pxi, _, _), + [127] = PINGROUP(127, qup1_se2, qup1_se2, _, atest_usb21, ddr_pxi, _, _, _, _), + [128] = PINGROUP(128, qup1_se2, qup1_se2, _, atest_usb20, ddr_pxi, _, _, _, _), + [129] = PINGROUP(129, qup1_se3, qup1_se3, ccu_i2c_sda, mdp1_vsync_out, _, atest_usb21, + ddr_pxi, _, _), + [130] = PINGROUP(130, qup1_se3, qup1_se3, ccu_i2c_scl, mdp1_vsync_out, _, atest_usb20, + ddr_pxi, _, _), + [131] = PINGROUP(131, qup1_se4, qup1_se6, ccu_i2c_sda, mdp1_vsync_out, _, atest_usb21, + ddr_pxi, _, _), + [132] = PINGROUP(132, qup1_se4, qup1_se6, ccu_i2c_scl, mdp1_vsync_out, _, + vsense_trigger_mirnat, ddr_pxi, _, _), + [133] = PINGROUP(133, qup1_se5, emac0_ptp, mdp1_vsync_out, _, ddr_pxi, _, _, _, _), + [134] = PINGROUP(134, qup1_se5, emac0_ptp, mdp1_vsync_out, _, ddr_pxi, _, _, _, _), + [135] = PINGROUP(135, qup1_se5, emac0_ptp, mdp1_vsync_out, _, ddr_pxi, _, _, _, _), + [136] = PINGROUP(136, qup1_se5, emac0_ptp, _, ddr_pxi, _, _, _, _, _), + [137] = PINGROUP(137, qup1_se6, qup1_se4, dp_rx0, _, ddr_pxi, _, _, _, _), + [138] = PINGROUP(138, qup1_se6, qup1_se4, dp_rx0, qdss_cti, jitter_bist, ddr_pxi, _, _, _), + [139] = PINGROUP(139, qup2_se0, emac0_ptp, mdp0_vsync_out, ddr_pxi, _, _, _, _, _), + [140] = PINGROUP(140, qup2_se0, emac0_ptp, mdp0_vsync_out, _, _, _, _, _, _), + [141] = PINGROUP(141, qup2_se0, emac0_ptp, mdp0_vsync_out, _, _, _, _, _, _), + [142] = PINGROUP(142, qup2_se0, emac0_ptp, qdss_cti, mdp0_vsync_out, _, _, _, _, _), + [143] = PINGROUP(143, qup2_se1, qup2_se4, ccu_timer, mdp0_vsync_out, _, _, _, _, _), + [144] = PINGROUP(144, qup2_se1, qup2_se4, ccu_timer, qdss_cti, mdp_vsync_s, _, _, _, _), + [145] = PINGROUP(145, qup2_se2, _, _, _, _, _, _, _, _), + [146] = PINGROUP(146, qup2_se2, _, _, _, _, _, _, _, _), + [147] = PINGROUP(147, qup2_se2, _, _, _, _, _, _, _, _), + [148] = PINGROUP(148, qup2_se2, _, _, _, _, _, _, _, _), + [149] = PINGROUP(149, qup2_se2, _, _, _, _, _, _, _, _), + [150] = PINGROUP(150, qup2_se3, qup2_se4, ccu_timer, _, _, _, _, _, _), + [151] = PINGROUP(151, qup2_se3, qup2_se4, ccu_timer, _, _, _, _, _, _), + [152] = PINGROUP(152, qup2_se3, qup2_se4, ccu_timer, _, _, _, _, _, _), + [153] = PINGROUP(153, qup2_se3, ccu_timer, _, _, _, _, _, _, _), + [154] = PINGROUP(154, qup2_se4, qup2_se1, _, _, _, _, _, _, _), + [155] = PINGROUP(155, qup2_se4, qup2_se1, _, _, _, _, _, _, _), + [156] = PINGROUP(156, qup2_se5, qup2_se6, _, _, _, _, _, _, _), + [157] = PINGROUP(157, qup2_se5, qup2_se6, _, _, _, _, _, _, _), + [158] = PINGROUP(158, qup2_se6, qup2_se5, dp_rx1, _, _, _, _, _, _), + [159] = PINGROUP(159, qup2_se6, qup2_se5, dp_rx1, _, _, _, _, _, _), + [160] = PINGROUP(160, wcn_sw_ctrl, _, _, _, _, _, _, _, _), + [161] = PINGROUP(161, wcn_sw, _, _, _, _, _, _, _, _), + [162] = PINGROUP(162, qdss_cti, _, ddr_pxi, _, _, _, _, _, _), + [163] = PINGROUP(163, qdss_cti, _, ddr_pxi, _, _, _, _, _, _), + [164] = PINGROUP(164, usb0_phy_ps, _, sailss_ospi, ddr_pxi, _, _, _, _, _), + [165] = PINGROUP(165, usb1_phy_ps, dbg_out_clk, sailss_ospi, ddr_pxi, _, _, _, _, _), + [166] = PINGROUP(166, _, _, _, _, _, _, _, _, _), + [167] = PINGROUP(167, pwrbrk_i_n, _, _, _, _, _, _, _, _), + [168] = PINGROUP(168, bist_done, _, _, _, _, _, _, _, _), + [169] = PINGROUP(169, tb_trig_sdc4, _, _, _, _, _, _, _, _), + [170] = PINGROUP(170, sdc4_data, _, _, _, _, _, _, _, _), + [171] = PINGROUP(171, sdc4_data, _, _, _, _, _, _, _, _), + [172] = PINGROUP(172, sdc4_data, _, _, _, _, _, _, _, _), + [173] = PINGROUP(173, sdc4_data, _, _, _, _, _, _, _, _), + [174] = PINGROUP(174, sdc4_cmd, _, _, _, _, _, _, _, _), + [175] = PINGROUP(175, sdc4_clk, _, _, _, _, _, _, _, _), + [176] = PINGROUP(176, ccu_async_in, pll_bist_sync, atest_char, _, _, _, _, _, _), + [177] = PINGROUP(177, ccu_async_in, atest_char, _, _, _, _, _, _, _), + [178] = PINGROUP(178, ccu_async_in, atest_char, _, _, _, _, _, _, _), + [179] = PINGROUP(179, ccu_async_in, atest_char, _, _, _, _, _, _, _), + [180] = PINGROUP(180, ccu_async_in, atest_char, _, _, _, _, _, _, _), +}; + +static const struct msm_special_pin_data nord_special_pins_data[] = { + [0] = UFS_RESET(ufs_reset, 0xbd004, 0xbe000), +}; + +static const char *nord_get_function_name(struct udevice *dev, unsigned int selector) +{ + return msm_pinctrl_functions[selector].name; +} + +static const char *nord_get_pin_name(struct udevice *dev, unsigned int selector) +{ + if (selector >= 181) + snprintf(pin_name, MAX_PIN_NAME_LEN, "%s", + nord_special_pins_data[selector - 181].name); + else + snprintf(pin_name, MAX_PIN_NAME_LEN, "gpio%u", selector); + + return pin_name; +} + +static int nord_get_function_mux(__maybe_unused unsigned int pin, unsigned int selector) +{ + unsigned int i; + const msm_pin_function *func = NULL; + + if (pin >= ARRAY_SIZE(nord_pin_functions)) + return -EINVAL; + + func = nord_pin_functions + pin; + for (i = 0; i < 10; i++) + if ((*func)[i] == selector) + return i; + + pr_err("Can't find requested function for pin %u pin\n", pin); + + return -EINVAL; +} + +static const struct msm_pinctrl_data nord_data = { + .pin_data = { + .pin_count = 182, + .special_pins_start = 181, + .special_pins_data = nord_special_pins_data, + }, + .functions_count = ARRAY_SIZE(msm_pinctrl_functions), + .get_function_name = nord_get_function_name, + .get_function_mux = nord_get_function_mux, + .get_pin_name = nord_get_pin_name, +}; + +static const struct udevice_id msm_pinctrl_ids[] = { + { + .compatible = "qcom,nord-tlmm", + .data = (ulong)&nord_data + }, + { /* Sentinel */ } }; + +U_BOOT_DRIVER(pinctrl_nord) = { + .name = "pinctrl_nord", + .id = UCLASS_NOP, + .of_match = msm_pinctrl_ids, + .ops = &msm_pinctrl_ops, + .bind = msm_pinctrl_bind, +}; -- 2.34.1 ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v3 7/8] pinctrl: qcom: add TLMM driver for nord 2026-10-21 16:04 ` [PATCH v3 7/8] pinctrl: qcom: add TLMM driver for nord Aswin Murugan @ 2026-10-22 21:34 ` Tyler Baker 0 siblings, 0 replies; 21+ messages in thread From: Tyler Baker @ 2026-10-22 21:34 UTC (permalink / raw) To: Aswin Murugan Cc: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot On Wed, 21 Oct 2026 at 21:34, Aswin Murugan wrote: Reviewed-by: Tyler Baker <tyler.baker@oss.qualcomm.com> ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 8/8] phy: qcom: snps-eusb2: add Nord compatible 2026-10-21 16:04 [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC Aswin Murugan ` (6 preceding siblings ...) 2026-10-21 16:04 ` [PATCH v3 7/8] pinctrl: qcom: add TLMM driver for nord Aswin Murugan @ 2026-10-21 16:04 ` Aswin Murugan 2026-10-22 21:34 ` Tyler Baker 2026-10-22 21:33 ` [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC Tyler Baker 8 siblings, 1 reply; 21+ messages in thread From: Aswin Murugan @ 2026-10-21 16:04 UTC (permalink / raw) To: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, aswin.murugan, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot Add qcom,nord-snps-eusb2-phy to the match table so the driver binds directly on Nord. Signed-off-by: Aswin Murugan <aswin.murugan@oss.qualcomm.com> --- drivers/phy/qcom/phy-qcom-snps-eusb2.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/phy/qcom/phy-qcom-snps-eusb2.c b/drivers/phy/qcom/phy-qcom-snps-eusb2.c index 28502c46f67..8bdd2544443 100644 --- a/drivers/phy/qcom/phy-qcom-snps-eusb2.c +++ b/drivers/phy/qcom/phy-qcom-snps-eusb2.c @@ -354,6 +354,9 @@ static const struct udevice_id qcom_snps_eusb2_phy_ids[] = { { .compatible = "qcom,sm8550-snps-eusb2-phy", }, + { + .compatible = "qcom,nord-snps-eusb2-phy", + }, {} }; -- 2.34.1 ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH v3 8/8] phy: qcom: snps-eusb2: add Nord compatible 2026-10-21 16:04 ` [PATCH v3 8/8] phy: qcom: snps-eusb2: add Nord compatible Aswin Murugan @ 2026-10-22 21:34 ` Tyler Baker 0 siblings, 0 replies; 21+ messages in thread From: Tyler Baker @ 2026-10-22 21:34 UTC (permalink / raw) To: Aswin Murugan Cc: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot On Wed, 21 Oct 2026 at 21:34, Aswin Murugan wrote: [...] > + .compatible = "qcom,nord-snps-eusb2-phy", Not in the binding, and the sm8550 fallback already matches. Drop this. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC 2026-10-21 16:04 [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC Aswin Murugan ` (7 preceding siblings ...) 2026-10-21 16:04 ` [PATCH v3 8/8] phy: qcom: snps-eusb2: add Nord compatible Aswin Murugan @ 2026-10-22 21:33 ` Tyler Baker 2026-10-22 22:05 ` Tom Rini 2026-10-24 18:22 ` Aswin Murugan 8 siblings, 2 replies; 21+ messages in thread From: Tyler Baker @ 2026-10-22 21:33 UTC (permalink / raw) To: Aswin Murugan Cc: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot On Wed, 21 Oct 2026 at 21:34, Aswin Murugan wrote: > This series adds foundational support for the Qualcomm Nord SoC in > U-Boot, including clock, pinctrl, USB HS PHY, and configuration updates There's no Nord DT in dts/upstream and nothing builds a Nord board, so none of this is used or tested in tree. Please send it with the board enablement. The commit messages only restate the subjects. Say what U-Boot needs each controller for. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC 2026-10-22 21:33 ` [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC Tyler Baker @ 2026-10-22 22:05 ` Tom Rini 2026-10-24 18:22 ` Aswin Murugan 1 sibling, 0 replies; 21+ messages in thread From: Tom Rini @ 2026-10-22 22:05 UTC (permalink / raw) To: Tyler Baker Cc: Aswin Murugan, casey.connolly, neil.armstrong, sumit.garg, lukma, marek.vasut+usb, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot [-- Attachment #1: Type: text/plain, Size: 680 bytes --] On Thu, Oct 22, 2026 at 05:33:56PM -0400, Tyler Baker wrote: > On Wed, 21 Oct 2026 at 21:34, Aswin Murugan wrote: > > This series adds foundational support for the Qualcomm Nord SoC in > > U-Boot, including clock, pinctrl, USB HS PHY, and configuration updates > > There's no Nord DT in dts/upstream and nothing builds a Nord board, so > none of this is used or tested in tree. Please send it with the board > enablement. > > The commit messages only restate the subjects. Say what U-Boot needs > each controller for. And all of the more general types of comments I made today apply to all of the various SoCs that need to be upstreamed, to be clear. -- Tom [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC 2026-10-22 21:33 ` [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC Tyler Baker 2026-10-22 22:05 ` Tom Rini @ 2026-10-24 18:22 ` Aswin Murugan 2026-10-24 18:31 ` Tom Rini 1 sibling, 1 reply; 21+ messages in thread From: Aswin Murugan @ 2026-10-24 18:22 UTC (permalink / raw) To: Tyler Baker Cc: casey.connolly, neil.armstrong, sumit.garg, trini, lukma, marek.vasut+usb, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot Hi Tyler On 10/23/2026 3:03 AM, Tyler Baker wrote: > On Wed, 21 Oct 2026 at 21:34, Aswin Murugan wrote: >> This series adds foundational support for the Qualcomm Nord SoC in >> U-Boot, including clock, pinctrl, USB HS PHY, and configuration updates > There's no Nord DT in dts/upstream and nothing builds a Nord board, so > none of this is used or tested in tree. Please send it with the board > enablement. DTs for newer SoCs typically take longer to reach upstream. In the meantime, we are posting the required platform drivers for review so they can be discussed and iterated independently.This follows the pattern commonly seen in the Linux kernel, where SoC support drivers (clock, pinctrl, PHY, etc.) are often upstreamed before the corresponding board DTS files become available. The board enablement series will consume these drivers once the DT support is ready. Thanks, Aswin > The commit messages only restate the subjects. Say what U-Boot needs > each controller for. ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC 2026-10-24 18:22 ` Aswin Murugan @ 2026-10-24 18:31 ` Tom Rini 0 siblings, 0 replies; 21+ messages in thread From: Tom Rini @ 2026-10-24 18:31 UTC (permalink / raw) To: Aswin Murugan Cc: Tyler Baker, casey.connolly, neil.armstrong, sumit.garg, lukma, marek.vasut+usb, Michael.Srba, nathbappai, nikroks, luca.weiss, jbx6244, u-boot-qcom, u-boot [-- Attachment #1: Type: text/plain, Size: 1360 bytes --] On Sat, Oct 24, 2026 at 11:52:47PM +0530, Aswin Murugan wrote: > Hi Tyler > > On 10/23/2026 3:03 AM, Tyler Baker wrote: > > On Wed, 21 Oct 2026 at 21:34, Aswin Murugan wrote: > > > This series adds foundational support for the Qualcomm Nord SoC in > > > U-Boot, including clock, pinctrl, USB HS PHY, and configuration updates > > There's no Nord DT in dts/upstream and nothing builds a Nord board, so > > none of this is used or tested in tree. Please send it with the board > > enablement. > > DTs for newer SoCs typically take longer to reach upstream. In the meantime, > we are posting the required platform drivers for review so they can be > discussed and iterated independently.This follows the pattern commonly seen > in the Linux kernel, where SoC support drivers (clock, pinctrl, PHY, etc.) > are often upstreamed before the corresponding board DTS files become > available. The board enablement series will consume these drivers once the > DT support is ready. As I've mentioned in private, but I'll repeat in public now, a lot of this code needs a lot more internal review anyhow before being posted in public. So no, I don't think we have the bandwidth to try and follow the linux kernel model in this case. Especially since we're talking about clock/pinctrl drivers and so that's not the tricky part anyhow. -- Tom [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2026-10-24 18:31 UTC | newest] Thread overview: 21+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-10-21 16:04 [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC Aswin Murugan 2026-10-21 16:04 ` [PATCH v3 1/8] clk: qcom: add GCC driver for nord Aswin Murugan 2026-10-22 7:50 ` neil.armstrong 2026-10-22 21:33 ` Tyler Baker 2026-10-21 16:04 ` [PATCH v3 2/8] clk: qcom: add NEGCC " Aswin Murugan 2026-10-22 21:34 ` Tyler Baker 2026-10-21 16:04 ` [PATCH v3 3/8] clk: qcom: add SEGCC " Aswin Murugan 2026-10-22 21:34 ` Tyler Baker 2026-10-21 16:04 ` [PATCH v3 4/8] clk: qcom: add NWGCC " Aswin Murugan 2026-10-22 21:34 ` Tyler Baker 2026-10-21 16:04 ` [PATCH v3 5/8] clk: qcom: add TCSRCC " Aswin Murugan 2026-10-21 16:04 ` [PATCH v3 6/8] configs: qcom_defconfig: enable nord clock drivers Aswin Murugan 2026-10-22 21:34 ` Tyler Baker 2026-10-21 16:04 ` [PATCH v3 7/8] pinctrl: qcom: add TLMM driver for nord Aswin Murugan 2026-10-22 21:34 ` Tyler Baker 2026-10-21 16:04 ` [PATCH v3 8/8] phy: qcom: snps-eusb2: add Nord compatible Aswin Murugan 2026-10-22 21:34 ` Tyler Baker 2026-10-22 21:33 ` [PATCH v3 0/8] arm64: qcom: Add initial support for Nord SoC Tyler Baker 2026-10-22 22:05 ` Tom Rini 2026-10-24 18:22 ` Aswin Murugan 2026-10-24 18:31 ` Tom Rini
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.