1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * Copyright (C) 2024 Linaro Ltd.
6 #ifndef __PCI_PWRCTRL_H__
7 #define __PCI_PWRCTRL_H__
9 #include <linux/notifier.h>
10 #include <linux/workqueue.h>
16 * This is a simple framework for solving the issue of PCI devices that require
17 * certain resources (regulators, GPIOs, clocks) to be enabled before the
18 * device can actually be detected on the PCI bus.
20 * The idea is to reuse the platform bus to populate OF nodes describing the
21 * PCI device and its resources, let these platform devices probe and enable
22 * relevant resources and then trigger a rescan of the PCI bus allowing for the
23 * same device (with a second associated struct device) to be registered with
26 * To preserve a correct hierarchy for PCI power management and device reset,
27 * we create a device link between the power control platform device (parent)
28 * and the supplied PCI device (child).
32 * struct pci_pwrctrl - PCI device power control context.
33 * @dev: Address of the power controlling device.
35 * An object of this type must be allocated by the PCI power control device and
36 * passed to the pwrctrl subsystem to trigger a bus rescan and setup a device
37 * link with the device once it's up.
42 /* Private: don't use. */
43 struct notifier_block nb
;
44 struct device_link
*link
;
45 struct work_struct work
;
48 void pci_pwrctrl_init(struct pci_pwrctrl
*pwrctrl
, struct device
*dev
);
49 int pci_pwrctrl_device_set_ready(struct pci_pwrctrl
*pwrctrl
);
50 void pci_pwrctrl_device_unset_ready(struct pci_pwrctrl
*pwrctrl
);
51 int devm_pci_pwrctrl_device_set_ready(struct device
*dev
,
52 struct pci_pwrctrl
*pwrctrl
);
54 #endif /* __PCI_PWRCTRL_H__ */