/* Copyright (C) 2018 RDA Technologies Limited and/or its affiliates("RDA").
 * All rights reserved.
 *
 * This software is supplied "AS IS" without any warranties.
 * RDA assumes no responsibility or liability for the use of the software,
 * conveys no license or title under any patent, copyright, or mask work
 * right to the product. RDA reserves the right to make changes in the
 * software without notification.  RDA also make no representation or
 * warranty that such application will be suitable for the specified use
 * without further testing or modification.
 */

#ifndef _I2C_MASTER_H_
#define _I2C_MASTER_H_

// Auto generated by dtools(see dtools.txt for its version).
// Don't edit it manually!

#define REG_I2C_MASTER1_BASE (0x04807000)
#define REG_I2C_MASTER2_BASE (0x04808000)
#define REG_I2C_MASTER3_BASE (0x51504000)

typedef volatile struct
{
    uint32_t ctrl;        // 0x00000000
    uint32_t status;      // 0x00000004
    uint32_t txrx_buffer; // 0x00000008
    uint32_t cmd;         // 0x0000000c
    uint32_t irq_clr;     // 0x00000010
} HWP_I2C_MASTER_T;

#define hwp_i2cMaster1 ((HWP_I2C_MASTER_T *)REG_ACCESS_ADDRESS(REG_I2C_MASTER1_BASE))
#define hwp_i2cMaster2 ((HWP_I2C_MASTER_T *)REG_ACCESS_ADDRESS(REG_I2C_MASTER2_BASE))
#define hwp_i2cMaster3 ((HWP_I2C_MASTER_T *)REG_ACCESS_ADDRESS(REG_I2C_MASTER3_BASE))

// ctrl
typedef union {
    uint32_t v;
    struct
    {
        uint32_t en : 1;              // [0]
        uint32_t __7_1 : 7;           // [7:1]
        uint32_t irq_mask : 1;        // [8]
        uint32_t __15_9 : 7;          // [15:9]
        uint32_t clock_prescale : 16; // [31:16]
    } b;
} REG_I2C_MASTER_CTRL_T;

// status
typedef union {
    uint32_t v;
    struct
    {
        uint32_t irq_cause : 1;  // [0], read only
        uint32_t __3_1 : 3;      // [3:1]
        uint32_t irq_status : 1; // [4], read only
        uint32_t __7_5 : 3;      // [7:5]
        uint32_t tip : 1;        // [8], read only
        uint32_t __11_9 : 3;     // [11:9]
        uint32_t al : 1;         // [12], read only
        uint32_t __15_13 : 3;    // [15:13]
        uint32_t busy : 1;       // [16], read only
        uint32_t __19_17 : 3;    // [19:17]
        uint32_t rxack : 1;      // [20], read only
        uint32_t __31_21 : 11;   // [31:21]
    } b;
} REG_I2C_MASTER_STATUS_T;

// txrx_buffer
typedef union {
    uint32_t v;
    struct
    {
        uint32_t tx_data : 8; // [7:0]
        uint32_t rx_data : 8; // [7:0], read only
        uint32_t __31_8 : 24; // [31:8]
    } b;
} REG_I2C_MASTER_TXRX_BUFFER_T;

// cmd
typedef union {
    uint32_t v;
    struct
    {
        uint32_t ack : 1;      // [0]
        uint32_t __3_1 : 3;    // [3:1]
        uint32_t rd : 1;       // [4]
        uint32_t __7_5 : 3;    // [7:5]
        uint32_t sto : 1;      // [8]
        uint32_t __11_9 : 3;   // [11:9]
        uint32_t rw : 1;       // [12]
        uint32_t __15_13 : 3;  // [15:13]
        uint32_t sta : 1;      // [16]
        uint32_t __31_17 : 15; // [31:17]
    } b;
} REG_I2C_MASTER_CMD_T;

// irq_clr
typedef union {
    uint32_t v;
    struct
    {
        uint32_t irq_clr : 1; // [0], write clear
        uint32_t __31_1 : 31; // [31:1]
    } b;
} REG_I2C_MASTER_IRQ_CLR_T;

// ctrl
#define I2C_MASTER_EN (1 << 0)
#define I2C_MASTER_IRQ_MASK (1 << 8)
#define I2C_MASTER_CLOCK_PRESCALE(n) (((n)&0xffff) << 16)

// status
#define I2C_MASTER_IRQ_CAUSE (1 << 0)
#define I2C_MASTER_IRQ_STATUS (1 << 4)
#define I2C_MASTER_TIP (1 << 8)
#define I2C_MASTER_AL (1 << 12)
#define I2C_MASTER_BUSY (1 << 16)
#define I2C_MASTER_RXACK (1 << 20)

// txrx_buffer
#define I2C_MASTER_TX_DATA(n) (((n)&0xff) << 0)
#define I2C_MASTER_RX_DATA(n) (((n)&0xff) << 0)

// cmd
#define I2C_MASTER_ACK (1 << 0)
#define I2C_MASTER_RD (1 << 4)
#define I2C_MASTER_STO (1 << 8)
#define I2C_MASTER_RW (1 << 12)
#define I2C_MASTER_STA (1 << 16)

// irq_clr
#define I2C_MASTER_IRQ_CLR (1 << 0)

#endif // _I2C_MASTER_H_
