[openwrt/openwrt] qualcommax: use upstreamed IPQ5018 PCI support

LEDE Commits lede-commits at lists.infradead.org
Thu May 8 12:03:51 PDT 2025


robimarko pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/b2fa7e4b9d7606e2b8959f7ce981c96f98a07277

commit b2fa7e4b9d7606e2b8959f7ce981c96f98a07277
Author: Robert Marko <robimarko at gmail.com>
AuthorDate: Thu May 8 21:02:44 2025 +0200

    qualcommax: use upstreamed IPQ5018 PCI support
    
    Instead of downstream patch, use the upstreamed version.
    Makes it easy to update to 6.12.
    
    Signed-off-by: Robert Marko <robimarko at gmail.com>
---
 ...11-PCI-qcom-Use-devm_clk_bulk_get_all-API.patch | 388 +++++++++++++++++++++
 ...48-v6.16-PCI-qcom-Add-support-for-IPQ5018.patch |  31 ++
 ...0160-dt-bindings-PCI-qcom-Add-IPQ5018-SoC.patch |  78 -----
 .../0161-PCI-qcom-add-support-for-IPQ5018.patch    |  77 ----
 4 files changed, 419 insertions(+), 155 deletions(-)

diff --git a/target/linux/qualcommax/patches-6.6/0047-v6.11-PCI-qcom-Use-devm_clk_bulk_get_all-API.patch b/target/linux/qualcommax/patches-6.6/0047-v6.11-PCI-qcom-Use-devm_clk_bulk_get_all-API.patch
new file mode 100644
index 0000000000..453620f320
--- /dev/null
+++ b/target/linux/qualcommax/patches-6.6/0047-v6.11-PCI-qcom-Use-devm_clk_bulk_get_all-API.patch
@@ -0,0 +1,388 @@
+From 652935ba05860eadaa19ac9efe7aea61fb7a3aef Mon Sep 17 00:00:00 2001
+From: Manivannan Sadhasivam <manivannan.sadhasivam at linaro.org>
+Date: Wed, 17 Apr 2024 12:32:53 +0530
+Subject: [PATCH] PCI: qcom: Use devm_clk_bulk_get_all() API
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+There is no need for the device drivers to validate the clocks defined in
+Devicetree. The validation should be performed by the DT schema and the
+drivers should just get all the clocks from DT. Right now the driver
+hardcodes the clock info and validates them against DT which is redundant.
+
+So use devm_clk_bulk_get_all() that just gets all the clocks defined in DT
+and get rid of all static clocks info from the driver. This simplifies the
+driver.
+
+Link: https://lore.kernel.org/linux-pci/20240417-pci-qcom-clk-bulk-v1-1-52ca19b3d6b2@linaro.org
+Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam at linaro.org>
+Signed-off-by: Krzysztof Wilczyński <kwilczynski at kernel.org>
+Signed-off-by: Bjorn Helgaas <bhelgaas at google.com>
+---
+ drivers/pci/controller/dwc/pcie-qcom.c | 177 ++++++++-----------------
+ 1 file changed, 58 insertions(+), 119 deletions(-)
+
+--- a/drivers/pci/controller/dwc/pcie-qcom.c
++++ b/drivers/pci/controller/dwc/pcie-qcom.c
+@@ -151,58 +151,56 @@
+ 
+ #define QCOM_PCIE_CRC8_POLYNOMIAL		(BIT(2) | BIT(1) | BIT(0))
+ 
+-#define QCOM_PCIE_1_0_0_MAX_CLOCKS		4
+ struct qcom_pcie_resources_1_0_0 {
+-	struct clk_bulk_data clks[QCOM_PCIE_1_0_0_MAX_CLOCKS];
++	struct clk_bulk_data *clks;
++	int num_clks;
+ 	struct reset_control *core;
+ 	struct regulator *vdda;
+ };
+ 
+-#define QCOM_PCIE_2_1_0_MAX_CLOCKS		5
+ #define QCOM_PCIE_2_1_0_MAX_RESETS		6
+ #define QCOM_PCIE_2_1_0_MAX_SUPPLY		3
+ struct qcom_pcie_resources_2_1_0 {
+-	struct clk_bulk_data clks[QCOM_PCIE_2_1_0_MAX_CLOCKS];
++	struct clk_bulk_data *clks;
++	int num_clks;
+ 	struct reset_control_bulk_data resets[QCOM_PCIE_2_1_0_MAX_RESETS];
+ 	int num_resets;
+ 	struct regulator_bulk_data supplies[QCOM_PCIE_2_1_0_MAX_SUPPLY];
+ };
+ 
+-#define QCOM_PCIE_2_3_2_MAX_CLOCKS		4
+ #define QCOM_PCIE_2_3_2_MAX_SUPPLY		2
+ struct qcom_pcie_resources_2_3_2 {
+-	struct clk_bulk_data clks[QCOM_PCIE_2_3_2_MAX_CLOCKS];
++	struct clk_bulk_data *clks;
++	int num_clks;
+ 	struct regulator_bulk_data supplies[QCOM_PCIE_2_3_2_MAX_SUPPLY];
+ };
+ 
+-#define QCOM_PCIE_2_3_3_MAX_CLOCKS		5
+ #define QCOM_PCIE_2_3_3_MAX_RESETS		7
+ struct qcom_pcie_resources_2_3_3 {
+-	struct clk_bulk_data clks[QCOM_PCIE_2_3_3_MAX_CLOCKS];
++	struct clk_bulk_data *clks;
++	int num_clks;
+ 	struct reset_control_bulk_data rst[QCOM_PCIE_2_3_3_MAX_RESETS];
+ };
+ 
+-#define QCOM_PCIE_2_4_0_MAX_CLOCKS		4
+ #define QCOM_PCIE_2_4_0_MAX_RESETS		12
+ struct qcom_pcie_resources_2_4_0 {
+-	struct clk_bulk_data clks[QCOM_PCIE_2_4_0_MAX_CLOCKS];
++	struct clk_bulk_data *clks;
+ 	int num_clks;
+ 	struct reset_control_bulk_data resets[QCOM_PCIE_2_4_0_MAX_RESETS];
+ 	int num_resets;
+ };
+ 
+-#define QCOM_PCIE_2_7_0_MAX_CLOCKS		15
+ #define QCOM_PCIE_2_7_0_MAX_SUPPLIES		2
+ struct qcom_pcie_resources_2_7_0 {
+-	struct clk_bulk_data clks[QCOM_PCIE_2_7_0_MAX_CLOCKS];
++	struct clk_bulk_data *clks;
+ 	int num_clks;
+ 	struct regulator_bulk_data supplies[QCOM_PCIE_2_7_0_MAX_SUPPLIES];
+ 	struct reset_control *rst;
+ };
+ 
+-#define QCOM_PCIE_2_9_0_MAX_CLOCKS		5
+ struct qcom_pcie_resources_2_9_0 {
+-	struct clk_bulk_data clks[QCOM_PCIE_2_9_0_MAX_CLOCKS];
++	struct clk_bulk_data *clks;
++	int num_clks;
+ 	struct reset_control *rst;
+ };
+ 
+@@ -313,21 +311,11 @@ static int qcom_pcie_get_resources_2_1_0
+ 	if (ret)
+ 		return ret;
+ 
+-	res->clks[0].id = "iface";
+-	res->clks[1].id = "core";
+-	res->clks[2].id = "phy";
+-	res->clks[3].id = "aux";
+-	res->clks[4].id = "ref";
+-
+-	/* iface, core, phy are required */
+-	ret = devm_clk_bulk_get(dev, 3, res->clks);
+-	if (ret < 0)
+-		return ret;
+-
+-	/* aux, ref are optional */
+-	ret = devm_clk_bulk_get_optional(dev, 2, res->clks + 3);
+-	if (ret < 0)
+-		return ret;
++	res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
++	if (res->num_clks < 0) {
++		dev_err(dev, "Failed to get clocks\n");
++		return res->num_clks;
++	}
+ 
+ 	res->resets[0].id = "pci";
+ 	res->resets[1].id = "axi";
+@@ -349,7 +337,7 @@ static void qcom_pcie_deinit_2_1_0(struc
+ {
+ 	struct qcom_pcie_resources_2_1_0 *res = &pcie->res.v2_1_0;
+ 
+-	clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
++	clk_bulk_disable_unprepare(res->num_clks, res->clks);
+ 	reset_control_bulk_assert(res->num_resets, res->resets);
+ 
+ 	writel(1, pcie->parf + PARF_PHY_CTRL);
+@@ -401,7 +389,7 @@ static int qcom_pcie_post_init_2_1_0(str
+ 	val &= ~PHY_TEST_PWR_DOWN;
+ 	writel(val, pcie->parf + PARF_PHY_CTRL);
+ 
+-	ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks);
++	ret = clk_bulk_prepare_enable(res->num_clks, res->clks);
+ 	if (ret)
+ 		return ret;
+ 
+@@ -452,20 +440,16 @@ static int qcom_pcie_get_resources_1_0_0
+ 	struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0;
+ 	struct dw_pcie *pci = pcie->pci;
+ 	struct device *dev = pci->dev;
+-	int ret;
+ 
+ 	res->vdda = devm_regulator_get(dev, "vdda");
+ 	if (IS_ERR(res->vdda))
+ 		return PTR_ERR(res->vdda);
+ 
+-	res->clks[0].id = "iface";
+-	res->clks[1].id = "aux";
+-	res->clks[2].id = "master_bus";
+-	res->clks[3].id = "slave_bus";
+-
+-	ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks);
+-	if (ret < 0)
+-		return ret;
++	res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
++	if (res->num_clks < 0) {
++		dev_err(dev, "Failed to get clocks\n");
++		return res->num_clks;
++	}
+ 
+ 	res->core = devm_reset_control_get_exclusive(dev, "core");
+ 	return PTR_ERR_OR_ZERO(res->core);
+@@ -476,7 +460,7 @@ static void qcom_pcie_deinit_1_0_0(struc
+ 	struct qcom_pcie_resources_1_0_0 *res = &pcie->res.v1_0_0;
+ 
+ 	reset_control_assert(res->core);
+-	clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
++	clk_bulk_disable_unprepare(res->num_clks, res->clks);
+ 	regulator_disable(res->vdda);
+ }
+ 
+@@ -493,7 +477,7 @@ static int qcom_pcie_init_1_0_0(struct q
+ 		return ret;
+ 	}
+ 
+-	ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks);
++	ret = clk_bulk_prepare_enable(res->num_clks, res->clks);
+ 	if (ret) {
+ 		dev_err(dev, "cannot prepare/enable clocks\n");
+ 		goto err_assert_reset;
+@@ -508,7 +492,7 @@ static int qcom_pcie_init_1_0_0(struct q
+ 	return 0;
+ 
+ err_disable_clks:
+-	clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
++	clk_bulk_disable_unprepare(res->num_clks, res->clks);
+ err_assert_reset:
+ 	reset_control_assert(res->core);
+ 
+@@ -556,14 +540,11 @@ static int qcom_pcie_get_resources_2_3_2
+ 	if (ret)
+ 		return ret;
+ 
+-	res->clks[0].id = "aux";
+-	res->clks[1].id = "cfg";
+-	res->clks[2].id = "bus_master";
+-	res->clks[3].id = "bus_slave";
+-
+-	ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks);
+-	if (ret < 0)
+-		return ret;
++	res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
++	if (res->num_clks < 0) {
++		dev_err(dev, "Failed to get clocks\n");
++		return res->num_clks;
++	}
+ 
+ 	return 0;
+ }
+@@ -572,7 +553,7 @@ static void qcom_pcie_deinit_2_3_2(struc
+ {
+ 	struct qcom_pcie_resources_2_3_2 *res = &pcie->res.v2_3_2;
+ 
+-	clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
++	clk_bulk_disable_unprepare(res->num_clks, res->clks);
+ 	regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies);
+ }
+ 
+@@ -589,7 +570,7 @@ static int qcom_pcie_init_2_3_2(struct q
+ 		return ret;
+ 	}
+ 
+-	ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks);
++	ret = clk_bulk_prepare_enable(res->num_clks, res->clks);
+ 	if (ret) {
+ 		dev_err(dev, "cannot prepare/enable clocks\n");
+ 		regulator_bulk_disable(ARRAY_SIZE(res->supplies), res->supplies);
+@@ -637,17 +618,11 @@ static int qcom_pcie_get_resources_2_4_0
+ 	bool is_ipq = of_device_is_compatible(dev->of_node, "qcom,pcie-ipq4019");
+ 	int ret;
+ 
+-	res->clks[0].id = "aux";
+-	res->clks[1].id = "master_bus";
+-	res->clks[2].id = "slave_bus";
+-	res->clks[3].id = "iface";
+-
+-	/* qcom,pcie-ipq4019 is defined without "iface" */
+-	res->num_clks = is_ipq ? 3 : 4;
+-
+-	ret = devm_clk_bulk_get(dev, res->num_clks, res->clks);
+-	if (ret < 0)
+-		return ret;
++	res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
++	if (res->num_clks < 0) {
++		dev_err(dev, "Failed to get clocks\n");
++		return res->num_clks;
++	}
+ 
+ 	res->resets[0].id = "axi_m";
+ 	res->resets[1].id = "axi_s";
+@@ -718,15 +693,11 @@ static int qcom_pcie_get_resources_2_3_3
+ 	struct device *dev = pci->dev;
+ 	int ret;
+ 
+-	res->clks[0].id = "iface";
+-	res->clks[1].id = "axi_m";
+-	res->clks[2].id = "axi_s";
+-	res->clks[3].id = "ahb";
+-	res->clks[4].id = "aux";
+-
+-	ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks);
+-	if (ret < 0)
+-		return ret;
++	res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
++	if (res->num_clks < 0) {
++		dev_err(dev, "Failed to get clocks\n");
++		return res->num_clks;
++	}
+ 
+ 	res->rst[0].id = "axi_m";
+ 	res->rst[1].id = "axi_s";
+@@ -747,7 +718,7 @@ static void qcom_pcie_deinit_2_3_3(struc
+ {
+ 	struct qcom_pcie_resources_2_3_3 *res = &pcie->res.v2_3_3;
+ 
+-	clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
++	clk_bulk_disable_unprepare(res->num_clks, res->clks);
+ }
+ 
+ static int qcom_pcie_init_2_3_3(struct qcom_pcie *pcie)
+@@ -777,7 +748,7 @@ static int qcom_pcie_init_2_3_3(struct q
+ 	 */
+ 	usleep_range(2000, 2500);
+ 
+-	ret = clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks);
++	ret = clk_bulk_prepare_enable(res->num_clks, res->clks);
+ 	if (ret) {
+ 		dev_err(dev, "cannot prepare/enable clocks\n");
+ 		goto err_assert_resets;
+@@ -838,8 +809,6 @@ static int qcom_pcie_get_resources_2_7_0
+ 	struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0;
+ 	struct dw_pcie *pci = pcie->pci;
+ 	struct device *dev = pci->dev;
+-	unsigned int num_clks, num_opt_clks;
+-	unsigned int idx;
+ 	int ret;
+ 
+ 	res->rst = devm_reset_control_array_get_exclusive(dev);
+@@ -853,36 +822,11 @@ static int qcom_pcie_get_resources_2_7_0
+ 	if (ret)
+ 		return ret;
+ 
+-	idx = 0;
+-	res->clks[idx++].id = "aux";
+-	res->clks[idx++].id = "cfg";
+-	res->clks[idx++].id = "bus_master";
+-	res->clks[idx++].id = "bus_slave";
+-	res->clks[idx++].id = "slave_q2a";
+-
+-	num_clks = idx;
+-
+-	ret = devm_clk_bulk_get(dev, num_clks, res->clks);
+-	if (ret < 0)
+-		return ret;
+-
+-	res->clks[idx++].id = "tbu";
+-	res->clks[idx++].id = "ddrss_sf_tbu";
+-	res->clks[idx++].id = "aggre0";
+-	res->clks[idx++].id = "aggre1";
+-	res->clks[idx++].id = "noc_aggr";
+-	res->clks[idx++].id = "noc_aggr_4";
+-	res->clks[idx++].id = "noc_aggr_south_sf";
+-	res->clks[idx++].id = "cnoc_qx";
+-	res->clks[idx++].id = "sleep";
+-	res->clks[idx++].id = "cnoc_sf_axi";
+-
+-	num_opt_clks = idx - num_clks;
+-	res->num_clks = idx;
+-
+-	ret = devm_clk_bulk_get_optional(dev, num_opt_clks, res->clks + num_clks);
+-	if (ret < 0)
+-		return ret;
++	res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
++	if (res->num_clks < 0) {
++		dev_err(dev, "Failed to get clocks\n");
++		return res->num_clks;
++	}
+ 
+ 	return 0;
+ }
+@@ -1073,17 +1017,12 @@ static int qcom_pcie_get_resources_2_9_0
+ 	struct qcom_pcie_resources_2_9_0 *res = &pcie->res.v2_9_0;
+ 	struct dw_pcie *pci = pcie->pci;
+ 	struct device *dev = pci->dev;
+-	int ret;
+-
+-	res->clks[0].id = "iface";
+-	res->clks[1].id = "axi_m";
+-	res->clks[2].id = "axi_s";
+-	res->clks[3].id = "axi_bridge";
+-	res->clks[4].id = "rchng";
+ 
+-	ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks);
+-	if (ret < 0)
+-		return ret;
++	res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
++	if (res->num_clks < 0) {
++		dev_err(dev, "Failed to get clocks\n");
++		return res->num_clks;
++	}
+ 
+ 	res->rst = devm_reset_control_array_get_exclusive(dev);
+ 	if (IS_ERR(res->rst))
+@@ -1096,7 +1035,7 @@ static void qcom_pcie_deinit_2_9_0(struc
+ {
+ 	struct qcom_pcie_resources_2_9_0 *res = &pcie->res.v2_9_0;
+ 
+-	clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
++	clk_bulk_disable_unprepare(res->num_clks, res->clks);
+ }
+ 
+ static int qcom_pcie_init_2_9_0(struct qcom_pcie *pcie)
+@@ -1125,7 +1064,7 @@ static int qcom_pcie_init_2_9_0(struct q
+ 
+ 	usleep_range(2000, 2500);
+ 
+-	return clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks);
++	return clk_bulk_prepare_enable(res->num_clks, res->clks);
+ }
+ 
+ static int qcom_pcie_post_init_2_9_0(struct qcom_pcie *pcie)
diff --git a/target/linux/qualcommax/patches-6.6/0048-v6.16-PCI-qcom-Add-support-for-IPQ5018.patch b/target/linux/qualcommax/patches-6.6/0048-v6.16-PCI-qcom-Add-support-for-IPQ5018.patch
new file mode 100644
index 0000000000..e9873eaf81
--- /dev/null
+++ b/target/linux/qualcommax/patches-6.6/0048-v6.16-PCI-qcom-Add-support-for-IPQ5018.patch
@@ -0,0 +1,31 @@
+From 3e5127469a8d41153fb30031a271788f52dd17ec Mon Sep 17 00:00:00 2001
+From: Nitheesh Sekar <quic_nsekar at quicinc.com>
+Date: Wed, 26 Mar 2025 12:10:58 +0400
+Subject: [PATCH] PCI: qcom: Add support for IPQ5018
+
+Add IPQ5018 platform with is based on Qcom IP rev. 2.9.0 and Synopsys IP
+rev. 5.00a.
+
+The platform itself has two PCIe Gen2 controllers: one single-lane and
+one dual-lane. So add the IPQ5018 compatible and re-use 2_9_0 ops.
+
+Signed-off-by: Nitheesh Sekar <quic_nsekar at quicinc.com>
+Signed-off-by: Sricharan R <quic_srichara at quicinc.com>
+Signed-off-by: George Moussalem <george.moussalem at outlook.com>
+Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam at linaro.org>
+Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam at linaro.org>
+Link: https://patch.msgid.link/20250326-ipq5018-pcie-v7-4-e1828fef06c9@outlook.com
+---
+ drivers/pci/controller/dwc/pcie-qcom.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/pci/controller/dwc/pcie-qcom.c
++++ b/drivers/pci/controller/dwc/pcie-qcom.c
+@@ -1580,6 +1580,7 @@ static const struct of_device_id qcom_pc
+ 	{ .compatible = "qcom,pcie-apq8064", .data = &cfg_2_1_0 },
+ 	{ .compatible = "qcom,pcie-apq8084", .data = &cfg_1_0_0 },
+ 	{ .compatible = "qcom,pcie-ipq4019", .data = &cfg_2_4_0 },
++	{ .compatible = "qcom,pcie-ipq5018", .data = &cfg_2_9_0 },
+ 	{ .compatible = "qcom,pcie-ipq6018", .data = &cfg_2_9_0 },
+ 	{ .compatible = "qcom,pcie-ipq8064", .data = &cfg_2_1_0 },
+ 	{ .compatible = "qcom,pcie-ipq8064-v2", .data = &cfg_2_1_0 },
diff --git a/target/linux/qualcommax/patches-6.6/0160-dt-bindings-PCI-qcom-Add-IPQ5018-SoC.patch b/target/linux/qualcommax/patches-6.6/0160-dt-bindings-PCI-qcom-Add-IPQ5018-SoC.patch
deleted file mode 100644
index caa9889109..0000000000
--- a/target/linux/qualcommax/patches-6.6/0160-dt-bindings-PCI-qcom-Add-IPQ5018-SoC.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From: Nitheesh Sekar <quic_nsekar at quicinc.com>
-Date: Tue, 3 Oct 2023 17:38:42 +0530
-Subject: [PATCH] dt-bindings: PCI: qcom: Add IPQ5108 SoC
-
-Add support for the PCIe controller on the Qualcomm
-IPQ5108 SoC to the bindings.
-
-Signed-off-by: Nitheesh Sekar <quic_nsekar at quicinc.com>
----
- .../devicetree/bindings/pci/qcom,pcie.yaml    | 36 +++++++++++++++++++
- 1 file changed, 36 insertions(+)
-
---- a/Documentation/devicetree/bindings/pci/qcom,pcie.yaml
-+++ b/Documentation/devicetree/bindings/pci/qcom,pcie.yaml
-@@ -21,6 +21,7 @@ properties:
-           - qcom,pcie-apq8064
-           - qcom,pcie-apq8084
-           - qcom,pcie-ipq4019
-+          - qcom,pcie-ipq5018
-           - qcom,pcie-ipq6018
-           - qcom,pcie-ipq8064
-           - qcom,pcie-ipq8064-v2
-@@ -170,6 +171,7 @@ allOf:
-         compatible:
-           contains:
-             enum:
-+              - qcom,pcie-ipq5018
-               - qcom,pcie-ipq6018
-               - qcom,pcie-ipq8074-gen3
-     then:
-@@ -337,6 +339,39 @@ allOf:
-         compatible:
-           contains:
-             enum:
-+              - qcom,pcie-ipq5018
-+    then:
-+      properties:
-+        clocks:
-+          minItems: 6
-+          maxItems: 6
-+        clock-names:
-+          items:
-+            - const: iface # PCIe to SysNOC BIU clock
-+            - const: axi_m # AXI Master clock
-+            - const: axi_s # AXI Slave clock
-+            - const: ahb # AHB clock
-+            - const: aux # Auxiliary clock
-+            - const: axi_bridge # AXI bridge clock
-+        resets:
-+          minItems: 8
-+          maxItems: 8
-+        reset-names:
-+          items:
-+            - const: pipe # PIPE reset
-+            - const: sleep # Sleep reset
-+            - const: sticky # Core sticky reset
-+            - const: axi_m # AXI master reset
-+            - const: axi_s # AXI slave reset
-+            - const: ahb # AHB reset
-+            - const: axi_m_sticky # AXI master sticky reset
-+            - const: axi_s_sticky # AXI slave sticky reset
-+
-+  - if:
-+      properties:
-+        compatible:
-+          contains:
-+            enum:
-               - qcom,pcie-msm8996
-     then:
-       properties:
-@@ -875,6 +910,7 @@ allOf:
-               - qcom,pcie-apq8064
-               - qcom,pcie-apq8084
-               - qcom,pcie-ipq4019
-+              - qcom,pcie-ipq5018
-               - qcom,pcie-ipq6018
-               - qcom,pcie-ipq8064
-               - qcom,pcie-ipq8064-v2
diff --git a/target/linux/qualcommax/patches-6.6/0161-PCI-qcom-add-support-for-IPQ5018.patch b/target/linux/qualcommax/patches-6.6/0161-PCI-qcom-add-support-for-IPQ5018.patch
deleted file mode 100644
index bd8f51b84c..0000000000
--- a/target/linux/qualcommax/patches-6.6/0161-PCI-qcom-add-support-for-IPQ5018.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-From: Nitheesh Sekar <quic_nsekar at quicinc.com>
-Subject: [PATCH] PCI: qcom: Add support for IPQ5018
-Date: Tue, 3 Oct 2023 17:38:44 +0530
-
-Added a new compatible 'qcom,pcie-ipq5018' and modified
-get_resources of 'ops 2_9_0' to get the clocks from the
-device-tree.
-
-Co-developed-by: Anusha Rao <quic_anusha at quicinc.com>
-Signed-off-by: Anusha Rao <quic_anusha at quicinc.com>
-Co-developed-by: Devi Priya <quic_devipriy at quicinc.com>
-Signed-off-by: Devi Priya <quic_devipriy at quicinc.com>
-Signed-off-by: Nitheesh Sekar <quic_nsekar at quicinc.com>
----
- drivers/pci/controller/dwc/pcie-qcom.c | 22 ++++++++--------------
- 1 file changed, 8 insertions(+), 14 deletions(-)
-
---- a/drivers/pci/controller/dwc/pcie-qcom.c
-+++ b/drivers/pci/controller/dwc/pcie-qcom.c
-@@ -202,8 +202,9 @@ struct qcom_pcie_resources_2_7_0 {
- 
- #define QCOM_PCIE_2_9_0_MAX_CLOCKS		5
- struct qcom_pcie_resources_2_9_0 {
--	struct clk_bulk_data clks[QCOM_PCIE_2_9_0_MAX_CLOCKS];
-+	struct clk_bulk_data *clks;
- 	struct reset_control *rst;
-+	int num_clks;
- };
- 
- union qcom_pcie_resources {
-@@ -1073,17 +1074,10 @@ static int qcom_pcie_get_resources_2_9_0
- 	struct qcom_pcie_resources_2_9_0 *res = &pcie->res.v2_9_0;
- 	struct dw_pcie *pci = pcie->pci;
- 	struct device *dev = pci->dev;
--	int ret;
--
--	res->clks[0].id = "iface";
--	res->clks[1].id = "axi_m";
--	res->clks[2].id = "axi_s";
--	res->clks[3].id = "axi_bridge";
--	res->clks[4].id = "rchng";
- 
--	ret = devm_clk_bulk_get(dev, ARRAY_SIZE(res->clks), res->clks);
--	if (ret < 0)
--		return ret;
-+	res->num_clks = devm_clk_bulk_get_all(dev, &res->clks);
-+	if (res->num_clks < 0)
-+		return res->num_clks;
- 
- 	res->rst = devm_reset_control_array_get_exclusive(dev);
- 	if (IS_ERR(res->rst))
-@@ -1096,7 +1090,7 @@ static void qcom_pcie_deinit_2_9_0(struc
- {
- 	struct qcom_pcie_resources_2_9_0 *res = &pcie->res.v2_9_0;
- 
--	clk_bulk_disable_unprepare(ARRAY_SIZE(res->clks), res->clks);
-+	clk_bulk_disable_unprepare(res->num_clks, res->clks);
- }
- 
- static int qcom_pcie_init_2_9_0(struct qcom_pcie *pcie)
-@@ -1125,7 +1119,7 @@ static int qcom_pcie_init_2_9_0(struct q
- 
- 	usleep_range(2000, 2500);
- 
--	return clk_bulk_prepare_enable(ARRAY_SIZE(res->clks), res->clks);
-+	return clk_bulk_prepare_enable(res->num_clks, res->clks);
- }
- 
- static int qcom_pcie_post_init_2_9_0(struct qcom_pcie *pcie)
-@@ -1641,6 +1635,7 @@ static const struct of_device_id qcom_pc
- 	{ .compatible = "qcom,pcie-apq8064", .data = &cfg_2_1_0 },
- 	{ .compatible = "qcom,pcie-apq8084", .data = &cfg_1_0_0 },
- 	{ .compatible = "qcom,pcie-ipq4019", .data = &cfg_2_4_0 },
-+	{ .compatible = "qcom,pcie-ipq5018", .data = &cfg_2_9_0 },
- 	{ .compatible = "qcom,pcie-ipq6018", .data = &cfg_2_9_0 },
- 	{ .compatible = "qcom,pcie-ipq8064", .data = &cfg_2_1_0 },
- 	{ .compatible = "qcom,pcie-ipq8064-v2", .data = &cfg_2_1_0 },




More information about the lede-commits mailing list