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

#include "fsl_wm8524.h"

/*******************************************************************************
 * Definitions
 ******************************************************************************/

/*******************************************************************************
 * Prototypes
 ******************************************************************************/

/*******************************************************************************
 * Variables
 ******************************************************************************/

/*******************************************************************************
 * Code
 ******************************************************************************/

/*!
 * brief Initializes WM8524.
 *
 * param handle WM8524 handle structure.
 * param config WM8524 configure structure.
 * return kStatus_Success.
 */
status_t WM8524_Init(wm8524_handle_t *handle, wm8524_config_t *config)
{
    assert(config != NULL);
    wm8524_config_t *wm8524Config = (wm8524_config_t *)config;

    handle->config = config;

    if (wm8524Config->setProtocol)
    {
        /* set format */
        WM8524_ConfigFormat(handle, wm8524Config->protocol);
    }

    /* Unmute codec */
    wm8524Config->setMute(kWM8524_Unmute);

    return kStatus_Success;
}

/*!
 * brief Configure WM8524 audio protocol.
 *
 * param handle WM8524 handle structure.
 * param protocol WM8524 configuration structure.
 */
void WM8524_ConfigFormat(wm8524_handle_t *handle, wm8524_protocol_t protocol)
{
    assert(handle->config != NULL);
    assert(handle->config->setProtocol != NULL);

    wm8524_config_t *wm8524Config = (wm8524_config_t *)handle->config;

    if (protocol != kWM8524_ProtocolRightJustified)
    {
        wm8524Config->setProtocol((uint32_t)protocol);
    }
}

/*!
 * brief Sets the codec mute state.
 *
 * param handle WM8524 handle structure.
 * param isMute true means mute, false means normal.
 */
void WM8524_SetMute(wm8524_handle_t *handle, bool isMute)
{
    assert(handle->config != NULL);
    assert(handle->config->setMute != NULL);

    wm8524_config_t *wm8524Config = (wm8524_config_t *)handle->config;

    wm8524Config->setMute(!isMute);
}
