#ifndef _AT91_I2C_H #define _AT91_I2C_H #define TWI_CR_START BIT(0) /* Send a Start Condition */ #define TWI_CR_MSEN BIT(2) /* Master Transfer Enable */ #define TWI_CR_STOP BIT(1) /* Send a Stop Condition */ #define TWI_CR_SVDIS BIT(5) /* Slave Transfer Disable */ #define TWI_CR_SWRST BIT(7) /* Software Reset */ #define TWI_CR_ACMEN BIT(16) /* Alternative Command Mode Enable */ #define TWI_CR_ACMDIS BIT(17) /* Alternative Command Mode Disable */ #define TWI_CR_LOCKCLR BIT(26) /* Lock Clear */ #define TWI_MMR_MREAD BIT(12) /* Master Read Direction */ #define TWI_MMR_IADRSZ_1 BIT(8) /* Internal Device Address Size */ #define TWI_SR_TXCOMP BIT(0) /* Transmission Complete */ #define TWI_SR_RXRDY BIT(1) /* Receive Holding Register Ready */ #define TWI_SR_TXRDY BIT(2) /* Transmit Holding Register Ready */ #define TWI_SR_OVRE BIT(6) /* Overrun Error */ #define TWI_SR_UNRE BIT(7) /* Underrun Error */ #define TWI_SR_NACK BIT(8) /* Not Acknowledged */ #define TWI_SR_LOCK BIT(23) /* TWI Lock due to Frame Errors */ #define TWI_ACR_DATAL(len) ((len) & 0xff) #define TWI_ACR_DIR_READ BIT(8) #define TWI_CWGR_HOLD_MAX 0x1f #define TWI_CWGR_HOLD(x) (((x) & TWI_CWGR_HOLD_MAX) << 24) struct at91_i2c_regs { u32 cr; u32 mmr; u32 smr; u32 iadr; u32 cwgr; u32 rev_0[3]; u32 sr; u32 ier; u32 idr; u32 imr; u32 rhr; u32 thr; u32 smbtr; u32 rev_1; u32 acr; u32 filtr; u32 rev_2; u32 swmr; u32 fmr; u32 flr; u32 rev_3; u32 fsr; u32 fier; u32 fidr; u32 fimr; u32 rev_4[29]; u32 wpmr; u32 wpsr; u32 rev_5[6]; }; struct at91_i2c_pdata { unsigned clk_max_div; unsigned clk_offset; }; struct at91_i2c_bus { struct at91_i2c_regs *regs; u32 status; ulong bus_clk_rate; u32 clock_frequency; u32 speed; u32 cwgr_val; const struct at91_i2c_pdata *pdata; }; #endif