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