|
@@ -39,13 +39,23 @@ static int m25p80_read_reg(struct spi_nor *nor, u8 code, u8 *val, int len)
|
|
struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(code, 1),
|
|
struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(code, 1),
|
|
SPI_MEM_OP_NO_ADDR,
|
|
SPI_MEM_OP_NO_ADDR,
|
|
SPI_MEM_OP_NO_DUMMY,
|
|
SPI_MEM_OP_NO_DUMMY,
|
|
- SPI_MEM_OP_DATA_IN(len, val, 1));
|
|
|
|
|
|
+ SPI_MEM_OP_DATA_IN(len, NULL, 1));
|
|
|
|
+ void *scratchbuf;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
|
|
+ scratchbuf = kmalloc(len, GFP_KERNEL);
|
|
|
|
+ if (!scratchbuf)
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+
|
|
|
|
+ op.data.buf.in = scratchbuf;
|
|
ret = spi_mem_exec_op(flash->spimem, &op);
|
|
ret = spi_mem_exec_op(flash->spimem, &op);
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
dev_err(&flash->spimem->spi->dev, "error %d reading %x\n", ret,
|
|
dev_err(&flash->spimem->spi->dev, "error %d reading %x\n", ret,
|
|
code);
|
|
code);
|
|
|
|
+ else
|
|
|
|
+ memcpy(val, scratchbuf, len);
|
|
|
|
+
|
|
|
|
+ kfree(scratchbuf);
|
|
|
|
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
@@ -56,9 +66,19 @@ static int m25p80_write_reg(struct spi_nor *nor, u8 opcode, u8 *buf, int len)
|
|
struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(opcode, 1),
|
|
struct spi_mem_op op = SPI_MEM_OP(SPI_MEM_OP_CMD(opcode, 1),
|
|
SPI_MEM_OP_NO_ADDR,
|
|
SPI_MEM_OP_NO_ADDR,
|
|
SPI_MEM_OP_NO_DUMMY,
|
|
SPI_MEM_OP_NO_DUMMY,
|
|
- SPI_MEM_OP_DATA_OUT(len, buf, 1));
|
|
|
|
|
|
+ SPI_MEM_OP_DATA_OUT(len, NULL, 1));
|
|
|
|
+ void *scratchbuf;
|
|
|
|
+ int ret;
|
|
|
|
|
|
- return spi_mem_exec_op(flash->spimem, &op);
|
|
|
|
|
|
+ scratchbuf = kmemdup(buf, len, GFP_KERNEL);
|
|
|
|
+ if (!scratchbuf)
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+
|
|
|
|
+ op.data.buf.out = scratchbuf;
|
|
|
|
+ ret = spi_mem_exec_op(flash->spimem, &op);
|
|
|
|
+ kfree(scratchbuf);
|
|
|
|
+
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
static ssize_t m25p80_write(struct spi_nor *nor, loff_t to, size_t len,
|
|
static ssize_t m25p80_write(struct spi_nor *nor, loff_t to, size_t len,
|