162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _LINUX_RESET_CONTROLLER_H_
362306a36Sopenharmony_ci#define _LINUX_RESET_CONTROLLER_H_
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/list.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_cistruct reset_controller_dev;
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci/**
1062306a36Sopenharmony_ci * struct reset_control_ops - reset controller driver callbacks
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * @reset: for self-deasserting resets, does all necessary
1362306a36Sopenharmony_ci *         things to reset the device
1462306a36Sopenharmony_ci * @assert: manually assert the reset line, if supported
1562306a36Sopenharmony_ci * @deassert: manually deassert the reset line, if supported
1662306a36Sopenharmony_ci * @status: return the status of the reset line, if supported
1762306a36Sopenharmony_ci */
1862306a36Sopenharmony_cistruct reset_control_ops {
1962306a36Sopenharmony_ci	int (*reset)(struct reset_controller_dev *rcdev, unsigned long id);
2062306a36Sopenharmony_ci	int (*assert)(struct reset_controller_dev *rcdev, unsigned long id);
2162306a36Sopenharmony_ci	int (*deassert)(struct reset_controller_dev *rcdev, unsigned long id);
2262306a36Sopenharmony_ci	int (*status)(struct reset_controller_dev *rcdev, unsigned long id);
2362306a36Sopenharmony_ci};
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistruct module;
2662306a36Sopenharmony_cistruct device_node;
2762306a36Sopenharmony_cistruct of_phandle_args;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/**
3062306a36Sopenharmony_ci * struct reset_control_lookup - represents a single lookup entry
3162306a36Sopenharmony_ci *
3262306a36Sopenharmony_ci * @list: internal list of all reset lookup entries
3362306a36Sopenharmony_ci * @provider: name of the reset controller device controlling this reset line
3462306a36Sopenharmony_ci * @index: ID of the reset controller in the reset controller device
3562306a36Sopenharmony_ci * @dev_id: name of the device associated with this reset line
3662306a36Sopenharmony_ci * @con_id: name of the reset line (can be NULL)
3762306a36Sopenharmony_ci */
3862306a36Sopenharmony_cistruct reset_control_lookup {
3962306a36Sopenharmony_ci	struct list_head list;
4062306a36Sopenharmony_ci	const char *provider;
4162306a36Sopenharmony_ci	unsigned int index;
4262306a36Sopenharmony_ci	const char *dev_id;
4362306a36Sopenharmony_ci	const char *con_id;
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#define RESET_LOOKUP(_provider, _index, _dev_id, _con_id)		\
4762306a36Sopenharmony_ci	{								\
4862306a36Sopenharmony_ci		.provider = _provider,					\
4962306a36Sopenharmony_ci		.index = _index,					\
5062306a36Sopenharmony_ci		.dev_id = _dev_id,					\
5162306a36Sopenharmony_ci		.con_id = _con_id,					\
5262306a36Sopenharmony_ci	}
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci/**
5562306a36Sopenharmony_ci * struct reset_controller_dev - reset controller entity that might
5662306a36Sopenharmony_ci *                               provide multiple reset controls
5762306a36Sopenharmony_ci * @ops: a pointer to device specific struct reset_control_ops
5862306a36Sopenharmony_ci * @owner: kernel module of the reset controller driver
5962306a36Sopenharmony_ci * @list: internal list of reset controller devices
6062306a36Sopenharmony_ci * @reset_control_head: head of internal list of requested reset controls
6162306a36Sopenharmony_ci * @dev: corresponding driver model device struct
6262306a36Sopenharmony_ci * @of_node: corresponding device tree node as phandle target
6362306a36Sopenharmony_ci * @of_reset_n_cells: number of cells in reset line specifiers
6462306a36Sopenharmony_ci * @of_xlate: translation function to translate from specifier as found in the
6562306a36Sopenharmony_ci *            device tree to id as given to the reset control ops, defaults
6662306a36Sopenharmony_ci *            to :c:func:`of_reset_simple_xlate`.
6762306a36Sopenharmony_ci * @nr_resets: number of reset controls in this reset controller device
6862306a36Sopenharmony_ci */
6962306a36Sopenharmony_cistruct reset_controller_dev {
7062306a36Sopenharmony_ci	const struct reset_control_ops *ops;
7162306a36Sopenharmony_ci	struct module *owner;
7262306a36Sopenharmony_ci	struct list_head list;
7362306a36Sopenharmony_ci	struct list_head reset_control_head;
7462306a36Sopenharmony_ci	struct device *dev;
7562306a36Sopenharmony_ci	struct device_node *of_node;
7662306a36Sopenharmony_ci	int of_reset_n_cells;
7762306a36Sopenharmony_ci	int (*of_xlate)(struct reset_controller_dev *rcdev,
7862306a36Sopenharmony_ci			const struct of_phandle_args *reset_spec);
7962306a36Sopenharmony_ci	unsigned int nr_resets;
8062306a36Sopenharmony_ci};
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_RESET_CONTROLLER)
8362306a36Sopenharmony_ciint reset_controller_register(struct reset_controller_dev *rcdev);
8462306a36Sopenharmony_civoid reset_controller_unregister(struct reset_controller_dev *rcdev);
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistruct device;
8762306a36Sopenharmony_ciint devm_reset_controller_register(struct device *dev,
8862306a36Sopenharmony_ci				   struct reset_controller_dev *rcdev);
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_civoid reset_controller_add_lookup(struct reset_control_lookup *lookup,
9162306a36Sopenharmony_ci				 unsigned int num_entries);
9262306a36Sopenharmony_ci#else
9362306a36Sopenharmony_cistatic inline int reset_controller_register(struct reset_controller_dev *rcdev)
9462306a36Sopenharmony_ci{
9562306a36Sopenharmony_ci	return 0;
9662306a36Sopenharmony_ci}
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cistatic inline void reset_controller_unregister(struct reset_controller_dev *rcdev)
9962306a36Sopenharmony_ci{
10062306a36Sopenharmony_ci}
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_cistatic inline int devm_reset_controller_register(struct device *dev,
10362306a36Sopenharmony_ci						 struct reset_controller_dev *rcdev)
10462306a36Sopenharmony_ci{
10562306a36Sopenharmony_ci	return 0;
10662306a36Sopenharmony_ci}
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_cistatic inline void reset_controller_add_lookup(struct reset_control_lookup *lookup,
10962306a36Sopenharmony_ci					       unsigned int num_entries)
11062306a36Sopenharmony_ci{
11162306a36Sopenharmony_ci}
11262306a36Sopenharmony_ci#endif
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci#endif
115