| /* SPDX-License-Identifier: GPL-2.0-only */ |
| /* |
| * Copyright (C) 2024 Linaro Ltd. |
| */ |
| |
| #ifndef __PCI_PWRCTL_H__ |
| #define __PCI_PWRCTL_H__ |
| |
| #include <linux/notifier.h> |
| #include <linux/workqueue.h> |
| |
| struct device; |
| struct device_link; |
| |
| /* |
| * This is a simple framework for solving the issue of PCI devices that require |
| * certain resources (regulators, GPIOs, clocks) to be enabled before the |
| * device can actually be detected on the PCI bus. |
| * |
| * The idea is to reuse the platform bus to populate OF nodes describing the |
| * PCI device and its resources, let these platform devices probe and enable |
| * relevant resources and then trigger a rescan of the PCI bus allowing for the |
| * same device (with a second associated struct device) to be registered with |
| * the PCI subsystem. |
| * |
| * To preserve a correct hierarchy for PCI power management and device reset, |
| * we create a device link between the power control platform device (parent) |
| * and the supplied PCI device (child). |
| */ |
| |
| /** |
| * struct pci_pwrctl - PCI device power control context. |
| * @dev: Address of the power controlling device. |
| * |
| * An object of this type must be allocated by the PCI power control device and |
| * passed to the pwrctl subsystem to trigger a bus rescan and setup a device |
| * link with the device once it's up. |
| */ |
| struct pci_pwrctl { |
| struct device *dev; |
| |
| /* Private: don't use. */ |
| struct notifier_block nb; |
| struct device_link *link; |
| struct work_struct work; |
| }; |
| |
| void pci_pwrctl_init(struct pci_pwrctl *pwrctl, struct device *dev); |
| int pci_pwrctl_device_set_ready(struct pci_pwrctl *pwrctl); |
| void pci_pwrctl_device_unset_ready(struct pci_pwrctl *pwrctl); |
| int devm_pci_pwrctl_device_set_ready(struct device *dev, |
| struct pci_pwrctl *pwrctl); |
| |
| #endif /* __PCI_PWRCTL_H__ */ |