Message ID | 20200320093527.921010-1-tudor.ambarus@microchip.com |
---|---|
State | Accepted |
Commit | 790c1699b2c0ca40809c43b3ddb9fc4a46939d18 |
Delegated to: | Jagannadha Sutradharudu Teki |
Headers | show |
Series | [u-boot] spi: spi-mem: Add SPI_MEM_NO_DATA to the spi_mem_data_dir enum | expand |
On Fri, Mar 20, 2020 at 3:05 PM <Tudor.Ambarus@microchip.com> wrote: > > From: Tudor Ambarus <tudor.ambarus@microchip.com> > > Commit: 0ebb261a0b2d ("spi: spi-mem: Add SPI_MEM_NO_DATA to the spi_mem_data_dir enum") > in linux. > > When defining spi_mem_op templates we don't necessarily know the size > that will be passed when the template is actually used, and basing the > supports_op() check on op->data.nbytes to know whether there will be > data transferred for a specific operation is not possible. > > Add SPI_MEM_NO_DATA to the spi_mem_data_dir enum so that we can base > our checks on op->data.dir instead of op->data.nbytes. > > This also fixes a bug identified with the atmel-quaspi driver. > The spi-nor core, when erasing sectors, fills the spi_mem_op template > using SPI_MEM_OP_NO_DATA, which initializes all the data members with > value zero. This is wrong because data.dir is treated as SPI_MEM_DATA_IN, > which translates in our driver to read accesses for erases (RICR), while > the controller expects write accesses (WICR). > > Signed-off-by: Tudor Ambarus <tudor.ambarus@microchip.com> > --- Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
diff --git a/drivers/spi/spi-mem.c b/drivers/spi/spi-mem.c index e900c997bd7f..ffbe20c5b1e6 100644 --- a/drivers/spi/spi-mem.c +++ b/drivers/spi/spi-mem.c @@ -153,7 +153,7 @@ bool spi_mem_default_supports_op(struct spi_slave *slave, spi_check_buswidth_req(slave, op->dummy.buswidth, true)) return false; - if (op->data.nbytes && + if (op->data.dir != SPI_MEM_NO_DATA && spi_check_buswidth_req(slave, op->data.buswidth, op->data.dir == SPI_MEM_DATA_OUT)) return false; diff --git a/include/spi-mem.h b/include/spi-mem.h index 36814efa8613..893f7bd73370 100644 --- a/include/spi-mem.h +++ b/include/spi-mem.h @@ -60,10 +60,12 @@ /** * enum spi_mem_data_dir - describes the direction of a SPI memory data * transfer from the controller perspective + * @SPI_MEM_NO_DATA: no data transferred * @SPI_MEM_DATA_IN: data coming from the SPI memory * @SPI_MEM_DATA_OUT: data sent the SPI memory */ enum spi_mem_data_dir { + SPI_MEM_NO_DATA, SPI_MEM_DATA_IN, SPI_MEM_DATA_OUT, };