/* ------------------------------------------
 * Copyright (c) 2017, Synopsys, Inc. All rights reserved.

 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:

 * 1) Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.

 * 2) Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation and/or
 * other materials provided with the distribution.

 * 3) Neither the name of the Synopsys, Inc., nor the names of its contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.

 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * \version 2017.03
 * \date 2014-06-25
 * \author Huaqi Fang(Huaqi.Fang@synopsys.com)
--------------------------------------------- */

/**
 * \file
 * \brief   DesignWare SPI driver header file
 * \ingroup DEVICE_DW_SPI
 */

#ifndef _DEVICE_DW_SPI_H_
#define _DEVICE_DW_SPI_H_

#include "device/device_hal/inc/dev_spi.h"

/**
 * if this header file is included,
 * will indicate that this designware spi device
 * is used
 */
#define DEVICE_USE_DESIGNWARE_SPI

#define DW_SPI_IN_FREE          (0)                 /*!< Currently not in spi transfer */
#define DW_SPI_IN_XFER          (DEV_IN_TX|DEV_IN_RX|DEV_IN_XFER)   /*!< Currently in spi transfer */
#define DW_SPI_IN_TX            (DEV_IN_TX|DEV_IN_XFER)         /*!< Currently in spi tx */
#define DW_SPI_IN_RX            (DEV_IN_RX|DEV_IN_XFER)         /*!< Currently in spi rx */

#define DW_SPI_GINT_DISABLED        (0)     /*!< designware interrupt disabled for control iic irq/fiq */
#define DW_SPI_GINT_ENABLE      (1<<0)      /*!< designware interrupt enabled for control iic irq/fiq */

#define DW_SPI_MASTER_SUPPORTED     (0x1)   /*!< Support Designware SPI Master Mode */
#define DW_SPI_SLAVE_SUPPORTED      (0x2)   /*!< Support Designware SPI Slave Mode */
/*!< Support Designware SPI Both Master and Slave Mode */
#define DW_SPI_BOTH_SUPPORTED       (DW_SPI_MASTER_SUPPORTED|DW_SPI_SLAVE_SUPPORTED)

/**
 * \defgroup    DEVICE_DW_SPI_REGSTRUCT     DesignWare SPI Register Structure
 * \ingroup DEVICE_DW_SPI
 * \brief   contains definitions of DesignWare SPI register structure.
 * \details detailed description of DesignWare SPI register information
 * @{
 */
/**
 * \brief   DesignWare SPI register structure
 * \details Detailed struct description of DesignWare SPI
 *  block register information, implementation of dev_spi_info::spi_regs
 */
typedef volatile struct dw_spi_reg
{
    /*!< Control Register */
    /*!< SPI Control Register 0  (0x0) */
    uint32_t CTRLR0;
    /*!< SPI Control Register 1  (0x4) */
    uint32_t CTRLR1;
    /*!< Enable Register */
    /*!< SPI Enable Register  (0x8) */
    uint32_t SSIENR;
    /*!< SPI Microwire Control Register  (0xC) */
    uint32_t MWCR;
    /*!< SPI Slave Enable Register  (0x10) */
    uint32_t SER;
    /*!< SPI Baud Rate Select Register  (0x14) */
    uint32_t BAUDR;
    /*!< TX and RX FIFO Control Register */
    /*!< SPI Transmit FIFO Threshold Level Register  (0x18) */
    uint32_t TXFTLR;
    /*!< SPI Receive  FIFO Threshold Level Register  (0x1C) */
    uint32_t RXFTLR;
    /*!< SPI Transmit FIFO Level Register  (0x20) */
    uint32_t TXFLR;
    /*!< SPI Receive  FIFO Level Register  (0x24) */
    uint32_t RXFLR;
    /*!< SPI Status   Register  (0x28) */
    uint32_t SR;
    /*!< Interrupt Enable/Disable/Control Registers */
    /*!< SPI Interrupt Mask Register  (0x2C) */
    uint32_t IMR;
    /*!< SPI Interrupt Status Register  (0x30) */
    uint32_t ISR;
    /*!< SPI Raw Interrupt Status Register (0x34) */
    uint32_t RISR;
    /*!< SPI Transmit FIFO Overflow Interrupt Clear Register  (0x38) */
    uint32_t TXOICR;
    /*!< SPI Receive  FIFO Overflow Interrupt Clear Register  (0x3C) */
    uint32_t RXOICR;
    /*!< SPI Receive FIFO Underflow Interrupt Clear Register  (0x40) */
    uint32_t RXUICR;
    /*!< SPI Multi-Master Interrupt Clear Register  (0x44) */
    uint32_t MSTICR;
    /*!< SPI Interrupt Clear Register  (0x48) */
    uint32_t ICR;
    /*!< DMA Control Register  (0x4C) */
    uint32_t DMACR;
    /*!< DMA Transmit Data Level  (0x50) */
    uint32_t DMATDLR;
    /*!< DMA Receive Data Level  (0x54) */
    uint32_t DMARDLR;
    /*!< SPI Identification Register  (0x58) */
    uint32_t IDR;
    /*!< SPI CoreKit ID Register (Value after Reset : 0x3332322A)  (0x5C) */
    uint32_t SSI_VER_ID;
    /*!< Data Register */
    /*!< SPI DATA Register for both Read and Write  (0x60) */
    uint32_t DATAREG;
} DW_SPI_REG, *DW_SPI_REG_PTR;
/** @} */

/** Designware SPI Message Transfer */
typedef struct dw_spi_transfer
{
    uint32_t xfer_len;
    uint32_t tx_idx;
    uint32_t rx_idx;
    uint32_t nbytes;
    DEV_SPI_TRANSFER *tx_xfer;
    DEV_SPI_TRANSFER *rx_xfer;
} DW_SPI_TRANSFER, *DW_SPI_TRANSFER_PTR;

/**
 * \brief   DesignWare SPI control structure definition
 * \details implement of dev_spi_info::dev_spi_info
 */
typedef struct dw_spi_ctrl
{
    DW_SPI_REG *dw_spi_regs;    /*!< spi register */
    /* Variables which should be set during object implementation */
    uint32_t support_modes;     /*!< supported spi modes */
    uint32_t intno;         /*!< interrupt no */
    uint32_t dw_apb_bus_freq;   /*!< spi ip apb bus frequency */
    uint32_t tx_fifo_len;       /*!< transmit fifo length */
    uint32_t rx_fifo_len;       /*!< receive fifo length */
    INT_HANDLER dw_spi_int_handler; /*!< spi interrupt handler */
    /* Variables which always change during iic operation */
    uint32_t int_status;        /*!< iic interrupt status */
    DW_SPI_TRANSFER dw_xfer;    /*!< designware spi transfer */
} DW_SPI_CTRL, *DW_SPI_CTRL_PTR;

#ifdef __cplusplus
extern "C" {
#endif

/**
 * \defgroup    DEVICE_DW_SPI_FUNCDLR       DesignWare SPI Function Declaration
 * \ingroup DEVICE_DW_SPI
 * \brief   contains declarations of designware spi functions.
 * \details This are only used in \ref dw_spi_obj.c
 * @{
 */
extern int32_t dw_spi_open(DEV_SPI *spi_obj, uint32_t mode, uint32_t param);
extern int32_t dw_spi_close(DEV_SPI *spi_obj);
extern int32_t dw_spi_control(DEV_SPI *spi_obj, uint32_t ctrl_cmd, void *param);
extern int32_t dw_spi_write(DEV_SPI *spi_obj, const void *data, uint32_t len);
extern int32_t dw_spi_read(DEV_SPI *spi_obj, void *data, uint32_t len);
extern void dw_spi_isr(DEV_SPI *spi_obj, void *ptr);
/** @} */

#ifdef __cplusplus
}
#endif

/** @} */

#endif /* _DEVICE_DW_SPI_H_ */
