int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout, void *din, unsigned long flags) { struct fsl_qspi *qspi = to_qspi_spi(slave); return qspi_xfer(&qspi->priv, bitlen, dout, din, flags); }
int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout, void *din, unsigned long flags) { struct fsl_qspi *qspi = to_qspi_spi(slave); u32 bytes = DIV_ROUND_UP(bitlen, 8); static u32 pp_sfaddr; u32 txbuf; if (dout) { memcpy(&txbuf, dout, 4); qspi->cur_seqid = *(u8 *)dout; if (flags == SPI_XFER_END) { qspi->sf_addr = pp_sfaddr; qspi_op_pp(qspi, (u32 *)dout, bytes); return 0; } if (qspi->cur_seqid == OPCODE_FAST_READ) { qspi->sf_addr = swab32(txbuf) & OFFSET_BITS_MASK; } else if (qspi->cur_seqid == OPCODE_SE) { qspi->sf_addr = swab32(txbuf) & OFFSET_BITS_MASK; qspi_op_se(qspi); } else if (qspi->cur_seqid == OPCODE_PP) { pp_sfaddr = swab32(txbuf) & OFFSET_BITS_MASK; } } if (din) { if (qspi->cur_seqid == OPCODE_FAST_READ) qspi_op_read(qspi, din, bytes); else if (qspi->cur_seqid == OPCODE_RDID) qspi_op_rdid(qspi, din, bytes); else if (qspi->cur_seqid == OPCODE_RDSR) qspi_op_rdsr(qspi, din); } return 0; }
void spi_free_slave(struct spi_slave *slave) { struct fsl_qspi *qspi = to_qspi_spi(slave); free(qspi); }
int spi_xfer(struct spi_slave *slave, unsigned int bitlen, const void *dout, void *din, unsigned long flags) { struct fsl_qspi *qspi = to_qspi_spi(slave); u32 bytes = DIV_ROUND_UP(bitlen, 8); static u32 wr_sfaddr; u32 txbuf; if (dout) { if (flags & SPI_XFER_BEGIN) { qspi->cur_seqid = *(u8 *)dout; memcpy(&txbuf, dout, 4); } if (flags == SPI_XFER_END) { qspi->sf_addr = wr_sfaddr; qspi_op_write(qspi, (u8 *)dout, bytes); return 0; } if (qspi->cur_seqid == QSPI_CMD_FAST_READ) { qspi->sf_addr = swab32(txbuf) & OFFSET_BITS_MASK; } else if ((qspi->cur_seqid == QSPI_CMD_SE) || (qspi->cur_seqid == QSPI_CMD_BE_4K)) { qspi->sf_addr = swab32(txbuf) & OFFSET_BITS_MASK; qspi_op_erase(qspi); } else if (qspi->cur_seqid == QSPI_CMD_PP) wr_sfaddr = swab32(txbuf) & OFFSET_BITS_MASK; #ifdef CONFIG_SPI_FLASH_BAR else if ((qspi->cur_seqid == QSPI_CMD_BRWR) || (qspi->cur_seqid == QSPI_CMD_WREAR)) { wr_sfaddr = 0; } #endif } if (din) { if (qspi->cur_seqid == QSPI_CMD_FAST_READ) { #ifdef CONFIG_SYS_FSL_QSPI_AHB qspi_ahb_read(qspi, din, bytes); #else qspi_op_read(qspi, din, bytes); #endif } else if (qspi->cur_seqid == QSPI_CMD_RDID) qspi_op_rdid(qspi, din, bytes); else if (qspi->cur_seqid == QSPI_CMD_RDSR) qspi_op_rdsr(qspi, din); #ifdef CONFIG_SPI_FLASH_BAR else if ((qspi->cur_seqid == QSPI_CMD_BRRD) || (qspi->cur_seqid == QSPI_CMD_RDEAR)) { qspi->sf_addr = 0; qspi_op_rdbank(qspi, din, bytes); } #endif } #ifdef CONFIG_SYS_FSL_QSPI_AHB if ((qspi->cur_seqid == QSPI_CMD_SE) || (qspi->cur_seqid == QSPI_CMD_PP) || (qspi->cur_seqid == QSPI_CMD_BE_4K) || (qspi->cur_seqid == QSPI_CMD_WREAR) || (qspi->cur_seqid == QSPI_CMD_BRWR)) qspi_ahb_invalid(qspi); #endif return 0; }