1 /* 2 * SPI device spec header file 3 * 4 * Copyright (C) 1999-2019, Broadcom. 5 * 6 * Unless you and Broadcom execute a separate written software license 7 * agreement governing use of this software, this software is licensed to you 8 * under the terms of the GNU General Public License version 2 (the "GPL"), 9 * available at http://www.broadcom.com/licenses/GPLv2.php, with the 10 * following added to such license: 11 * 12 * As a special exception, the copyright holders of this software give you 13 * permission to link this software with independent modules, and to copy and 14 * distribute the resulting executable under terms of your choice, provided that 15 * you also meet, for each linked independent module, the terms and conditions 16 * of the license of that module. An independent module is a module which is 17 * not derived from this software. The special exception does not apply to any 18 * modifications of the software. 19 * 20 * Notwithstanding the above, under no circumstances may you combine this 21 * software in any way with any other Broadcom software provided under a license 22 * other than the GPL, without Broadcom's express prior written consent. 23 * 24 * 25 * <<Broadcom-WL-IPTag/Open:>> 26 * 27 * $Id: spid.h 514727 2014-11-12 03:02:48Z $ 28 */ 29 30 #ifndef _SPI_H 31 #define _SPI_H 32 33 /* 34 * Brcm SPI Device Register Map. 35 * 36 */ 37 38 typedef volatile struct { 39 uint8 config; /* 0x00, len, endian, clock, speed, polarity, wakeup */ 40 uint8 response_delay; /* 0x01, read response delay in bytes (corerev < 3) */ 41 uint8 42 status_enable; /* 0x02, status-enable, intr with status, response_delay 43 * function selection, command/data error check 44 */ 45 uint8 reset_bp; /* 0x03, reset on wlan/bt backplane reset (corerev >= 1) */ 46 uint16 intr_reg; /* 0x04, Intr status register */ 47 uint16 intr_en_reg; /* 0x06, Intr mask register */ 48 uint32 status_reg; /* 0x08, RO, Status bits of last spi transfer */ 49 uint16 50 f1_info_reg; /* 0x0c, RO, enabled, ready for data transfer, blocksize */ 51 uint16 52 f2_info_reg; /* 0x0e, RO, enabled, ready for data transfer, blocksize */ 53 uint16 54 f3_info_reg; /* 0x10, RO, enabled, ready for data transfer, blocksize */ 55 uint32 test_read; /* 0x14, RO 0xfeedbead signature */ 56 uint32 test_rw; /* 0x18, RW */ 57 uint8 resp_delay_f0; /* 0x1c, read resp delay bytes for F0 (corerev >= 3) */ 58 uint8 resp_delay_f1; /* 0x1d, read resp delay bytes for F1 (corerev >= 3) */ 59 uint8 resp_delay_f2; /* 0x1e, read resp delay bytes for F2 (corerev >= 3) */ 60 uint8 resp_delay_f3; /* 0x1f, read resp delay bytes for F3 (corerev >= 3) */ 61 } spi_regs_t; 62 63 /* SPI device register offsets */ 64 #define SPID_CONFIG 0x00 65 #define SPID_RESPONSE_DELAY 0x01 66 #define SPID_STATUS_ENABLE 0x02 67 #define SPID_RESET_BP 0x03 /* (corerev >= 1) */ 68 #define SPID_INTR_REG 0x04 /* 16 bits - Interrupt status */ 69 #define SPID_INTR_EN_REG 0x06 /* 16 bits - Interrupt mask */ 70 #define SPID_STATUS_REG 0x08 /* 32 bits */ 71 #define SPID_F1_INFO_REG 0x0C /* 16 bits */ 72 #define SPID_F2_INFO_REG 0x0E /* 16 bits */ 73 #define SPID_F3_INFO_REG 0x10 /* 16 bits */ 74 #define SPID_TEST_READ 0x14 /* 32 bits */ 75 #define SPID_TEST_RW 0x18 /* 32 bits */ 76 #define SPID_RESP_DELAY_F0 0x1c /* 8 bits (corerev >= 3) */ 77 #define SPID_RESP_DELAY_F1 0x1d /* 8 bits (corerev >= 3) */ 78 #define SPID_RESP_DELAY_F2 0x1e /* 8 bits (corerev >= 3) */ 79 #define SPID_RESP_DELAY_F3 0x1f /* 8 bits (corerev >= 3) */ 80 81 /* Bit masks for SPID_CONFIG device register */ 82 #define WORD_LENGTH_32 0x1 /* 0/1 16/32 bit word length */ 83 #define ENDIAN_BIG 0x2 /* 0/1 Little/Big Endian */ 84 #define CLOCK_PHASE 0x4 /* 0/1 clock phase delay */ 85 #define CLOCK_POLARITY 0x8 /* 0/1 Idle state clock polarity is low/high */ 86 #define HIGH_SPEED_MODE 0x10 /* 1/0 High Speed mode / Normal mode */ 87 #define INTR_POLARITY 0x20 /* 1/0 Interrupt active polarity is high/low */ 88 #define WAKE_UP 0x80 /* 0/1 Wake-up command from Host to WLAN */ 89 90 /* Bit mask for SPID_RESPONSE_DELAY device register */ 91 #define RESPONSE_DELAY_MASK \ 92 0xFF /* Configurable rd response delay in multiples of 8 bits */ 93 94 /* Bit mask for SPID_STATUS_ENABLE device register */ 95 #define STATUS_ENABLE \ 96 0x1 /* 1/0 Status sent/not sent to host after read/write */ 97 #define INTR_WITH_STATUS 0x2 /* 0/1 Do-not / do-interrupt if status is sent */ 98 #define RESP_DELAY_ALL \ 99 0x4 /* Applicability of resp delay to F1 or all func's read */ 100 #define DWORD_PKT_LEN_EN 0x8 /* Packet len denoted in dwords instead of bytes \ 101 */ 102 #define CMD_ERR_CHK_EN 0x20 /* Command error check enable */ 103 #define DATA_ERR_CHK_EN 0x40 /* Data error check enable */ 104 105 /* Bit mask for SPID_RESET_BP device register */ 106 #define RESET_ON_WLAN_BP_RESET 0x4 /* enable reset for WLAN backplane */ 107 #define RESET_ON_BT_BP_RESET 0x8 /* enable reset for BT backplane */ 108 #define RESET_SPI 0x80 /* reset the above enabled logic */ 109 110 /* Bit mask for SPID_INTR_REG device register */ 111 #define DATA_UNAVAILABLE \ 112 0x0001 /* Requested data not available; Clear by writing a "1" */ 113 #define F2_F3_FIFO_RD_UNDERFLOW 0x0002 114 #define F2_F3_FIFO_WR_OVERFLOW 0x0004 115 #define COMMAND_ERROR 0x0008 /* Cleared by writing 1 */ 116 #define DATA_ERROR 0x0010 /* Cleared by writing 1 */ 117 #define F2_PACKET_AVAILABLE 0x0020 118 #define F3_PACKET_AVAILABLE 0x0040 119 #define F1_OVERFLOW \ 120 0x0080 /* Due to last write. Bkplane has pending write requests */ 121 #define MISC_INTR0 0x0100 122 #define MISC_INTR1 0x0200 123 #define MISC_INTR2 0x0400 124 #define MISC_INTR3 0x0800 125 #define MISC_INTR4 0x1000 126 #define F1_INTR 0x2000 127 #define F2_INTR 0x4000 128 #define F3_INTR 0x8000 129 130 /* Bit mask for 32bit SPID_STATUS_REG device register */ 131 #define STATUS_DATA_NOT_AVAILABLE 0x00000001 132 #define STATUS_UNDERFLOW 0x00000002 133 #define STATUS_OVERFLOW 0x00000004 134 #define STATUS_F2_INTR 0x00000008 135 #define STATUS_F3_INTR 0x00000010 136 #define STATUS_F2_RX_READY 0x00000020 137 #define STATUS_F3_RX_READY 0x00000040 138 #define STATUS_HOST_CMD_DATA_ERR 0x00000080 139 #define STATUS_F2_PKT_AVAILABLE 0x00000100 140 #define STATUS_F2_PKT_LEN_MASK 0x000FFE00 141 #define STATUS_F2_PKT_LEN_SHIFT 9 142 #define STATUS_F3_PKT_AVAILABLE 0x00100000 143 #define STATUS_F3_PKT_LEN_MASK 0xFFE00000 144 #define STATUS_F3_PKT_LEN_SHIFT 21 145 146 /* Bit mask for 16 bits SPID_F1_INFO_REG device register */ 147 #define F1_ENABLED 0x0001 148 #define F1_RDY_FOR_DATA_TRANSFER 0x0002 149 #define F1_MAX_PKT_SIZE 0x01FC 150 151 /* Bit mask for 16 bits SPID_F2_INFO_REG device register */ 152 #define F2_ENABLED 0x0001 153 #define F2_RDY_FOR_DATA_TRANSFER 0x0002 154 #define F2_MAX_PKT_SIZE 0x3FFC 155 156 /* Bit mask for 16 bits SPID_F3_INFO_REG device register */ 157 #define F3_ENABLED 0x0001 158 #define F3_RDY_FOR_DATA_TRANSFER 0x0002 159 #define F3_MAX_PKT_SIZE 0x3FFC 160 161 /* Bit mask for 32 bits SPID_TEST_READ device register read in 16bit LE mode */ 162 #define TEST_RO_DATA_32BIT_LE 0xFEEDBEAD 163 164 /* Maximum number of I/O funcs */ 165 #define SPI_MAX_IOFUNCS 4 166 167 #define SPI_MAX_PKT_LEN (2048 * 4) 168 169 /* Misc defines */ 170 #define SPI_FUNC_0 0 171 #define SPI_FUNC_1 1 172 #define SPI_FUNC_2 2 173 #define SPI_FUNC_3 3 174 175 #define WAIT_F2RXFIFORDY 100 176 #define WAIT_F2RXFIFORDY_DELAY 20 177 178 #endif /* _SPI_H */ 179