History

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.

Tudor Ambarus committed 6 years ago

Commit fb249e12 parents cc59e6b 4728f076 files · +45 −15Browse files

Unified · Split

6 files
  1. drivers/spi/atmel-quadspi.c +6 −0
  2. drivers/spi/spi-mem.c +10 −6
  3. drivers/spi/spi-mtk-nor.c +8 −2
  4. drivers/spi/spi-mxic.c +2 −1
  5. drivers/spi/spi-zynq-qspi.c +6 −5
  6. include/linux/spi/spi-mem.h +13 −1
drivers/spi/atmel-quadspi.c+6−0
@@ -285,6 +285,12 @@ static bool atmel_qspi_supports_op(struct spi_mem *mem, · 284 unmodified lines
285285 op->dummy.nbytes == 0)
286286 return false;
287287
288+ /* DTR ops not supported. */
289+ if (op->cmd.dtr || op->addr.dtr || op->dummy.dtr || op->data.dtr)
290+ return false;
291+ if (op->cmd.nbytes != 1)
292+ return false;
293+
288294 return true;
289295 }
290296
drivers/spi/spi-mem.c+10−6
@@ -156,6 +156,12 @@ bool spi_mem_default_supports_op(struct spi_mem *mem, · 155 unmodified lines
156156 op->data.dir == SPI_MEM_DATA_OUT))
157157 return false;
158158
159+ if (op->cmd.dtr || op->addr.dtr || op->dummy.dtr || op->data.dtr)
160+ return false;
161+
162+ if (op->cmd.nbytes != 1)
163+ return false;
164+
159165 return true;
160166 }
161167 EXPORT_SYMBOL_GPL(spi_mem_default_supports_op);
@@ -170,7 +176,7 @@ static bool spi_mem_buswidth_is_valid(u8 buswidth) · 8 unmodified lines
170176
171177 static int spi_mem_check_op(const struct spi_mem_op *op)
172178 {
173− if (!op->cmd.buswidth)
179+ if (!op->cmd.buswidth || !op->cmd.nbytes)
174180 return -EINVAL;
175181
176182 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) · 129 unmodified lines
306312 return ret;
307313 }
308314
309− tmpbufsize = sizeof(op->cmd.opcode) + op->addr.nbytes +
310− op->dummy.nbytes;
315+ tmpbufsize = op->cmd.nbytes + op->addr.nbytes + op->dummy.nbytes;
311316
312317 /*
313318 * 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) · 8 unmodified lines
322327
323328 tmpbuf[0] = op->cmd.opcode;
324329 xfers[xferpos].tx_buf = tmpbuf;
325− xfers[xferpos].len = sizeof(op->cmd.opcode);
330+ xfers[xferpos].len = op->cmd.nbytes;
326331 xfers[xferpos].tx_nbits = op->cmd.buswidth;
327332 spi_message_add_tail(&xfers[xferpos], &msg);
328333 xferpos++;
@@ -424,8 +429,7 @@ int spi_mem_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op) · 95 unmodified lines
424429 return ctlr->mem_ops->adjust_op_size(mem, op);
425430
426431 if (!ctlr->mem_ops || !ctlr->mem_ops->exec_op) {
427− len = sizeof(op->cmd.opcode) + op->addr.nbytes +
428− op->dummy.nbytes;
432+ len = op->cmd.nbytes + op->addr.nbytes + op->dummy.nbytes;
429433
430434 if (len > spi_max_transfer_size(mem->spi))
431435 return -EINVAL;
drivers/spi/spi-mtk-nor.c+8−2
@@ -195,7 +195,7 @@ static int mtk_nor_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op) · 194 unmodified lines
195195 }
196196 }
197197
198− len = MTK_NOR_PRG_MAX_SIZE - sizeof(op->cmd.opcode) - op->addr.nbytes -
198+ len = MTK_NOR_PRG_MAX_SIZE - op->cmd.nbytes - op->addr.nbytes -
199199 op->dummy.nbytes;
200200 if (op->data.nbytes > len)
201201 op->data.nbytes = len;
@@ -211,6 +211,12 @@ static bool mtk_nor_supports_op(struct spi_mem *mem, · 9 unmodified lines
211211 if (op->cmd.buswidth != 1)
212212 return false;
213213
214+ /* DTR ops not supported. */
215+ if (op->cmd.dtr || op->addr.dtr || op->dummy.dtr || op->data.dtr)
216+ return false;
217+ if (op->cmd.nbytes != 1)
218+ return false;
219+
214220 if ((op->addr.nbytes == 3) || (op->addr.nbytes == 4)) {
215221 if ((op->data.dir == SPI_MEM_DATA_IN) && mtk_nor_match_read(op))
216222 return true;
@@ -219,7 +225,7 @@ static bool mtk_nor_supports_op(struct spi_mem *mem, · 2 unmodified lines
219225 (op->dummy.buswidth == 0) &&
220226 (op->data.buswidth == 1);
221227 }
222− len = sizeof(op->cmd.opcode) + op->addr.nbytes + op->dummy.nbytes;
228+ len = op->cmd.nbytes + op->addr.nbytes + op->dummy.nbytes;
223229 if ((len > MTK_NOR_PRG_MAX_SIZE) ||
224230 ((op->data.nbytes) && (len == MTK_NOR_PRG_MAX_SIZE)))
225231 return false;
drivers/spi/spi-mxic.c+2−1
@@ -356,6 +356,7 @@ static int mxic_spi_mem_exec_op(struct spi_mem *mem, · 355 unmodified lines
356356 int nio = 1, i, ret;
357357 u32 ss_ctrl;
358358 u8 addr[8];
359+ u8 opcode = op->cmd.opcode;
359360
360361 ret = mxic_spi_set_freq(mxic, mem->spi->max_speed_hz);
361362 if (ret)
@@ -393,7 +394,7 @@ static int mxic_spi_mem_exec_op(struct spi_mem *mem, · 31 unmodified lines
393394 writel(readl(mxic->regs + HC_CFG) | HC_CFG_MAN_CS_ASSERT,
394395 mxic->regs + HC_CFG);
395396
396− ret = mxic_spi_data_xfer(mxic, &op->cmd.opcode, NULL, 1);
397+ ret = mxic_spi_data_xfer(mxic, &opcode, NULL, 1);
397398 if (ret)
398399 goto out;
399400
drivers/spi/spi-zynq-qspi.c+6−5
@@ -527,20 +527,21 @@ static int zynq_qspi_exec_mem_op(struct spi_mem *mem, · 526 unmodified lines
527527 struct zynq_qspi *xqspi = spi_controller_get_devdata(mem->spi->master);
528528 int err = 0, i;
529529 u8 *tmpbuf;
530+ u8 opcode = op->cmd.opcode;
530531
531532 dev_dbg(xqspi->dev, "cmd:%#x mode:%d.%d.%d.%d\n",
532− op->cmd.opcode, op->cmd.buswidth, op->addr.buswidth,
533+ opcode, op->cmd.buswidth, op->addr.buswidth,
533534 op->dummy.buswidth, op->data.buswidth);
534535
535536 zynq_qspi_chipselect(mem->spi, true);
536537 zynq_qspi_config_op(xqspi, mem->spi);
537538
538− if (op->cmd.opcode) {
539+ if (op->cmd.nbytes) {
539540 reinit_completion(&xqspi->data_completion);
540− xqspi->txbuf = (u8 *)&op->cmd.opcode;
541+ xqspi->txbuf = &opcode;
541542 xqspi->rxbuf = NULL;
542− xqspi->tx_bytes = sizeof(op->cmd.opcode);
543− xqspi->rx_bytes = sizeof(op->cmd.opcode);
543+ xqspi->tx_bytes = op->cmd.nbytes;
544+ xqspi->rx_bytes = op->cmd.nbytes;
544545 zynq_qspi_write_op(xqspi, ZYNQ_QSPI_FIFO_DEPTH, true);
545546 zynq_qspi_write(xqspi, ZYNQ_QSPI_IEN_OFFSET,
546547 ZYNQ_QSPI_IXR_RXTX_MASK);
include/linux/spi/spi-mem.h+13−1
@@ -17,6 +17,7 @@ · 16 unmodified lines
1717 { \
1818 .buswidth = __buswidth, \
1919 .opcode = __opcode, \
20+ .nbytes = 1, \
2021 }
2122
2223 #define SPI_MEM_OP_ADDR(__nbytes, __val, __buswidth) \
@@ -69,11 +70,15 @@ enum spi_mem_data_dir { · 46 unmodified lines
6970
7071 /**
7172 * struct spi_mem_op - describes a SPI memory operation
73+ * @cmd.nbytes: number of opcode bytes (only 1 or 2 are valid). The opcode is
74+ * sent MSB-first.
7275 * @cmd.buswidth: number of IO lines used to transmit the command
7376 * @cmd.opcode: operation opcode
77+ * @cmd.dtr: whether the command opcode should be sent in DTR mode or not
7478 * @addr.nbytes: number of address bytes to send. Can be zero if the operation
7579 * does not need to send an address
7680 * @addr.buswidth: number of IO lines used to transmit the address cycles
81+ * @addr.dtr: whether the address should be sent in DTR mode or not
7782 * @addr.val: address value. This value is always sent MSB first on the bus.
7883 * Note that only @addr.nbytes are taken into account in this
7984 * address value, so users should make sure the value fits in the
@@ -81,7 +86,9 @@ enum spi_mem_data_dir { · 1 unmodified line
8186 * @dummy.nbytes: number of dummy bytes to send after an opcode or address. Can
8287 * be zero if the operation does not require dummy bytes
8388 * @dummy.buswidth: number of IO lanes used to transmit the dummy bytes
89+ * @dummy.dtr: whether the dummy bytes should be sent in DTR mode or not
8490 * @data.buswidth: number of IO lanes used to send/receive the data
91+ * @data.dtr: whether the data should be sent in DTR mode or not
8592 * @data.dir: direction of the transfer
8693 * @data.nbytes: number of data bytes to send/receive. Can be zero if the
8794 * operation does not involve transferring data
@@ -90,23 +97,28 @@ enum spi_mem_data_dir { · 2 unmodified lines
9097 */
9198 struct spi_mem_op {
9299 struct {
100+ u8 nbytes;
93101 u8 buswidth;
94− u8 opcode;
102+ u8 dtr : 1;
103+ u16 opcode;
95104 } cmd;
96105
97106 struct {
98107 u8 nbytes;
99108 u8 buswidth;
109+ u8 dtr : 1;
100110 u64 val;
101111 } addr;
102112
103113 struct {
104114 u8 nbytes;
105115 u8 buswidth;
116+ u8 dtr : 1;
106117 } dummy;
107118
108119 struct {
109120 u8 buswidth;
121+ u8 dtr : 1;
110122 enum spi_mem_data_dir dir;
111123 unsigned int nbytes;
112124 union {