Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spi: sirf: add support for USP-based SPI

USP is a general purpose serial port in SiRFSoC, which can work as SPI.
the most data flow of USP and pure SPI is same with main differences
in registers layout.
this patch moves registers layout to private data, and use flags to
differentiate other minor differences between prima2-spi, prima2-usp
and atlas7-usp for hardware configuration.

Signed-off-by: Qipan Li <Qipan.Li@csr.com>
Signed-off-by: Barry Song <Baohua.Song@csr.com>
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Qipan Li and committed by
Mark Brown
e3fb57c8 a34bcbed

+583 -206
+2 -1
Documentation/devicetree/bindings/spi/spi-sirf.txt
··· 1 1 * CSR SiRFprimaII Serial Peripheral Interface 2 2 3 3 Required properties: 4 - - compatible : Should be "sirf,prima2-spi" 4 + - compatible : Should be "sirf,prima2-spi", "sirf,prima2-usp" 5 + or "sirf,atlas7-usp" 5 6 - reg : Offset and length of the register set for the device 6 7 - interrupts : Should contain SPI interrupt 7 8 - resets: phandle to the reset controller asserting this device in
+581 -205
drivers/spi/spi-sirf.c
··· 26 26 #include <linux/reset.h> 27 27 28 28 #define DRIVER_NAME "sirfsoc_spi" 29 - 30 - #define SIRFSOC_SPI_CTRL 0x0000 31 - #define SIRFSOC_SPI_CMD 0x0004 32 - #define SIRFSOC_SPI_TX_RX_EN 0x0008 33 - #define SIRFSOC_SPI_INT_EN 0x000C 34 - #define SIRFSOC_SPI_INT_STATUS 0x0010 35 - #define SIRFSOC_SPI_TX_DMA_IO_CTRL 0x0100 36 - #define SIRFSOC_SPI_TX_DMA_IO_LEN 0x0104 37 - #define SIRFSOC_SPI_TXFIFO_CTRL 0x0108 38 - #define SIRFSOC_SPI_TXFIFO_LEVEL_CHK 0x010C 39 - #define SIRFSOC_SPI_TXFIFO_OP 0x0110 40 - #define SIRFSOC_SPI_TXFIFO_STATUS 0x0114 41 - #define SIRFSOC_SPI_TXFIFO_DATA 0x0118 42 - #define SIRFSOC_SPI_RX_DMA_IO_CTRL 0x0120 43 - #define SIRFSOC_SPI_RX_DMA_IO_LEN 0x0124 44 - #define SIRFSOC_SPI_RXFIFO_CTRL 0x0128 45 - #define SIRFSOC_SPI_RXFIFO_LEVEL_CHK 0x012C 46 - #define SIRFSOC_SPI_RXFIFO_OP 0x0130 47 - #define SIRFSOC_SPI_RXFIFO_STATUS 0x0134 48 - #define SIRFSOC_SPI_RXFIFO_DATA 0x0138 49 - #define SIRFSOC_SPI_DUMMY_DELAY_CTL 0x0144 50 - 51 29 /* SPI CTRL register defines */ 52 30 #define SIRFSOC_SPI_SLV_MODE BIT(16) 53 31 #define SIRFSOC_SPI_CMD_MODE BIT(17) ··· 58 80 #define SIRFSOC_SPI_TXFIFO_THD_INT_EN BIT(9) 59 81 #define SIRFSOC_SPI_FRM_END_INT_EN BIT(10) 60 82 61 - #define SIRFSOC_SPI_INT_MASK_ALL 0x1FFF 62 - 63 83 /* Interrupt status */ 64 84 #define SIRFSOC_SPI_RX_DONE BIT(0) 65 85 #define SIRFSOC_SPI_TX_DONE BIT(1) ··· 86 110 #define SIRFSOC_SPI_FIFO_WIDTH_BYTE (0 << 0) 87 111 #define SIRFSOC_SPI_FIFO_WIDTH_WORD (1 << 0) 88 112 #define SIRFSOC_SPI_FIFO_WIDTH_DWORD (2 << 0) 113 + /* USP related */ 114 + #define SIRFSOC_USP_SYNC_MODE BIT(0) 115 + #define SIRFSOC_USP_SLV_MODE BIT(1) 116 + #define SIRFSOC_USP_LSB BIT(4) 117 + #define SIRFSOC_USP_EN BIT(5) 118 + #define SIRFSOC_USP_RXD_FALLING_EDGE BIT(6) 119 + #define SIRFSOC_USP_TXD_FALLING_EDGE BIT(7) 120 + #define SIRFSOC_USP_CS_HIGH_VALID BIT(9) 121 + #define SIRFSOC_USP_SCLK_IDLE_STAT BIT(11) 122 + #define SIRFSOC_USP_TFS_IO_MODE BIT(14) 123 + #define SIRFSOC_USP_TFS_IO_INPUT BIT(19) 89 124 90 - /* FIFO Status */ 91 - #define SIRFSOC_SPI_FIFO_LEVEL_MASK 0xFF 92 - #define SIRFSOC_SPI_FIFO_FULL BIT(8) 93 - #define SIRFSOC_SPI_FIFO_EMPTY BIT(9) 125 + #define SIRFSOC_USP_RXD_DELAY_LEN_MASK 0xFF 126 + #define SIRFSOC_USP_TXD_DELAY_LEN_MASK 0xFF 127 + #define SIRFSOC_USP_RXD_DELAY_OFFSET 0 128 + #define SIRFSOC_USP_TXD_DELAY_OFFSET 8 129 + #define SIRFSOC_USP_RXD_DELAY_LEN 1 130 + #define SIRFSOC_USP_TXD_DELAY_LEN 1 131 + #define SIRFSOC_USP_CLK_DIVISOR_OFFSET 21 132 + #define SIRFSOC_USP_CLK_DIVISOR_MASK 0x3FF 133 + #define SIRFSOC_USP_CLK_10_11_MASK 0x3 134 + #define SIRFSOC_USP_CLK_10_11_OFFSET 30 135 + #define SIRFSOC_USP_CLK_12_15_MASK 0xF 136 + #define SIRFSOC_USP_CLK_12_15_OFFSET 24 94 137 95 - /* 256 bytes rx/tx FIFO */ 96 - #define SIRFSOC_SPI_FIFO_SIZE 256 97 - #define SIRFSOC_SPI_DAT_FRM_LEN_MAX (64 * 1024) 138 + #define SIRFSOC_USP_TX_DATA_OFFSET 0 139 + #define SIRFSOC_USP_TX_SYNC_OFFSET 8 140 + #define SIRFSOC_USP_TX_FRAME_OFFSET 16 141 + #define SIRFSOC_USP_TX_SHIFTER_OFFSET 24 98 142 99 - #define SIRFSOC_SPI_FIFO_SC(x) ((x) & 0x3F) 100 - #define SIRFSOC_SPI_FIFO_LC(x) (((x) & 0x3F) << 10) 101 - #define SIRFSOC_SPI_FIFO_HC(x) (((x) & 0x3F) << 20) 102 - #define SIRFSOC_SPI_FIFO_THD(x) (((x) & 0xFF) << 2) 143 + #define SIRFSOC_USP_TX_DATA_MASK 0xFF 144 + #define SIRFSOC_USP_TX_SYNC_MASK 0xFF 145 + #define SIRFSOC_USP_TX_FRAME_MASK 0xFF 146 + #define SIRFSOC_USP_TX_SHIFTER_MASK 0x1F 147 + 148 + #define SIRFSOC_USP_RX_DATA_OFFSET 0 149 + #define SIRFSOC_USP_RX_FRAME_OFFSET 8 150 + #define SIRFSOC_USP_RX_SHIFTER_OFFSET 16 151 + 152 + #define SIRFSOC_USP_RX_DATA_MASK 0xFF 153 + #define SIRFSOC_USP_RX_FRAME_MASK 0xFF 154 + #define SIRFSOC_USP_RX_SHIFTER_MASK 0x1F 155 + #define SIRFSOC_USP_CS_HIGH_VALUE BIT(1) 156 + 157 + #define SIRFSOC_SPI_FIFO_SC_OFFSET 0 158 + #define SIRFSOC_SPI_FIFO_LC_OFFSET 10 159 + #define SIRFSOC_SPI_FIFO_HC_OFFSET 20 160 + 161 + #define SIRFSOC_SPI_FIFO_FULL_MASK(s) (1 << ((s)->fifo_full_offset)) 162 + #define SIRFSOC_SPI_FIFO_EMPTY_MASK(s) (1 << ((s)->fifo_full_offset + 1)) 163 + #define SIRFSOC_SPI_FIFO_THD_MASK(s) ((s)->fifo_size - 1) 164 + #define SIRFSOC_SPI_FIFO_THD_OFFSET 2 165 + #define SIRFSOC_SPI_FIFO_LEVEL_CHK_MASK(s, val) \ 166 + ((val) & (s)->fifo_level_chk_mask) 167 + 168 + enum sirf_spi_type { 169 + SIRF_REAL_SPI, 170 + SIRF_USP_SPI_P2, 171 + SIRF_USP_SPI_A7, 172 + }; 103 173 104 174 /* 105 175 * only if the rx/tx buffer and transfer size are 4-bytes aligned, we use dma ··· 158 136 159 137 #define SIRFSOC_MAX_CMD_BYTES 4 160 138 #define SIRFSOC_SPI_DEFAULT_FRQ 1000000 139 + 140 + struct sirf_spi_register { 141 + /*SPI and USP-SPI common*/ 142 + u32 tx_rx_en; 143 + u32 int_en; 144 + u32 int_st; 145 + u32 tx_dma_io_ctrl; 146 + u32 tx_dma_io_len; 147 + u32 txfifo_ctrl; 148 + u32 txfifo_level_chk; 149 + u32 txfifo_op; 150 + u32 txfifo_st; 151 + u32 txfifo_data; 152 + u32 rx_dma_io_ctrl; 153 + u32 rx_dma_io_len; 154 + u32 rxfifo_ctrl; 155 + u32 rxfifo_level_chk; 156 + u32 rxfifo_op; 157 + u32 rxfifo_st; 158 + u32 rxfifo_data; 159 + /*SPI self*/ 160 + u32 spi_ctrl; 161 + u32 spi_cmd; 162 + u32 spi_dummy_delay_ctrl; 163 + /*USP-SPI self*/ 164 + u32 usp_mode1; 165 + u32 usp_mode2; 166 + u32 usp_tx_frame_ctrl; 167 + u32 usp_rx_frame_ctrl; 168 + u32 usp_pin_io_data; 169 + u32 usp_risc_dsp_mode; 170 + u32 usp_async_param_reg; 171 + u32 usp_irda_x_mode_div; 172 + u32 usp_sm_cfg; 173 + u32 usp_int_en_clr; 174 + }; 175 + 176 + static const struct sirf_spi_register real_spi_register = { 177 + .tx_rx_en = 0x8, 178 + .int_en = 0xc, 179 + .int_st = 0x10, 180 + .tx_dma_io_ctrl = 0x100, 181 + .tx_dma_io_len = 0x104, 182 + .txfifo_ctrl = 0x108, 183 + .txfifo_level_chk = 0x10c, 184 + .txfifo_op = 0x110, 185 + .txfifo_st = 0x114, 186 + .txfifo_data = 0x118, 187 + .rx_dma_io_ctrl = 0x120, 188 + .rx_dma_io_len = 0x124, 189 + .rxfifo_ctrl = 0x128, 190 + .rxfifo_level_chk = 0x12c, 191 + .rxfifo_op = 0x130, 192 + .rxfifo_st = 0x134, 193 + .rxfifo_data = 0x138, 194 + .spi_ctrl = 0x0, 195 + .spi_cmd = 0x4, 196 + .spi_dummy_delay_ctrl = 0x144, 197 + }; 198 + 199 + static const struct sirf_spi_register usp_spi_register = { 200 + .tx_rx_en = 0x10, 201 + .int_en = 0x14, 202 + .int_st = 0x18, 203 + .tx_dma_io_ctrl = 0x100, 204 + .tx_dma_io_len = 0x104, 205 + .txfifo_ctrl = 0x108, 206 + .txfifo_level_chk = 0x10c, 207 + .txfifo_op = 0x110, 208 + .txfifo_st = 0x114, 209 + .txfifo_data = 0x118, 210 + .rx_dma_io_ctrl = 0x120, 211 + .rx_dma_io_len = 0x124, 212 + .rxfifo_ctrl = 0x128, 213 + .rxfifo_level_chk = 0x12c, 214 + .rxfifo_op = 0x130, 215 + .rxfifo_st = 0x134, 216 + .rxfifo_data = 0x138, 217 + .usp_mode1 = 0x0, 218 + .usp_mode2 = 0x4, 219 + .usp_tx_frame_ctrl = 0x8, 220 + .usp_rx_frame_ctrl = 0xc, 221 + .usp_pin_io_data = 0x1c, 222 + .usp_risc_dsp_mode = 0x20, 223 + .usp_async_param_reg = 0x24, 224 + .usp_irda_x_mode_div = 0x28, 225 + .usp_sm_cfg = 0x2c, 226 + .usp_int_en_clr = 0x140, 227 + }; 228 + 229 + struct sirf_spi_comp_data { 230 + const struct sirf_spi_register *regs; 231 + enum sirf_spi_type type; 232 + unsigned int dat_max_frm_len; 233 + unsigned int fifo_size; 234 + }; 235 + 236 + static const struct sirf_spi_comp_data sirf_real_spi = { 237 + .regs = &real_spi_register, 238 + .type = SIRF_REAL_SPI, 239 + .dat_max_frm_len = 64 * 1024, 240 + .fifo_size = 256, 241 + }; 242 + 243 + static const struct sirf_spi_comp_data sirf_usp_spi_p2 = { 244 + .regs = &usp_spi_register, 245 + .type = SIRF_USP_SPI_P2, 246 + .dat_max_frm_len = 1024 * 1024, 247 + .fifo_size = 128, 248 + }; 249 + 250 + static const struct sirf_spi_comp_data sirf_usp_spi_a7 = { 251 + .regs = &usp_spi_register, 252 + .type = SIRF_USP_SPI_A7, 253 + .dat_max_frm_len = 1024 * 1024, 254 + .fifo_size = 512, 255 + }; 161 256 162 257 struct sirfsoc_spi { 163 258 struct spi_bitbang bitbang; ··· 312 173 */ 313 174 bool tx_by_cmd; 314 175 bool hw_cs; 176 + enum sirf_spi_type type; 177 + const struct sirf_spi_register *regs; 178 + unsigned int fifo_size; 179 + /* fifo empty offset is (fifo full offset + 1)*/ 180 + unsigned int fifo_full_offset; 181 + /* fifo_level_chk_mask is (fifo_size/4 - 1) */ 182 + unsigned int fifo_level_chk_mask; 183 + unsigned int dat_max_frm_len; 315 184 }; 316 185 317 186 static void spi_sirfsoc_rx_word_u8(struct sirfsoc_spi *sspi) ··· 327 180 u32 data; 328 181 u8 *rx = sspi->rx; 329 182 330 - data = readl(sspi->base + SIRFSOC_SPI_RXFIFO_DATA); 183 + data = readl(sspi->base + sspi->regs->rxfifo_data); 331 184 332 185 if (rx) { 333 186 *rx++ = (u8) data; ··· 346 199 data = *tx++; 347 200 sspi->tx = tx; 348 201 } 349 - 350 - writel(data, sspi->base + SIRFSOC_SPI_TXFIFO_DATA); 202 + writel(data, sspi->base + sspi->regs->txfifo_data); 351 203 sspi->left_tx_word--; 352 204 } 353 205 ··· 355 209 u32 data; 356 210 u16 *rx = sspi->rx; 357 211 358 - data = readl(sspi->base + SIRFSOC_SPI_RXFIFO_DATA); 212 + data = readl(sspi->base + sspi->regs->rxfifo_data); 359 213 360 214 if (rx) { 361 215 *rx++ = (u16) data; ··· 375 229 sspi->tx = tx; 376 230 } 377 231 378 - writel(data, sspi->base + SIRFSOC_SPI_TXFIFO_DATA); 232 + writel(data, sspi->base + sspi->regs->txfifo_data); 379 233 sspi->left_tx_word--; 380 234 } 381 235 ··· 384 238 u32 data; 385 239 u32 *rx = sspi->rx; 386 240 387 - data = readl(sspi->base + SIRFSOC_SPI_RXFIFO_DATA); 241 + data = readl(sspi->base + sspi->regs->rxfifo_data); 388 242 389 243 if (rx) { 390 244 *rx++ = (u32) data; ··· 405 259 sspi->tx = tx; 406 260 } 407 261 408 - writel(data, sspi->base + SIRFSOC_SPI_TXFIFO_DATA); 262 + writel(data, sspi->base + sspi->regs->txfifo_data); 409 263 sspi->left_tx_word--; 410 264 } 411 265 412 266 static irqreturn_t spi_sirfsoc_irq(int irq, void *dev_id) 413 267 { 414 268 struct sirfsoc_spi *sspi = dev_id; 415 - u32 spi_stat = readl(sspi->base + SIRFSOC_SPI_INT_STATUS); 416 - if (sspi->tx_by_cmd && (spi_stat & SIRFSOC_SPI_FRM_END)) { 269 + u32 spi_stat; 270 + 271 + spi_stat = readl(sspi->base + sspi->regs->int_st); 272 + if (sspi->tx_by_cmd && sspi->type == SIRF_REAL_SPI 273 + && (spi_stat & SIRFSOC_SPI_FRM_END)) { 417 274 complete(&sspi->tx_done); 418 - writel(0x0, sspi->base + SIRFSOC_SPI_INT_EN); 419 - writel(SIRFSOC_SPI_INT_MASK_ALL, 420 - sspi->base + SIRFSOC_SPI_INT_STATUS); 275 + writel(0x0, sspi->base + sspi->regs->int_en); 276 + writel(readl(sspi->base + sspi->regs->int_st), 277 + sspi->base + sspi->regs->int_st); 421 278 return IRQ_HANDLED; 422 279 } 423 - 424 280 /* Error Conditions */ 425 281 if (spi_stat & SIRFSOC_SPI_RX_OFLOW || 426 282 spi_stat & SIRFSOC_SPI_TX_UFLOW) { 427 283 complete(&sspi->tx_done); 428 284 complete(&sspi->rx_done); 429 - writel(0x0, sspi->base + SIRFSOC_SPI_INT_EN); 430 - writel(SIRFSOC_SPI_INT_MASK_ALL, 431 - sspi->base + SIRFSOC_SPI_INT_STATUS); 285 + switch (sspi->type) { 286 + case SIRF_REAL_SPI: 287 + case SIRF_USP_SPI_P2: 288 + writel(0x0, sspi->base + sspi->regs->int_en); 289 + break; 290 + case SIRF_USP_SPI_A7: 291 + writel(~0UL, sspi->base + sspi->regs->usp_int_en_clr); 292 + break; 293 + } 294 + writel(readl(sspi->base + sspi->regs->int_st), 295 + sspi->base + sspi->regs->int_st); 432 296 return IRQ_HANDLED; 433 297 } 434 298 if (spi_stat & SIRFSOC_SPI_TXFIFO_EMPTY) 435 299 complete(&sspi->tx_done); 436 - while (!(readl(sspi->base + SIRFSOC_SPI_INT_STATUS) & 300 + while (!(readl(sspi->base + sspi->regs->int_st) & 437 301 SIRFSOC_SPI_RX_IO_DMA)) 438 302 cpu_relax(); 439 303 complete(&sspi->rx_done); 440 - writel(0x0, sspi->base + SIRFSOC_SPI_INT_EN); 441 - writel(SIRFSOC_SPI_INT_MASK_ALL, 442 - sspi->base + SIRFSOC_SPI_INT_STATUS); 304 + switch (sspi->type) { 305 + case SIRF_REAL_SPI: 306 + case SIRF_USP_SPI_P2: 307 + writel(0x0, sspi->base + sspi->regs->int_en); 308 + break; 309 + case SIRF_USP_SPI_A7: 310 + writel(~0UL, sspi->base + sspi->regs->usp_int_en_clr); 311 + break; 312 + } 313 + writel(readl(sspi->base + sspi->regs->int_st), 314 + sspi->base + sspi->regs->int_st); 443 315 444 316 return IRQ_HANDLED; 445 317 } ··· 477 313 u32 cmd; 478 314 479 315 sspi = spi_master_get_devdata(spi->master); 480 - writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + SIRFSOC_SPI_TXFIFO_OP); 481 - writel(SIRFSOC_SPI_FIFO_START, sspi->base + SIRFSOC_SPI_TXFIFO_OP); 316 + writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + sspi->regs->txfifo_op); 317 + writel(SIRFSOC_SPI_FIFO_START, sspi->base + sspi->regs->txfifo_op); 482 318 memcpy(&cmd, sspi->tx, t->len); 483 319 if (sspi->word_width == 1 && !(spi->mode & SPI_LSB_FIRST)) 484 320 cmd = cpu_to_be32(cmd) >> ··· 486 322 if (sspi->word_width == 2 && t->len == 4 && 487 323 (!(spi->mode & SPI_LSB_FIRST))) 488 324 cmd = ((cmd & 0xffff) << 16) | (cmd >> 16); 489 - writel(cmd, sspi->base + SIRFSOC_SPI_CMD); 325 + writel(cmd, sspi->base + sspi->regs->spi_cmd); 490 326 writel(SIRFSOC_SPI_FRM_END_INT_EN, 491 - sspi->base + SIRFSOC_SPI_INT_EN); 327 + sspi->base + sspi->regs->int_en); 492 328 writel(SIRFSOC_SPI_CMD_TX_EN, 493 - sspi->base + SIRFSOC_SPI_TX_RX_EN); 329 + sspi->base + sspi->regs->tx_rx_en); 494 330 if (wait_for_completion_timeout(&sspi->tx_done, timeout) == 0) { 495 331 dev_err(&spi->dev, "cmd transfer timeout\n"); 496 332 return; ··· 506 342 int timeout = t->len * 10; 507 343 508 344 sspi = spi_master_get_devdata(spi->master); 509 - writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + SIRFSOC_SPI_RXFIFO_OP); 510 - writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + SIRFSOC_SPI_TXFIFO_OP); 511 - writel(SIRFSOC_SPI_FIFO_START, sspi->base + SIRFSOC_SPI_RXFIFO_OP); 512 - writel(SIRFSOC_SPI_FIFO_START, sspi->base + SIRFSOC_SPI_TXFIFO_OP); 513 - writel(0, sspi->base + SIRFSOC_SPI_INT_EN); 514 - writel(SIRFSOC_SPI_INT_MASK_ALL, sspi->base + SIRFSOC_SPI_INT_STATUS); 515 - if (sspi->left_tx_word < SIRFSOC_SPI_DAT_FRM_LEN_MAX) { 516 - writel(readl(sspi->base + SIRFSOC_SPI_CTRL) | 517 - SIRFSOC_SPI_ENA_AUTO_CLR | SIRFSOC_SPI_MUL_DAT_MODE, 518 - sspi->base + SIRFSOC_SPI_CTRL); 519 - writel(sspi->left_tx_word - 1, 520 - sspi->base + SIRFSOC_SPI_TX_DMA_IO_LEN); 521 - writel(sspi->left_tx_word - 1, 522 - sspi->base + SIRFSOC_SPI_RX_DMA_IO_LEN); 345 + writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + sspi->regs->rxfifo_op); 346 + writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + sspi->regs->txfifo_op); 347 + switch (sspi->type) { 348 + case SIRF_REAL_SPI: 349 + writel(SIRFSOC_SPI_FIFO_START, 350 + sspi->base + sspi->regs->rxfifo_op); 351 + writel(SIRFSOC_SPI_FIFO_START, 352 + sspi->base + sspi->regs->txfifo_op); 353 + writel(0, sspi->base + sspi->regs->int_en); 354 + break; 355 + case SIRF_USP_SPI_P2: 356 + writel(0x0, sspi->base + sspi->regs->rxfifo_op); 357 + writel(0x0, sspi->base + sspi->regs->txfifo_op); 358 + writel(0, sspi->base + sspi->regs->int_en); 359 + break; 360 + case SIRF_USP_SPI_A7: 361 + writel(0x0, sspi->base + sspi->regs->rxfifo_op); 362 + writel(0x0, sspi->base + sspi->regs->txfifo_op); 363 + writel(~0UL, sspi->base + sspi->regs->usp_int_en_clr); 364 + break; 365 + } 366 + writel(readl(sspi->base + sspi->regs->int_st), 367 + sspi->base + sspi->regs->int_st); 368 + if (sspi->left_tx_word < sspi->dat_max_frm_len) { 369 + switch (sspi->type) { 370 + case SIRF_REAL_SPI: 371 + writel(readl(sspi->base + sspi->regs->spi_ctrl) | 372 + SIRFSOC_SPI_ENA_AUTO_CLR | 373 + SIRFSOC_SPI_MUL_DAT_MODE, 374 + sspi->base + sspi->regs->spi_ctrl); 375 + writel(sspi->left_tx_word - 1, 376 + sspi->base + sspi->regs->tx_dma_io_len); 377 + writel(sspi->left_tx_word - 1, 378 + sspi->base + sspi->regs->rx_dma_io_len); 379 + break; 380 + case SIRF_USP_SPI_P2: 381 + case SIRF_USP_SPI_A7: 382 + /*USP simulate SPI, tx/rx_dma_io_len indicates bytes*/ 383 + writel(sspi->left_tx_word * sspi->word_width, 384 + sspi->base + sspi->regs->tx_dma_io_len); 385 + writel(sspi->left_tx_word * sspi->word_width, 386 + sspi->base + sspi->regs->rx_dma_io_len); 387 + break; 388 + } 523 389 } else { 524 - writel(readl(sspi->base + SIRFSOC_SPI_CTRL), 525 - sspi->base + SIRFSOC_SPI_CTRL); 526 - writel(0, sspi->base + SIRFSOC_SPI_TX_DMA_IO_LEN); 527 - writel(0, sspi->base + SIRFSOC_SPI_RX_DMA_IO_LEN); 390 + if (sspi->type == SIRF_REAL_SPI) 391 + writel(readl(sspi->base + sspi->regs->spi_ctrl), 392 + sspi->base + sspi->regs->spi_ctrl); 393 + writel(0, sspi->base + sspi->regs->tx_dma_io_len); 394 + writel(0, sspi->base + sspi->regs->rx_dma_io_len); 528 395 } 529 396 sspi->dst_start = dma_map_single(&spi->dev, sspi->rx, t->len, 530 397 (t->tx_buf != t->rx_buf) ? ··· 580 385 dma_async_issue_pending(sspi->tx_chan); 581 386 dma_async_issue_pending(sspi->rx_chan); 582 387 writel(SIRFSOC_SPI_RX_EN | SIRFSOC_SPI_TX_EN, 583 - sspi->base + SIRFSOC_SPI_TX_RX_EN); 388 + sspi->base + sspi->regs->tx_rx_en); 389 + if (sspi->type == SIRF_USP_SPI_P2 || 390 + sspi->type == SIRF_USP_SPI_A7) { 391 + writel(SIRFSOC_SPI_FIFO_START, 392 + sspi->base + sspi->regs->rxfifo_op); 393 + writel(SIRFSOC_SPI_FIFO_START, 394 + sspi->base + sspi->regs->txfifo_op); 395 + } 584 396 if (wait_for_completion_timeout(&sspi->rx_done, timeout) == 0) { 585 397 dev_err(&spi->dev, "transfer timeout\n"); 586 398 dmaengine_terminate_all(sspi->rx_chan); ··· 600 398 */ 601 399 if (wait_for_completion_timeout(&sspi->tx_done, timeout) == 0) { 602 400 dev_err(&spi->dev, "transfer timeout\n"); 401 + if (sspi->type == SIRF_USP_SPI_P2 || 402 + sspi->type == SIRF_USP_SPI_A7) 403 + writel(0, sspi->base + sspi->regs->tx_rx_en); 603 404 dmaengine_terminate_all(sspi->tx_chan); 604 405 } 605 406 dma_unmap_single(&spi->dev, sspi->src_start, t->len, DMA_TO_DEVICE); 606 407 dma_unmap_single(&spi->dev, sspi->dst_start, t->len, DMA_FROM_DEVICE); 607 408 /* TX, RX FIFO stop */ 608 - writel(0, sspi->base + SIRFSOC_SPI_RXFIFO_OP); 609 - writel(0, sspi->base + SIRFSOC_SPI_TXFIFO_OP); 610 - if (sspi->left_tx_word >= SIRFSOC_SPI_DAT_FRM_LEN_MAX) 611 - writel(0, sspi->base + SIRFSOC_SPI_TX_RX_EN); 409 + writel(0, sspi->base + sspi->regs->rxfifo_op); 410 + writel(0, sspi->base + sspi->regs->txfifo_op); 411 + if (sspi->left_tx_word >= sspi->dat_max_frm_len) 412 + writel(0, sspi->base + sspi->regs->tx_rx_en); 413 + if (sspi->type == SIRF_USP_SPI_P2 || 414 + sspi->type == SIRF_USP_SPI_A7) 415 + writel(0, sspi->base + sspi->regs->tx_rx_en); 612 416 } 613 417 614 418 static void spi_sirfsoc_pio_transfer(struct spi_device *spi, ··· 622 414 { 623 415 struct sirfsoc_spi *sspi; 624 416 int timeout = t->len * 10; 417 + unsigned int data_units; 625 418 626 419 sspi = spi_master_get_devdata(spi->master); 627 420 do { 628 421 writel(SIRFSOC_SPI_FIFO_RESET, 629 - sspi->base + SIRFSOC_SPI_RXFIFO_OP); 422 + sspi->base + sspi->regs->rxfifo_op); 630 423 writel(SIRFSOC_SPI_FIFO_RESET, 631 - sspi->base + SIRFSOC_SPI_TXFIFO_OP); 632 - writel(SIRFSOC_SPI_FIFO_START, 633 - sspi->base + SIRFSOC_SPI_RXFIFO_OP); 634 - writel(SIRFSOC_SPI_FIFO_START, 635 - sspi->base + SIRFSOC_SPI_TXFIFO_OP); 636 - writel(0, sspi->base + SIRFSOC_SPI_INT_EN); 637 - writel(SIRFSOC_SPI_INT_MASK_ALL, 638 - sspi->base + SIRFSOC_SPI_INT_STATUS); 639 - writel(readl(sspi->base + SIRFSOC_SPI_CTRL) | 640 - SIRFSOC_SPI_MUL_DAT_MODE | SIRFSOC_SPI_ENA_AUTO_CLR, 641 - sspi->base + SIRFSOC_SPI_CTRL); 642 - writel(min(sspi->left_tx_word, (u32)(256 / sspi->word_width)) 643 - - 1, sspi->base + SIRFSOC_SPI_TX_DMA_IO_LEN); 644 - writel(min(sspi->left_rx_word, (u32)(256 / sspi->word_width)) 645 - - 1, sspi->base + SIRFSOC_SPI_RX_DMA_IO_LEN); 646 - while (!((readl(sspi->base + SIRFSOC_SPI_TXFIFO_STATUS) 647 - & SIRFSOC_SPI_FIFO_FULL)) && sspi->left_tx_word) 424 + sspi->base + sspi->regs->txfifo_op); 425 + switch (sspi->type) { 426 + case SIRF_USP_SPI_P2: 427 + writel(0x0, sspi->base + sspi->regs->rxfifo_op); 428 + writel(0x0, sspi->base + sspi->regs->txfifo_op); 429 + writel(0, sspi->base + sspi->regs->int_en); 430 + writel(readl(sspi->base + sspi->regs->int_st), 431 + sspi->base + sspi->regs->int_st); 432 + writel(min((sspi->left_tx_word * sspi->word_width), 433 + sspi->fifo_size), 434 + sspi->base + sspi->regs->tx_dma_io_len); 435 + writel(min((sspi->left_rx_word * sspi->word_width), 436 + sspi->fifo_size), 437 + sspi->base + sspi->regs->rx_dma_io_len); 438 + break; 439 + case SIRF_USP_SPI_A7: 440 + writel(0x0, sspi->base + sspi->regs->rxfifo_op); 441 + writel(0x0, sspi->base + sspi->regs->txfifo_op); 442 + writel(~0UL, sspi->base + sspi->regs->usp_int_en_clr); 443 + writel(readl(sspi->base + sspi->regs->int_st), 444 + sspi->base + sspi->regs->int_st); 445 + writel(min((sspi->left_tx_word * sspi->word_width), 446 + sspi->fifo_size), 447 + sspi->base + sspi->regs->tx_dma_io_len); 448 + writel(min((sspi->left_rx_word * sspi->word_width), 449 + sspi->fifo_size), 450 + sspi->base + sspi->regs->rx_dma_io_len); 451 + break; 452 + case SIRF_REAL_SPI: 453 + writel(SIRFSOC_SPI_FIFO_START, 454 + sspi->base + sspi->regs->rxfifo_op); 455 + writel(SIRFSOC_SPI_FIFO_START, 456 + sspi->base + sspi->regs->txfifo_op); 457 + writel(0, sspi->base + sspi->regs->int_en); 458 + writel(readl(sspi->base + sspi->regs->int_st), 459 + sspi->base + sspi->regs->int_st); 460 + writel(readl(sspi->base + sspi->regs->spi_ctrl) | 461 + SIRFSOC_SPI_MUL_DAT_MODE | 462 + SIRFSOC_SPI_ENA_AUTO_CLR, 463 + sspi->base + sspi->regs->spi_ctrl); 464 + data_units = sspi->fifo_size / sspi->word_width; 465 + writel(min(sspi->left_tx_word, data_units) - 1, 466 + sspi->base + sspi->regs->tx_dma_io_len); 467 + writel(min(sspi->left_rx_word, data_units) - 1, 468 + sspi->base + sspi->regs->rx_dma_io_len); 469 + break; 470 + } 471 + while (!((readl(sspi->base + sspi->regs->txfifo_st) 472 + & SIRFSOC_SPI_FIFO_FULL_MASK(sspi))) && 473 + sspi->left_tx_word) 648 474 sspi->tx_word(sspi); 649 475 writel(SIRFSOC_SPI_TXFIFO_EMPTY_INT_EN | 650 476 SIRFSOC_SPI_TX_UFLOW_INT_EN | 651 477 SIRFSOC_SPI_RX_OFLOW_INT_EN | 652 478 SIRFSOC_SPI_RX_IO_DMA_INT_EN, 653 - sspi->base + SIRFSOC_SPI_INT_EN); 479 + sspi->base + sspi->regs->int_en); 654 480 writel(SIRFSOC_SPI_RX_EN | SIRFSOC_SPI_TX_EN, 655 - sspi->base + SIRFSOC_SPI_TX_RX_EN); 481 + sspi->base + sspi->regs->tx_rx_en); 482 + if (sspi->type == SIRF_USP_SPI_P2 || 483 + sspi->type == SIRF_USP_SPI_A7) { 484 + writel(SIRFSOC_SPI_FIFO_START, 485 + sspi->base + sspi->regs->rxfifo_op); 486 + writel(SIRFSOC_SPI_FIFO_START, 487 + sspi->base + sspi->regs->txfifo_op); 488 + } 656 489 if (!wait_for_completion_timeout(&sspi->tx_done, timeout) || 657 490 !wait_for_completion_timeout(&sspi->rx_done, timeout)) { 658 491 dev_err(&spi->dev, "transfer timeout\n"); 492 + if (sspi->type == SIRF_USP_SPI_P2 || 493 + sspi->type == SIRF_USP_SPI_A7) 494 + writel(0, sspi->base + sspi->regs->tx_rx_en); 659 495 break; 660 496 } 661 - while (!((readl(sspi->base + SIRFSOC_SPI_RXFIFO_STATUS) 662 - & SIRFSOC_SPI_FIFO_EMPTY)) && sspi->left_rx_word) 497 + while (!((readl(sspi->base + sspi->regs->rxfifo_st) 498 + & SIRFSOC_SPI_FIFO_EMPTY_MASK(sspi))) && 499 + sspi->left_rx_word) 663 500 sspi->rx_word(sspi); 664 - writel(0, sspi->base + SIRFSOC_SPI_RXFIFO_OP); 665 - writel(0, sspi->base + SIRFSOC_SPI_TXFIFO_OP); 501 + if (sspi->type == SIRF_USP_SPI_P2 || 502 + sspi->type == SIRF_USP_SPI_A7) 503 + writel(0, sspi->base + sspi->regs->tx_rx_en); 504 + writel(0, sspi->base + sspi->regs->rxfifo_op); 505 + writel(0, sspi->base + sspi->regs->txfifo_op); 666 506 } while (sspi->left_tx_word != 0 || sspi->left_rx_word != 0); 667 507 } 668 508 669 509 static int spi_sirfsoc_transfer(struct spi_device *spi, struct spi_transfer *t) 670 510 { 671 511 struct sirfsoc_spi *sspi; 672 - sspi = spi_master_get_devdata(spi->master); 673 512 513 + sspi = spi_master_get_devdata(spi->master); 674 514 sspi->tx = t->tx_buf ? t->tx_buf : sspi->dummypage; 675 515 sspi->rx = t->rx_buf ? t->rx_buf : sspi->dummypage; 676 516 sspi->left_tx_word = sspi->left_rx_word = t->len / sspi->word_width; ··· 729 473 * null, just fill command data into command register and wait for its 730 474 * completion. 731 475 */ 732 - if (sspi->tx_by_cmd) 476 + if (sspi->type == SIRF_REAL_SPI && sspi->tx_by_cmd) 733 477 spi_sirfsoc_cmd_transfer(spi, t); 734 478 else if (IS_DMA_VALID(t)) 735 479 spi_sirfsoc_dma_transfer(spi, t); ··· 744 488 struct sirfsoc_spi *sspi = spi_master_get_devdata(spi->master); 745 489 746 490 if (sspi->hw_cs) { 747 - u32 regval = readl(sspi->base + SIRFSOC_SPI_CTRL); 748 - switch (value) { 749 - case BITBANG_CS_ACTIVE: 750 - if (spi->mode & SPI_CS_HIGH) 751 - regval |= SIRFSOC_SPI_CS_IO_OUT; 752 - else 753 - regval &= ~SIRFSOC_SPI_CS_IO_OUT; 491 + u32 regval; 492 + 493 + switch (sspi->type) { 494 + case SIRF_REAL_SPI: 495 + regval = readl(sspi->base + sspi->regs->spi_ctrl); 496 + switch (value) { 497 + case BITBANG_CS_ACTIVE: 498 + if (spi->mode & SPI_CS_HIGH) 499 + regval |= SIRFSOC_SPI_CS_IO_OUT; 500 + else 501 + regval &= ~SIRFSOC_SPI_CS_IO_OUT; 502 + break; 503 + case BITBANG_CS_INACTIVE: 504 + if (spi->mode & SPI_CS_HIGH) 505 + regval &= ~SIRFSOC_SPI_CS_IO_OUT; 506 + else 507 + regval |= SIRFSOC_SPI_CS_IO_OUT; 508 + break; 509 + } 510 + writel(regval, sspi->base + sspi->regs->spi_ctrl); 754 511 break; 755 - case BITBANG_CS_INACTIVE: 756 - if (spi->mode & SPI_CS_HIGH) 757 - regval &= ~SIRFSOC_SPI_CS_IO_OUT; 758 - else 759 - regval |= SIRFSOC_SPI_CS_IO_OUT; 512 + case SIRF_USP_SPI_P2: 513 + case SIRF_USP_SPI_A7: 514 + regval = readl(sspi->base + 515 + sspi->regs->usp_pin_io_data); 516 + switch (value) { 517 + case BITBANG_CS_ACTIVE: 518 + if (spi->mode & SPI_CS_HIGH) 519 + regval |= SIRFSOC_USP_CS_HIGH_VALUE; 520 + else 521 + regval &= ~(SIRFSOC_USP_CS_HIGH_VALUE); 522 + break; 523 + case BITBANG_CS_INACTIVE: 524 + if (spi->mode & SPI_CS_HIGH) 525 + regval &= ~(SIRFSOC_USP_CS_HIGH_VALUE); 526 + else 527 + regval |= SIRFSOC_USP_CS_HIGH_VALUE; 528 + break; 529 + } 530 + writel(regval, 531 + sspi->base + sspi->regs->usp_pin_io_data); 760 532 break; 761 533 } 762 - writel(regval, sspi->base + SIRFSOC_SPI_CTRL); 763 534 } else { 764 535 switch (value) { 765 536 case BITBANG_CS_ACTIVE: ··· 801 518 } 802 519 } 803 520 521 + static int spi_sirfsoc_config_mode(struct spi_device *spi) 522 + { 523 + struct sirfsoc_spi *sspi; 524 + u32 regval, usp_mode1; 525 + 526 + sspi = spi_master_get_devdata(spi->master); 527 + regval = readl(sspi->base + sspi->regs->spi_ctrl); 528 + usp_mode1 = readl(sspi->base + sspi->regs->usp_mode1); 529 + if (!(spi->mode & SPI_CS_HIGH)) { 530 + regval |= SIRFSOC_SPI_CS_IDLE_STAT; 531 + usp_mode1 &= ~SIRFSOC_USP_CS_HIGH_VALID; 532 + } else { 533 + regval &= ~SIRFSOC_SPI_CS_IDLE_STAT; 534 + usp_mode1 |= SIRFSOC_USP_CS_HIGH_VALID; 535 + } 536 + if (!(spi->mode & SPI_LSB_FIRST)) { 537 + regval |= SIRFSOC_SPI_TRAN_MSB; 538 + usp_mode1 &= ~SIRFSOC_USP_LSB; 539 + } else { 540 + regval &= ~SIRFSOC_SPI_TRAN_MSB; 541 + usp_mode1 |= SIRFSOC_USP_LSB; 542 + } 543 + if (spi->mode & SPI_CPOL) { 544 + regval |= SIRFSOC_SPI_CLK_IDLE_STAT; 545 + usp_mode1 |= SIRFSOC_USP_SCLK_IDLE_STAT; 546 + } else { 547 + regval &= ~SIRFSOC_SPI_CLK_IDLE_STAT; 548 + usp_mode1 &= ~SIRFSOC_USP_SCLK_IDLE_STAT; 549 + } 550 + /* 551 + * Data should be driven at least 1/2 cycle before the fetch edge 552 + * to make sure that data gets stable at the fetch edge. 553 + */ 554 + if (((spi->mode & SPI_CPOL) && (spi->mode & SPI_CPHA)) || 555 + (!(spi->mode & SPI_CPOL) && !(spi->mode & SPI_CPHA))) { 556 + regval &= ~SIRFSOC_SPI_DRV_POS_EDGE; 557 + usp_mode1 |= (SIRFSOC_USP_TXD_FALLING_EDGE | 558 + SIRFSOC_USP_RXD_FALLING_EDGE); 559 + } else { 560 + regval |= SIRFSOC_SPI_DRV_POS_EDGE; 561 + usp_mode1 &= ~(SIRFSOC_USP_RXD_FALLING_EDGE | 562 + SIRFSOC_USP_TXD_FALLING_EDGE); 563 + } 564 + writel((SIRFSOC_SPI_FIFO_LEVEL_CHK_MASK(sspi, sspi->fifo_size - 2) << 565 + SIRFSOC_SPI_FIFO_SC_OFFSET) | 566 + (SIRFSOC_SPI_FIFO_LEVEL_CHK_MASK(sspi, sspi->fifo_size / 2) << 567 + SIRFSOC_SPI_FIFO_LC_OFFSET) | 568 + (SIRFSOC_SPI_FIFO_LEVEL_CHK_MASK(sspi, 2) << 569 + SIRFSOC_SPI_FIFO_HC_OFFSET), 570 + sspi->base + sspi->regs->txfifo_level_chk); 571 + writel((SIRFSOC_SPI_FIFO_LEVEL_CHK_MASK(sspi, 2) << 572 + SIRFSOC_SPI_FIFO_SC_OFFSET) | 573 + (SIRFSOC_SPI_FIFO_LEVEL_CHK_MASK(sspi, sspi->fifo_size / 2) << 574 + SIRFSOC_SPI_FIFO_LC_OFFSET) | 575 + (SIRFSOC_SPI_FIFO_LEVEL_CHK_MASK(sspi, sspi->fifo_size - 2) << 576 + SIRFSOC_SPI_FIFO_HC_OFFSET), 577 + sspi->base + sspi->regs->rxfifo_level_chk); 578 + /* 579 + * it should never set to hardware cs mode because in hardware cs mode, 580 + * cs signal can't controlled by driver. 581 + */ 582 + switch (sspi->type) { 583 + case SIRF_REAL_SPI: 584 + regval |= SIRFSOC_SPI_CS_IO_MODE; 585 + writel(regval, sspi->base + sspi->regs->spi_ctrl); 586 + break; 587 + case SIRF_USP_SPI_P2: 588 + case SIRF_USP_SPI_A7: 589 + usp_mode1 |= SIRFSOC_USP_SYNC_MODE; 590 + usp_mode1 |= SIRFSOC_USP_TFS_IO_MODE; 591 + usp_mode1 &= ~SIRFSOC_USP_TFS_IO_INPUT; 592 + writel(usp_mode1, sspi->base + sspi->regs->usp_mode1); 593 + break; 594 + } 595 + 596 + return 0; 597 + } 598 + 804 599 static int 805 600 spi_sirfsoc_setup_transfer(struct spi_device *spi, struct spi_transfer *t) 806 601 { 807 602 struct sirfsoc_spi *sspi; 808 603 u8 bits_per_word = 0; 809 604 int hz = 0; 810 - u32 regval; 811 - u32 txfifo_ctrl, rxfifo_ctrl; 812 - u32 fifo_size = SIRFSOC_SPI_FIFO_SIZE / 4; 605 + u32 regval, txfifo_ctrl, rxfifo_ctrl, tx_frm_ctl, rx_frm_ctl, usp_mode2; 813 606 814 607 sspi = spi_master_get_devdata(spi->master); 815 608 816 609 bits_per_word = (t) ? t->bits_per_word : spi->bits_per_word; 817 610 hz = t && t->speed_hz ? t->speed_hz : spi->max_speed_hz; 818 611 819 - regval = (sspi->ctrl_freq / (2 * hz)) - 1; 612 + usp_mode2 = regval = (sspi->ctrl_freq / (2 * hz)) - 1; 820 613 if (regval > 0xFFFF || regval < 0) { 821 614 dev_err(&spi->dev, "Speed %d not supported\n", hz); 822 615 return -EINVAL; 823 616 } 824 - 825 617 switch (bits_per_word) { 826 618 case 8: 827 619 regval |= SIRFSOC_SPI_TRAN_DAT_FORMAT_8; ··· 920 562 dev_err(&spi->dev, "bpw %d not supported\n", bits_per_word); 921 563 return -EINVAL; 922 564 } 923 - 924 565 sspi->word_width = DIV_ROUND_UP(bits_per_word, 8); 925 - txfifo_ctrl = SIRFSOC_SPI_FIFO_THD(SIRFSOC_SPI_FIFO_SIZE / 2) | 926 - (sspi->word_width >> 1); 927 - rxfifo_ctrl = SIRFSOC_SPI_FIFO_THD(SIRFSOC_SPI_FIFO_SIZE / 2) | 928 - (sspi->word_width >> 1); 929 - 930 - if (!(spi->mode & SPI_CS_HIGH)) 931 - regval |= SIRFSOC_SPI_CS_IDLE_STAT; 932 - if (!(spi->mode & SPI_LSB_FIRST)) 933 - regval |= SIRFSOC_SPI_TRAN_MSB; 934 - if (spi->mode & SPI_CPOL) 935 - regval |= SIRFSOC_SPI_CLK_IDLE_STAT; 936 - 937 - /* 938 - * Data should be driven at least 1/2 cycle before the fetch edge 939 - * to make sure that data gets stable at the fetch edge. 940 - */ 941 - if (((spi->mode & SPI_CPOL) && (spi->mode & SPI_CPHA)) || 942 - (!(spi->mode & SPI_CPOL) && !(spi->mode & SPI_CPHA))) 943 - regval &= ~SIRFSOC_SPI_DRV_POS_EDGE; 944 - else 945 - regval |= SIRFSOC_SPI_DRV_POS_EDGE; 946 - 947 - writel(SIRFSOC_SPI_FIFO_SC(fifo_size - 2) | 948 - SIRFSOC_SPI_FIFO_LC(fifo_size / 2) | 949 - SIRFSOC_SPI_FIFO_HC(2), 950 - sspi->base + SIRFSOC_SPI_TXFIFO_LEVEL_CHK); 951 - writel(SIRFSOC_SPI_FIFO_SC(2) | 952 - SIRFSOC_SPI_FIFO_LC(fifo_size / 2) | 953 - SIRFSOC_SPI_FIFO_HC(fifo_size - 2), 954 - sspi->base + SIRFSOC_SPI_RXFIFO_LEVEL_CHK); 955 - writel(txfifo_ctrl, sspi->base + SIRFSOC_SPI_TXFIFO_CTRL); 956 - writel(rxfifo_ctrl, sspi->base + SIRFSOC_SPI_RXFIFO_CTRL); 957 - 958 - if (t && t->tx_buf && !t->rx_buf && (t->len <= SIRFSOC_MAX_CMD_BYTES)) { 959 - regval |= (SIRFSOC_SPI_CMD_BYTE_NUM((t->len - 1)) | 960 - SIRFSOC_SPI_CMD_MODE); 961 - sspi->tx_by_cmd = true; 962 - } else { 963 - regval &= ~SIRFSOC_SPI_CMD_MODE; 964 - sspi->tx_by_cmd = false; 566 + txfifo_ctrl = (((sspi->fifo_size / 2) & 567 + SIRFSOC_SPI_FIFO_THD_MASK(sspi)) 568 + << SIRFSOC_SPI_FIFO_THD_OFFSET) | 569 + (sspi->word_width >> 1); 570 + rxfifo_ctrl = (((sspi->fifo_size / 2) & 571 + SIRFSOC_SPI_FIFO_THD_MASK(sspi)) 572 + << SIRFSOC_SPI_FIFO_THD_OFFSET) | 573 + (sspi->word_width >> 1); 574 + writel(txfifo_ctrl, sspi->base + sspi->regs->txfifo_ctrl); 575 + writel(rxfifo_ctrl, sspi->base + sspi->regs->rxfifo_ctrl); 576 + if (sspi->type == SIRF_USP_SPI_P2 || 577 + sspi->type == SIRF_USP_SPI_A7) { 578 + tx_frm_ctl = 0; 579 + tx_frm_ctl |= ((bits_per_word - 1) & SIRFSOC_USP_TX_DATA_MASK) 580 + << SIRFSOC_USP_TX_DATA_OFFSET; 581 + tx_frm_ctl |= ((bits_per_word + 1 + SIRFSOC_USP_TXD_DELAY_LEN 582 + - 1) & SIRFSOC_USP_TX_SYNC_MASK) << 583 + SIRFSOC_USP_TX_SYNC_OFFSET; 584 + tx_frm_ctl |= ((bits_per_word + 1 + SIRFSOC_USP_TXD_DELAY_LEN 585 + + 2 - 1) & SIRFSOC_USP_TX_FRAME_MASK) << 586 + SIRFSOC_USP_TX_FRAME_OFFSET; 587 + tx_frm_ctl |= ((bits_per_word - 1) & 588 + SIRFSOC_USP_TX_SHIFTER_MASK) << 589 + SIRFSOC_USP_TX_SHIFTER_OFFSET; 590 + rx_frm_ctl = 0; 591 + rx_frm_ctl |= ((bits_per_word - 1) & SIRFSOC_USP_RX_DATA_MASK) 592 + << SIRFSOC_USP_RX_DATA_OFFSET; 593 + rx_frm_ctl |= ((bits_per_word + 1 + SIRFSOC_USP_RXD_DELAY_LEN 594 + + 2 - 1) & SIRFSOC_USP_RX_FRAME_MASK) << 595 + SIRFSOC_USP_RX_FRAME_OFFSET; 596 + rx_frm_ctl |= ((bits_per_word - 1) 597 + & SIRFSOC_USP_RX_SHIFTER_MASK) << 598 + SIRFSOC_USP_RX_SHIFTER_OFFSET; 599 + writel(tx_frm_ctl | (((usp_mode2 >> 10) & 600 + SIRFSOC_USP_CLK_10_11_MASK) << 601 + SIRFSOC_USP_CLK_10_11_OFFSET), 602 + sspi->base + sspi->regs->usp_tx_frame_ctrl); 603 + writel(rx_frm_ctl | (((usp_mode2 >> 12) & 604 + SIRFSOC_USP_CLK_12_15_MASK) << 605 + SIRFSOC_USP_CLK_12_15_OFFSET), 606 + sspi->base + sspi->regs->usp_rx_frame_ctrl); 607 + writel(readl(sspi->base + sspi->regs->usp_mode2) | 608 + ((usp_mode2 & SIRFSOC_USP_CLK_DIVISOR_MASK) << 609 + SIRFSOC_USP_CLK_DIVISOR_OFFSET) | 610 + (SIRFSOC_USP_RXD_DELAY_LEN << 611 + SIRFSOC_USP_RXD_DELAY_OFFSET) | 612 + (SIRFSOC_USP_TXD_DELAY_LEN << 613 + SIRFSOC_USP_TXD_DELAY_OFFSET), 614 + sspi->base + sspi->regs->usp_mode2); 965 615 } 966 - /* 967 - * it should never set to hardware cs mode because in hardware cs mode, 968 - * cs signal can't controlled by driver. 969 - */ 970 - regval |= SIRFSOC_SPI_CS_IO_MODE; 971 - writel(regval, sspi->base + SIRFSOC_SPI_CTRL); 972 - 616 + if (sspi->type == SIRF_REAL_SPI) 617 + writel(regval, sspi->base + sspi->regs->spi_ctrl); 618 + spi_sirfsoc_config_mode(spi); 619 + if (sspi->type == SIRF_REAL_SPI) { 620 + if (t && t->tx_buf && !t->rx_buf && 621 + (t->len <= SIRFSOC_MAX_CMD_BYTES)) { 622 + sspi->tx_by_cmd = true; 623 + writel(readl(sspi->base + sspi->regs->spi_ctrl) | 624 + (SIRFSOC_SPI_CMD_BYTE_NUM((t->len - 1)) | 625 + SIRFSOC_SPI_CMD_MODE), 626 + sspi->base + sspi->regs->spi_ctrl); 627 + } else { 628 + sspi->tx_by_cmd = false; 629 + writel(readl(sspi->base + sspi->regs->spi_ctrl) & 630 + ~SIRFSOC_SPI_CMD_MODE, 631 + sspi->base + sspi->regs->spi_ctrl); 632 + } 633 + } 973 634 if (IS_DMA_VALID(t)) { 974 635 /* Enable DMA mode for RX, TX */ 975 - writel(0, sspi->base + SIRFSOC_SPI_TX_DMA_IO_CTRL); 636 + writel(0, sspi->base + sspi->regs->tx_dma_io_ctrl); 976 637 writel(SIRFSOC_SPI_RX_DMA_FLUSH, 977 - sspi->base + SIRFSOC_SPI_RX_DMA_IO_CTRL); 638 + sspi->base + sspi->regs->rx_dma_io_ctrl); 978 639 } else { 979 640 /* Enable IO mode for RX, TX */ 980 641 writel(SIRFSOC_SPI_IO_MODE_SEL, 981 - sspi->base + SIRFSOC_SPI_TX_DMA_IO_CTRL); 642 + sspi->base + sspi->regs->tx_dma_io_ctrl); 982 643 writel(SIRFSOC_SPI_IO_MODE_SEL, 983 - sspi->base + SIRFSOC_SPI_RX_DMA_IO_CTRL); 644 + sspi->base + sspi->regs->rx_dma_io_ctrl); 984 645 } 985 - 986 646 return 0; 987 647 } 988 648 ··· 1010 634 int ret = 0; 1011 635 1012 636 sspi = spi_master_get_devdata(spi->master); 1013 - 1014 637 if (spi->cs_gpio == -ENOENT) 1015 638 sspi->hw_cs = true; 1016 639 else { ··· 1034 659 spi_set_ctldata(spi, cs); 1035 660 } 1036 661 } 1037 - writel(readl(sspi->base + SIRFSOC_SPI_CTRL) | SIRFSOC_SPI_CS_IO_MODE, 1038 - sspi->base + SIRFSOC_SPI_CTRL); 662 + spi_sirfsoc_config_mode(spi); 1039 663 spi_sirfsoc_chipselect(spi, BITBANG_CS_INACTIVE); 1040 664 exit: 1041 665 return ret; ··· 1048 674 } 1049 675 } 1050 676 677 + static const struct of_device_id spi_sirfsoc_of_match[] = { 678 + { .compatible = "sirf,prima2-spi", .data = &sirf_real_spi}, 679 + { .compatible = "sirf,prima2-usp-spi", .data = &sirf_usp_spi_p2}, 680 + { .compatible = "sirf,atlas7-usp-spi", .data = &sirf_usp_spi_a7}, 681 + {} 682 + }; 683 + MODULE_DEVICE_TABLE(of, spi_sirfsoc_of_match); 684 + 1051 685 static int spi_sirfsoc_probe(struct platform_device *pdev) 1052 686 { 1053 687 struct sirfsoc_spi *sspi; 1054 688 struct spi_master *master; 1055 689 struct resource *mem_res; 690 + struct sirf_spi_comp_data *spi_comp_data; 1056 691 int irq; 1057 692 int ret; 693 + const struct of_device_id *match; 1058 694 1059 695 ret = device_reset(&pdev->dev); 1060 696 if (ret) { ··· 1077 693 dev_err(&pdev->dev, "Unable to allocate SPI master\n"); 1078 694 return -ENOMEM; 1079 695 } 696 + match = of_match_node(spi_sirfsoc_of_match, pdev->dev.of_node); 1080 697 platform_set_drvdata(pdev, master); 1081 698 sspi = spi_master_get_devdata(master); 1082 - 699 + sspi->fifo_full_offset = ilog2(sspi->fifo_size); 700 + spi_comp_data = (struct sirf_spi_comp_data *)match->data; 701 + sspi->regs = spi_comp_data->regs; 702 + sspi->type = spi_comp_data->type; 703 + sspi->fifo_level_chk_mask = (sspi->fifo_size / 4) - 1; 704 + sspi->dat_max_frm_len = spi_comp_data->dat_max_frm_len; 705 + sspi->fifo_size = spi_comp_data->fifo_size; 1083 706 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1084 707 sspi->base = devm_ioremap_resource(&pdev->dev, mem_res); 1085 708 if (IS_ERR(sspi->base)) { 1086 709 ret = PTR_ERR(sspi->base); 1087 710 goto free_master; 1088 711 } 1089 - 1090 712 irq = platform_get_irq(pdev, 0); 1091 713 if (irq < 0) { 1092 714 ret = -ENXIO; ··· 1141 751 init_completion(&sspi->rx_done); 1142 752 init_completion(&sspi->tx_done); 1143 753 1144 - writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + SIRFSOC_SPI_RXFIFO_OP); 1145 - writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + SIRFSOC_SPI_TXFIFO_OP); 1146 - writel(SIRFSOC_SPI_FIFO_START, sspi->base + SIRFSOC_SPI_RXFIFO_OP); 1147 - writel(SIRFSOC_SPI_FIFO_START, sspi->base + SIRFSOC_SPI_TXFIFO_OP); 1148 - /* We are not using dummy delay between command and data */ 1149 - writel(0, sspi->base + SIRFSOC_SPI_DUMMY_DELAY_CTL); 1150 - 1151 754 sspi->dummypage = devm_kzalloc(&pdev->dev, 2 * PAGE_SIZE, GFP_KERNEL); 1152 755 if (!sspi->dummypage) { 1153 756 ret = -ENOMEM; ··· 1173 790 1174 791 master = platform_get_drvdata(pdev); 1175 792 sspi = spi_master_get_devdata(master); 1176 - 1177 793 spi_bitbang_stop(&sspi->bitbang); 1178 794 clk_disable_unprepare(sspi->clk); 1179 795 clk_put(sspi->clk); ··· 1203 821 struct sirfsoc_spi *sspi = spi_master_get_devdata(master); 1204 822 1205 823 clk_enable(sspi->clk); 1206 - writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + SIRFSOC_SPI_RXFIFO_OP); 1207 - writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + SIRFSOC_SPI_TXFIFO_OP); 1208 - writel(SIRFSOC_SPI_FIFO_START, sspi->base + SIRFSOC_SPI_RXFIFO_OP); 1209 - writel(SIRFSOC_SPI_FIFO_START, sspi->base + SIRFSOC_SPI_TXFIFO_OP); 1210 - 1211 - return spi_master_resume(master); 824 + writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + sspi->regs->txfifo_op); 825 + writel(SIRFSOC_SPI_FIFO_RESET, sspi->base + sspi->regs->rxfifo_op); 826 + writel(SIRFSOC_SPI_FIFO_START, sspi->base + sspi->regs->txfifo_op); 827 + writel(SIRFSOC_SPI_FIFO_START, sspi->base + sspi->regs->rxfifo_op); 828 + return 0; 1212 829 } 1213 830 #endif 1214 831 1215 832 static SIMPLE_DEV_PM_OPS(spi_sirfsoc_pm_ops, spi_sirfsoc_suspend, 1216 833 spi_sirfsoc_resume); 1217 - 1218 - static const struct of_device_id spi_sirfsoc_of_match[] = { 1219 - { .compatible = "sirf,prima2-spi", }, 1220 - {} 1221 - }; 1222 - MODULE_DEVICE_TABLE(of, spi_sirfsoc_of_match); 1223 834 1224 835 static struct platform_driver spi_sirfsoc_driver = { 1225 836 .driver = { ··· 1227 852 MODULE_DESCRIPTION("SiRF SoC SPI master driver"); 1228 853 MODULE_AUTHOR("Zhiwu Song <Zhiwu.Song@csr.com>"); 1229 854 MODULE_AUTHOR("Barry Song <Baohua.Song@csr.com>"); 855 + MODULE_AUTHOR("Qipan Li <Qipan.Li@csr.com>"); 1230 856 MODULE_LICENSE("GPL v2");