On 08/01/2019 07:22 PM, Vignesh Raghavendra wrote: > External E-Mail > > > spi-mem layer expects all buffers passed to it to be DMA'able. But > spi-nor layer mostly allocates buffers on stack for reading/writing to > registers and therefore are not DMA'able. Introduce bounce buffer to be > used to read/write to registers. This ensures that buffer passed to > spi-mem layer during register read/writes is DMA'able. With this change > nor->cmd-buf is no longer used, so drop it. > > Reviewed-by: Boris Brezillon <boris.brezillon@xxxxxxxxxxxxx> > Signed-off-by: Vignesh Raghavendra <vigneshr@xxxxxx> > --- > > v4: > Avoid memcpy during READID > > v3: new patch > > drivers/mtd/spi-nor/spi-nor.c | 70 ++++++++++++++++++++--------------- > include/linux/mtd/spi-nor.h | 7 +++- > 2 files changed, 45 insertions(+), 32 deletions(-) > > diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c > index 03cc788511d5..e02376e1127b 100644 > --- a/drivers/mtd/spi-nor/spi-nor.c > +++ b/drivers/mtd/spi-nor/spi-nor.c cut > /** > @@ -1404,9 +1401,11 @@ static int write_sr_cr(struct spi_nor *nor, u8 *sr_cr) > { > int ret; > > + memcpy(nor->bouncebuf, sr_cr, 2); I'm thinking out loud. This can be avoided by forcing all the callers to use nor->bouncebuf. That would result in a: static int write_sr(struct spi_nor *nor, size_t len) write_sr_cr() can be removed. Memcopying 2 bytes is a small price to pay, we can keep things as they are, to not be too invasive. But if you think that this idea is worth it, tell. > + > write_enable(nor); > > - ret = nor->write_reg(nor, SPINOR_OP_WRSR, sr_cr, 2); > + ret = nor->write_reg(nor, SPINOR_OP_WRSR, nor->bouncebuf, 2); > if (ret < 0) { > dev_err(nor->dev, > "error while writing configuration register\n"); cut > @@ -2177,9 +2176,10 @@ static const struct flash_info spi_nor_ids[] = { > static const struct flash_info *spi_nor_read_id(struct spi_nor *nor) > { > int tmp; > - u8 id[SPI_NOR_MAX_ID_LEN]; > + u8 *id; > const struct flash_info *info; > > + id = nor->bouncebuf; nit: do init at declaration. Also, you missed a place in which you can use the bouncebuf, search by "read_reg(": ret = nor->read_reg(nor, SPINOR_OP_XRDSR, &val, 1); Cheers, ta ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/