[PATCH v3 03/12] PCI: of: Return -ENOENT if max-link-speed property is not found

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



OF API function of_property_read_u32() returns -EINVAL if property is
not found. Therefore this also happens with of_pci_get_max_link_speed(),
which also returns -EINVAL if the 'max-link-speed' property has invalid
value.

Change the behaviour of of_pci_get_max_link_speed() to return -ENOENT
in case when the property does not exist and -EINVAL if it has invalid
value.

Also interpret zero max-link-speed value of this property as invalid,
as the device tree bindings documentation specifies.

Update pcie-tegra194 code to handle errors from this function like other
drivers - they do not distinguish between no value and invalid value.

Signed-off-by: Pali Rohár <pali@xxxxxxxxxx>
---
 drivers/pci/controller/dwc/pcie-tegra194.c |  6 +++---
 drivers/pci/of.c                           | 15 +++++++++++----
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/drivers/pci/controller/dwc/pcie-tegra194.c b/drivers/pci/controller/dwc/pcie-tegra194.c
index ae30a2fd3716..027bb41809f9 100644
--- a/drivers/pci/controller/dwc/pcie-tegra194.c
+++ b/drivers/pci/controller/dwc/pcie-tegra194.c
@@ -296,7 +296,7 @@ struct tegra_pcie_dw {
 	u8 init_link_width;
 	u32 msi_ctrl_int;
 	u32 num_lanes;
-	u32 max_speed;
+	int max_speed;
 	u32 cid;
 	u32 cfg_link_cap_l1sub;
 	u32 pcie_cap_base;
@@ -911,7 +911,7 @@ static void tegra_pcie_prepare_host(struct pcie_port *pp)
 	dw_pcie_writel_dbi(pci, PORT_LOGIC_AMBA_ERROR_RESPONSE_DEFAULT, val);
 
 	/* Configure Max Speed from DT */
-	if (pcie->max_speed && pcie->max_speed != -EINVAL) {
+	if (pcie->max_speed > 0) {
 		val = dw_pcie_readl_dbi(pci, pcie->pcie_cap_base +
 					PCI_EXP_LNKCAP);
 		val &= ~PCI_EXP_LNKCAP_SLS;
@@ -1830,7 +1830,7 @@ static void pex_ep_event_pex_rst_deassert(struct tegra_pcie_dw *pcie)
 	dw_pcie_writel_dbi(pci, PORT_LOGIC_GEN2_CTRL, val);
 
 	/* Configure Max Speed from DT */
-	if (pcie->max_speed && pcie->max_speed != -EINVAL) {
+	if (pcie->max_speed > 0) {
 		val = dw_pcie_readl_dbi(pci, pcie->pcie_cap_base +
 					PCI_EXP_LNKCAP);
 		val &= ~PCI_EXP_LNKCAP_SLS;
diff --git a/drivers/pci/of.c b/drivers/pci/of.c
index 81ceeaa6f1d5..19bf652256d8 100644
--- a/drivers/pci/of.c
+++ b/drivers/pci/of.c
@@ -584,15 +584,22 @@ EXPORT_SYMBOL_GPL(pci_parse_request_of_pci_ranges);
  *
  * @node: device tree node with the max link speed information
  *
- * Returns the associated max link speed from DT, or a negative value if the
- * required property is not found or is invalid.
+ * Returns the associated max link speed from DT, -ENOENT if the required
+ * property is not found or -EINVAL if the required property is invalid.
  */
 int of_pci_get_max_link_speed(struct device_node *node)
 {
 	u32 max_link_speed;
+	int ret;
+
+	/* of_property_read_u32 returns -EINVAL if property does not exist */
+	ret = of_property_read_u32(node, "max-link-speed", &max_link_speed);
+	if (ret == -EINVAL)
+		return -ENOENT;
+	else if (ret)
+		return -EINVAL;
 
-	if (of_property_read_u32(node, "max-link-speed", &max_link_speed) ||
-	    max_link_speed > 4)
+	if (max_link_speed == 0 || max_link_speed > 4)
 		return -EINVAL;
 
 	return max_link_speed;
-- 
2.20.1




[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux