mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
57151b502c
-----BEGIN PGP SIGNATURE----- iQJIBAABCgAyFiEEgMe7l+5h9hnxdsnuWYigwDrT+vwFAmCRp48UHGJoZWxnYWFz QGdvb2dsZS5jb20ACgkQWYigwDrT+vwsVRAAsIYueNKzZczpkeQwHigYzf4HLdKm yyT2c/Zlj9REAUOe7ApkowVAJWiMGDJP0J361KIluAGvAxnkMP1V6WlVdByorYd0 CrXc/UhD//cs+3QDo4SmJRHyL8q5QQTDa8Z/8seVJUYTR/t5OhSpMOuEJPhpeQ1s nqUk0yWNJRoN6wn6T/7KqgYEvPhARXo9epuWy5MNPZ5f8E7SRi/QG/6hP8/YOLpK A+8beIOX5LAvUJaXxEovwv5UQnSUkeZTGDyRietQYE6xXNeHPKCvZ7vDjjSE7NOW mIodD6JcG3n/riYV3sMA5PKDZgsPI3P/qJU6Y6vWBBYOaO/kQX/c7CZ+M2bcZay4 mh1dW0vOqoTy/pAVwQB2aq08Rrg2SAskpNdeyzduXllmuTyuwCMPXzG4RKmbQ8I1 qMFb8qOyNulRAWcTKgSMKByEQYASQsFA5yShtaba6h0+vqrseuP6hchBKKOEan8F 9THTI3ZflKwRvGjkI0MDbp0z0+wPYmNhrcZDpAJ3bEltw58E8TL/9aBtuhajmo8+ wJ64mZclFuMmSyhsfkAXOvjeKXMlEBaw7vinZGbcACmv4ZGI0MV7r4vVYQbQltcy myzB6xJxcWB8N07UpKpUbsGMb9JjTUPlaT36eZNvUZQDntrE1ljt8RSq3nphDrcD KmBRU8ru74I2RE0= =WvTD -----END PGP SIGNATURE----- Merge tag 'pci-v5.13-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci Pull pci updates from Bjorn Helgaas: "Enumeration: - Release OF node when pci_scan_device() fails (Dmitry Baryshkov) - Add pci_disable_parity() (Bjorn Helgaas) - Disable Mellanox Tavor parity reporting (Heiner Kallweit) - Disable N2100 r8169 parity reporting (Heiner Kallweit) - Fix RCiEP device to RCEC association (Qiuxu Zhuo) - Convert sysfs "config", "rom", "reset", "label", "index", "acpi_index" to static attributes to help fix races in device enumeration (Krzysztof Wilczyński) - Convert sysfs "vpd" to static attribute (Heiner Kallweit, Krzysztof Wilczyński) - Use sysfs_emit() in "show" functions (Krzysztof Wilczyński) - Remove unused alloc_pci_root_info() return value (Krzysztof Wilczyński) PCI device hotplug: - Fix acpiphp reference count leak (Feilong Lin) Power management: - Fix acpi_pci_set_power_state() debug message (Rafael J. Wysocki) - Fix runtime PM imbalance (Dinghao Liu) Virtualization: - Increase delay after FLR to work around Intel DC P4510 NVMe erratum (Raphael Norwitz) MSI: - Convert rcar, tegra, xilinx to MSI domains (Marc Zyngier) - For rcar, xilinx, use controller address as MSI doorbell (Marc Zyngier) - Remove unused hv msi_controller struct (Marc Zyngier) - Remove unused PCI core msi_controller support (Marc Zyngier) - Remove struct msi_controller altogether (Marc Zyngier) - Remove unused default_teardown_msi_irqs() (Marc Zyngier) - Let host bridges declare their reliance on MSI domains (Marc Zyngier) - Make pci_host_common_probe() declare its reliance on MSI domains (Marc Zyngier) - Advertise mediatek lack of built-in MSI handling (Thomas Gleixner) - Document ways of ending up with NO_MSI (Marc Zyngier) - Refactor HT advertising of NO_MSI flag (Marc Zyngier) VPD: - Remove obsolete Broadcom NIC VPD length-limiting quirk (Heiner Kallweit) - Remove sysfs VPD size checking dead code (Heiner Kallweit) - Convert VPF sysfs file to static attribute (Heiner Kallweit) - Remove unnecessary pci_set_vpd_size() (Heiner Kallweit) - Tone down "missing VPD" message (Heiner Kallweit) Endpoint framework: - Fix NULL pointer dereference when epc_features not implemented (Shradha Todi) - Add missing destroy_workqueue() in endpoint test (Yang Yingliang) Amazon Annapurna Labs PCIe controller driver: - Fix compile testing without CONFIG_PCI_ECAM (Arnd Bergmann) - Fix "no symbols" warnings when compile testing with CONFIG_TRIM_UNUSED_KSYMS (Arnd Bergmann) APM X-Gene PCIe controller driver: - Fix cfg resource mapping regression (Dejin Zheng) Broadcom iProc PCIe controller driver: - Return zero for success of iproc_msi_irq_domain_alloc() (Pali Rohár) Broadcom STB PCIe controller driver: - Add reset_control_rearm() stub for !CONFIG_RESET_CONTROLLER (Jim Quinlan) - Fix use of BCM7216 reset controller (Jim Quinlan) - Use reset/rearm for Broadcom STB pulse reset instead of deassert/assert (Jim Quinlan) - Fix brcm_pcie_probe() error return for unsupported revision (Wei Yongjun) Cavium ThunderX PCIe controller driver: - Fix compile testing (Arnd Bergmann) - Fix "no symbols" warnings when compile testing with CONFIG_TRIM_UNUSED_KSYMS (Arnd Bergmann) Freescale Layerscape PCIe controller driver: - Fix ls_pcie_ep_probe() syntax error (comma for semicolon) (Krzysztof Wilczyński) - Remove layerscape-gen4 dependencies on OF and ARM64, add dependency on ARCH_LAYERSCAPE (Geert Uytterhoeven) HiSilicon HIP PCIe controller driver: - Remove obsolete HiSilicon PCIe DT description (Dongdong Liu) Intel Gateway PCIe controller driver: - Remove unused pcie_app_rd() (Jiapeng Chong) Intel VMD host bridge driver: - Program IRTE with Requester ID of VMD endpoint, not child device (Jon Derrick) - Disable VMD MSI-X remapping when possible so children can use more MSI-X vectors (Jon Derrick) MediaTek PCIe controller driver: - Configure FC and FTS for functions other than 0 (Ryder Lee) - Add YAML schema for MediaTek (Jianjun Wang) - Export pci_pio_to_address() for module use (Jianjun Wang) - Add MediaTek MT8192 PCIe controller driver (Jianjun Wang) - Add MediaTek MT8192 INTx support (Jianjun Wang) - Add MediaTek MT8192 MSI support (Jianjun Wang) - Add MediaTek MT8192 system power management support (Jianjun Wang) - Add missing MODULE_DEVICE_TABLE (Qiheng Lin) Microchip PolarFlare PCIe controller driver: - Make several symbols static (Wei Yongjun) NVIDIA Tegra PCIe controller driver: - Add MCFG quirks for Tegra194 ECAM errata (Vidya Sagar) - Make several symbols const (Rikard Falkeborn) - Fix Kconfig host/endpoint typo (Wesley Sheng) SiFive FU740 PCIe controller driver: - Add pcie_aux clock to prci driver (Greentime Hu) - Use reset-simple in prci driver for PCIe (Greentime Hu) - Add SiFive FU740 PCIe host controller driver and DT binding (Paul Walmsley, Greentime Hu) Synopsys DesignWare PCIe controller driver: - Move MSI Receiver init to dw_pcie_host_init() so it is re-initialized along with the RC in resume (Jisheng Zhang) - Move iATU detection earlier to fix regression (Hou Zhiqiang) TI J721E PCIe driver: - Add DT binding and TI j721e support for refclk to PCIe connector (Kishon Vijay Abraham I) - Add host mode and endpoint mode DT bindings for TI AM64 SoC (Kishon Vijay Abraham I) TI Keystone PCIe controller driver: - Use generic config accessors for TI AM65x (K3) to fix regression (Kishon Vijay Abraham I) Xilinx NWL PCIe controller driver: - Add support for coherent PCIe DMA traffic using CCI (Bharat Kumar Gogada) - Add optional "dma-coherent" DT property (Bharat Kumar Gogada) Miscellaneous: - Fix kernel-doc warnings (Krzysztof Wilczyński) - Remove unused MicroGate SyncLink device IDs (Jiri Slaby) - Remove redundant dev_err() for devm_ioremap_resource() failure (Chen Hui) - Remove redundant initialization (Colin Ian King) - Drop redundant dev_err() for platform_get_irq() errors (Krzysztof Wilczyński)" * tag 'pci-v5.13-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (98 commits) riscv: dts: Add PCIe support for the SiFive FU740-C000 SoC PCI: fu740: Add SiFive FU740 PCIe host controller driver dt-bindings: PCI: Add SiFive FU740 PCIe host controller MAINTAINERS: Add maintainers for SiFive FU740 PCIe driver clk: sifive: Use reset-simple in prci driver for PCIe driver clk: sifive: Add pcie_aux clock in prci driver for PCIe driver PCI: brcmstb: Use reset/rearm instead of deassert/assert ata: ahci_brcm: Fix use of BCM7216 reset controller reset: add missing empty function reset_control_rearm() PCI: Allow VPD access for QLogic ISP2722 PCI/VPD: Add helper pci_get_func0_dev() PCI/VPD: Remove pci_vpd_find_tag() SRDT handling PCI/VPD: Remove pci_vpd_find_tag() 'offset' argument PCI/VPD: Change pci_vpd_init() return type to void PCI/VPD: Make missing VPD message less alarming PCI/VPD: Remove pci_set_vpd_size() x86/PCI: Remove unused alloc_pci_root_info() return value MAINTAINERS: Add Jianjun Wang as MediaTek PCI co-maintainer PCI: mediatek-gen3: Add system PM support PCI: mediatek-gen3: Add MSI support ...
884 lines
30 KiB
C
884 lines
30 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _LINUX_RESET_H_
|
|
#define _LINUX_RESET_H_
|
|
|
|
#include <linux/err.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/types.h>
|
|
|
|
struct device;
|
|
struct device_node;
|
|
struct reset_control;
|
|
|
|
/**
|
|
* struct reset_control_bulk_data - Data used for bulk reset control operations.
|
|
*
|
|
* @id: reset control consumer ID
|
|
* @rstc: struct reset_control * to store the associated reset control
|
|
*
|
|
* The reset APIs provide a series of reset_control_bulk_*() API calls as
|
|
* a convenience to consumers which require multiple reset controls.
|
|
* This structure is used to manage data for these calls.
|
|
*/
|
|
struct reset_control_bulk_data {
|
|
const char *id;
|
|
struct reset_control *rstc;
|
|
};
|
|
|
|
#ifdef CONFIG_RESET_CONTROLLER
|
|
|
|
int reset_control_reset(struct reset_control *rstc);
|
|
int reset_control_rearm(struct reset_control *rstc);
|
|
int reset_control_assert(struct reset_control *rstc);
|
|
int reset_control_deassert(struct reset_control *rstc);
|
|
int reset_control_status(struct reset_control *rstc);
|
|
int reset_control_acquire(struct reset_control *rstc);
|
|
void reset_control_release(struct reset_control *rstc);
|
|
|
|
int reset_control_bulk_reset(int num_rstcs, struct reset_control_bulk_data *rstcs);
|
|
int reset_control_bulk_assert(int num_rstcs, struct reset_control_bulk_data *rstcs);
|
|
int reset_control_bulk_deassert(int num_rstcs, struct reset_control_bulk_data *rstcs);
|
|
int reset_control_bulk_acquire(int num_rstcs, struct reset_control_bulk_data *rstcs);
|
|
void reset_control_bulk_release(int num_rstcs, struct reset_control_bulk_data *rstcs);
|
|
|
|
struct reset_control *__of_reset_control_get(struct device_node *node,
|
|
const char *id, int index, bool shared,
|
|
bool optional, bool acquired);
|
|
struct reset_control *__reset_control_get(struct device *dev, const char *id,
|
|
int index, bool shared,
|
|
bool optional, bool acquired);
|
|
void reset_control_put(struct reset_control *rstc);
|
|
int __reset_control_bulk_get(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs,
|
|
bool shared, bool optional, bool acquired);
|
|
void reset_control_bulk_put(int num_rstcs, struct reset_control_bulk_data *rstcs);
|
|
|
|
int __device_reset(struct device *dev, bool optional);
|
|
struct reset_control *__devm_reset_control_get(struct device *dev,
|
|
const char *id, int index, bool shared,
|
|
bool optional, bool acquired);
|
|
int __devm_reset_control_bulk_get(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs,
|
|
bool shared, bool optional, bool acquired);
|
|
|
|
struct reset_control *devm_reset_control_array_get(struct device *dev,
|
|
bool shared, bool optional);
|
|
struct reset_control *of_reset_control_array_get(struct device_node *np,
|
|
bool shared, bool optional,
|
|
bool acquired);
|
|
|
|
int reset_control_get_count(struct device *dev);
|
|
|
|
#else
|
|
|
|
static inline int reset_control_reset(struct reset_control *rstc)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int reset_control_rearm(struct reset_control *rstc)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int reset_control_assert(struct reset_control *rstc)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int reset_control_deassert(struct reset_control *rstc)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int reset_control_status(struct reset_control *rstc)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int reset_control_acquire(struct reset_control *rstc)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void reset_control_release(struct reset_control *rstc)
|
|
{
|
|
}
|
|
|
|
static inline void reset_control_put(struct reset_control *rstc)
|
|
{
|
|
}
|
|
|
|
static inline int __device_reset(struct device *dev, bool optional)
|
|
{
|
|
return optional ? 0 : -ENOTSUPP;
|
|
}
|
|
|
|
static inline struct reset_control *__of_reset_control_get(
|
|
struct device_node *node,
|
|
const char *id, int index, bool shared,
|
|
bool optional, bool acquired)
|
|
{
|
|
return optional ? NULL : ERR_PTR(-ENOTSUPP);
|
|
}
|
|
|
|
static inline struct reset_control *__reset_control_get(
|
|
struct device *dev, const char *id,
|
|
int index, bool shared, bool optional,
|
|
bool acquired)
|
|
{
|
|
return optional ? NULL : ERR_PTR(-ENOTSUPP);
|
|
}
|
|
|
|
static inline int
|
|
reset_control_bulk_reset(int num_rstcs, struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int
|
|
reset_control_bulk_assert(int num_rstcs, struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int
|
|
reset_control_bulk_deassert(int num_rstcs, struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int
|
|
reset_control_bulk_acquire(int num_rstcs, struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void
|
|
reset_control_bulk_release(int num_rstcs, struct reset_control_bulk_data *rstcs)
|
|
{
|
|
}
|
|
|
|
static inline int
|
|
__reset_control_bulk_get(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs,
|
|
bool shared, bool optional, bool acquired)
|
|
{
|
|
return optional ? 0 : -EOPNOTSUPP;
|
|
}
|
|
|
|
static inline void
|
|
reset_control_bulk_put(int num_rstcs, struct reset_control_bulk_data *rstcs)
|
|
{
|
|
}
|
|
|
|
static inline struct reset_control *__devm_reset_control_get(
|
|
struct device *dev, const char *id,
|
|
int index, bool shared, bool optional,
|
|
bool acquired)
|
|
{
|
|
return optional ? NULL : ERR_PTR(-ENOTSUPP);
|
|
}
|
|
|
|
static inline int
|
|
__devm_reset_control_bulk_get(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs,
|
|
bool shared, bool optional, bool acquired)
|
|
{
|
|
return optional ? 0 : -EOPNOTSUPP;
|
|
}
|
|
|
|
static inline struct reset_control *
|
|
devm_reset_control_array_get(struct device *dev, bool shared, bool optional)
|
|
{
|
|
return optional ? NULL : ERR_PTR(-ENOTSUPP);
|
|
}
|
|
|
|
static inline struct reset_control *
|
|
of_reset_control_array_get(struct device_node *np, bool shared, bool optional,
|
|
bool acquired)
|
|
{
|
|
return optional ? NULL : ERR_PTR(-ENOTSUPP);
|
|
}
|
|
|
|
static inline int reset_control_get_count(struct device *dev)
|
|
{
|
|
return -ENOENT;
|
|
}
|
|
|
|
#endif /* CONFIG_RESET_CONTROLLER */
|
|
|
|
static inline int __must_check device_reset(struct device *dev)
|
|
{
|
|
return __device_reset(dev, false);
|
|
}
|
|
|
|
static inline int device_reset_optional(struct device *dev)
|
|
{
|
|
return __device_reset(dev, true);
|
|
}
|
|
|
|
/**
|
|
* reset_control_get_exclusive - Lookup and obtain an exclusive reference
|
|
* to a reset controller.
|
|
* @dev: device to be reset by the controller
|
|
* @id: reset line name
|
|
*
|
|
* Returns a struct reset_control or IS_ERR() condition containing errno.
|
|
* If this function is called more than once for the same reset_control it will
|
|
* return -EBUSY.
|
|
*
|
|
* See reset_control_get_shared() for details on shared references to
|
|
* reset-controls.
|
|
*
|
|
* Use of id names is optional.
|
|
*/
|
|
static inline struct reset_control *
|
|
__must_check reset_control_get_exclusive(struct device *dev, const char *id)
|
|
{
|
|
return __reset_control_get(dev, id, 0, false, false, true);
|
|
}
|
|
|
|
/**
|
|
* reset_control_bulk_get_exclusive - Lookup and obtain exclusive references to
|
|
* multiple reset controllers.
|
|
* @dev: device to be reset by the controller
|
|
* @num_rstcs: number of entries in rstcs array
|
|
* @rstcs: array of struct reset_control_bulk_data with reset line names set
|
|
*
|
|
* Fills the rstcs array with pointers to exclusive reset controls and
|
|
* returns 0, or an IS_ERR() condition containing errno.
|
|
*/
|
|
static inline int __must_check
|
|
reset_control_bulk_get_exclusive(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return __reset_control_bulk_get(dev, num_rstcs, rstcs, false, false, true);
|
|
}
|
|
|
|
/**
|
|
* reset_control_get_exclusive_released - Lookup and obtain a temoprarily
|
|
* exclusive reference to a reset
|
|
* controller.
|
|
* @dev: device to be reset by the controller
|
|
* @id: reset line name
|
|
*
|
|
* Returns a struct reset_control or IS_ERR() condition containing errno.
|
|
* reset-controls returned by this function must be acquired via
|
|
* reset_control_acquire() before they can be used and should be released
|
|
* via reset_control_release() afterwards.
|
|
*
|
|
* Use of id names is optional.
|
|
*/
|
|
static inline struct reset_control *
|
|
__must_check reset_control_get_exclusive_released(struct device *dev,
|
|
const char *id)
|
|
{
|
|
return __reset_control_get(dev, id, 0, false, false, false);
|
|
}
|
|
|
|
/**
|
|
* reset_control_bulk_get_exclusive_released - Lookup and obtain temporarily
|
|
* exclusive references to multiple reset
|
|
* controllers.
|
|
* @dev: device to be reset by the controller
|
|
* @num_rstcs: number of entries in rstcs array
|
|
* @rstcs: array of struct reset_control_bulk_data with reset line names set
|
|
*
|
|
* Fills the rstcs array with pointers to exclusive reset controls and
|
|
* returns 0, or an IS_ERR() condition containing errno.
|
|
* reset-controls returned by this function must be acquired via
|
|
* reset_control_bulk_acquire() before they can be used and should be released
|
|
* via reset_control_bulk_release() afterwards.
|
|
*/
|
|
static inline int __must_check
|
|
reset_control_bulk_get_exclusive_released(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return __reset_control_bulk_get(dev, num_rstcs, rstcs, false, false, false);
|
|
}
|
|
|
|
/**
|
|
* reset_control_bulk_get_optional_exclusive_released - Lookup and obtain optional
|
|
* temporarily exclusive references to multiple
|
|
* reset controllers.
|
|
* @dev: device to be reset by the controller
|
|
* @num_rstcs: number of entries in rstcs array
|
|
* @rstcs: array of struct reset_control_bulk_data with reset line names set
|
|
*
|
|
* Optional variant of reset_control_bulk_get_exclusive_released(). If the
|
|
* requested reset is not specified in the device tree, this function returns 0
|
|
* instead of an error and missing rtsc is set to NULL.
|
|
*
|
|
* See reset_control_bulk_get_exclusive_released() for more information.
|
|
*/
|
|
static inline int __must_check
|
|
reset_control_bulk_get_optional_exclusive_released(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return __reset_control_bulk_get(dev, num_rstcs, rstcs, false, true, false);
|
|
}
|
|
|
|
/**
|
|
* reset_control_get_shared - Lookup and obtain a shared reference to a
|
|
* reset controller.
|
|
* @dev: device to be reset by the controller
|
|
* @id: reset line name
|
|
*
|
|
* Returns a struct reset_control or IS_ERR() condition containing errno.
|
|
* This function is intended for use with reset-controls which are shared
|
|
* between hardware blocks.
|
|
*
|
|
* When a reset-control is shared, the behavior of reset_control_assert /
|
|
* deassert is changed, the reset-core will keep track of a deassert_count
|
|
* and only (re-)assert the reset after reset_control_assert has been called
|
|
* as many times as reset_control_deassert was called. Also see the remark
|
|
* about shared reset-controls in the reset_control_assert docs.
|
|
*
|
|
* Calling reset_control_assert without first calling reset_control_deassert
|
|
* is not allowed on a shared reset control. Calling reset_control_reset is
|
|
* also not allowed on a shared reset control.
|
|
*
|
|
* Use of id names is optional.
|
|
*/
|
|
static inline struct reset_control *reset_control_get_shared(
|
|
struct device *dev, const char *id)
|
|
{
|
|
return __reset_control_get(dev, id, 0, true, false, false);
|
|
}
|
|
|
|
/**
|
|
* reset_control_bulk_get_shared - Lookup and obtain shared references to
|
|
* multiple reset controllers.
|
|
* @dev: device to be reset by the controller
|
|
* @num_rstcs: number of entries in rstcs array
|
|
* @rstcs: array of struct reset_control_bulk_data with reset line names set
|
|
*
|
|
* Fills the rstcs array with pointers to shared reset controls and
|
|
* returns 0, or an IS_ERR() condition containing errno.
|
|
*/
|
|
static inline int __must_check
|
|
reset_control_bulk_get_shared(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return __reset_control_bulk_get(dev, num_rstcs, rstcs, true, false, false);
|
|
}
|
|
|
|
/**
|
|
* reset_control_get_optional_exclusive - optional reset_control_get_exclusive()
|
|
* @dev: device to be reset by the controller
|
|
* @id: reset line name
|
|
*
|
|
* Optional variant of reset_control_get_exclusive(). If the requested reset
|
|
* is not specified in the device tree, this function returns NULL instead of
|
|
* an error.
|
|
*
|
|
* See reset_control_get_exclusive() for more information.
|
|
*/
|
|
static inline struct reset_control *reset_control_get_optional_exclusive(
|
|
struct device *dev, const char *id)
|
|
{
|
|
return __reset_control_get(dev, id, 0, false, true, true);
|
|
}
|
|
|
|
/**
|
|
* reset_control_bulk_get_optional_exclusive - optional
|
|
* reset_control_bulk_get_exclusive()
|
|
* @dev: device to be reset by the controller
|
|
* @num_rstcs: number of entries in rstcs array
|
|
* @rstcs: array of struct reset_control_bulk_data with reset line names set
|
|
*
|
|
* Optional variant of reset_control_bulk_get_exclusive(). If any of the
|
|
* requested resets are not specified in the device tree, this function sets
|
|
* them to NULL instead of returning an error.
|
|
*
|
|
* See reset_control_bulk_get_exclusive() for more information.
|
|
*/
|
|
static inline int __must_check
|
|
reset_control_bulk_get_optional_exclusive(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return __reset_control_bulk_get(dev, num_rstcs, rstcs, false, true, true);
|
|
}
|
|
|
|
/**
|
|
* reset_control_get_optional_shared - optional reset_control_get_shared()
|
|
* @dev: device to be reset by the controller
|
|
* @id: reset line name
|
|
*
|
|
* Optional variant of reset_control_get_shared(). If the requested reset
|
|
* is not specified in the device tree, this function returns NULL instead of
|
|
* an error.
|
|
*
|
|
* See reset_control_get_shared() for more information.
|
|
*/
|
|
static inline struct reset_control *reset_control_get_optional_shared(
|
|
struct device *dev, const char *id)
|
|
{
|
|
return __reset_control_get(dev, id, 0, true, true, false);
|
|
}
|
|
|
|
/**
|
|
* reset_control_bulk_get_optional_shared - optional
|
|
* reset_control_bulk_get_shared()
|
|
* @dev: device to be reset by the controller
|
|
* @num_rstcs: number of entries in rstcs array
|
|
* @rstcs: array of struct reset_control_bulk_data with reset line names set
|
|
*
|
|
* Optional variant of reset_control_bulk_get_shared(). If the requested resets
|
|
* are not specified in the device tree, this function sets them to NULL
|
|
* instead of returning an error.
|
|
*
|
|
* See reset_control_bulk_get_shared() for more information.
|
|
*/
|
|
static inline int __must_check
|
|
reset_control_bulk_get_optional_shared(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return __reset_control_bulk_get(dev, num_rstcs, rstcs, true, true, false);
|
|
}
|
|
|
|
/**
|
|
* of_reset_control_get_exclusive - Lookup and obtain an exclusive reference
|
|
* to a reset controller.
|
|
* @node: device to be reset by the controller
|
|
* @id: reset line name
|
|
*
|
|
* Returns a struct reset_control or IS_ERR() condition containing errno.
|
|
*
|
|
* Use of id names is optional.
|
|
*/
|
|
static inline struct reset_control *of_reset_control_get_exclusive(
|
|
struct device_node *node, const char *id)
|
|
{
|
|
return __of_reset_control_get(node, id, 0, false, false, true);
|
|
}
|
|
|
|
/**
|
|
* of_reset_control_get_shared - Lookup and obtain a shared reference
|
|
* to a reset controller.
|
|
* @node: device to be reset by the controller
|
|
* @id: reset line name
|
|
*
|
|
* When a reset-control is shared, the behavior of reset_control_assert /
|
|
* deassert is changed, the reset-core will keep track of a deassert_count
|
|
* and only (re-)assert the reset after reset_control_assert has been called
|
|
* as many times as reset_control_deassert was called. Also see the remark
|
|
* about shared reset-controls in the reset_control_assert docs.
|
|
*
|
|
* Calling reset_control_assert without first calling reset_control_deassert
|
|
* is not allowed on a shared reset control. Calling reset_control_reset is
|
|
* also not allowed on a shared reset control.
|
|
* Returns a struct reset_control or IS_ERR() condition containing errno.
|
|
*
|
|
* Use of id names is optional.
|
|
*/
|
|
static inline struct reset_control *of_reset_control_get_shared(
|
|
struct device_node *node, const char *id)
|
|
{
|
|
return __of_reset_control_get(node, id, 0, true, false, false);
|
|
}
|
|
|
|
/**
|
|
* of_reset_control_get_exclusive_by_index - Lookup and obtain an exclusive
|
|
* reference to a reset controller
|
|
* by index.
|
|
* @node: device to be reset by the controller
|
|
* @index: index of the reset controller
|
|
*
|
|
* This is to be used to perform a list of resets for a device or power domain
|
|
* in whatever order. Returns a struct reset_control or IS_ERR() condition
|
|
* containing errno.
|
|
*/
|
|
static inline struct reset_control *of_reset_control_get_exclusive_by_index(
|
|
struct device_node *node, int index)
|
|
{
|
|
return __of_reset_control_get(node, NULL, index, false, false, true);
|
|
}
|
|
|
|
/**
|
|
* of_reset_control_get_shared_by_index - Lookup and obtain a shared
|
|
* reference to a reset controller
|
|
* by index.
|
|
* @node: device to be reset by the controller
|
|
* @index: index of the reset controller
|
|
*
|
|
* When a reset-control is shared, the behavior of reset_control_assert /
|
|
* deassert is changed, the reset-core will keep track of a deassert_count
|
|
* and only (re-)assert the reset after reset_control_assert has been called
|
|
* as many times as reset_control_deassert was called. Also see the remark
|
|
* about shared reset-controls in the reset_control_assert docs.
|
|
*
|
|
* Calling reset_control_assert without first calling reset_control_deassert
|
|
* is not allowed on a shared reset control. Calling reset_control_reset is
|
|
* also not allowed on a shared reset control.
|
|
* Returns a struct reset_control or IS_ERR() condition containing errno.
|
|
*
|
|
* This is to be used to perform a list of resets for a device or power domain
|
|
* in whatever order. Returns a struct reset_control or IS_ERR() condition
|
|
* containing errno.
|
|
*/
|
|
static inline struct reset_control *of_reset_control_get_shared_by_index(
|
|
struct device_node *node, int index)
|
|
{
|
|
return __of_reset_control_get(node, NULL, index, true, false, false);
|
|
}
|
|
|
|
/**
|
|
* devm_reset_control_get_exclusive - resource managed
|
|
* reset_control_get_exclusive()
|
|
* @dev: device to be reset by the controller
|
|
* @id: reset line name
|
|
*
|
|
* Managed reset_control_get_exclusive(). For reset controllers returned
|
|
* from this function, reset_control_put() is called automatically on driver
|
|
* detach.
|
|
*
|
|
* See reset_control_get_exclusive() for more information.
|
|
*/
|
|
static inline struct reset_control *
|
|
__must_check devm_reset_control_get_exclusive(struct device *dev,
|
|
const char *id)
|
|
{
|
|
return __devm_reset_control_get(dev, id, 0, false, false, true);
|
|
}
|
|
|
|
/**
|
|
* devm_reset_control_bulk_get_exclusive - resource managed
|
|
* reset_control_bulk_get_exclusive()
|
|
* @dev: device to be reset by the controller
|
|
* @num_rstcs: number of entries in rstcs array
|
|
* @rstcs: array of struct reset_control_bulk_data with reset line names set
|
|
*
|
|
* Managed reset_control_bulk_get_exclusive(). For reset controllers returned
|
|
* from this function, reset_control_put() is called automatically on driver
|
|
* detach.
|
|
*
|
|
* See reset_control_bulk_get_exclusive() for more information.
|
|
*/
|
|
static inline int __must_check
|
|
devm_reset_control_bulk_get_exclusive(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return __devm_reset_control_bulk_get(dev, num_rstcs, rstcs, false, false, true);
|
|
}
|
|
|
|
/**
|
|
* devm_reset_control_get_exclusive_released - resource managed
|
|
* reset_control_get_exclusive_released()
|
|
* @dev: device to be reset by the controller
|
|
* @id: reset line name
|
|
*
|
|
* Managed reset_control_get_exclusive_released(). For reset controllers
|
|
* returned from this function, reset_control_put() is called automatically on
|
|
* driver detach.
|
|
*
|
|
* See reset_control_get_exclusive_released() for more information.
|
|
*/
|
|
static inline struct reset_control *
|
|
__must_check devm_reset_control_get_exclusive_released(struct device *dev,
|
|
const char *id)
|
|
{
|
|
return __devm_reset_control_get(dev, id, 0, false, false, false);
|
|
}
|
|
|
|
/**
|
|
* devm_reset_control_bulk_get_exclusive_released - resource managed
|
|
* reset_control_bulk_get_exclusive_released()
|
|
* @dev: device to be reset by the controller
|
|
* @num_rstcs: number of entries in rstcs array
|
|
* @rstcs: array of struct reset_control_bulk_data with reset line names set
|
|
*
|
|
* Managed reset_control_bulk_get_exclusive_released(). For reset controllers
|
|
* returned from this function, reset_control_put() is called automatically on
|
|
* driver detach.
|
|
*
|
|
* See reset_control_bulk_get_exclusive_released() for more information.
|
|
*/
|
|
static inline int __must_check
|
|
devm_reset_control_bulk_get_exclusive_released(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return __devm_reset_control_bulk_get(dev, num_rstcs, rstcs, false, false, false);
|
|
}
|
|
|
|
/**
|
|
* devm_reset_control_get_optional_exclusive_released - resource managed
|
|
* reset_control_get_optional_exclusive_released()
|
|
* @dev: device to be reset by the controller
|
|
* @id: reset line name
|
|
*
|
|
* Managed-and-optional variant of reset_control_get_exclusive_released(). For
|
|
* reset controllers returned from this function, reset_control_put() is called
|
|
* automatically on driver detach.
|
|
*
|
|
* See reset_control_get_exclusive_released() for more information.
|
|
*/
|
|
static inline struct reset_control *
|
|
__must_check devm_reset_control_get_optional_exclusive_released(struct device *dev,
|
|
const char *id)
|
|
{
|
|
return __devm_reset_control_get(dev, id, 0, false, true, false);
|
|
}
|
|
|
|
/**
|
|
* devm_reset_control_bulk_get_optional_exclusive_released - resource managed
|
|
* reset_control_bulk_optional_get_exclusive_released()
|
|
* @dev: device to be reset by the controller
|
|
* @num_rstcs: number of entries in rstcs array
|
|
* @rstcs: array of struct reset_control_bulk_data with reset line names set
|
|
*
|
|
* Managed reset_control_bulk_optional_get_exclusive_released(). For reset
|
|
* controllers returned from this function, reset_control_put() is called
|
|
* automatically on driver detach.
|
|
*
|
|
* See reset_control_bulk_optional_get_exclusive_released() for more information.
|
|
*/
|
|
static inline int __must_check
|
|
devm_reset_control_bulk_get_optional_exclusive_released(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return __devm_reset_control_bulk_get(dev, num_rstcs, rstcs, false, true, false);
|
|
}
|
|
|
|
/**
|
|
* devm_reset_control_get_shared - resource managed reset_control_get_shared()
|
|
* @dev: device to be reset by the controller
|
|
* @id: reset line name
|
|
*
|
|
* Managed reset_control_get_shared(). For reset controllers returned from
|
|
* this function, reset_control_put() is called automatically on driver detach.
|
|
* See reset_control_get_shared() for more information.
|
|
*/
|
|
static inline struct reset_control *devm_reset_control_get_shared(
|
|
struct device *dev, const char *id)
|
|
{
|
|
return __devm_reset_control_get(dev, id, 0, true, false, false);
|
|
}
|
|
|
|
/**
|
|
* devm_reset_control_bulk_get_shared - resource managed
|
|
* reset_control_bulk_get_shared()
|
|
* @dev: device to be reset by the controller
|
|
* @num_rstcs: number of entries in rstcs array
|
|
* @rstcs: array of struct reset_control_bulk_data with reset line names set
|
|
*
|
|
* Managed reset_control_bulk_get_shared(). For reset controllers returned
|
|
* from this function, reset_control_put() is called automatically on driver
|
|
* detach.
|
|
*
|
|
* See reset_control_bulk_get_shared() for more information.
|
|
*/
|
|
static inline int __must_check
|
|
devm_reset_control_bulk_get_shared(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return __devm_reset_control_bulk_get(dev, num_rstcs, rstcs, true, false, false);
|
|
}
|
|
|
|
/**
|
|
* devm_reset_control_get_optional_exclusive - resource managed
|
|
* reset_control_get_optional_exclusive()
|
|
* @dev: device to be reset by the controller
|
|
* @id: reset line name
|
|
*
|
|
* Managed reset_control_get_optional_exclusive(). For reset controllers
|
|
* returned from this function, reset_control_put() is called automatically on
|
|
* driver detach.
|
|
*
|
|
* See reset_control_get_optional_exclusive() for more information.
|
|
*/
|
|
static inline struct reset_control *devm_reset_control_get_optional_exclusive(
|
|
struct device *dev, const char *id)
|
|
{
|
|
return __devm_reset_control_get(dev, id, 0, false, true, true);
|
|
}
|
|
|
|
/**
|
|
* devm_reset_control_bulk_get_optional_exclusive - resource managed
|
|
* reset_control_bulk_get_optional_exclusive()
|
|
* @dev: device to be reset by the controller
|
|
* @num_rstcs: number of entries in rstcs array
|
|
* @rstcs: array of struct reset_control_bulk_data with reset line names set
|
|
*
|
|
* Managed reset_control_bulk_get_optional_exclusive(). For reset controllers
|
|
* returned from this function, reset_control_put() is called automatically on
|
|
* driver detach.
|
|
*
|
|
* See reset_control_bulk_get_optional_exclusive() for more information.
|
|
*/
|
|
static inline int __must_check
|
|
devm_reset_control_bulk_get_optional_exclusive(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return __devm_reset_control_bulk_get(dev, num_rstcs, rstcs, true, false, true);
|
|
}
|
|
|
|
/**
|
|
* devm_reset_control_get_optional_shared - resource managed
|
|
* reset_control_get_optional_shared()
|
|
* @dev: device to be reset by the controller
|
|
* @id: reset line name
|
|
*
|
|
* Managed reset_control_get_optional_shared(). For reset controllers returned
|
|
* from this function, reset_control_put() is called automatically on driver
|
|
* detach.
|
|
*
|
|
* See reset_control_get_optional_shared() for more information.
|
|
*/
|
|
static inline struct reset_control *devm_reset_control_get_optional_shared(
|
|
struct device *dev, const char *id)
|
|
{
|
|
return __devm_reset_control_get(dev, id, 0, true, true, false);
|
|
}
|
|
|
|
/**
|
|
* devm_reset_control_bulk_get_optional_shared - resource managed
|
|
* reset_control_bulk_get_optional_shared()
|
|
* @dev: device to be reset by the controller
|
|
* @num_rstcs: number of entries in rstcs array
|
|
* @rstcs: array of struct reset_control_bulk_data with reset line names set
|
|
*
|
|
* Managed reset_control_bulk_get_optional_shared(). For reset controllers
|
|
* returned from this function, reset_control_put() is called automatically on
|
|
* driver detach.
|
|
*
|
|
* See reset_control_bulk_get_optional_shared() for more information.
|
|
*/
|
|
static inline int __must_check
|
|
devm_reset_control_bulk_get_optional_shared(struct device *dev, int num_rstcs,
|
|
struct reset_control_bulk_data *rstcs)
|
|
{
|
|
return __devm_reset_control_bulk_get(dev, num_rstcs, rstcs, true, true, false);
|
|
}
|
|
|
|
/**
|
|
* devm_reset_control_get_exclusive_by_index - resource managed
|
|
* reset_control_get_exclusive()
|
|
* @dev: device to be reset by the controller
|
|
* @index: index of the reset controller
|
|
*
|
|
* Managed reset_control_get_exclusive(). For reset controllers returned from
|
|
* this function, reset_control_put() is called automatically on driver
|
|
* detach.
|
|
*
|
|
* See reset_control_get_exclusive() for more information.
|
|
*/
|
|
static inline struct reset_control *
|
|
devm_reset_control_get_exclusive_by_index(struct device *dev, int index)
|
|
{
|
|
return __devm_reset_control_get(dev, NULL, index, false, false, true);
|
|
}
|
|
|
|
/**
|
|
* devm_reset_control_get_shared_by_index - resource managed
|
|
* reset_control_get_shared
|
|
* @dev: device to be reset by the controller
|
|
* @index: index of the reset controller
|
|
*
|
|
* Managed reset_control_get_shared(). For reset controllers returned from
|
|
* this function, reset_control_put() is called automatically on driver detach.
|
|
* See reset_control_get_shared() for more information.
|
|
*/
|
|
static inline struct reset_control *
|
|
devm_reset_control_get_shared_by_index(struct device *dev, int index)
|
|
{
|
|
return __devm_reset_control_get(dev, NULL, index, true, false, false);
|
|
}
|
|
|
|
/*
|
|
* TEMPORARY calls to use during transition:
|
|
*
|
|
* of_reset_control_get() => of_reset_control_get_exclusive()
|
|
*
|
|
* These inline function calls will be removed once all consumers
|
|
* have been moved over to the new explicit API.
|
|
*/
|
|
static inline struct reset_control *of_reset_control_get(
|
|
struct device_node *node, const char *id)
|
|
{
|
|
return of_reset_control_get_exclusive(node, id);
|
|
}
|
|
|
|
static inline struct reset_control *of_reset_control_get_by_index(
|
|
struct device_node *node, int index)
|
|
{
|
|
return of_reset_control_get_exclusive_by_index(node, index);
|
|
}
|
|
|
|
static inline struct reset_control *devm_reset_control_get(
|
|
struct device *dev, const char *id)
|
|
{
|
|
return devm_reset_control_get_exclusive(dev, id);
|
|
}
|
|
|
|
static inline struct reset_control *devm_reset_control_get_optional(
|
|
struct device *dev, const char *id)
|
|
{
|
|
return devm_reset_control_get_optional_exclusive(dev, id);
|
|
|
|
}
|
|
|
|
static inline struct reset_control *devm_reset_control_get_by_index(
|
|
struct device *dev, int index)
|
|
{
|
|
return devm_reset_control_get_exclusive_by_index(dev, index);
|
|
}
|
|
|
|
/*
|
|
* APIs to manage a list of reset controllers
|
|
*/
|
|
static inline struct reset_control *
|
|
devm_reset_control_array_get_exclusive(struct device *dev)
|
|
{
|
|
return devm_reset_control_array_get(dev, false, false);
|
|
}
|
|
|
|
static inline struct reset_control *
|
|
devm_reset_control_array_get_shared(struct device *dev)
|
|
{
|
|
return devm_reset_control_array_get(dev, true, false);
|
|
}
|
|
|
|
static inline struct reset_control *
|
|
devm_reset_control_array_get_optional_exclusive(struct device *dev)
|
|
{
|
|
return devm_reset_control_array_get(dev, false, true);
|
|
}
|
|
|
|
static inline struct reset_control *
|
|
devm_reset_control_array_get_optional_shared(struct device *dev)
|
|
{
|
|
return devm_reset_control_array_get(dev, true, true);
|
|
}
|
|
|
|
static inline struct reset_control *
|
|
of_reset_control_array_get_exclusive(struct device_node *node)
|
|
{
|
|
return of_reset_control_array_get(node, false, false, true);
|
|
}
|
|
|
|
static inline struct reset_control *
|
|
of_reset_control_array_get_exclusive_released(struct device_node *node)
|
|
{
|
|
return of_reset_control_array_get(node, false, false, false);
|
|
}
|
|
|
|
static inline struct reset_control *
|
|
of_reset_control_array_get_shared(struct device_node *node)
|
|
{
|
|
return of_reset_control_array_get(node, true, false, true);
|
|
}
|
|
|
|
static inline struct reset_control *
|
|
of_reset_control_array_get_optional_exclusive(struct device_node *node)
|
|
{
|
|
return of_reset_control_array_get(node, false, true, true);
|
|
}
|
|
|
|
static inline struct reset_control *
|
|
of_reset_control_array_get_optional_shared(struct device_node *node)
|
|
{
|
|
return of_reset_control_array_get(node, true, true, true);
|
|
}
|
|
#endif
|