Files
Greg Kroah-Hartman 598cf27219 Linux 6.19.3
Link: https://lore.kernel.org/r/20260217200002.683975158@linuxfoundation.org
Tested-by: Florian Fainelli <florian.fainelli@broadcom.com>
Tested-by: Takeshi Ogasawara <takeshi.ogasawara@futuring-girl.com>
Tested-by: Peter Schneider <pschneider1968@googlemail.com>
Tested-by: Jon Hunter <jonathanh@nvidia.com>
Tested-by: Salvatore Bonaccorso <carnil@debian.org>
Tested-by: Brett A C Sheffield <bacs@librecast.net>
Tested-by: Mark Brown <broonie@kernel.org>
Tested-by: Luna Jernberg <droidbittin@gmail.com>
Tested-by: Ronald Warsow <rwarsow@gmx.de>
Tested-by: Justin M. Forbes <jforbes@fedoraproject.org>
Tested-by: Ron Economos <re@w6rz.net>
Tested-by: Miguel Ojeda <ojeda@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2026-02-19 16:33:27 +01:00

55 lines
1.7 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (C) 2024 Linaro Ltd.
*/
#ifndef __PCI_PWRCTRL_H__
#define __PCI_PWRCTRL_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_pwrctrl - 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 pwrctrl subsystem to trigger a bus rescan and setup a device
* link with the device once it's up.
*/
struct pci_pwrctrl {
struct device *dev;
/* private: internal use only */
struct notifier_block nb;
struct device_link *link;
struct work_struct work;
};
void pci_pwrctrl_init(struct pci_pwrctrl *pwrctrl, struct device *dev);
int pci_pwrctrl_device_set_ready(struct pci_pwrctrl *pwrctrl);
void pci_pwrctrl_device_unset_ready(struct pci_pwrctrl *pwrctrl);
int devm_pci_pwrctrl_device_set_ready(struct device *dev,
struct pci_pwrctrl *pwrctrl);
#endif /* __PCI_PWRCTRL_H__ */