/*
 * Copyright (c) 2016, NVIDIA CORPORATION.
 *
 * SPDX-License-Identifier: GPL-2.0
 */

#ifndef _RESET_UCLASS_H
#define _RESET_UCLASS_H

/* See reset.h for background documentation. */

#include <reset.h>

struct udevice;

/**
 * struct reset_ops - The functions that a reset controller driver must
 * implement.
 */
struct reset_ops {
	/**
	 * of_xlate - Translate a client's device-tree (OF) reset specifier.
	 *
	 * The reset core calls this function as the first step in implementing
	 * a client's reset_get_by_*() call.
	 *
	 * If this function pointer is set to NULL, the reset core will use a
	 * default implementation, which assumes #reset-cells = <1>, and that
	 * the DT cell contains a simple integer reset signal ID.
	 *
	 * At present, the reset API solely supports device-tree. If this
	 * changes, other xxx_xlate() functions may be added to support those
	 * other mechanisms.
	 *
	 * @reset_ctl:	The reset control struct to hold the translation result.
	 * @args:	The reset specifier values from device tree.
	 * @return 0 if OK, or a negative error code.
	 */
	int (*of_xlate)(struct reset_ctl *reset_ctl,
			struct fdtdec_phandle_args *args);
	/**
	 * request - Request a translated reset control.
	 *
	 * The reset core calls this function as the second step in
	 * implementing a client's reset_get_by_*() call, following a
	 * successful xxx_xlate() call.
	 *
	 * @reset_ctl:	The reset control struct to request; this has been
	 *		filled in by a previoux xxx_xlate() function call.
	 * @return 0 if OK, or a negative error code.
	 */
	int (*request)(struct reset_ctl *reset_ctl);
	/**
	 * free - Free a previously requested reset control.
	 *
	 * This is the implementation of the client reset_free() API.
	 *
	 * @reset_ctl:	The reset control to free.
	 * @return 0 if OK, or a negative error code.
	 */
	int (*free)(struct reset_ctl *reset_ctl);
	/**
	 * rst_assert - Assert a reset signal.
	 *
	 * Note: This function is named rst_assert not assert to avoid
	 * conflicting with global macro assert().
	 *
	 * @reset_ctl:	The reset signal to assert.
	 * @return 0 if OK, or a negative error code.
	 */
	int (*rst_assert)(struct reset_ctl *reset_ctl);
	/**
	 * rst_deassert - Deassert a reset signal.
	 *
	 * @reset_ctl:	The reset signal to deassert.
	 * @return 0 if OK, or a negative error code.
	 */
	int (*rst_deassert)(struct reset_ctl *reset_ctl);
};

#endif
