Commit fb249e10 authored by Tudor Ambarus's avatar Tudor Ambarus
Browse files

Merge tag 'spi-mem-dtr' into spi-nor/next

spi: Support for DTR ops

Merge the SPIMEM DTR bits in spi-nor/next so that we can
continue the development on top of them.
parents cc59e6bb 4728f073
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -285,6 +285,12 @@ static bool atmel_qspi_supports_op(struct spi_mem *mem,
		op->dummy.nbytes == 0)
		return false;

	/* DTR ops not supported. */
	if (op->cmd.dtr || op->addr.dtr || op->dummy.dtr || op->data.dtr)
		return false;
	if (op->cmd.nbytes != 1)
		return false;

	return true;
}

+10 −6
Original line number Diff line number Diff line
@@ -156,6 +156,12 @@ bool spi_mem_default_supports_op(struct spi_mem *mem,
				   op->data.dir == SPI_MEM_DATA_OUT))
		return false;

	if (op->cmd.dtr || op->addr.dtr || op->dummy.dtr || op->data.dtr)
		return false;

	if (op->cmd.nbytes != 1)
		return false;

	return true;
}
EXPORT_SYMBOL_GPL(spi_mem_default_supports_op);
@@ -170,7 +176,7 @@ static bool spi_mem_buswidth_is_valid(u8 buswidth)

static int spi_mem_check_op(const struct spi_mem_op *op)
{
	if (!op->cmd.buswidth)
	if (!op->cmd.buswidth || !op->cmd.nbytes)
		return -EINVAL;

	if ((op->addr.nbytes && !op->addr.buswidth) ||
@@ -306,8 +312,7 @@ int spi_mem_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
			return ret;
	}

	tmpbufsize = sizeof(op->cmd.opcode) + op->addr.nbytes +
		     op->dummy.nbytes;
	tmpbufsize = op->cmd.nbytes + op->addr.nbytes + op->dummy.nbytes;

	/*
	 * Allocate a buffer to transmit the CMD, ADDR cycles with kmalloc() so
@@ -322,7 +327,7 @@ int spi_mem_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)

	tmpbuf[0] = op->cmd.opcode;
	xfers[xferpos].tx_buf = tmpbuf;
	xfers[xferpos].len = sizeof(op->cmd.opcode);
	xfers[xferpos].len = op->cmd.nbytes;
	xfers[xferpos].tx_nbits = op->cmd.buswidth;
	spi_message_add_tail(&xfers[xferpos], &msg);
	xferpos++;
@@ -424,8 +429,7 @@ int spi_mem_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op)
		return ctlr->mem_ops->adjust_op_size(mem, op);

	if (!ctlr->mem_ops || !ctlr->mem_ops->exec_op) {
		len = sizeof(op->cmd.opcode) + op->addr.nbytes +
		      op->dummy.nbytes;
		len = op->cmd.nbytes + op->addr.nbytes + op->dummy.nbytes;

		if (len > spi_max_transfer_size(mem->spi))
			return -EINVAL;
+8 −2
Original line number Diff line number Diff line
@@ -195,7 +195,7 @@ static int mtk_nor_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op)
		}
	}

	len = MTK_NOR_PRG_MAX_SIZE - sizeof(op->cmd.opcode) - op->addr.nbytes -
	len = MTK_NOR_PRG_MAX_SIZE - op->cmd.nbytes - op->addr.nbytes -
	      op->dummy.nbytes;
	if (op->data.nbytes > len)
		op->data.nbytes = len;
@@ -211,6 +211,12 @@ static bool mtk_nor_supports_op(struct spi_mem *mem,
	if (op->cmd.buswidth != 1)
		return false;

	/* DTR ops not supported. */
	if (op->cmd.dtr || op->addr.dtr || op->dummy.dtr || op->data.dtr)
		return false;
	if (op->cmd.nbytes != 1)
		return false;

	if ((op->addr.nbytes == 3) || (op->addr.nbytes == 4)) {
		if ((op->data.dir == SPI_MEM_DATA_IN) && mtk_nor_match_read(op))
			return true;
@@ -219,7 +225,7 @@ static bool mtk_nor_supports_op(struct spi_mem *mem,
			       (op->dummy.buswidth == 0) &&
			       (op->data.buswidth == 1);
	}
	len = sizeof(op->cmd.opcode) + op->addr.nbytes + op->dummy.nbytes;
	len = op->cmd.nbytes + op->addr.nbytes + op->dummy.nbytes;
	if ((len > MTK_NOR_PRG_MAX_SIZE) ||
	    ((op->data.nbytes) && (len == MTK_NOR_PRG_MAX_SIZE)))
		return false;
+2 −1
Original line number Diff line number Diff line
@@ -356,6 +356,7 @@ static int mxic_spi_mem_exec_op(struct spi_mem *mem,
	int nio = 1, i, ret;
	u32 ss_ctrl;
	u8 addr[8];
	u8 opcode = op->cmd.opcode;

	ret = mxic_spi_set_freq(mxic, mem->spi->max_speed_hz);
	if (ret)
@@ -393,7 +394,7 @@ static int mxic_spi_mem_exec_op(struct spi_mem *mem,
	writel(readl(mxic->regs + HC_CFG) | HC_CFG_MAN_CS_ASSERT,
	       mxic->regs + HC_CFG);

	ret = mxic_spi_data_xfer(mxic, &op->cmd.opcode, NULL, 1);
	ret = mxic_spi_data_xfer(mxic, &opcode, NULL, 1);
	if (ret)
		goto out;

+6 −5
Original line number Diff line number Diff line
@@ -527,20 +527,21 @@ static int zynq_qspi_exec_mem_op(struct spi_mem *mem,
	struct zynq_qspi *xqspi = spi_controller_get_devdata(mem->spi->master);
	int err = 0, i;
	u8 *tmpbuf;
	u8 opcode = op->cmd.opcode;

	dev_dbg(xqspi->dev, "cmd:%#x mode:%d.%d.%d.%d\n",
		op->cmd.opcode, op->cmd.buswidth, op->addr.buswidth,
		opcode, op->cmd.buswidth, op->addr.buswidth,
		op->dummy.buswidth, op->data.buswidth);

	zynq_qspi_chipselect(mem->spi, true);
	zynq_qspi_config_op(xqspi, mem->spi);

	if (op->cmd.opcode) {
	if (op->cmd.nbytes) {
		reinit_completion(&xqspi->data_completion);
		xqspi->txbuf = (u8 *)&op->cmd.opcode;
		xqspi->txbuf = &opcode;
		xqspi->rxbuf = NULL;
		xqspi->tx_bytes = sizeof(op->cmd.opcode);
		xqspi->rx_bytes = sizeof(op->cmd.opcode);
		xqspi->tx_bytes = op->cmd.nbytes;
		xqspi->rx_bytes = op->cmd.nbytes;
		zynq_qspi_write_op(xqspi, ZYNQ_QSPI_FIFO_DEPTH, true);
		zynq_qspi_write(xqspi, ZYNQ_QSPI_IEN_OFFSET,
				ZYNQ_QSPI_IXR_RXTX_MASK);
Loading