162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _LINUX_RESET_H_ 362306a36Sopenharmony_ci#define _LINUX_RESET_H_ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/err.h> 662306a36Sopenharmony_ci#include <linux/errno.h> 762306a36Sopenharmony_ci#include <linux/types.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_cistruct device; 1062306a36Sopenharmony_cistruct device_node; 1162306a36Sopenharmony_cistruct reset_control; 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/** 1462306a36Sopenharmony_ci * struct reset_control_bulk_data - Data used for bulk reset control operations. 1562306a36Sopenharmony_ci * 1662306a36Sopenharmony_ci * @id: reset control consumer ID 1762306a36Sopenharmony_ci * @rstc: struct reset_control * to store the associated reset control 1862306a36Sopenharmony_ci * 1962306a36Sopenharmony_ci * The reset APIs provide a series of reset_control_bulk_*() API calls as 2062306a36Sopenharmony_ci * a convenience to consumers which require multiple reset controls. 2162306a36Sopenharmony_ci * This structure is used to manage data for these calls. 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_cistruct reset_control_bulk_data { 2462306a36Sopenharmony_ci const char *id; 2562306a36Sopenharmony_ci struct reset_control *rstc; 2662306a36Sopenharmony_ci}; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#ifdef CONFIG_RESET_CONTROLLER 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ciint reset_control_reset(struct reset_control *rstc); 3162306a36Sopenharmony_ciint reset_control_rearm(struct reset_control *rstc); 3262306a36Sopenharmony_ciint reset_control_assert(struct reset_control *rstc); 3362306a36Sopenharmony_ciint reset_control_deassert(struct reset_control *rstc); 3462306a36Sopenharmony_ciint reset_control_status(struct reset_control *rstc); 3562306a36Sopenharmony_ciint reset_control_acquire(struct reset_control *rstc); 3662306a36Sopenharmony_civoid reset_control_release(struct reset_control *rstc); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ciint reset_control_bulk_reset(int num_rstcs, struct reset_control_bulk_data *rstcs); 3962306a36Sopenharmony_ciint reset_control_bulk_assert(int num_rstcs, struct reset_control_bulk_data *rstcs); 4062306a36Sopenharmony_ciint reset_control_bulk_deassert(int num_rstcs, struct reset_control_bulk_data *rstcs); 4162306a36Sopenharmony_ciint reset_control_bulk_acquire(int num_rstcs, struct reset_control_bulk_data *rstcs); 4262306a36Sopenharmony_civoid reset_control_bulk_release(int num_rstcs, struct reset_control_bulk_data *rstcs); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistruct reset_control *__of_reset_control_get(struct device_node *node, 4562306a36Sopenharmony_ci const char *id, int index, bool shared, 4662306a36Sopenharmony_ci bool optional, bool acquired); 4762306a36Sopenharmony_cistruct reset_control *__reset_control_get(struct device *dev, const char *id, 4862306a36Sopenharmony_ci int index, bool shared, 4962306a36Sopenharmony_ci bool optional, bool acquired); 5062306a36Sopenharmony_civoid reset_control_put(struct reset_control *rstc); 5162306a36Sopenharmony_ciint __reset_control_bulk_get(struct device *dev, int num_rstcs, 5262306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs, 5362306a36Sopenharmony_ci bool shared, bool optional, bool acquired); 5462306a36Sopenharmony_civoid reset_control_bulk_put(int num_rstcs, struct reset_control_bulk_data *rstcs); 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ciint __device_reset(struct device *dev, bool optional); 5762306a36Sopenharmony_cistruct reset_control *__devm_reset_control_get(struct device *dev, 5862306a36Sopenharmony_ci const char *id, int index, bool shared, 5962306a36Sopenharmony_ci bool optional, bool acquired); 6062306a36Sopenharmony_ciint __devm_reset_control_bulk_get(struct device *dev, int num_rstcs, 6162306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs, 6262306a36Sopenharmony_ci bool shared, bool optional, bool acquired); 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistruct reset_control *devm_reset_control_array_get(struct device *dev, 6562306a36Sopenharmony_ci bool shared, bool optional); 6662306a36Sopenharmony_cistruct reset_control *of_reset_control_array_get(struct device_node *np, 6762306a36Sopenharmony_ci bool shared, bool optional, 6862306a36Sopenharmony_ci bool acquired); 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ciint reset_control_get_count(struct device *dev); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#else 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cistatic inline int reset_control_reset(struct reset_control *rstc) 7562306a36Sopenharmony_ci{ 7662306a36Sopenharmony_ci return 0; 7762306a36Sopenharmony_ci} 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistatic inline int reset_control_rearm(struct reset_control *rstc) 8062306a36Sopenharmony_ci{ 8162306a36Sopenharmony_ci return 0; 8262306a36Sopenharmony_ci} 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_cistatic inline int reset_control_assert(struct reset_control *rstc) 8562306a36Sopenharmony_ci{ 8662306a36Sopenharmony_ci return 0; 8762306a36Sopenharmony_ci} 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_cistatic inline int reset_control_deassert(struct reset_control *rstc) 9062306a36Sopenharmony_ci{ 9162306a36Sopenharmony_ci return 0; 9262306a36Sopenharmony_ci} 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistatic inline int reset_control_status(struct reset_control *rstc) 9562306a36Sopenharmony_ci{ 9662306a36Sopenharmony_ci return 0; 9762306a36Sopenharmony_ci} 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cistatic inline int reset_control_acquire(struct reset_control *rstc) 10062306a36Sopenharmony_ci{ 10162306a36Sopenharmony_ci return 0; 10262306a36Sopenharmony_ci} 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cistatic inline void reset_control_release(struct reset_control *rstc) 10562306a36Sopenharmony_ci{ 10662306a36Sopenharmony_ci} 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_cistatic inline void reset_control_put(struct reset_control *rstc) 10962306a36Sopenharmony_ci{ 11062306a36Sopenharmony_ci} 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_cistatic inline int __device_reset(struct device *dev, bool optional) 11362306a36Sopenharmony_ci{ 11462306a36Sopenharmony_ci return optional ? 0 : -ENOTSUPP; 11562306a36Sopenharmony_ci} 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_cistatic inline struct reset_control *__of_reset_control_get( 11862306a36Sopenharmony_ci struct device_node *node, 11962306a36Sopenharmony_ci const char *id, int index, bool shared, 12062306a36Sopenharmony_ci bool optional, bool acquired) 12162306a36Sopenharmony_ci{ 12262306a36Sopenharmony_ci return optional ? NULL : ERR_PTR(-ENOTSUPP); 12362306a36Sopenharmony_ci} 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_cistatic inline struct reset_control *__reset_control_get( 12662306a36Sopenharmony_ci struct device *dev, const char *id, 12762306a36Sopenharmony_ci int index, bool shared, bool optional, 12862306a36Sopenharmony_ci bool acquired) 12962306a36Sopenharmony_ci{ 13062306a36Sopenharmony_ci return optional ? NULL : ERR_PTR(-ENOTSUPP); 13162306a36Sopenharmony_ci} 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cistatic inline int 13462306a36Sopenharmony_cireset_control_bulk_reset(int num_rstcs, struct reset_control_bulk_data *rstcs) 13562306a36Sopenharmony_ci{ 13662306a36Sopenharmony_ci return 0; 13762306a36Sopenharmony_ci} 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cistatic inline int 14062306a36Sopenharmony_cireset_control_bulk_assert(int num_rstcs, struct reset_control_bulk_data *rstcs) 14162306a36Sopenharmony_ci{ 14262306a36Sopenharmony_ci return 0; 14362306a36Sopenharmony_ci} 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_cistatic inline int 14662306a36Sopenharmony_cireset_control_bulk_deassert(int num_rstcs, struct reset_control_bulk_data *rstcs) 14762306a36Sopenharmony_ci{ 14862306a36Sopenharmony_ci return 0; 14962306a36Sopenharmony_ci} 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cistatic inline int 15262306a36Sopenharmony_cireset_control_bulk_acquire(int num_rstcs, struct reset_control_bulk_data *rstcs) 15362306a36Sopenharmony_ci{ 15462306a36Sopenharmony_ci return 0; 15562306a36Sopenharmony_ci} 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cistatic inline void 15862306a36Sopenharmony_cireset_control_bulk_release(int num_rstcs, struct reset_control_bulk_data *rstcs) 15962306a36Sopenharmony_ci{ 16062306a36Sopenharmony_ci} 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_cistatic inline int 16362306a36Sopenharmony_ci__reset_control_bulk_get(struct device *dev, int num_rstcs, 16462306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs, 16562306a36Sopenharmony_ci bool shared, bool optional, bool acquired) 16662306a36Sopenharmony_ci{ 16762306a36Sopenharmony_ci return optional ? 0 : -EOPNOTSUPP; 16862306a36Sopenharmony_ci} 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_cistatic inline void 17162306a36Sopenharmony_cireset_control_bulk_put(int num_rstcs, struct reset_control_bulk_data *rstcs) 17262306a36Sopenharmony_ci{ 17362306a36Sopenharmony_ci} 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_cistatic inline struct reset_control *__devm_reset_control_get( 17662306a36Sopenharmony_ci struct device *dev, const char *id, 17762306a36Sopenharmony_ci int index, bool shared, bool optional, 17862306a36Sopenharmony_ci bool acquired) 17962306a36Sopenharmony_ci{ 18062306a36Sopenharmony_ci return optional ? NULL : ERR_PTR(-ENOTSUPP); 18162306a36Sopenharmony_ci} 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_cistatic inline int 18462306a36Sopenharmony_ci__devm_reset_control_bulk_get(struct device *dev, int num_rstcs, 18562306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs, 18662306a36Sopenharmony_ci bool shared, bool optional, bool acquired) 18762306a36Sopenharmony_ci{ 18862306a36Sopenharmony_ci return optional ? 0 : -EOPNOTSUPP; 18962306a36Sopenharmony_ci} 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_cistatic inline struct reset_control * 19262306a36Sopenharmony_cidevm_reset_control_array_get(struct device *dev, bool shared, bool optional) 19362306a36Sopenharmony_ci{ 19462306a36Sopenharmony_ci return optional ? NULL : ERR_PTR(-ENOTSUPP); 19562306a36Sopenharmony_ci} 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_cistatic inline struct reset_control * 19862306a36Sopenharmony_ciof_reset_control_array_get(struct device_node *np, bool shared, bool optional, 19962306a36Sopenharmony_ci bool acquired) 20062306a36Sopenharmony_ci{ 20162306a36Sopenharmony_ci return optional ? NULL : ERR_PTR(-ENOTSUPP); 20262306a36Sopenharmony_ci} 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_cistatic inline int reset_control_get_count(struct device *dev) 20562306a36Sopenharmony_ci{ 20662306a36Sopenharmony_ci return -ENOENT; 20762306a36Sopenharmony_ci} 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci#endif /* CONFIG_RESET_CONTROLLER */ 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_cistatic inline int __must_check device_reset(struct device *dev) 21262306a36Sopenharmony_ci{ 21362306a36Sopenharmony_ci return __device_reset(dev, false); 21462306a36Sopenharmony_ci} 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_cistatic inline int device_reset_optional(struct device *dev) 21762306a36Sopenharmony_ci{ 21862306a36Sopenharmony_ci return __device_reset(dev, true); 21962306a36Sopenharmony_ci} 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci/** 22262306a36Sopenharmony_ci * reset_control_get_exclusive - Lookup and obtain an exclusive reference 22362306a36Sopenharmony_ci * to a reset controller. 22462306a36Sopenharmony_ci * @dev: device to be reset by the controller 22562306a36Sopenharmony_ci * @id: reset line name 22662306a36Sopenharmony_ci * 22762306a36Sopenharmony_ci * Returns a struct reset_control or IS_ERR() condition containing errno. 22862306a36Sopenharmony_ci * If this function is called more than once for the same reset_control it will 22962306a36Sopenharmony_ci * return -EBUSY. 23062306a36Sopenharmony_ci * 23162306a36Sopenharmony_ci * See reset_control_get_shared() for details on shared references to 23262306a36Sopenharmony_ci * reset-controls. 23362306a36Sopenharmony_ci * 23462306a36Sopenharmony_ci * Use of id names is optional. 23562306a36Sopenharmony_ci */ 23662306a36Sopenharmony_cistatic inline struct reset_control * 23762306a36Sopenharmony_ci__must_check reset_control_get_exclusive(struct device *dev, const char *id) 23862306a36Sopenharmony_ci{ 23962306a36Sopenharmony_ci return __reset_control_get(dev, id, 0, false, false, true); 24062306a36Sopenharmony_ci} 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci/** 24362306a36Sopenharmony_ci * reset_control_bulk_get_exclusive - Lookup and obtain exclusive references to 24462306a36Sopenharmony_ci * multiple reset controllers. 24562306a36Sopenharmony_ci * @dev: device to be reset by the controller 24662306a36Sopenharmony_ci * @num_rstcs: number of entries in rstcs array 24762306a36Sopenharmony_ci * @rstcs: array of struct reset_control_bulk_data with reset line names set 24862306a36Sopenharmony_ci * 24962306a36Sopenharmony_ci * Fills the rstcs array with pointers to exclusive reset controls and 25062306a36Sopenharmony_ci * returns 0, or an IS_ERR() condition containing errno. 25162306a36Sopenharmony_ci */ 25262306a36Sopenharmony_cistatic inline int __must_check 25362306a36Sopenharmony_cireset_control_bulk_get_exclusive(struct device *dev, int num_rstcs, 25462306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs) 25562306a36Sopenharmony_ci{ 25662306a36Sopenharmony_ci return __reset_control_bulk_get(dev, num_rstcs, rstcs, false, false, true); 25762306a36Sopenharmony_ci} 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci/** 26062306a36Sopenharmony_ci * reset_control_get_exclusive_released - Lookup and obtain a temoprarily 26162306a36Sopenharmony_ci * exclusive reference to a reset 26262306a36Sopenharmony_ci * controller. 26362306a36Sopenharmony_ci * @dev: device to be reset by the controller 26462306a36Sopenharmony_ci * @id: reset line name 26562306a36Sopenharmony_ci * 26662306a36Sopenharmony_ci * Returns a struct reset_control or IS_ERR() condition containing errno. 26762306a36Sopenharmony_ci * reset-controls returned by this function must be acquired via 26862306a36Sopenharmony_ci * reset_control_acquire() before they can be used and should be released 26962306a36Sopenharmony_ci * via reset_control_release() afterwards. 27062306a36Sopenharmony_ci * 27162306a36Sopenharmony_ci * Use of id names is optional. 27262306a36Sopenharmony_ci */ 27362306a36Sopenharmony_cistatic inline struct reset_control * 27462306a36Sopenharmony_ci__must_check reset_control_get_exclusive_released(struct device *dev, 27562306a36Sopenharmony_ci const char *id) 27662306a36Sopenharmony_ci{ 27762306a36Sopenharmony_ci return __reset_control_get(dev, id, 0, false, false, false); 27862306a36Sopenharmony_ci} 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci/** 28162306a36Sopenharmony_ci * reset_control_bulk_get_exclusive_released - Lookup and obtain temporarily 28262306a36Sopenharmony_ci * exclusive references to multiple reset 28362306a36Sopenharmony_ci * controllers. 28462306a36Sopenharmony_ci * @dev: device to be reset by the controller 28562306a36Sopenharmony_ci * @num_rstcs: number of entries in rstcs array 28662306a36Sopenharmony_ci * @rstcs: array of struct reset_control_bulk_data with reset line names set 28762306a36Sopenharmony_ci * 28862306a36Sopenharmony_ci * Fills the rstcs array with pointers to exclusive reset controls and 28962306a36Sopenharmony_ci * returns 0, or an IS_ERR() condition containing errno. 29062306a36Sopenharmony_ci * reset-controls returned by this function must be acquired via 29162306a36Sopenharmony_ci * reset_control_bulk_acquire() before they can be used and should be released 29262306a36Sopenharmony_ci * via reset_control_bulk_release() afterwards. 29362306a36Sopenharmony_ci */ 29462306a36Sopenharmony_cistatic inline int __must_check 29562306a36Sopenharmony_cireset_control_bulk_get_exclusive_released(struct device *dev, int num_rstcs, 29662306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs) 29762306a36Sopenharmony_ci{ 29862306a36Sopenharmony_ci return __reset_control_bulk_get(dev, num_rstcs, rstcs, false, false, false); 29962306a36Sopenharmony_ci} 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci/** 30262306a36Sopenharmony_ci * reset_control_bulk_get_optional_exclusive_released - Lookup and obtain optional 30362306a36Sopenharmony_ci * temporarily exclusive references to multiple 30462306a36Sopenharmony_ci * reset controllers. 30562306a36Sopenharmony_ci * @dev: device to be reset by the controller 30662306a36Sopenharmony_ci * @num_rstcs: number of entries in rstcs array 30762306a36Sopenharmony_ci * @rstcs: array of struct reset_control_bulk_data with reset line names set 30862306a36Sopenharmony_ci * 30962306a36Sopenharmony_ci * Optional variant of reset_control_bulk_get_exclusive_released(). If the 31062306a36Sopenharmony_ci * requested reset is not specified in the device tree, this function returns 0 31162306a36Sopenharmony_ci * instead of an error and missing rtsc is set to NULL. 31262306a36Sopenharmony_ci * 31362306a36Sopenharmony_ci * See reset_control_bulk_get_exclusive_released() for more information. 31462306a36Sopenharmony_ci */ 31562306a36Sopenharmony_cistatic inline int __must_check 31662306a36Sopenharmony_cireset_control_bulk_get_optional_exclusive_released(struct device *dev, int num_rstcs, 31762306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs) 31862306a36Sopenharmony_ci{ 31962306a36Sopenharmony_ci return __reset_control_bulk_get(dev, num_rstcs, rstcs, false, true, false); 32062306a36Sopenharmony_ci} 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci/** 32362306a36Sopenharmony_ci * reset_control_get_shared - Lookup and obtain a shared reference to a 32462306a36Sopenharmony_ci * reset controller. 32562306a36Sopenharmony_ci * @dev: device to be reset by the controller 32662306a36Sopenharmony_ci * @id: reset line name 32762306a36Sopenharmony_ci * 32862306a36Sopenharmony_ci * Returns a struct reset_control or IS_ERR() condition containing errno. 32962306a36Sopenharmony_ci * This function is intended for use with reset-controls which are shared 33062306a36Sopenharmony_ci * between hardware blocks. 33162306a36Sopenharmony_ci * 33262306a36Sopenharmony_ci * When a reset-control is shared, the behavior of reset_control_assert / 33362306a36Sopenharmony_ci * deassert is changed, the reset-core will keep track of a deassert_count 33462306a36Sopenharmony_ci * and only (re-)assert the reset after reset_control_assert has been called 33562306a36Sopenharmony_ci * as many times as reset_control_deassert was called. Also see the remark 33662306a36Sopenharmony_ci * about shared reset-controls in the reset_control_assert docs. 33762306a36Sopenharmony_ci * 33862306a36Sopenharmony_ci * Calling reset_control_assert without first calling reset_control_deassert 33962306a36Sopenharmony_ci * is not allowed on a shared reset control. Calling reset_control_reset is 34062306a36Sopenharmony_ci * also not allowed on a shared reset control. 34162306a36Sopenharmony_ci * 34262306a36Sopenharmony_ci * Use of id names is optional. 34362306a36Sopenharmony_ci */ 34462306a36Sopenharmony_cistatic inline struct reset_control *reset_control_get_shared( 34562306a36Sopenharmony_ci struct device *dev, const char *id) 34662306a36Sopenharmony_ci{ 34762306a36Sopenharmony_ci return __reset_control_get(dev, id, 0, true, false, false); 34862306a36Sopenharmony_ci} 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci/** 35162306a36Sopenharmony_ci * reset_control_bulk_get_shared - Lookup and obtain shared references to 35262306a36Sopenharmony_ci * multiple reset controllers. 35362306a36Sopenharmony_ci * @dev: device to be reset by the controller 35462306a36Sopenharmony_ci * @num_rstcs: number of entries in rstcs array 35562306a36Sopenharmony_ci * @rstcs: array of struct reset_control_bulk_data with reset line names set 35662306a36Sopenharmony_ci * 35762306a36Sopenharmony_ci * Fills the rstcs array with pointers to shared reset controls and 35862306a36Sopenharmony_ci * returns 0, or an IS_ERR() condition containing errno. 35962306a36Sopenharmony_ci */ 36062306a36Sopenharmony_cistatic inline int __must_check 36162306a36Sopenharmony_cireset_control_bulk_get_shared(struct device *dev, int num_rstcs, 36262306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs) 36362306a36Sopenharmony_ci{ 36462306a36Sopenharmony_ci return __reset_control_bulk_get(dev, num_rstcs, rstcs, true, false, false); 36562306a36Sopenharmony_ci} 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci/** 36862306a36Sopenharmony_ci * reset_control_get_optional_exclusive - optional reset_control_get_exclusive() 36962306a36Sopenharmony_ci * @dev: device to be reset by the controller 37062306a36Sopenharmony_ci * @id: reset line name 37162306a36Sopenharmony_ci * 37262306a36Sopenharmony_ci * Optional variant of reset_control_get_exclusive(). If the requested reset 37362306a36Sopenharmony_ci * is not specified in the device tree, this function returns NULL instead of 37462306a36Sopenharmony_ci * an error. 37562306a36Sopenharmony_ci * 37662306a36Sopenharmony_ci * See reset_control_get_exclusive() for more information. 37762306a36Sopenharmony_ci */ 37862306a36Sopenharmony_cistatic inline struct reset_control *reset_control_get_optional_exclusive( 37962306a36Sopenharmony_ci struct device *dev, const char *id) 38062306a36Sopenharmony_ci{ 38162306a36Sopenharmony_ci return __reset_control_get(dev, id, 0, false, true, true); 38262306a36Sopenharmony_ci} 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci/** 38562306a36Sopenharmony_ci * reset_control_bulk_get_optional_exclusive - optional 38662306a36Sopenharmony_ci * reset_control_bulk_get_exclusive() 38762306a36Sopenharmony_ci * @dev: device to be reset by the controller 38862306a36Sopenharmony_ci * @num_rstcs: number of entries in rstcs array 38962306a36Sopenharmony_ci * @rstcs: array of struct reset_control_bulk_data with reset line names set 39062306a36Sopenharmony_ci * 39162306a36Sopenharmony_ci * Optional variant of reset_control_bulk_get_exclusive(). If any of the 39262306a36Sopenharmony_ci * requested resets are not specified in the device tree, this function sets 39362306a36Sopenharmony_ci * them to NULL instead of returning an error. 39462306a36Sopenharmony_ci * 39562306a36Sopenharmony_ci * See reset_control_bulk_get_exclusive() for more information. 39662306a36Sopenharmony_ci */ 39762306a36Sopenharmony_cistatic inline int __must_check 39862306a36Sopenharmony_cireset_control_bulk_get_optional_exclusive(struct device *dev, int num_rstcs, 39962306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs) 40062306a36Sopenharmony_ci{ 40162306a36Sopenharmony_ci return __reset_control_bulk_get(dev, num_rstcs, rstcs, false, true, true); 40262306a36Sopenharmony_ci} 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci/** 40562306a36Sopenharmony_ci * reset_control_get_optional_shared - optional reset_control_get_shared() 40662306a36Sopenharmony_ci * @dev: device to be reset by the controller 40762306a36Sopenharmony_ci * @id: reset line name 40862306a36Sopenharmony_ci * 40962306a36Sopenharmony_ci * Optional variant of reset_control_get_shared(). If the requested reset 41062306a36Sopenharmony_ci * is not specified in the device tree, this function returns NULL instead of 41162306a36Sopenharmony_ci * an error. 41262306a36Sopenharmony_ci * 41362306a36Sopenharmony_ci * See reset_control_get_shared() for more information. 41462306a36Sopenharmony_ci */ 41562306a36Sopenharmony_cistatic inline struct reset_control *reset_control_get_optional_shared( 41662306a36Sopenharmony_ci struct device *dev, const char *id) 41762306a36Sopenharmony_ci{ 41862306a36Sopenharmony_ci return __reset_control_get(dev, id, 0, true, true, false); 41962306a36Sopenharmony_ci} 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_ci/** 42262306a36Sopenharmony_ci * reset_control_bulk_get_optional_shared - optional 42362306a36Sopenharmony_ci * reset_control_bulk_get_shared() 42462306a36Sopenharmony_ci * @dev: device to be reset by the controller 42562306a36Sopenharmony_ci * @num_rstcs: number of entries in rstcs array 42662306a36Sopenharmony_ci * @rstcs: array of struct reset_control_bulk_data with reset line names set 42762306a36Sopenharmony_ci * 42862306a36Sopenharmony_ci * Optional variant of reset_control_bulk_get_shared(). If the requested resets 42962306a36Sopenharmony_ci * are not specified in the device tree, this function sets them to NULL 43062306a36Sopenharmony_ci * instead of returning an error. 43162306a36Sopenharmony_ci * 43262306a36Sopenharmony_ci * See reset_control_bulk_get_shared() for more information. 43362306a36Sopenharmony_ci */ 43462306a36Sopenharmony_cistatic inline int __must_check 43562306a36Sopenharmony_cireset_control_bulk_get_optional_shared(struct device *dev, int num_rstcs, 43662306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs) 43762306a36Sopenharmony_ci{ 43862306a36Sopenharmony_ci return __reset_control_bulk_get(dev, num_rstcs, rstcs, true, true, false); 43962306a36Sopenharmony_ci} 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_ci/** 44262306a36Sopenharmony_ci * of_reset_control_get_exclusive - Lookup and obtain an exclusive reference 44362306a36Sopenharmony_ci * to a reset controller. 44462306a36Sopenharmony_ci * @node: device to be reset by the controller 44562306a36Sopenharmony_ci * @id: reset line name 44662306a36Sopenharmony_ci * 44762306a36Sopenharmony_ci * Returns a struct reset_control or IS_ERR() condition containing errno. 44862306a36Sopenharmony_ci * 44962306a36Sopenharmony_ci * Use of id names is optional. 45062306a36Sopenharmony_ci */ 45162306a36Sopenharmony_cistatic inline struct reset_control *of_reset_control_get_exclusive( 45262306a36Sopenharmony_ci struct device_node *node, const char *id) 45362306a36Sopenharmony_ci{ 45462306a36Sopenharmony_ci return __of_reset_control_get(node, id, 0, false, false, true); 45562306a36Sopenharmony_ci} 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ci/** 45862306a36Sopenharmony_ci * of_reset_control_get_optional_exclusive - Lookup and obtain an optional exclusive 45962306a36Sopenharmony_ci * reference to a reset controller. 46062306a36Sopenharmony_ci * @node: device to be reset by the controller 46162306a36Sopenharmony_ci * @id: reset line name 46262306a36Sopenharmony_ci * 46362306a36Sopenharmony_ci * Optional variant of of_reset_control_get_exclusive(). If the requested reset 46462306a36Sopenharmony_ci * is not specified in the device tree, this function returns NULL instead of 46562306a36Sopenharmony_ci * an error. 46662306a36Sopenharmony_ci * 46762306a36Sopenharmony_ci * Returns a struct reset_control or IS_ERR() condition containing errno. 46862306a36Sopenharmony_ci * 46962306a36Sopenharmony_ci * Use of id names is optional. 47062306a36Sopenharmony_ci */ 47162306a36Sopenharmony_cistatic inline struct reset_control *of_reset_control_get_optional_exclusive( 47262306a36Sopenharmony_ci struct device_node *node, const char *id) 47362306a36Sopenharmony_ci{ 47462306a36Sopenharmony_ci return __of_reset_control_get(node, id, 0, false, true, true); 47562306a36Sopenharmony_ci} 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_ci/** 47862306a36Sopenharmony_ci * of_reset_control_get_shared - Lookup and obtain a shared reference 47962306a36Sopenharmony_ci * to a reset controller. 48062306a36Sopenharmony_ci * @node: device to be reset by the controller 48162306a36Sopenharmony_ci * @id: reset line name 48262306a36Sopenharmony_ci * 48362306a36Sopenharmony_ci * When a reset-control is shared, the behavior of reset_control_assert / 48462306a36Sopenharmony_ci * deassert is changed, the reset-core will keep track of a deassert_count 48562306a36Sopenharmony_ci * and only (re-)assert the reset after reset_control_assert has been called 48662306a36Sopenharmony_ci * as many times as reset_control_deassert was called. Also see the remark 48762306a36Sopenharmony_ci * about shared reset-controls in the reset_control_assert docs. 48862306a36Sopenharmony_ci * 48962306a36Sopenharmony_ci * Calling reset_control_assert without first calling reset_control_deassert 49062306a36Sopenharmony_ci * is not allowed on a shared reset control. Calling reset_control_reset is 49162306a36Sopenharmony_ci * also not allowed on a shared reset control. 49262306a36Sopenharmony_ci * Returns a struct reset_control or IS_ERR() condition containing errno. 49362306a36Sopenharmony_ci * 49462306a36Sopenharmony_ci * Use of id names is optional. 49562306a36Sopenharmony_ci */ 49662306a36Sopenharmony_cistatic inline struct reset_control *of_reset_control_get_shared( 49762306a36Sopenharmony_ci struct device_node *node, const char *id) 49862306a36Sopenharmony_ci{ 49962306a36Sopenharmony_ci return __of_reset_control_get(node, id, 0, true, false, false); 50062306a36Sopenharmony_ci} 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ci/** 50362306a36Sopenharmony_ci * of_reset_control_get_exclusive_by_index - Lookup and obtain an exclusive 50462306a36Sopenharmony_ci * reference to a reset controller 50562306a36Sopenharmony_ci * by index. 50662306a36Sopenharmony_ci * @node: device to be reset by the controller 50762306a36Sopenharmony_ci * @index: index of the reset controller 50862306a36Sopenharmony_ci * 50962306a36Sopenharmony_ci * This is to be used to perform a list of resets for a device or power domain 51062306a36Sopenharmony_ci * in whatever order. Returns a struct reset_control or IS_ERR() condition 51162306a36Sopenharmony_ci * containing errno. 51262306a36Sopenharmony_ci */ 51362306a36Sopenharmony_cistatic inline struct reset_control *of_reset_control_get_exclusive_by_index( 51462306a36Sopenharmony_ci struct device_node *node, int index) 51562306a36Sopenharmony_ci{ 51662306a36Sopenharmony_ci return __of_reset_control_get(node, NULL, index, false, false, true); 51762306a36Sopenharmony_ci} 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci/** 52062306a36Sopenharmony_ci * of_reset_control_get_shared_by_index - Lookup and obtain a shared 52162306a36Sopenharmony_ci * reference to a reset controller 52262306a36Sopenharmony_ci * by index. 52362306a36Sopenharmony_ci * @node: device to be reset by the controller 52462306a36Sopenharmony_ci * @index: index of the reset controller 52562306a36Sopenharmony_ci * 52662306a36Sopenharmony_ci * When a reset-control is shared, the behavior of reset_control_assert / 52762306a36Sopenharmony_ci * deassert is changed, the reset-core will keep track of a deassert_count 52862306a36Sopenharmony_ci * and only (re-)assert the reset after reset_control_assert has been called 52962306a36Sopenharmony_ci * as many times as reset_control_deassert was called. Also see the remark 53062306a36Sopenharmony_ci * about shared reset-controls in the reset_control_assert docs. 53162306a36Sopenharmony_ci * 53262306a36Sopenharmony_ci * Calling reset_control_assert without first calling reset_control_deassert 53362306a36Sopenharmony_ci * is not allowed on a shared reset control. Calling reset_control_reset is 53462306a36Sopenharmony_ci * also not allowed on a shared reset control. 53562306a36Sopenharmony_ci * Returns a struct reset_control or IS_ERR() condition containing errno. 53662306a36Sopenharmony_ci * 53762306a36Sopenharmony_ci * This is to be used to perform a list of resets for a device or power domain 53862306a36Sopenharmony_ci * in whatever order. Returns a struct reset_control or IS_ERR() condition 53962306a36Sopenharmony_ci * containing errno. 54062306a36Sopenharmony_ci */ 54162306a36Sopenharmony_cistatic inline struct reset_control *of_reset_control_get_shared_by_index( 54262306a36Sopenharmony_ci struct device_node *node, int index) 54362306a36Sopenharmony_ci{ 54462306a36Sopenharmony_ci return __of_reset_control_get(node, NULL, index, true, false, false); 54562306a36Sopenharmony_ci} 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_ci/** 54862306a36Sopenharmony_ci * devm_reset_control_get_exclusive - resource managed 54962306a36Sopenharmony_ci * reset_control_get_exclusive() 55062306a36Sopenharmony_ci * @dev: device to be reset by the controller 55162306a36Sopenharmony_ci * @id: reset line name 55262306a36Sopenharmony_ci * 55362306a36Sopenharmony_ci * Managed reset_control_get_exclusive(). For reset controllers returned 55462306a36Sopenharmony_ci * from this function, reset_control_put() is called automatically on driver 55562306a36Sopenharmony_ci * detach. 55662306a36Sopenharmony_ci * 55762306a36Sopenharmony_ci * See reset_control_get_exclusive() for more information. 55862306a36Sopenharmony_ci */ 55962306a36Sopenharmony_cistatic inline struct reset_control * 56062306a36Sopenharmony_ci__must_check devm_reset_control_get_exclusive(struct device *dev, 56162306a36Sopenharmony_ci const char *id) 56262306a36Sopenharmony_ci{ 56362306a36Sopenharmony_ci return __devm_reset_control_get(dev, id, 0, false, false, true); 56462306a36Sopenharmony_ci} 56562306a36Sopenharmony_ci 56662306a36Sopenharmony_ci/** 56762306a36Sopenharmony_ci * devm_reset_control_bulk_get_exclusive - resource managed 56862306a36Sopenharmony_ci * reset_control_bulk_get_exclusive() 56962306a36Sopenharmony_ci * @dev: device to be reset by the controller 57062306a36Sopenharmony_ci * @num_rstcs: number of entries in rstcs array 57162306a36Sopenharmony_ci * @rstcs: array of struct reset_control_bulk_data with reset line names set 57262306a36Sopenharmony_ci * 57362306a36Sopenharmony_ci * Managed reset_control_bulk_get_exclusive(). For reset controllers returned 57462306a36Sopenharmony_ci * from this function, reset_control_put() is called automatically on driver 57562306a36Sopenharmony_ci * detach. 57662306a36Sopenharmony_ci * 57762306a36Sopenharmony_ci * See reset_control_bulk_get_exclusive() for more information. 57862306a36Sopenharmony_ci */ 57962306a36Sopenharmony_cistatic inline int __must_check 58062306a36Sopenharmony_cidevm_reset_control_bulk_get_exclusive(struct device *dev, int num_rstcs, 58162306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs) 58262306a36Sopenharmony_ci{ 58362306a36Sopenharmony_ci return __devm_reset_control_bulk_get(dev, num_rstcs, rstcs, false, false, true); 58462306a36Sopenharmony_ci} 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_ci/** 58762306a36Sopenharmony_ci * devm_reset_control_get_exclusive_released - resource managed 58862306a36Sopenharmony_ci * reset_control_get_exclusive_released() 58962306a36Sopenharmony_ci * @dev: device to be reset by the controller 59062306a36Sopenharmony_ci * @id: reset line name 59162306a36Sopenharmony_ci * 59262306a36Sopenharmony_ci * Managed reset_control_get_exclusive_released(). For reset controllers 59362306a36Sopenharmony_ci * returned from this function, reset_control_put() is called automatically on 59462306a36Sopenharmony_ci * driver detach. 59562306a36Sopenharmony_ci * 59662306a36Sopenharmony_ci * See reset_control_get_exclusive_released() for more information. 59762306a36Sopenharmony_ci */ 59862306a36Sopenharmony_cistatic inline struct reset_control * 59962306a36Sopenharmony_ci__must_check devm_reset_control_get_exclusive_released(struct device *dev, 60062306a36Sopenharmony_ci const char *id) 60162306a36Sopenharmony_ci{ 60262306a36Sopenharmony_ci return __devm_reset_control_get(dev, id, 0, false, false, false); 60362306a36Sopenharmony_ci} 60462306a36Sopenharmony_ci 60562306a36Sopenharmony_ci/** 60662306a36Sopenharmony_ci * devm_reset_control_bulk_get_exclusive_released - resource managed 60762306a36Sopenharmony_ci * reset_control_bulk_get_exclusive_released() 60862306a36Sopenharmony_ci * @dev: device to be reset by the controller 60962306a36Sopenharmony_ci * @num_rstcs: number of entries in rstcs array 61062306a36Sopenharmony_ci * @rstcs: array of struct reset_control_bulk_data with reset line names set 61162306a36Sopenharmony_ci * 61262306a36Sopenharmony_ci * Managed reset_control_bulk_get_exclusive_released(). For reset controllers 61362306a36Sopenharmony_ci * returned from this function, reset_control_put() is called automatically on 61462306a36Sopenharmony_ci * driver detach. 61562306a36Sopenharmony_ci * 61662306a36Sopenharmony_ci * See reset_control_bulk_get_exclusive_released() for more information. 61762306a36Sopenharmony_ci */ 61862306a36Sopenharmony_cistatic inline int __must_check 61962306a36Sopenharmony_cidevm_reset_control_bulk_get_exclusive_released(struct device *dev, int num_rstcs, 62062306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs) 62162306a36Sopenharmony_ci{ 62262306a36Sopenharmony_ci return __devm_reset_control_bulk_get(dev, num_rstcs, rstcs, false, false, false); 62362306a36Sopenharmony_ci} 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_ci/** 62662306a36Sopenharmony_ci * devm_reset_control_get_optional_exclusive_released - resource managed 62762306a36Sopenharmony_ci * reset_control_get_optional_exclusive_released() 62862306a36Sopenharmony_ci * @dev: device to be reset by the controller 62962306a36Sopenharmony_ci * @id: reset line name 63062306a36Sopenharmony_ci * 63162306a36Sopenharmony_ci * Managed-and-optional variant of reset_control_get_exclusive_released(). For 63262306a36Sopenharmony_ci * reset controllers returned from this function, reset_control_put() is called 63362306a36Sopenharmony_ci * automatically on driver detach. 63462306a36Sopenharmony_ci * 63562306a36Sopenharmony_ci * See reset_control_get_exclusive_released() for more information. 63662306a36Sopenharmony_ci */ 63762306a36Sopenharmony_cistatic inline struct reset_control * 63862306a36Sopenharmony_ci__must_check devm_reset_control_get_optional_exclusive_released(struct device *dev, 63962306a36Sopenharmony_ci const char *id) 64062306a36Sopenharmony_ci{ 64162306a36Sopenharmony_ci return __devm_reset_control_get(dev, id, 0, false, true, false); 64262306a36Sopenharmony_ci} 64362306a36Sopenharmony_ci 64462306a36Sopenharmony_ci/** 64562306a36Sopenharmony_ci * devm_reset_control_bulk_get_optional_exclusive_released - resource managed 64662306a36Sopenharmony_ci * reset_control_bulk_optional_get_exclusive_released() 64762306a36Sopenharmony_ci * @dev: device to be reset by the controller 64862306a36Sopenharmony_ci * @num_rstcs: number of entries in rstcs array 64962306a36Sopenharmony_ci * @rstcs: array of struct reset_control_bulk_data with reset line names set 65062306a36Sopenharmony_ci * 65162306a36Sopenharmony_ci * Managed reset_control_bulk_optional_get_exclusive_released(). For reset 65262306a36Sopenharmony_ci * controllers returned from this function, reset_control_put() is called 65362306a36Sopenharmony_ci * automatically on driver detach. 65462306a36Sopenharmony_ci * 65562306a36Sopenharmony_ci * See reset_control_bulk_optional_get_exclusive_released() for more information. 65662306a36Sopenharmony_ci */ 65762306a36Sopenharmony_cistatic inline int __must_check 65862306a36Sopenharmony_cidevm_reset_control_bulk_get_optional_exclusive_released(struct device *dev, int num_rstcs, 65962306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs) 66062306a36Sopenharmony_ci{ 66162306a36Sopenharmony_ci return __devm_reset_control_bulk_get(dev, num_rstcs, rstcs, false, true, false); 66262306a36Sopenharmony_ci} 66362306a36Sopenharmony_ci 66462306a36Sopenharmony_ci/** 66562306a36Sopenharmony_ci * devm_reset_control_get_shared - resource managed reset_control_get_shared() 66662306a36Sopenharmony_ci * @dev: device to be reset by the controller 66762306a36Sopenharmony_ci * @id: reset line name 66862306a36Sopenharmony_ci * 66962306a36Sopenharmony_ci * Managed reset_control_get_shared(). For reset controllers returned from 67062306a36Sopenharmony_ci * this function, reset_control_put() is called automatically on driver detach. 67162306a36Sopenharmony_ci * See reset_control_get_shared() for more information. 67262306a36Sopenharmony_ci */ 67362306a36Sopenharmony_cistatic inline struct reset_control *devm_reset_control_get_shared( 67462306a36Sopenharmony_ci struct device *dev, const char *id) 67562306a36Sopenharmony_ci{ 67662306a36Sopenharmony_ci return __devm_reset_control_get(dev, id, 0, true, false, false); 67762306a36Sopenharmony_ci} 67862306a36Sopenharmony_ci 67962306a36Sopenharmony_ci/** 68062306a36Sopenharmony_ci * devm_reset_control_bulk_get_shared - resource managed 68162306a36Sopenharmony_ci * reset_control_bulk_get_shared() 68262306a36Sopenharmony_ci * @dev: device to be reset by the controller 68362306a36Sopenharmony_ci * @num_rstcs: number of entries in rstcs array 68462306a36Sopenharmony_ci * @rstcs: array of struct reset_control_bulk_data with reset line names set 68562306a36Sopenharmony_ci * 68662306a36Sopenharmony_ci * Managed reset_control_bulk_get_shared(). For reset controllers returned 68762306a36Sopenharmony_ci * from this function, reset_control_put() is called automatically on driver 68862306a36Sopenharmony_ci * detach. 68962306a36Sopenharmony_ci * 69062306a36Sopenharmony_ci * See reset_control_bulk_get_shared() for more information. 69162306a36Sopenharmony_ci */ 69262306a36Sopenharmony_cistatic inline int __must_check 69362306a36Sopenharmony_cidevm_reset_control_bulk_get_shared(struct device *dev, int num_rstcs, 69462306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs) 69562306a36Sopenharmony_ci{ 69662306a36Sopenharmony_ci return __devm_reset_control_bulk_get(dev, num_rstcs, rstcs, true, false, false); 69762306a36Sopenharmony_ci} 69862306a36Sopenharmony_ci 69962306a36Sopenharmony_ci/** 70062306a36Sopenharmony_ci * devm_reset_control_get_optional_exclusive - resource managed 70162306a36Sopenharmony_ci * reset_control_get_optional_exclusive() 70262306a36Sopenharmony_ci * @dev: device to be reset by the controller 70362306a36Sopenharmony_ci * @id: reset line name 70462306a36Sopenharmony_ci * 70562306a36Sopenharmony_ci * Managed reset_control_get_optional_exclusive(). For reset controllers 70662306a36Sopenharmony_ci * returned from this function, reset_control_put() is called automatically on 70762306a36Sopenharmony_ci * driver detach. 70862306a36Sopenharmony_ci * 70962306a36Sopenharmony_ci * See reset_control_get_optional_exclusive() for more information. 71062306a36Sopenharmony_ci */ 71162306a36Sopenharmony_cistatic inline struct reset_control *devm_reset_control_get_optional_exclusive( 71262306a36Sopenharmony_ci struct device *dev, const char *id) 71362306a36Sopenharmony_ci{ 71462306a36Sopenharmony_ci return __devm_reset_control_get(dev, id, 0, false, true, true); 71562306a36Sopenharmony_ci} 71662306a36Sopenharmony_ci 71762306a36Sopenharmony_ci/** 71862306a36Sopenharmony_ci * devm_reset_control_bulk_get_optional_exclusive - resource managed 71962306a36Sopenharmony_ci * reset_control_bulk_get_optional_exclusive() 72062306a36Sopenharmony_ci * @dev: device to be reset by the controller 72162306a36Sopenharmony_ci * @num_rstcs: number of entries in rstcs array 72262306a36Sopenharmony_ci * @rstcs: array of struct reset_control_bulk_data with reset line names set 72362306a36Sopenharmony_ci * 72462306a36Sopenharmony_ci * Managed reset_control_bulk_get_optional_exclusive(). For reset controllers 72562306a36Sopenharmony_ci * returned from this function, reset_control_put() is called automatically on 72662306a36Sopenharmony_ci * driver detach. 72762306a36Sopenharmony_ci * 72862306a36Sopenharmony_ci * See reset_control_bulk_get_optional_exclusive() for more information. 72962306a36Sopenharmony_ci */ 73062306a36Sopenharmony_cistatic inline int __must_check 73162306a36Sopenharmony_cidevm_reset_control_bulk_get_optional_exclusive(struct device *dev, int num_rstcs, 73262306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs) 73362306a36Sopenharmony_ci{ 73462306a36Sopenharmony_ci return __devm_reset_control_bulk_get(dev, num_rstcs, rstcs, false, true, true); 73562306a36Sopenharmony_ci} 73662306a36Sopenharmony_ci 73762306a36Sopenharmony_ci/** 73862306a36Sopenharmony_ci * devm_reset_control_get_optional_shared - resource managed 73962306a36Sopenharmony_ci * reset_control_get_optional_shared() 74062306a36Sopenharmony_ci * @dev: device to be reset by the controller 74162306a36Sopenharmony_ci * @id: reset line name 74262306a36Sopenharmony_ci * 74362306a36Sopenharmony_ci * Managed reset_control_get_optional_shared(). For reset controllers returned 74462306a36Sopenharmony_ci * from this function, reset_control_put() is called automatically on driver 74562306a36Sopenharmony_ci * detach. 74662306a36Sopenharmony_ci * 74762306a36Sopenharmony_ci * See reset_control_get_optional_shared() for more information. 74862306a36Sopenharmony_ci */ 74962306a36Sopenharmony_cistatic inline struct reset_control *devm_reset_control_get_optional_shared( 75062306a36Sopenharmony_ci struct device *dev, const char *id) 75162306a36Sopenharmony_ci{ 75262306a36Sopenharmony_ci return __devm_reset_control_get(dev, id, 0, true, true, false); 75362306a36Sopenharmony_ci} 75462306a36Sopenharmony_ci 75562306a36Sopenharmony_ci/** 75662306a36Sopenharmony_ci * devm_reset_control_bulk_get_optional_shared - resource managed 75762306a36Sopenharmony_ci * reset_control_bulk_get_optional_shared() 75862306a36Sopenharmony_ci * @dev: device to be reset by the controller 75962306a36Sopenharmony_ci * @num_rstcs: number of entries in rstcs array 76062306a36Sopenharmony_ci * @rstcs: array of struct reset_control_bulk_data with reset line names set 76162306a36Sopenharmony_ci * 76262306a36Sopenharmony_ci * Managed reset_control_bulk_get_optional_shared(). For reset controllers 76362306a36Sopenharmony_ci * returned from this function, reset_control_put() is called automatically on 76462306a36Sopenharmony_ci * driver detach. 76562306a36Sopenharmony_ci * 76662306a36Sopenharmony_ci * See reset_control_bulk_get_optional_shared() for more information. 76762306a36Sopenharmony_ci */ 76862306a36Sopenharmony_cistatic inline int __must_check 76962306a36Sopenharmony_cidevm_reset_control_bulk_get_optional_shared(struct device *dev, int num_rstcs, 77062306a36Sopenharmony_ci struct reset_control_bulk_data *rstcs) 77162306a36Sopenharmony_ci{ 77262306a36Sopenharmony_ci return __devm_reset_control_bulk_get(dev, num_rstcs, rstcs, true, true, false); 77362306a36Sopenharmony_ci} 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_ci/** 77662306a36Sopenharmony_ci * devm_reset_control_get_exclusive_by_index - resource managed 77762306a36Sopenharmony_ci * reset_control_get_exclusive() 77862306a36Sopenharmony_ci * @dev: device to be reset by the controller 77962306a36Sopenharmony_ci * @index: index of the reset controller 78062306a36Sopenharmony_ci * 78162306a36Sopenharmony_ci * Managed reset_control_get_exclusive(). For reset controllers returned from 78262306a36Sopenharmony_ci * this function, reset_control_put() is called automatically on driver 78362306a36Sopenharmony_ci * detach. 78462306a36Sopenharmony_ci * 78562306a36Sopenharmony_ci * See reset_control_get_exclusive() for more information. 78662306a36Sopenharmony_ci */ 78762306a36Sopenharmony_cistatic inline struct reset_control * 78862306a36Sopenharmony_cidevm_reset_control_get_exclusive_by_index(struct device *dev, int index) 78962306a36Sopenharmony_ci{ 79062306a36Sopenharmony_ci return __devm_reset_control_get(dev, NULL, index, false, false, true); 79162306a36Sopenharmony_ci} 79262306a36Sopenharmony_ci 79362306a36Sopenharmony_ci/** 79462306a36Sopenharmony_ci * devm_reset_control_get_shared_by_index - resource managed 79562306a36Sopenharmony_ci * reset_control_get_shared 79662306a36Sopenharmony_ci * @dev: device to be reset by the controller 79762306a36Sopenharmony_ci * @index: index of the reset controller 79862306a36Sopenharmony_ci * 79962306a36Sopenharmony_ci * Managed reset_control_get_shared(). For reset controllers returned from 80062306a36Sopenharmony_ci * this function, reset_control_put() is called automatically on driver detach. 80162306a36Sopenharmony_ci * See reset_control_get_shared() for more information. 80262306a36Sopenharmony_ci */ 80362306a36Sopenharmony_cistatic inline struct reset_control * 80462306a36Sopenharmony_cidevm_reset_control_get_shared_by_index(struct device *dev, int index) 80562306a36Sopenharmony_ci{ 80662306a36Sopenharmony_ci return __devm_reset_control_get(dev, NULL, index, true, false, false); 80762306a36Sopenharmony_ci} 80862306a36Sopenharmony_ci 80962306a36Sopenharmony_ci/* 81062306a36Sopenharmony_ci * TEMPORARY calls to use during transition: 81162306a36Sopenharmony_ci * 81262306a36Sopenharmony_ci * of_reset_control_get() => of_reset_control_get_exclusive() 81362306a36Sopenharmony_ci * 81462306a36Sopenharmony_ci * These inline function calls will be removed once all consumers 81562306a36Sopenharmony_ci * have been moved over to the new explicit API. 81662306a36Sopenharmony_ci */ 81762306a36Sopenharmony_cistatic inline struct reset_control *of_reset_control_get( 81862306a36Sopenharmony_ci struct device_node *node, const char *id) 81962306a36Sopenharmony_ci{ 82062306a36Sopenharmony_ci return of_reset_control_get_exclusive(node, id); 82162306a36Sopenharmony_ci} 82262306a36Sopenharmony_ci 82362306a36Sopenharmony_cistatic inline struct reset_control *of_reset_control_get_by_index( 82462306a36Sopenharmony_ci struct device_node *node, int index) 82562306a36Sopenharmony_ci{ 82662306a36Sopenharmony_ci return of_reset_control_get_exclusive_by_index(node, index); 82762306a36Sopenharmony_ci} 82862306a36Sopenharmony_ci 82962306a36Sopenharmony_cistatic inline struct reset_control *devm_reset_control_get( 83062306a36Sopenharmony_ci struct device *dev, const char *id) 83162306a36Sopenharmony_ci{ 83262306a36Sopenharmony_ci return devm_reset_control_get_exclusive(dev, id); 83362306a36Sopenharmony_ci} 83462306a36Sopenharmony_ci 83562306a36Sopenharmony_cistatic inline struct reset_control *devm_reset_control_get_optional( 83662306a36Sopenharmony_ci struct device *dev, const char *id) 83762306a36Sopenharmony_ci{ 83862306a36Sopenharmony_ci return devm_reset_control_get_optional_exclusive(dev, id); 83962306a36Sopenharmony_ci 84062306a36Sopenharmony_ci} 84162306a36Sopenharmony_ci 84262306a36Sopenharmony_cistatic inline struct reset_control *devm_reset_control_get_by_index( 84362306a36Sopenharmony_ci struct device *dev, int index) 84462306a36Sopenharmony_ci{ 84562306a36Sopenharmony_ci return devm_reset_control_get_exclusive_by_index(dev, index); 84662306a36Sopenharmony_ci} 84762306a36Sopenharmony_ci 84862306a36Sopenharmony_ci/* 84962306a36Sopenharmony_ci * APIs to manage a list of reset controllers 85062306a36Sopenharmony_ci */ 85162306a36Sopenharmony_cistatic inline struct reset_control * 85262306a36Sopenharmony_cidevm_reset_control_array_get_exclusive(struct device *dev) 85362306a36Sopenharmony_ci{ 85462306a36Sopenharmony_ci return devm_reset_control_array_get(dev, false, false); 85562306a36Sopenharmony_ci} 85662306a36Sopenharmony_ci 85762306a36Sopenharmony_cistatic inline struct reset_control * 85862306a36Sopenharmony_cidevm_reset_control_array_get_shared(struct device *dev) 85962306a36Sopenharmony_ci{ 86062306a36Sopenharmony_ci return devm_reset_control_array_get(dev, true, false); 86162306a36Sopenharmony_ci} 86262306a36Sopenharmony_ci 86362306a36Sopenharmony_cistatic inline struct reset_control * 86462306a36Sopenharmony_cidevm_reset_control_array_get_optional_exclusive(struct device *dev) 86562306a36Sopenharmony_ci{ 86662306a36Sopenharmony_ci return devm_reset_control_array_get(dev, false, true); 86762306a36Sopenharmony_ci} 86862306a36Sopenharmony_ci 86962306a36Sopenharmony_cistatic inline struct reset_control * 87062306a36Sopenharmony_cidevm_reset_control_array_get_optional_shared(struct device *dev) 87162306a36Sopenharmony_ci{ 87262306a36Sopenharmony_ci return devm_reset_control_array_get(dev, true, true); 87362306a36Sopenharmony_ci} 87462306a36Sopenharmony_ci 87562306a36Sopenharmony_cistatic inline struct reset_control * 87662306a36Sopenharmony_ciof_reset_control_array_get_exclusive(struct device_node *node) 87762306a36Sopenharmony_ci{ 87862306a36Sopenharmony_ci return of_reset_control_array_get(node, false, false, true); 87962306a36Sopenharmony_ci} 88062306a36Sopenharmony_ci 88162306a36Sopenharmony_cistatic inline struct reset_control * 88262306a36Sopenharmony_ciof_reset_control_array_get_exclusive_released(struct device_node *node) 88362306a36Sopenharmony_ci{ 88462306a36Sopenharmony_ci return of_reset_control_array_get(node, false, false, false); 88562306a36Sopenharmony_ci} 88662306a36Sopenharmony_ci 88762306a36Sopenharmony_cistatic inline struct reset_control * 88862306a36Sopenharmony_ciof_reset_control_array_get_shared(struct device_node *node) 88962306a36Sopenharmony_ci{ 89062306a36Sopenharmony_ci return of_reset_control_array_get(node, true, false, true); 89162306a36Sopenharmony_ci} 89262306a36Sopenharmony_ci 89362306a36Sopenharmony_cistatic inline struct reset_control * 89462306a36Sopenharmony_ciof_reset_control_array_get_optional_exclusive(struct device_node *node) 89562306a36Sopenharmony_ci{ 89662306a36Sopenharmony_ci return of_reset_control_array_get(node, false, true, true); 89762306a36Sopenharmony_ci} 89862306a36Sopenharmony_ci 89962306a36Sopenharmony_cistatic inline struct reset_control * 90062306a36Sopenharmony_ciof_reset_control_array_get_optional_shared(struct device_node *node) 90162306a36Sopenharmony_ci{ 90262306a36Sopenharmony_ci return of_reset_control_array_get(node, true, true, true); 90362306a36Sopenharmony_ci} 90462306a36Sopenharmony_ci#endif 905