/*
 * Copyright  2019 NXP
 * All rights reserved.
 *
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef _FSL_CODEC_I2C_H_
#define _FSL_CODEC_I2C_H_

#include "fsl_common.h"
#include "fsl_adapter_i2c.h"

/*!
 * @addtogroup codec_i2c
 * @{
 */

/*******************************************************************************
 * Definitions
 ******************************************************************************/
/*! @brief codec i2c handler */
#ifndef CODEC_I2C_MASTER_HANDLER_SIZE
#define CODEC_I2C_MASTER_HANDLER_SIZE HAL_I2C_MASTER_HANDLE_SIZE
#endif

/*! @brief CODEC device register address type. */
typedef enum _codec_reg_addr
{
    kCODEC_RegAddr8Bit  = 1U, /*!< 8-bit register address.  */
    kCODEC_RegAddr16Bit = 2U, /*!< 16-bit register address. */
} codec_reg_addr_t;

/*! @brief CODEC device register width. */
typedef enum _codec_reg_width
{
    kCODEC_RegWidth8Bit  = 1U, /*!< 8-bit register width.  */
    kCODEC_RegWidth16Bit = 2U, /*!< 16-bit register width. */
    kCODEC_RegWidth32Bit = 4U, /*!< 32-bit register width. */
} codec_reg_width_t;

/*! @brief CODEC I2C configurations structure */
typedef struct _codec_i2c_config
{
    uint32_t codecI2CInstance;    /*!< i2c bus instance */
    uint32_t codecI2CSourceClock; /*!< i2c bus source clock frequency */
} codec_i2c_config_t;

/*******************************************************************************
 * API
 ******************************************************************************/
#if defined(__cplusplus)
extern "C" {
#endif

/*!
 * @brief Codec i2c bus initilization.
 *
 * @param handle i2c master handle.
 * @param i2cInstance instance number of the i2c bus, such as 0 is corresponding to I2C0.
 * @param i2cBaudrate i2c baudrate.
 * @param i2cSourceClockHz i2c source clock frequency.
 * @return kStatus_HAL_I2cSuccess is success, else initial failed.
 */
status_t CODEC_I2C_Init(void *handle, uint32_t i2cInstance, uint32_t i2cBaudrate, uint32_t i2cSourceClockHz);

/*!
 * @brief Codec i2c de-initilization.
 *
 * @param handle i2c master handle.
 * @return kStatus_HAL_I2cSuccess is success, else deinitial failed.
 */
status_t CODEC_I2C_Deinit(void *handle);

/*!
 * @brief codec i2c send function.
 *
 * @param handle i2c master handle.
 * @param deviceAddress codec device address.
 * @param subAddress register address.
 * @param subaddressSize register address width.
 * @param txBuff tx buffer pointer.
 * @param txBuffSize tx buffer size.
 * @return kStatus_HAL_I2cSuccess is success, else send failed.
 */
status_t CODEC_I2C_Send(void *handle,
                        uint8_t deviceAddress,
                        uint32_t subAddress,
                        uint8_t subaddressSize,
                        uint8_t *txBuff,
                        uint8_t txBuffSize);

/*!
 * @brief codec i2c receive function.
 *
 * @param handle i2c master handle.
 * @param deviceAddress codec device address.
 * @param subAddress register address.
 * @param subaddressSize register address width.
 * @param rxBuff rx buffer pointer.
 * @param rxBuffSize rx buffer size.
 * @return kStatus_HAL_I2cSuccess is success, else receive failed.
 */
status_t CODEC_I2C_Receive(void *handle,
                           uint8_t deviceAddress,
                           uint32_t subAddress,
                           uint8_t subaddressSize,
                           uint8_t *rxBuff,
                           uint8_t rxBuffSize);

#if defined(__cplusplus)
}
#endif

/*! @} */
#endif /* _FSL_CODEC_I2C_H_ */
