From: Bartosz Golaszewski Date: Wed, 12 Jun 2024 08:20:15 +0000 (+0200) Subject: PCI/pwrctl: Reuse the OF node for power controlled devices X-Git-Tag: v6.11-rc1~213^2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=62c953f0f4fb0b5f67b0ad3096ab38f5c5712d75;p=thirdparty%2Fkernel%2Flinux.git PCI/pwrctl: Reuse the OF node for power controlled devices With PCI power control we deal with two struct device objects bound to two different drivers but consuming the same OF node. We must not bind the pinctrl twice. To that end: before setting the OF node of the newly instantiated PCI device, check if a platform device consuming the same OF node doesn't already exist on the platform bus and - if so - mark the PCI device as reusing the OF node. Tested-by: Amit Pundir Tested-by: Neil Armstrong # on SM8550-QRD, SM8650-QRD & SM8650-HDK Tested-by: Caleb Connolly # OnePlus 8T Acked-by: Bjorn Helgaas Link: https://lore.kernel.org/r/20240612082019.19161-3-brgl@bgdev.pl Signed-off-by: Bartosz Golaszewski --- diff --git a/drivers/pci/of.c b/drivers/pci/of.c index 51e3dd0ea5abe..b908fe1ae951e 100644 --- a/drivers/pci/of.c +++ b/drivers/pci/of.c @@ -6,6 +6,7 @@ */ #define pr_fmt(fmt) "PCI: OF: " fmt +#include #include #include #include @@ -13,6 +14,7 @@ #include #include #include +#include #include "pci.h" #ifdef CONFIG_PCI @@ -25,16 +27,20 @@ */ int pci_set_of_node(struct pci_dev *dev) { - struct device_node *node; - if (!dev->bus->dev.of_node) return 0; - node = of_pci_find_child_device(dev->bus->dev.of_node, dev->devfn); + struct device_node *node __free(device_node) = + of_pci_find_child_device(dev->bus->dev.of_node, dev->devfn); if (!node) return 0; - device_set_node(&dev->dev, of_fwnode_handle(node)); + struct device *pdev __free(put_device) = + bus_find_device_by_of_node(&platform_bus_type, node); + if (pdev) + dev->bus->dev.of_node_reused = true; + + device_set_node(&dev->dev, of_fwnode_handle(no_free_ptr(node))); return 0; }