/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Support for Intel Camera Imaging ISP subsystem.
 * Copyright (c) 2015, Intel Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 */

#ifndef __FIFO_MONITOR_PUBLIC_H_INCLUDED__
#define __FIFO_MONITOR_PUBLIC_H_INCLUDED__

#include "system_local.h"

typedef struct fifo_channel_state_s		fifo_channel_state_t;
typedef struct fifo_switch_state_s		fifo_switch_state_t;
typedef struct fifo_monitor_state_s		fifo_monitor_state_t;

/*! Set a fifo switch multiplex

 \param	ID[in]				FIFO_MONITOR identifier
 \param	switch_id[in]		fifo switch identifier
 \param	sel[in]				fifo switch selector

 \return none, fifo_switch[switch_id].sel = sel
 */
STORAGE_CLASS_FIFO_MONITOR_H void fifo_switch_set(
    const fifo_monitor_ID_t		ID,
    const fifo_switch_t			switch_id,
    const hrt_data				sel);

/*! Get a fifo switch multiplex

 \param	ID[in]				FIFO_MONITOR identifier
 \param	switch_id[in]		fifo switch identifier

 \return fifo_switch[switch_id].sel
 */
STORAGE_CLASS_FIFO_MONITOR_H hrt_data fifo_switch_get(
    const fifo_monitor_ID_t		ID,
    const fifo_switch_t			switch_id);

/*! Read the state of FIFO_MONITOR[ID]

 \param	ID[in]				FIFO_MONITOR identifier
 \param	state[out]			fifo monitor state structure

 \return none, state = FIFO_MONITOR[ID].state
 */
void fifo_monitor_get_state(
    const fifo_monitor_ID_t		ID,
    fifo_monitor_state_t		*state);

/*! Read the state of a fifo channel

 \param	ID[in]				FIFO_MONITOR identifier
 \param	channel_id[in]		fifo channel identifier
 \param	state[out]			fifo channel state structure

 \return none, state = fifo_channel[channel_id].state
 */
void fifo_channel_get_state(
    const fifo_monitor_ID_t		ID,
    const fifo_channel_t		channel_id,
    fifo_channel_state_t		*state);

/*! Read the state of a fifo switch

 \param	ID[in]				FIFO_MONITOR identifier
 \param	switch_id[in]		fifo switch identifier
 \param	state[out]			fifo switch state structure

 \return none, state = fifo_switch[switch_id].state
 */
void fifo_switch_get_state(
    const fifo_monitor_ID_t		ID,
    const fifo_switch_t			switch_id,
    fifo_switch_state_t			*state);

/*! Write to a control register of FIFO_MONITOR[ID]

 \param	ID[in]				FIFO_MONITOR identifier
 \param	reg[in]				register index
 \param value[in]			The data to be written

 \return none, FIFO_MONITOR[ID].ctrl[reg] = value
 */
STORAGE_CLASS_FIFO_MONITOR_H void fifo_monitor_reg_store(
    const fifo_monitor_ID_t		ID,
    const unsigned int			reg,
    const hrt_data				value);

/*! Read from a control register of FIFO_MONITOR[ID]

 \param	ID[in]				FIFO_MONITOR identifier
 \param	reg[in]				register index
 \param value[in]			The data to be written

 \return FIFO_MONITOR[ID].ctrl[reg]
 */
STORAGE_CLASS_FIFO_MONITOR_H hrt_data fifo_monitor_reg_load(
    const fifo_monitor_ID_t		ID,
    const unsigned int			reg);

#endif /* __FIFO_MONITOR_PUBLIC_H_INCLUDED__ */
