On Fri, Feb 2, 2024 at 4:53 AM Bjorn Andersson <andersson@xxxxxxxxxx> wrote: > [snip] > > + > > +static int pci_pwrctl_notify(struct notifier_block *nb, unsigned long action, > > + void *data) > > +{ > > + struct pci_pwrctl *pwrctl = container_of(nb, struct pci_pwrctl, nb); > > + struct device *dev = data; > > + > > + if (dev_fwnode(dev) != dev_fwnode(pwrctl->dev)) > > + return NOTIFY_DONE; > > + > > + switch (action) { > > + case BUS_NOTIFY_ADD_DEVICE: > > + device_set_of_node_from_dev(dev, pwrctl->dev); > > What happens if the bootloader left the power on, and the > of_platform_populate() got probe deferred because the pwrseq wasn't > ready, so this happens after pci_set_of_node() has been called? > > (I think dev->of_node will be put, then get and then node_reused > assigned...but I'm not entirely sure) That's exactly what will happen and the end result will be the same. > > > + break; > > + case BUS_NOTIFY_BOUND_DRIVER: > > + pwrctl->link = device_link_add(dev, pwrctl->dev, > > + DL_FLAG_AUTOREMOVE_CONSUMER); > > + if (!pwrctl->link) > > + dev_err(pwrctl->dev, "Failed to add device link\n"); > > + break; > > + case BUS_NOTIFY_UNBOUND_DRIVER: > > + device_link_del(pwrctl->link); > > This might however become a NULL-pointer dereference, if dev was bound > to its driver before the pci_pwrctl_notify() was registered for the > pwrctl and then the PCI device is unbound. > > This would also happen if device_link_add() failed when the PCI device > was bound... > Yes, I'll address it. > > + break; > > + } > > + > > + return NOTIFY_DONE; > > +} > > + > > +int pci_pwrctl_device_enable(struct pci_pwrctl *pwrctl) > > This function doesn't really "enable the device", looking at the example > driver it's rather "device_enabled" than "device_enable"... > I was also thinking about pci_pwrctl_device_ready() or pci_pwrctl_device_prepared(). Bart [snip!]