/* i2c_dw_registers.h - array access for I2C Design Ware registers */

/*
 * Copyright (c) 2015 Intel Corporation
 *
 * 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 __DRIVERS_I2C_DW_REGISTERS_H
#define __DRIVERS_I2C_DW_REGISTERS_H

#ifdef __cplusplus
extern "C" {
#endif

/*  IC_CON bits */
#define IC_CON_TX_INTR_MODE			(1 << 8)
#define IC_CON_STOP_DET_IFADDR			(1 << 7)
#define IC_CON_SLAVE_DISABLE			(1 << 6)
#define IC_CON_RESTART_EN			(1 << 5)
#define IC_CON_10BIT_ADDR_MASTER		(1 << 4)
#define IC_CON_10BIT_ADDR_SLAVE			(1 << 3)
#define IC_CON_SPEED_MASK			(2 << 1)
#define IC_CON_MASTER_MODE			(1 << 0)

union ic_con_register {
	uint16_t                raw;
	struct {
		uint16_t         master_mode : 1 __packed;
		uint16_t         speed : 2 __packed;
		uint16_t         addr_slave_10bit : 1 __packed;
		uint16_t         addr_master_10bit : 1 __packed;
		uint16_t         restart_en : 1 __packed;
		uint16_t         slave_disable : 1 __packed;
		uint16_t         stop_det : 1 __packed;
		uint16_t         tx_empty_ctl : 1 __packed;
		uint16_t         rx_fifo_full : 1 __packed;
	} bits;
};


/* IC_DATA_CMD bits */
#define IC_DATA_CMD_DAT_MASK		0xFF
#define IC_DATA_CMD_CMD			(1 << 8)
#define IC_DATA_CMD_STOP		(1 << 9)
#define IC_DATA_CMD_RESTART		(1 << 10)

union ic_data_cmd_register {
	uint16_t                raw;
	struct {
	       uint16_t         dat : 8 __packed;
	       uint16_t         cmd : 1 __packed;
	       uint16_t         stop : 1 __packed;
	       uint16_t         restart : 1 __packed;
	       uint16_t         reserved : 4 __packed;
	} bits;
};

/* IC_ENABLE register bits */
#define IC_ENABLE_ENABLE		(1 << 0)
#define IC_ENABLE_ABORT			(1 << 1)

union ic_enable_register {
	uint16_t		raw;
	struct {
		uint16_t	enable : 1 __packed;
		uint16_t	abort : 1 __packed;
		uint16_t	reserved : 13 __packed;
	} bits;
};


/* DesignWare Interrupt bits positions */
#define DW_INTR_STAT_RX_UNDER		(1 << 0)
#define DW_INTR_STAT_RX_OVER		(1 << 1)
#define DW_INTR_STAT_RX_FULL		(1 << 2)
#define DW_INTR_STAT_TX_OVER		(1 << 3)
#define DW_INTR_STAT_TX_EMPTY		(1 << 4)
#define DW_INTR_STAT_RD_REQ		(1 << 5)
#define DW_INTR_STAT_TX_ABRT		(1 << 6)
#define DW_INTR_STAT_RX_DONE		(1 << 7)
#define DW_INTR_STAT_ACTIVITY		(1 << 8)
#define DW_INTR_STAT_STOP_DET		(1 << 9)
#define DW_INTR_STAT_START_DET		(1 << 10)
#define DW_INTR_STAT_GEN_CALL		(1 << 11)
#define DW_INTR_STAT_RESTART_DET	(1 << 12)
#define DW_INTR_STAT_MST_ON_HOLD	(1 << 13)


union ic_interrupt_register {
	uint16_t			raw;
	struct {
		uint16_t	rx_under : 1 __packed;
		uint16_t	rx_over : 1 __packed;
		uint16_t	rx_full : 1 __packed;
		uint16_t	tx_over : 1 __packed;
		uint16_t	tx_empty : 1 __packed;
		uint16_t	rd_req : 1 __packed;
		uint16_t	tx_abrt : 1 __packed;
		uint16_t	rx_done : 1 __packed;
		uint16_t	activity : 1 __packed;
		uint16_t	stop_det : 1 __packed;
		uint16_t	start_det : 1 __packed;
		uint16_t	gen_call : 1 __packed;
		uint16_t	restart_det : 1 __packed;
		uint16_t	mst_on_hold : 1 __packed;
		uint16_t	reserved : 2 __packed;
	} bits;
};


/* IC_TAR */
union ic_tar_register {
	uint16_t		raw;
	struct {
		uint16_t	ic_tar : 9 __packed;
		uint16_t	gc_or_start : 1 __packed;
		uint16_t	special : 1 __packed;
		uint16_t	ic_10bitaddr_master : 1 __packed;
		uint16_t	reserved : 3 __packed;
	} bits;
};


/* IC_SAR */
union ic_sar_register {
	uint16_t		raw;
	struct {
		uint16_t	ic_sar : 9 __packed;
		uint16_t	reserved : 6 __packed;
	} bits;
};


/* IC_STATUS */
union ic_status_register {
	uint32_t		raw;
	struct {
		uint32_t	activity : 1 __packed;
		uint32_t	tfnf : 1 __packed;
		uint32_t	tfe : 1 __packed;
		uint32_t	rfne : 1 __packed;
		uint32_t	rff : 1 __packed;
		uint32_t	mst_activity : 1 __packed;
		uint32_t	slv_activity : 1 __packed;
		uint32_t	reserved : 24 __packed;
	} bits;
};


union ic_comp_param_1_register {
	uint32_t			raw;
	struct {
		uint32_t		apb_data_width : 2 __packed;
		uint32_t		max_speed_mode : 2 __packed;
		uint32_t		hc_count_values : 1 __packed;
		uint32_t		intr_io : 1 __packed;
		uint32_t		has_dma : 1 __packed;
		uint32_t		add_encoded_params : 1 __packed;
		uint32_t		rx_buffer_depth : 8 __packed;
		uint32_t		tx_buffer_depth : 8 __packed;
		uint32_t		reserved : 7 __packed;
	} bits;
};


/*
 * instantiate this like:
 *  volatile struct i2c_dw_registers *regs = (struct i2c_dw_regs *)0x80000000;
 *
 *  If this is being set as a global, use the following change to avoid the
 *  base pointer from being reloaded after function calls:
 *  volatile struct i2c_dw_regs* const *regs = (struct i2c_dw_regs*)0x80000000;
 *
 *  This will allow access to the registers like so:
 *  x = regs->ctrlreg;
 *  regs->ctrlreg = newval;
 */
struct i2c_dw_registers {
	union ic_con_register ic_con;	/* offset 0x00 */
	uint16_t dummy1;
	union ic_tar_register ic_tar;	/* offset 0x04 */
	uint16_t dummy2;
	union ic_sar_register ic_sar;	/* offset 0x08 */
	uint16_t dummy3;
	uint16_t ic_hs_maddr;		/* offset 0x0C */
	uint16_t dummy4;
	union ic_data_cmd_register ic_data_cmd;		/* offset 0x10 */
	uint16_t dummy5;
	uint16_t ic_ss_scl_hcnt;	/* offset 0x14 */
	uint16_t dummy6;
	uint16_t ic_ss_scl_lcnt;	/* offset 0x18 */
	uint16_t dummy7;
	uint16_t ic_fs_scl_hcnt;	/* offset 0x1C */
	uint16_t dummy8;
	uint16_t ic_fs_scl_lcnt;	/* offset 0x20 */
	uint16_t dummy9;
	uint16_t ic_hs_scl_hcnt;	/* offset 0x24 */
	uint16_t dummy10;
	uint16_t ic_hs_scl_lcnt;	/* offset 0x28 */
	uint16_t dummy11;
	union ic_interrupt_register ic_intr_stat;	/* offset 0x2C */
	uint16_t dummy12;
	union ic_interrupt_register ic_intr_mask;	/* offset 0x30 */
	uint16_t dummy13;
	union ic_interrupt_register ic_raw_intr_stat;	/* offset 0x34 */
	uint16_t dummy14;
	uint16_t ic_rx_tl;		/* offset 0x38 */
	uint16_t dummy15;
	uint16_t ic_tx_tl;		/* offset 0x3C */
	uint16_t dummy16;
	uint16_t ic_clr_intr;		/* offset 0x40 */
	uint16_t dummy17;
	uint16_t ic_clr_rx_under;	/* offset 0x44 */
	uint16_t dummy18;
	uint16_t ic_clr_rx_over;	/* offset 0x48 */
	uint16_t dummy19;
	uint16_t ic_clr_tx_over;	/* offset 0x4C */
	uint16_t dummy20;
	uint16_t ic_clr_rd_req;		/* offset 0x50 */
	uint16_t dummy21;
	uint16_t ic_clr_tx_abrt;	/* offset 0x54 */
	uint16_t dummy22;
	uint16_t ic_clr_rx_done;	/* offset 0x58 */
	uint16_t dummy23;
	uint16_t ic_clr_activity;	/* offset 0x5C */
	uint16_t dummy24;
	uint16_t ic_clr_stop_det;	/* offset 0x60 */
	uint16_t dummy25;
	uint16_t ic_clr_start_det;	/* offset 0x64 */
	uint16_t dummy26;
	uint16_t ic_clr_gen_call;	/* offset 0x68 */
	uint16_t dummy27;
	union ic_enable_register ic_enable;	/* offset 0x6c */
	uint16_t dummy28;
	union ic_status_register ic_status;	/* offset 0x70 */
	uint32_t ic_txflr;		/* offset 0x74 */
	uint32_t ic_rxflr;		/* offset 0x78 */
	uint32_t ic_sda_hold;		/* offset 0x7C */
	uint32_t ic_tx_abrt_source;	/* offset 0x80 */
	uint32_t ic_slv_data_nack_only; /* offset 0x84 */
	uint32_t ic_dma_cr;		/* offset 0x88 */
	uint32_t ic_dma_tdlr;		/* offset 0x8C */
	uint32_t ic_dma_rdlr;		/* offset 0x90 */
	uint32_t ic_sda_setup;		/* offset 0x94 */
	uint32_t ic_ack_general_call;	/* offset 0x98 */
	uint32_t ic_enable_status;	/* offset 0x9C */
	uint32_t ic_fs_spklen;		/* offset 0xA0 */
	uint32_t ic_hs_spklen;		/* offset 0xA4 */
	uint16_t ic_clr_restart_det;	/* offset 0xA8 */
	uint8_t	 filler[74];
	union ic_comp_param_1_register ic_comp_param_1;	/* offset 0xF4 */
	uint32_t ic_comp_version;	/* offset 0xF8 */
	uint32_t ic_comp_type;		/* offset 0xFC */
};

#ifdef __cplusplus
}
#endif

#endif /* __DRIVERS_I2C_DW_REGISTERS_H */
