diff options
Diffstat (limited to 'drivers/spi/spi-mem.c')
| -rw-r--r-- | drivers/spi/spi-mem.c | 46 | 
1 files changed, 38 insertions, 8 deletions
| diff --git a/drivers/spi/spi-mem.c b/drivers/spi/spi-mem.c index c095ae9505a..9c1ede1b61c 100644 --- a/drivers/spi/spi-mem.c +++ b/drivers/spi/spi-mem.c @@ -145,8 +145,8 @@ static int spi_check_buswidth_req(struct spi_slave *slave, u8 buswidth, bool tx)  	return -ENOTSUPP;  } -bool spi_mem_default_supports_op(struct spi_slave *slave, -				 const struct spi_mem_op *op) +static bool spi_mem_check_buswidth(struct spi_slave *slave, +				   const struct spi_mem_op *op)  {  	if (spi_check_buswidth_req(slave, op->cmd.buswidth, true))  		return false; @@ -166,6 +166,38 @@ bool spi_mem_default_supports_op(struct spi_slave *slave,  	return true;  } + +bool spi_mem_dtr_supports_op(struct spi_slave *slave, +			     const struct spi_mem_op *op) +{ +	if (op->cmd.buswidth == 8 && op->cmd.nbytes % 2) +		return false; + +	if (op->addr.nbytes && op->addr.buswidth == 8 && op->addr.nbytes % 2) +		return false; + +	if (op->dummy.nbytes && op->dummy.buswidth == 8 && op->dummy.nbytes % 2) +		return false; + +	if (op->data.dir != SPI_MEM_NO_DATA && +	    op->dummy.buswidth == 8 && op->data.nbytes % 2) +		return false; + +	return spi_mem_check_buswidth(slave, op); +} +EXPORT_SYMBOL_GPL(spi_mem_dtr_supports_op); + +bool spi_mem_default_supports_op(struct spi_slave *slave, +				 const struct spi_mem_op *op) +{ +	if (op->cmd.dtr || op->addr.dtr || op->dummy.dtr || op->data.dtr) +		return false; + +	if (op->cmd.nbytes != 1) +		return false; + +	return spi_mem_check_buswidth(slave, op); +}  EXPORT_SYMBOL_GPL(spi_mem_default_supports_op);  /** @@ -270,8 +302,7 @@ int spi_mem_exec_op(struct spi_slave *slave, const struct spi_mem_op *op)  	}  #ifndef __UBOOT__ -	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 @@ -286,7 +317,7 @@ int spi_mem_exec_op(struct spi_slave *slave, 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++; @@ -350,7 +381,7 @@ int spi_mem_exec_op(struct spi_slave *slave, const struct spi_mem_op *op)  			tx_buf = op->data.buf.out;  	} -	op_len = sizeof(op->cmd.opcode) + op->addr.nbytes + op->dummy.nbytes; +	op_len = op->cmd.nbytes + op->addr.nbytes + op->dummy.nbytes;  	/*  	 * Avoid using malloc() here so that we can use this code in SPL where @@ -439,8 +470,7 @@ int spi_mem_adjust_op_size(struct spi_slave *slave, struct spi_mem_op *op)  	if (!ops->mem_ops || !ops->mem_ops->exec_op) {  		unsigned int len; -		len = sizeof(op->cmd.opcode) + op->addr.nbytes + -			op->dummy.nbytes; +		len = op->cmd.nbytes + op->addr.nbytes + op->dummy.nbytes;  		if (slave->max_write_size && len > slave->max_write_size)  			return -EINVAL; | 
