Linux Audio

Check our new training course

Embedded Linux Audio

Check our new training course
with Creative Commons CC-BY-SA
lecture materials

Bootlin logo

Elixir Cross Referencer

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

/*
 * Copyright (c) 2015 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */
#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			(0x3 << 1)
#define IC_CON_MASTER_MODE			(1 << 0)

union ic_con_register {
	u16_t                raw;
	struct {
		u16_t         master_mode : 1 __packed;
		u16_t         speed : 2 __packed;
		u16_t         addr_slave_10bit : 1 __packed;
		u16_t         addr_master_10bit : 1 __packed;
		u16_t         restart_en : 1 __packed;
		u16_t         slave_disable : 1 __packed;
		u16_t         stop_det : 1 __packed;
		u16_t         tx_empty_ctl : 1 __packed;
		u16_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 {
	u16_t                raw;
	struct {
	       u16_t         dat : 8 __packed;
	       u16_t         cmd : 1 __packed;
	       u16_t         stop : 1 __packed;
	       u16_t         restart : 1 __packed;
	       u16_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 {
	u16_t		raw;
	struct {
		u16_t	enable : 1 __packed;
		u16_t	abort : 1 __packed;
		u16_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 {
	u16_t			raw;
	struct {
		u16_t	rx_under : 1 __packed;
		u16_t	rx_over : 1 __packed;
		u16_t	rx_full : 1 __packed;
		u16_t	tx_over : 1 __packed;
		u16_t	tx_empty : 1 __packed;
		u16_t	rd_req : 1 __packed;
		u16_t	tx_abrt : 1 __packed;
		u16_t	rx_done : 1 __packed;
		u16_t	activity : 1 __packed;
		u16_t	stop_det : 1 __packed;
		u16_t	start_det : 1 __packed;
		u16_t	gen_call : 1 __packed;
		u16_t	restart_det : 1 __packed;
		u16_t	mst_on_hold : 1 __packed;
		u16_t	reserved : 2 __packed;
	} bits;
};


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


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


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


union ic_comp_param_1_register {
	u32_t			raw;
	struct {
		u32_t		apb_data_width : 2 __packed;
		u32_t		max_speed_mode : 2 __packed;
		u32_t		hc_count_values : 1 __packed;
		u32_t		intr_io : 1 __packed;
		u32_t		has_dma : 1 __packed;
		u32_t		add_encoded_params : 1 __packed;
		u32_t		rx_buffer_depth : 8 __packed;
		u32_t		tx_buffer_depth : 8 __packed;
		u32_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 */
	u16_t dummy1;
	union ic_tar_register ic_tar;	/* offset 0x04 */
	u16_t dummy2;
	union ic_sar_register ic_sar;	/* offset 0x08 */
	u16_t dummy3;
	u16_t ic_hs_maddr;		/* offset 0x0C */
	u16_t dummy4;
	union ic_data_cmd_register ic_data_cmd;		/* offset 0x10 */
	u16_t dummy5;
	u16_t ic_ss_scl_hcnt;	/* offset 0x14 */
	u16_t dummy6;
	u16_t ic_ss_scl_lcnt;	/* offset 0x18 */
	u16_t dummy7;
	u16_t ic_fs_scl_hcnt;	/* offset 0x1C */
	u16_t dummy8;
	u16_t ic_fs_scl_lcnt;	/* offset 0x20 */
	u16_t dummy9;
	u16_t ic_hs_scl_hcnt;	/* offset 0x24 */
	u16_t dummy10;
	u16_t ic_hs_scl_lcnt;	/* offset 0x28 */
	u16_t dummy11;
	union ic_interrupt_register ic_intr_stat;	/* offset 0x2C */
	u16_t dummy12;
	union ic_interrupt_register ic_intr_mask;	/* offset 0x30 */
	u16_t dummy13;
	union ic_interrupt_register ic_raw_intr_stat;	/* offset 0x34 */
	u16_t dummy14;
	u16_t ic_rx_tl;		/* offset 0x38 */
	u16_t dummy15;
	u16_t ic_tx_tl;		/* offset 0x3C */
	u16_t dummy16;
	u16_t ic_clr_intr;		/* offset 0x40 */
	u16_t dummy17;
	u16_t ic_clr_rx_under;	/* offset 0x44 */
	u16_t dummy18;
	u16_t ic_clr_rx_over;	/* offset 0x48 */
	u16_t dummy19;
	u16_t ic_clr_tx_over;	/* offset 0x4C */
	u16_t dummy20;
	u16_t ic_clr_rd_req;		/* offset 0x50 */
	u16_t dummy21;
	u16_t ic_clr_tx_abrt;	/* offset 0x54 */
	u16_t dummy22;
	u16_t ic_clr_rx_done;	/* offset 0x58 */
	u16_t dummy23;
	u16_t ic_clr_activity;	/* offset 0x5C */
	u16_t dummy24;
	u16_t ic_clr_stop_det;	/* offset 0x60 */
	u16_t dummy25;
	u16_t ic_clr_start_det;	/* offset 0x64 */
	u16_t dummy26;
	u16_t ic_clr_gen_call;	/* offset 0x68 */
	u16_t dummy27;
	union ic_enable_register ic_enable;	/* offset 0x6c */
	u16_t dummy28;
	union ic_status_register ic_status;	/* offset 0x70 */
	u32_t ic_txflr;		/* offset 0x74 */
	u32_t ic_rxflr;		/* offset 0x78 */
	u32_t ic_sda_hold;		/* offset 0x7C */
	u32_t ic_tx_abrt_source;	/* offset 0x80 */
	u32_t ic_slv_data_nack_only; /* offset 0x84 */
	u32_t ic_dma_cr;		/* offset 0x88 */
	u32_t ic_dma_tdlr;		/* offset 0x8C */
	u32_t ic_dma_rdlr;		/* offset 0x90 */
	u32_t ic_sda_setup;		/* offset 0x94 */
	u32_t ic_ack_general_call;	/* offset 0x98 */
	u32_t ic_enable_status;	/* offset 0x9C */
	u32_t ic_fs_spklen;		/* offset 0xA0 */
	u32_t ic_hs_spklen;		/* offset 0xA4 */
	u16_t ic_clr_restart_det;	/* offset 0xA8 */
	u8_t	 filler[74];
	union ic_comp_param_1_register ic_comp_param_1;	/* offset 0xF4 */
	u32_t ic_comp_version;	/* offset 0xF8 */
	u32_t ic_comp_type;		/* offset 0xFC */
};

#ifdef __cplusplus
}
#endif

#endif /* __DRIVERS_I2C_DW_REGISTERS_H */