1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (C) 2024 Linaro Ltd. 4 */ 5 6 #ifndef __PCI_PWRCTL_H__ 7 #define __PCI_PWRCTL_H__ 8 9 #include <linux/notifier.h> 10 #include <linux/workqueue.h> 11 12 struct device; 13 struct device_link; 14 15 /* 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. 19 * 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 24 * the PCI subsystem. 25 * 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). 29 */ 30 31 /** 32 * struct pci_pwrctl - PCI device power control context. 33 * @dev: Address of the power controlling device. 34 * 35 * An object of this type must be allocated by the PCI power control device and 36 * passed to the pwrctl subsystem to trigger a bus rescan and setup a device 37 * link with the device once it's up. 38 */ 39 struct pci_pwrctl { 40 struct device *dev; 41 42 /* Private: don't use. */ 43 struct notifier_block nb; 44 struct device_link *link; 45 struct work_struct work; 46 }; 47 48 void pci_pwrctl_init(struct pci_pwrctl *pwrctl, struct device *dev); 49 int pci_pwrctl_device_set_ready(struct pci_pwrctl *pwrctl); 50 void pci_pwrctl_device_unset_ready(struct pci_pwrctl *pwrctl); 51 int devm_pci_pwrctl_device_set_ready(struct device *dev, 52 struct pci_pwrctl *pwrctl); 53 54 #endif /* __PCI_PWRCTL_H__ */ 55