Skip to content

Commit 1c5aa03

Browse files
lumagLorenzo Pieralisi
authored andcommitted
PCI: qcom: Add SM8450 PCIe support
On SM8450 platform PCIe hosts do not use all the clocks (and add several additional clocks), so expand the driver to handle these requirements. PCIe0 and PCIe1 hosts use different sets of clocks, so separate entries are required. Link: https://lore.kernel.org/r/20220223101435.447839-5-dmitry.baryshkov@linaro.org Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org> Acked-by: Stanimir Varbanov <svarbanov@mm-sol.com>
1 parent 0614f98 commit 1c5aa03

1 file changed

Lines changed: 44 additions & 13 deletions

File tree

drivers/pci/controller/dwc/pcie-qcom.c

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ struct qcom_pcie_resources_2_3_3 {
161161

162162
/* 6 clocks typically, 7 for sm8250 */
163163
struct qcom_pcie_resources_2_7_0 {
164-
struct clk_bulk_data clks[7];
164+
struct clk_bulk_data clks[9];
165165
int num_clks;
166166
struct regulator_bulk_data supplies[2];
167167
struct reset_control *pci_reset;
@@ -195,7 +195,10 @@ struct qcom_pcie_ops {
195195
struct qcom_pcie_cfg {
196196
const struct qcom_pcie_ops *ops;
197197
unsigned int pipe_clk_need_muxing:1;
198+
unsigned int has_tbu_clk:1;
198199
unsigned int has_ddrss_sf_tbu_clk:1;
200+
unsigned int has_aggre0_clk:1;
201+
unsigned int has_aggre1_clk:1;
199202
};
200203

201204
struct qcom_pcie {
@@ -1146,6 +1149,7 @@ static int qcom_pcie_get_resources_2_7_0(struct qcom_pcie *pcie)
11461149
struct qcom_pcie_resources_2_7_0 *res = &pcie->res.v2_7_0;
11471150
struct dw_pcie *pci = pcie->pci;
11481151
struct device *dev = pci->dev;
1152+
unsigned int idx;
11491153
int ret;
11501154

11511155
res->pci_reset = devm_reset_control_get_exclusive(dev, "pci");
@@ -1159,18 +1163,22 @@ static int qcom_pcie_get_resources_2_7_0(struct qcom_pcie *pcie)
11591163
if (ret)
11601164
return ret;
11611165

1162-
res->clks[0].id = "aux";
1163-
res->clks[1].id = "cfg";
1164-
res->clks[2].id = "bus_master";
1165-
res->clks[3].id = "bus_slave";
1166-
res->clks[4].id = "slave_q2a";
1167-
res->clks[5].id = "tbu";
1168-
if (pcie->cfg->has_ddrss_sf_tbu_clk) {
1169-
res->clks[6].id = "ddrss_sf_tbu";
1170-
res->num_clks = 7;
1171-
} else {
1172-
res->num_clks = 6;
1173-
}
1166+
idx = 0;
1167+
res->clks[idx++].id = "aux";
1168+
res->clks[idx++].id = "cfg";
1169+
res->clks[idx++].id = "bus_master";
1170+
res->clks[idx++].id = "bus_slave";
1171+
res->clks[idx++].id = "slave_q2a";
1172+
if (pcie->cfg->has_tbu_clk)
1173+
res->clks[idx++].id = "tbu";
1174+
if (pcie->cfg->has_ddrss_sf_tbu_clk)
1175+
res->clks[idx++].id = "ddrss_sf_tbu";
1176+
if (pcie->cfg->has_aggre0_clk)
1177+
res->clks[idx++].id = "aggre0";
1178+
if (pcie->cfg->has_aggre1_clk)
1179+
res->clks[idx++].id = "aggre1";
1180+
1181+
res->num_clks = idx;
11741182

11751183
ret = devm_clk_bulk_get(dev, res->num_clks, res->clks);
11761184
if (ret < 0)
@@ -1236,6 +1244,9 @@ static int qcom_pcie_init_2_7_0(struct qcom_pcie *pcie)
12361244
goto err_disable_clocks;
12371245
}
12381246

1247+
/* Wait for reset to complete, required on SM8450 */
1248+
usleep_range(1000, 1500);
1249+
12391250
/* configure PCIe to RC mode */
12401251
writel(DEVICE_TYPE_RC, pcie->parf + PCIE20_PARF_DEVICE_TYPE);
12411252

@@ -1509,15 +1520,33 @@ static const struct qcom_pcie_cfg ipq4019_cfg = {
15091520

15101521
static const struct qcom_pcie_cfg sdm845_cfg = {
15111522
.ops = &ops_2_7_0,
1523+
.has_tbu_clk = true,
15121524
};
15131525

15141526
static const struct qcom_pcie_cfg sm8250_cfg = {
1527+
.ops = &ops_1_9_0,
1528+
.has_tbu_clk = true,
1529+
.has_ddrss_sf_tbu_clk = true,
1530+
};
1531+
1532+
static const struct qcom_pcie_cfg sm8450_pcie0_cfg = {
15151533
.ops = &ops_1_9_0,
15161534
.has_ddrss_sf_tbu_clk = true,
1535+
.pipe_clk_need_muxing = true,
1536+
.has_aggre0_clk = true,
1537+
.has_aggre1_clk = true,
1538+
};
1539+
1540+
static const struct qcom_pcie_cfg sm8450_pcie1_cfg = {
1541+
.ops = &ops_1_9_0,
1542+
.has_ddrss_sf_tbu_clk = true,
1543+
.pipe_clk_need_muxing = true,
1544+
.has_aggre1_clk = true,
15171545
};
15181546

15191547
static const struct qcom_pcie_cfg sc7280_cfg = {
15201548
.ops = &ops_1_9_0,
1549+
.has_tbu_clk = true,
15211550
.pipe_clk_need_muxing = true,
15221551
};
15231552

@@ -1628,6 +1657,8 @@ static const struct of_device_id qcom_pcie_match[] = {
16281657
{ .compatible = "qcom,pcie-sdm845", .data = &sdm845_cfg },
16291658
{ .compatible = "qcom,pcie-sm8250", .data = &sm8250_cfg },
16301659
{ .compatible = "qcom,pcie-sc8180x", .data = &sm8250_cfg },
1660+
{ .compatible = "qcom,pcie-sm8450-pcie0", .data = &sm8450_pcie0_cfg },
1661+
{ .compatible = "qcom,pcie-sm8450-pcie1", .data = &sm8450_pcie1_cfg },
16311662
{ .compatible = "qcom,pcie-sc7280", .data = &sc7280_cfg },
16321663
{ }
16331664
};

0 commit comments

Comments
 (0)