/*
 * Copyright 2023 Google LLC
 * Copyright lowRISC contributors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


#ifndef OPENTITAN_SW_DEVICE_LIB_DIF_DIF_I2S_H_
#define OPENTITAN_SW_DEVICE_LIB_DIF_DIF_I2S_H_

// #error "This file is a template, and not real code."

/**
 * @file
 * @brief <a href="/hw/ip/i2s/doc/">I2S Audio</a> Device Interface Functions
 */

#include <stdint.h>

#include "sw/device/lib/dif/autogen/dif_i2s_autogen.h"

#ifdef __cplusplus
extern "C" {
#endif  // __cplusplus

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wextern-c-compat"
/**
 * Runtime configuration for I2S Audio.
 *
 * This struct describes (SOFTWARE) runtime information for one-time
 * configuration of the hardware.
 */
typedef struct dif_i2s_config {
  // Fields, if necessary.
} dif_i2s_config_t;


/**
 * Parameters for a I2S Audio transaction.
 */
typedef struct dif_i2s_transaction {
  // Your fields here.
} dif_i2s_transaction_t;

/**
 * An output location for a I2S Audio transaction.
 */
typedef struct dif_i2s_output {
  // Your fields here.
} dif_i2s_output_t;
#pragma clang diagnostic pop

/**
 * Configures I2S Audio with runtime information.
 *
 * This function should only need to be called once for the lifetime of
 * `handle`.
 *
 * @param i2s A I2S Audio handle.
 * @param config Runtime configuration parameters.
 * @return The result of the operation.
 */
OT_WARN_UNUSED_RESULT
dif_result_t dif_i2s_configure(
  const dif_i2s_t *i2s,
  dif_i2s_config_t config);

/**
 * Begins a I2S Audio transaction.
 *
 * Each call to this function should be sequenced with a call to
 * `dif_i2s_end()`.
 *
 * @param i2s A I2S Audio handle.
 * @param transaction Transaction configuration parameters.
 * @return The result of the operation.
 */
OT_WARN_UNUSED_RESULT
dif_result_t dif_i2s_start(
  const dif_i2s_t *i2s,
  dif_i2s_transaction_t transaction);

/** Ends a I2S Audio transaction, writing the results to the given output.
 *
 * @param i2s A I2S Audio handle.
 * @param output Transaction output parameters.
 * @return The result of the operation.
 */
OT_WARN_UNUSED_RESULT
dif_result_t dif_i2s_end(
  const dif_i2s_t *i2s,
  dif_i2s_output_t output);

/**
 * Locks out I2S Audio functionality.
 *
 * This function is reentrant: calling it while functionality is locked will
 * have no effect and return `kDifOk`.
 *
 * @param i2s A I2S Audio handle.
 * @return The result of the operation.
 */
OT_WARN_UNUSED_RESULT
dif_result_t dif_i2s_lock(
  const dif_i2s_t *i2s);

/**
 * Checks whether this I2S Audio is locked.
 *
 * @param i2s A I2S Audio handle.
 * @param[out] is_locked Out-param for the locked state.
 * @return The result of the operation.
 */
OT_WARN_UNUSED_RESULT
dif_result_t dif_i2s_is_locked(
  const dif_i2s_t *i2s,
  bool *is_locked);

/**
 * Checks whether the I2S RX FIFO is empty.
 *
 * @param i2s An I2S Audio handle.
 * @param[out] empty Out-param for the empty state.
 * @return The result of the operation.
 */
OT_WARN_UNUSED_RESULT
dif_result_t dif_i2s_rxfifo_empty(const dif_i2s_t *i2s, bool *empty);

/**
 * Checks whether the I2S RX FIFO is empty.
 *
 * @param i2s An I2S Audio handle.
 * @param[out] full Out-param for the full state.
 * @return The result of the operation.
 */
OT_WARN_UNUSED_RESULT
dif_result_t dif_i2s_txfifo_full(const dif_i2s_t *i2s, bool *full);

#ifdef __cplusplus
}  // extern "C"
#endif  // __cplusplus

#endif  // OPENTITAN_SW_DEVICE_LIB_DIF_DIF_I2S_H_
