171c98550STom Rini /* 271c98550STom Rini * Register definitions for the Atmel AT32/AT91 SPI Controller 371c98550STom Rini */ 471c98550STom Rini 571c98550STom Rini /* Register offsets */ 671c98550STom Rini #define ATMEL_SPI_CR 0x0000 771c98550STom Rini #define ATMEL_SPI_MR 0x0004 871c98550STom Rini #define ATMEL_SPI_RDR 0x0008 971c98550STom Rini #define ATMEL_SPI_TDR 0x000c 1071c98550STom Rini #define ATMEL_SPI_SR 0x0010 1171c98550STom Rini #define ATMEL_SPI_IER 0x0014 1271c98550STom Rini #define ATMEL_SPI_IDR 0x0018 1371c98550STom Rini #define ATMEL_SPI_IMR 0x001c 1471c98550STom Rini #define ATMEL_SPI_CSR(x) (0x0030 + 4 * (x)) 1571c98550STom Rini #define ATMEL_SPI_VERSION 0x00fc 1671c98550STom Rini 1771c98550STom Rini /* Bits in CR */ 1871c98550STom Rini #define ATMEL_SPI_CR_SPIEN BIT(0) 1971c98550STom Rini #define ATMEL_SPI_CR_SPIDIS BIT(1) 2071c98550STom Rini #define ATMEL_SPI_CR_SWRST BIT(7) 2171c98550STom Rini #define ATMEL_SPI_CR_LASTXFER BIT(24) 2271c98550STom Rini 2371c98550STom Rini /* Bits in MR */ 2471c98550STom Rini #define ATMEL_SPI_MR_MSTR BIT(0) 2571c98550STom Rini #define ATMEL_SPI_MR_PS BIT(1) 2671c98550STom Rini #define ATMEL_SPI_MR_PCSDEC BIT(2) 2771c98550STom Rini #define ATMEL_SPI_MR_FDIV BIT(3) 2871c98550STom Rini #define ATMEL_SPI_MR_MODFDIS BIT(4) 2971c98550STom Rini #define ATMEL_SPI_MR_WDRBT BIT(5) 3071c98550STom Rini #define ATMEL_SPI_MR_LLB BIT(7) 3171c98550STom Rini #define ATMEL_SPI_MR_PCS(x) (((x) & 15) << 16) 3271c98550STom Rini #define ATMEL_SPI_MR_DLYBCS(x) ((x) << 24) 3371c98550STom Rini 3471c98550STom Rini /* Bits in RDR */ 3571c98550STom Rini #define ATMEL_SPI_RDR_RD(x) (x) 3671c98550STom Rini #define ATMEL_SPI_RDR_PCS(x) ((x) << 16) 3771c98550STom Rini 3871c98550STom Rini /* Bits in TDR */ 3971c98550STom Rini #define ATMEL_SPI_TDR_TD(x) (x) 4071c98550STom Rini #define ATMEL_SPI_TDR_PCS(x) ((x) << 16) 4171c98550STom Rini #define ATMEL_SPI_TDR_LASTXFER BIT(24) 4271c98550STom Rini 4371c98550STom Rini /* Bits in SR/IER/IDR/IMR */ 4471c98550STom Rini #define ATMEL_SPI_SR_RDRF BIT(0) 4571c98550STom Rini #define ATMEL_SPI_SR_TDRE BIT(1) 4671c98550STom Rini #define ATMEL_SPI_SR_MODF BIT(2) 4771c98550STom Rini #define ATMEL_SPI_SR_OVRES BIT(3) 4871c98550STom Rini #define ATMEL_SPI_SR_ENDRX BIT(4) 4971c98550STom Rini #define ATMEL_SPI_SR_ENDTX BIT(5) 5071c98550STom Rini #define ATMEL_SPI_SR_RXBUFF BIT(6) 5171c98550STom Rini #define ATMEL_SPI_SR_TXBUFE BIT(7) 5271c98550STom Rini #define ATMEL_SPI_SR_NSSR BIT(8) 5371c98550STom Rini #define ATMEL_SPI_SR_TXEMPTY BIT(9) 5471c98550STom Rini #define ATMEL_SPI_SR_SPIENS BIT(16) 5571c98550STom Rini 5671c98550STom Rini /* Bits in CSRx */ 5771c98550STom Rini #define ATMEL_SPI_CSRx_CPOL BIT(0) 5871c98550STom Rini #define ATMEL_SPI_CSRx_NCPHA BIT(1) 5971c98550STom Rini #define ATMEL_SPI_CSRx_CSAAT BIT(3) 6071c98550STom Rini #define ATMEL_SPI_CSRx_BITS(x) ((x) << 4) 6171c98550STom Rini #define ATMEL_SPI_CSRx_SCBR(x) ((x) << 8) 6271c98550STom Rini #define ATMEL_SPI_CSRx_SCBR_MAX GENMASK(7, 0) 6371c98550STom Rini #define ATMEL_SPI_CSRx_DLYBS(x) ((x) << 16) 6471c98550STom Rini #define ATMEL_SPI_CSRx_DLYBCT(x) ((x) << 24) 6571c98550STom Rini 6671c98550STom Rini /* Bits in VERSION */ 6771c98550STom Rini #define ATMEL_SPI_VERSION_REV(x) ((x) & 0xfff) 6871c98550STom Rini #define ATMEL_SPI_VERSION_MFN(x) ((x) << 16) 6971c98550STom Rini 7071c98550STom Rini /* Constants for CSRx:BITS */ 7171c98550STom Rini #define ATMEL_SPI_BITS_8 0 7271c98550STom Rini #define ATMEL_SPI_BITS_9 1 7371c98550STom Rini #define ATMEL_SPI_BITS_10 2 7471c98550STom Rini #define ATMEL_SPI_BITS_11 3 7571c98550STom Rini #define ATMEL_SPI_BITS_12 4 7671c98550STom Rini #define ATMEL_SPI_BITS_13 5 7771c98550STom Rini #define ATMEL_SPI_BITS_14 6 7871c98550STom Rini #define ATMEL_SPI_BITS_15 7 7971c98550STom Rini #define ATMEL_SPI_BITS_16 8 8071c98550STom Rini 8171c98550STom Rini struct atmel_spi_slave { 82*10f7c0a9STom Rini struct spi_slave slave; 8371c98550STom Rini void *regs; 8471c98550STom Rini u32 mr; 8571c98550STom Rini }; 86*10f7c0a9STom Rini to_atmel_spi(struct spi_slave * slave)87*10f7c0a9STom Rinistatic inline struct atmel_spi_slave *to_atmel_spi(struct spi_slave *slave) 88*10f7c0a9STom Rini { 89*10f7c0a9STom Rini return container_of(slave, struct atmel_spi_slave, slave); 90*10f7c0a9STom Rini } 91*10f7c0a9STom Rini 92*10f7c0a9STom Rini /* Register access macros */ 93*10f7c0a9STom Rini #define spi_readl(as, reg) \ 94*10f7c0a9STom Rini readl(as->regs + ATMEL_SPI_##reg) 95*10f7c0a9STom Rini #define spi_writel(as, reg, value) \ 96*10f7c0a9STom Rini writel(value, as->regs + ATMEL_SPI_##reg) 97*10f7c0a9STom Rini 98*10f7c0a9STom Rini #if !defined(CONFIG_SYS_SPI_WRITE_TOUT) 99*10f7c0a9STom Rini #define CONFIG_SYS_SPI_WRITE_TOUT (5 * CONFIG_SYS_HZ) 100*10f7c0a9STom Rini #endif 101