Пример #1
0
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);
}
Пример #2
0
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;
}
Пример #3
0
void spi_free_slave(struct spi_slave *slave)
{
	struct fsl_qspi *qspi = to_qspi_spi(slave);

	free(qspi);
}
Пример #4
0
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;
}