mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 06:01:57 +00:00
PCI: qcom: Use OPP only if the platform supports it
With commit5b6272e0ef
("PCI: qcom: Add OPP support to scale performance"), OPP was used to control the interconnect and power domains if the platform supported OPP. Also to maintain the backward compatibility with platforms not supporting OPP but just ICC, the above mentioned commit assumed that if ICC was not available on the platform, it would resort to OPP. Unfortunately, some old platforms don't support either ICC or OPP. On those platforms, resorting to OPP in the absence of ICC throws below errors from OPP core during suspend and resume: qcom-pcie 1c08000.pcie: dev_pm_opp_set_opp: device opp doesn't exist qcom-pcie 1c08000.pcie: _find_key: OPP table not found (-19) Also, it doesn't make sense to invoke the OPP APIs when OPP is not supported by the platform at all. Add a "use_pm_opp" flag to identify whether OPP is supported and use it to control invoking the OPP APIs. Fixes:5b6272e0ef
("PCI: qcom: Add OPP support to scale performance") Link: https://lore.kernel.org/linux-pci/20240722131128.32470-1-manivannan.sadhasivam@linaro.org Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Mayank Rana <quic_mrana@quicinc.com>
This commit is contained in:
parent
5d6a6c7454
commit
db1ec60fba
@ -261,6 +261,7 @@ struct qcom_pcie {
|
||||
const struct qcom_pcie_cfg *cfg;
|
||||
struct dentry *debugfs;
|
||||
bool suspended;
|
||||
bool use_pm_opp;
|
||||
};
|
||||
|
||||
#define to_qcom_pcie(x) dev_get_drvdata((x)->dev)
|
||||
@ -1433,7 +1434,7 @@ static void qcom_pcie_icc_opp_update(struct qcom_pcie *pcie)
|
||||
dev_err(pci->dev, "Failed to set bandwidth for PCIe-MEM interconnect path: %d\n",
|
||||
ret);
|
||||
}
|
||||
} else {
|
||||
} else if (pcie->use_pm_opp) {
|
||||
freq_mbps = pcie_dev_speed_mbps(pcie_link_speed[speed]);
|
||||
if (freq_mbps < 0)
|
||||
return;
|
||||
@ -1592,6 +1593,8 @@ static int qcom_pcie_probe(struct platform_device *pdev)
|
||||
max_freq);
|
||||
goto err_pm_runtime_put;
|
||||
}
|
||||
|
||||
pcie->use_pm_opp = true;
|
||||
} else {
|
||||
/* Skip ICC init if OPP is supported as it is handled by OPP */
|
||||
ret = qcom_pcie_icc_init(pcie);
|
||||
@ -1683,7 +1686,7 @@ static int qcom_pcie_suspend_noirq(struct device *dev)
|
||||
if (ret)
|
||||
dev_err(dev, "Failed to disable CPU-PCIe interconnect path: %d\n", ret);
|
||||
|
||||
if (!pcie->icc_mem)
|
||||
if (pcie->use_pm_opp)
|
||||
dev_pm_opp_set_opp(pcie->pci->dev, NULL);
|
||||
}
|
||||
return ret;
|
||||
|
Loading…
Reference in New Issue
Block a user