UPSTREAM: of/pci: Add helper function to parse max-link-speed from dt
authorShawn Lin <shawn.lin@rock-chips.com>
Tue, 18 Oct 2016 01:45:09 +0000 (09:45 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Wed, 23 Nov 2016 09:33:37 +0000 (17:33 +0800)
This new helper function could be used by host drivers to
get the limitaion of max link speed provided by dt. If the
property isn't assigned or is invalid, it will return -EINVAL
to the caller.

Change-Id: I430b05fa5fd25fe17cf1bd8b1226e460eb7dd14b
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
(am from git.kernel.org/cgit/linux/kernel/git/next/linux-next.git
commit 9a1dc3891255afd836f355b117fd6b975d0b1eb2)

drivers/of/of_pci.c
include/linux/of_pci.h

index b1449f71601cb257f1057b77c217a943da92cab8..038c0ec1b0c523b6d2a191f1476d9684efc270c7 100644 (file)
@@ -118,6 +118,27 @@ int of_get_pci_domain_nr(struct device_node *node)
 }
 EXPORT_SYMBOL_GPL(of_get_pci_domain_nr);
 
+/**
+ * This function will try to find the limitation of link speed by finding
+ * a property called "max-link-speed" of the given device node.
+ *
+ * @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.
+ */
+int of_pci_get_max_link_speed(struct device_node *node)
+{
+       u32 max_link_speed;
+
+       if (of_property_read_u32(node, "max-link-speed", &max_link_speed) ||
+           max_link_speed > 4)
+               return -EINVAL;
+
+       return max_link_speed;
+}
+EXPORT_SYMBOL_GPL(of_pci_get_max_link_speed);
+
 /**
  * of_pci_check_probe_only - Setup probe only mode if linux,pci-probe-only
  *                           is present and valid
index 2c51ee78b1c0e31074ee17eb9a341021ee3162e0..7a6fd1c2e074c2ee4410364371bd64aafe5064ef 100644 (file)
@@ -16,6 +16,7 @@ int of_pci_get_devfn(struct device_node *np);
 int of_irq_parse_and_map_pci(const struct pci_dev *dev, u8 slot, u8 pin);
 int of_pci_parse_bus_range(struct device_node *node, struct resource *res);
 int of_get_pci_domain_nr(struct device_node *node);
+int of_pci_get_max_link_speed(struct device_node *node);
 void of_pci_check_probe_only(void);
 #else
 static inline int of_irq_parse_pci(const struct pci_dev *pdev, struct of_phandle_args *out_irq)
@@ -52,6 +53,12 @@ of_get_pci_domain_nr(struct device_node *node)
        return -1;
 }
 
+static inline int
+of_pci_get_max_link_speed(struct device_node *node)
+{
+       return -EINVAL;
+}
+
 static inline void of_pci_check_probe_only(void) { }
 #endif