diff options
-rw-r--r-- | Documentation/devicetree/bindings/spi/qcom,spi-qup.txt | 8 | ||||
-rw-r--r-- | Documentation/devicetree/bindings/spi/spi-rockchip.txt | 4 | ||||
-rw-r--r-- | drivers/spi/spi-qup.c | 336 | ||||
-rw-r--r-- | drivers/spi/spi-rockchip.c | 36 | ||||
-rw-r--r-- | drivers/spi/spi-rspi.c | 124 | ||||
-rw-r--r-- | drivers/spi/spi-s3c64xx.c | 4 | ||||
-rw-r--r-- | drivers/spi/spi-sc18is602.c | 2 |
7 files changed, 468 insertions, 46 deletions
diff --git a/Documentation/devicetree/bindings/spi/qcom,spi-qup.txt b/Documentation/devicetree/bindings/spi/qcom,spi-qup.txt index e2c88df2cc15..5c090771c016 100644 --- a/Documentation/devicetree/bindings/spi/qcom,spi-qup.txt +++ b/Documentation/devicetree/bindings/spi/qcom,spi-qup.txt | |||
@@ -33,6 +33,11 @@ Optional properties: | |||
33 | nodes. If unspecified, a single SPI device without a chip | 33 | nodes. If unspecified, a single SPI device without a chip |
34 | select can be used. | 34 | select can be used. |
35 | 35 | ||
36 | - dmas: Two DMA channel specifiers following the convention outlined | ||
37 | in bindings/dma/dma.txt | ||
38 | - dma-names: Names for the dma channels, if present. There must be at | ||
39 | least one channel named "tx" for transmit and named "rx" for | ||
40 | receive. | ||
36 | 41 | ||
37 | SPI slave nodes must be children of the SPI master node and can contain | 42 | SPI slave nodes must be children of the SPI master node and can contain |
38 | properties described in Documentation/devicetree/bindings/spi/spi-bus.txt | 43 | properties described in Documentation/devicetree/bindings/spi/spi-bus.txt |
@@ -51,6 +56,9 @@ Example: | |||
51 | clocks = <&gcc GCC_BLSP2_QUP2_SPI_APPS_CLK>, <&gcc GCC_BLSP2_AHB_CLK>; | 56 | clocks = <&gcc GCC_BLSP2_QUP2_SPI_APPS_CLK>, <&gcc GCC_BLSP2_AHB_CLK>; |
52 | clock-names = "core", "iface"; | 57 | clock-names = "core", "iface"; |
53 | 58 | ||
59 | dmas = <&blsp1_bam 13>, <&blsp1_bam 12>; | ||
60 | dma-names = "rx", "tx"; | ||
61 | |||
54 | pinctrl-names = "default"; | 62 | pinctrl-names = "default"; |
55 | pinctrl-0 = <&spi8_default>; | 63 | pinctrl-0 = <&spi8_default>; |
56 | 64 | ||
diff --git a/Documentation/devicetree/bindings/spi/spi-rockchip.txt b/Documentation/devicetree/bindings/spi/spi-rockchip.txt index 467dec441c62..0c491bda4c65 100644 --- a/Documentation/devicetree/bindings/spi/spi-rockchip.txt +++ b/Documentation/devicetree/bindings/spi/spi-rockchip.txt | |||
@@ -24,6 +24,9 @@ Optional Properties: | |||
24 | - dmas: DMA specifiers for tx and rx dma. See the DMA client binding, | 24 | - dmas: DMA specifiers for tx and rx dma. See the DMA client binding, |
25 | Documentation/devicetree/bindings/dma/dma.txt | 25 | Documentation/devicetree/bindings/dma/dma.txt |
26 | - dma-names: DMA request names should include "tx" and "rx" if present. | 26 | - dma-names: DMA request names should include "tx" and "rx" if present. |
27 | - rx-sample-delay-ns: nanoseconds to delay after the SCLK edge before sampling | ||
28 | Rx data (may need to be fine tuned for high capacitance lines). | ||
29 | No delay (0) by default. | ||
27 | 30 | ||
28 | 31 | ||
29 | Example: | 32 | Example: |
@@ -33,6 +36,7 @@ Example: | |||
33 | reg = <0xff110000 0x1000>; | 36 | reg = <0xff110000 0x1000>; |
34 | dmas = <&pdma1 11>, <&pdma1 12>; | 37 | dmas = <&pdma1 11>, <&pdma1 12>; |
35 | dma-names = "tx", "rx"; | 38 | dma-names = "tx", "rx"; |
39 | rx-sample-delay-ns = <10>; | ||
36 | #address-cells = <1>; | 40 | #address-cells = <1>; |
37 | #size-cells = <0>; | 41 | #size-cells = <0>; |
38 | interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>; | 42 | interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>; |
diff --git a/drivers/spi/spi-qup.c b/drivers/spi/spi-qup.c index 2b2c359f5a50..810a7fae3479 100644 --- a/drivers/spi/spi-qup.c +++ b/drivers/spi/spi-qup.c | |||
@@ -22,6 +22,8 @@ | |||
22 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
23 | #include <linux/pm_runtime.h> | 23 | #include <linux/pm_runtime.h> |
24 | #include <linux/spi/spi.h> | 24 | #include <linux/spi/spi.h> |
25 | #include <linux/dmaengine.h> | ||
26 | #include <linux/dma-mapping.h> | ||
25 | 27 | ||
26 | #define QUP_CONFIG 0x0000 | 28 | #define QUP_CONFIG 0x0000 |
27 | #define QUP_STATE 0x0004 | 29 | #define QUP_STATE 0x0004 |
@@ -116,6 +118,8 @@ | |||
116 | 118 | ||
117 | #define SPI_NUM_CHIPSELECTS 4 | 119 | #define SPI_NUM_CHIPSELECTS 4 |
118 | 120 | ||
121 | #define SPI_MAX_DMA_XFER (SZ_64K - 64) | ||
122 | |||
119 | /* high speed mode is when bus rate is greater then 26MHz */ | 123 | /* high speed mode is when bus rate is greater then 26MHz */ |
120 | #define SPI_HS_MIN_RATE 26000000 | 124 | #define SPI_HS_MIN_RATE 26000000 |
121 | #define SPI_MAX_RATE 50000000 | 125 | #define SPI_MAX_RATE 50000000 |
@@ -140,9 +144,14 @@ struct spi_qup { | |||
140 | struct completion done; | 144 | struct completion done; |
141 | int error; | 145 | int error; |
142 | int w_size; /* bytes per SPI word */ | 146 | int w_size; /* bytes per SPI word */ |
147 | int n_words; | ||
143 | int tx_bytes; | 148 | int tx_bytes; |
144 | int rx_bytes; | 149 | int rx_bytes; |
145 | int qup_v1; | 150 | int qup_v1; |
151 | |||
152 | int use_dma; | ||
153 | struct dma_slave_config rx_conf; | ||
154 | struct dma_slave_config tx_conf; | ||
146 | }; | 155 | }; |
147 | 156 | ||
148 | 157 | ||
@@ -198,7 +207,6 @@ static int spi_qup_set_state(struct spi_qup *controller, u32 state) | |||
198 | return 0; | 207 | return 0; |
199 | } | 208 | } |
200 | 209 | ||
201 | |||
202 | static void spi_qup_fifo_read(struct spi_qup *controller, | 210 | static void spi_qup_fifo_read(struct spi_qup *controller, |
203 | struct spi_transfer *xfer) | 211 | struct spi_transfer *xfer) |
204 | { | 212 | { |
@@ -266,6 +274,107 @@ static void spi_qup_fifo_write(struct spi_qup *controller, | |||
266 | } | 274 | } |
267 | } | 275 | } |
268 | 276 | ||
277 | static void spi_qup_dma_done(void *data) | ||
278 | { | ||
279 | struct spi_qup *qup = data; | ||
280 | |||
281 | complete(&qup->done); | ||
282 | } | ||
283 | |||
284 | static int spi_qup_prep_sg(struct spi_master *master, struct spi_transfer *xfer, | ||
285 | enum dma_transfer_direction dir, | ||
286 | dma_async_tx_callback callback) | ||
287 | { | ||
288 | struct spi_qup *qup = spi_master_get_devdata(master); | ||
289 | unsigned long flags = DMA_PREP_INTERRUPT | DMA_PREP_FENCE; | ||
290 | struct dma_async_tx_descriptor *desc; | ||
291 | struct scatterlist *sgl; | ||
292 | struct dma_chan *chan; | ||
293 | dma_cookie_t cookie; | ||
294 | unsigned int nents; | ||
295 | |||
296 | if (dir == DMA_MEM_TO_DEV) { | ||
297 | chan = master->dma_tx; | ||
298 | nents = xfer->tx_sg.nents; | ||
299 | sgl = xfer->tx_sg.sgl; | ||
300 | } else { | ||
301 | chan = master->dma_rx; | ||
302 | nents = xfer->rx_sg.nents; | ||
303 | sgl = xfer->rx_sg.sgl; | ||
304 | } | ||
305 | |||
306 | desc = dmaengine_prep_slave_sg(chan, sgl, nents, dir, flags); | ||
307 | if (!desc) | ||
308 | return -EINVAL; | ||
309 | |||
310 | desc->callback = callback; | ||
311 | desc->callback_param = qup; | ||
312 | |||
313 | cookie = dmaengine_submit(desc); | ||
314 | |||
315 | return dma_submit_error(cookie); | ||
316 | } | ||
317 | |||
318 | static void spi_qup_dma_terminate(struct spi_master *master, | ||
319 | struct spi_transfer *xfer) | ||
320 | { | ||
321 | if (xfer->tx_buf) | ||
322 | dmaengine_terminate_all(master->dma_tx); | ||
323 | if (xfer->rx_buf) | ||
324 | dmaengine_terminate_all(master->dma_rx); | ||
325 | } | ||
326 | |||
327 | static int spi_qup_do_dma(struct spi_master *master, struct spi_transfer *xfer) | ||
328 | { | ||
329 | dma_async_tx_callback rx_done = NULL, tx_done = NULL; | ||
330 | int ret; | ||
331 | |||
332 | if (xfer->rx_buf) | ||
333 | rx_done = spi_qup_dma_done; | ||
334 | else if (xfer->tx_buf) | ||
335 | tx_done = spi_qup_dma_done; | ||
336 | |||
337 | if (xfer->rx_buf) { | ||
338 | ret = spi_qup_prep_sg(master, xfer, DMA_DEV_TO_MEM, rx_done); | ||
339 | if (ret) | ||
340 | return ret; | ||
341 | |||
342 | dma_async_issue_pending(master->dma_rx); | ||
343 | } | ||
344 | |||
345 | if (xfer->tx_buf) { | ||
346 | ret = spi_qup_prep_sg(master, xfer, DMA_MEM_TO_DEV, tx_done); | ||
347 | if (ret) | ||
348 | return ret; | ||
349 | |||
350 | dma_async_issue_pending(master->dma_tx); | ||
351 | } | ||
352 | |||
353 | return 0; | ||
354 | } | ||
355 | |||
356 | static int spi_qup_do_pio(struct spi_master *master, struct spi_transfer *xfer) | ||
357 | { | ||
358 | struct spi_qup *qup = spi_master_get_devdata(master); | ||
359 | int ret; | ||
360 | |||
361 | ret = spi_qup_set_state(qup, QUP_STATE_RUN); | ||
362 | if (ret) { | ||
363 | dev_warn(qup->dev, "cannot set RUN state\n"); | ||
364 | return ret; | ||
365 | } | ||
366 | |||
367 | ret = spi_qup_set_state(qup, QUP_STATE_PAUSE); | ||
368 | if (ret) { | ||
369 | dev_warn(qup->dev, "cannot set PAUSE state\n"); | ||
370 | return ret; | ||
371 | } | ||
372 | |||
373 | spi_qup_fifo_write(qup, xfer); | ||
374 | |||
375 | return 0; | ||
376 | } | ||
377 | |||
269 | static irqreturn_t spi_qup_qup_irq(int irq, void *dev_id) | 378 | static irqreturn_t spi_qup_qup_irq(int irq, void *dev_id) |
270 | { | 379 | { |
271 | struct spi_qup *controller = dev_id; | 380 | struct spi_qup *controller = dev_id; |
@@ -315,11 +424,13 @@ static irqreturn_t spi_qup_qup_irq(int irq, void *dev_id) | |||
315 | error = -EIO; | 424 | error = -EIO; |
316 | } | 425 | } |
317 | 426 | ||
318 | if (opflags & QUP_OP_IN_SERVICE_FLAG) | 427 | if (!controller->use_dma) { |
319 | spi_qup_fifo_read(controller, xfer); | 428 | if (opflags & QUP_OP_IN_SERVICE_FLAG) |
429 | spi_qup_fifo_read(controller, xfer); | ||
320 | 430 | ||
321 | if (opflags & QUP_OP_OUT_SERVICE_FLAG) | 431 | if (opflags & QUP_OP_OUT_SERVICE_FLAG) |
322 | spi_qup_fifo_write(controller, xfer); | 432 | spi_qup_fifo_write(controller, xfer); |
433 | } | ||
323 | 434 | ||
324 | spin_lock_irqsave(&controller->lock, flags); | 435 | spin_lock_irqsave(&controller->lock, flags); |
325 | controller->error = error; | 436 | controller->error = error; |
@@ -332,13 +443,35 @@ static irqreturn_t spi_qup_qup_irq(int irq, void *dev_id) | |||
332 | return IRQ_HANDLED; | 443 | return IRQ_HANDLED; |
333 | } | 444 | } |
334 | 445 | ||
446 | static u32 | ||
447 | spi_qup_get_mode(struct spi_master *master, struct spi_transfer *xfer) | ||
448 | { | ||
449 | struct spi_qup *qup = spi_master_get_devdata(master); | ||
450 | u32 mode; | ||
451 | |||
452 | qup->w_size = 4; | ||
453 | |||
454 | if (xfer->bits_per_word <= 8) | ||
455 | qup->w_size = 1; | ||
456 | else if (xfer->bits_per_word <= 16) | ||
457 | qup->w_size = 2; | ||
458 | |||
459 | qup->n_words = xfer->len / qup->w_size; | ||
460 | |||
461 | if (qup->n_words <= (qup->in_fifo_sz / sizeof(u32))) | ||
462 | mode = QUP_IO_M_MODE_FIFO; | ||
463 | else | ||
464 | mode = QUP_IO_M_MODE_BLOCK; | ||
465 | |||
466 | return mode; | ||
467 | } | ||
335 | 468 | ||
336 | /* set clock freq ... bits per word */ | 469 | /* set clock freq ... bits per word */ |
337 | static int spi_qup_io_config(struct spi_device *spi, struct spi_transfer *xfer) | 470 | static int spi_qup_io_config(struct spi_device *spi, struct spi_transfer *xfer) |
338 | { | 471 | { |
339 | struct spi_qup *controller = spi_master_get_devdata(spi->master); | 472 | struct spi_qup *controller = spi_master_get_devdata(spi->master); |
340 | u32 config, iomode, mode, control; | 473 | u32 config, iomode, mode, control; |
341 | int ret, n_words, w_size; | 474 | int ret, n_words; |
342 | 475 | ||
343 | if (spi->mode & SPI_LOOP && xfer->len > controller->in_fifo_sz) { | 476 | if (spi->mode & SPI_LOOP && xfer->len > controller->in_fifo_sz) { |
344 | dev_err(controller->dev, "too big size for loopback %d > %d\n", | 477 | dev_err(controller->dev, "too big size for loopback %d > %d\n", |
@@ -358,35 +491,54 @@ static int spi_qup_io_config(struct spi_device *spi, struct spi_transfer *xfer) | |||
358 | return -EIO; | 491 | return -EIO; |
359 | } | 492 | } |
360 | 493 | ||
361 | w_size = 4; | 494 | mode = spi_qup_get_mode(spi->master, xfer); |
362 | if (xfer->bits_per_word <= 8) | 495 | n_words = controller->n_words; |
363 | w_size = 1; | ||
364 | else if (xfer->bits_per_word <= 16) | ||
365 | w_size = 2; | ||
366 | |||
367 | n_words = xfer->len / w_size; | ||
368 | controller->w_size = w_size; | ||
369 | 496 | ||
370 | if (n_words <= (controller->in_fifo_sz / sizeof(u32))) { | 497 | if (mode == QUP_IO_M_MODE_FIFO) { |
371 | mode = QUP_IO_M_MODE_FIFO; | ||
372 | writel_relaxed(n_words, controller->base + QUP_MX_READ_CNT); | 498 | writel_relaxed(n_words, controller->base + QUP_MX_READ_CNT); |
373 | writel_relaxed(n_words, controller->base + QUP_MX_WRITE_CNT); | 499 | writel_relaxed(n_words, controller->base + QUP_MX_WRITE_CNT); |
374 | /* must be zero for FIFO */ | 500 | /* must be zero for FIFO */ |
375 | writel_relaxed(0, controller->base + QUP_MX_INPUT_CNT); | 501 | writel_relaxed(0, controller->base + QUP_MX_INPUT_CNT); |
376 | writel_relaxed(0, controller->base + QUP_MX_OUTPUT_CNT); | 502 | writel_relaxed(0, controller->base + QUP_MX_OUTPUT_CNT); |
377 | } else { | 503 | } else if (!controller->use_dma) { |
378 | mode = QUP_IO_M_MODE_BLOCK; | ||
379 | writel_relaxed(n_words, controller->base + QUP_MX_INPUT_CNT); | 504 | writel_relaxed(n_words, controller->base + QUP_MX_INPUT_CNT); |
380 | writel_relaxed(n_words, controller->base + QUP_MX_OUTPUT_CNT); | 505 | writel_relaxed(n_words, controller->base + QUP_MX_OUTPUT_CNT); |
381 | /* must be zero for BLOCK and BAM */ | 506 | /* must be zero for BLOCK and BAM */ |
382 | writel_relaxed(0, controller->base + QUP_MX_READ_CNT); | 507 | writel_relaxed(0, controller->base + QUP_MX_READ_CNT); |
383 | writel_relaxed(0, controller->base + QUP_MX_WRITE_CNT); | 508 | writel_relaxed(0, controller->base + QUP_MX_WRITE_CNT); |
509 | } else { | ||
510 | mode = QUP_IO_M_MODE_BAM; | ||
511 | writel_relaxed(0, controller->base + QUP_MX_READ_CNT); | ||
512 | writel_relaxed(0, controller->base + QUP_MX_WRITE_CNT); | ||
513 | |||
514 | if (!controller->qup_v1) { | ||
515 | void __iomem *input_cnt; | ||
516 | |||
517 | input_cnt = controller->base + QUP_MX_INPUT_CNT; | ||
518 | /* | ||
519 | * for DMA transfers, both QUP_MX_INPUT_CNT and | ||
520 | * QUP_MX_OUTPUT_CNT must be zero to all cases but one. | ||
521 | * That case is a non-balanced transfer when there is | ||
522 | * only a rx_buf. | ||
523 | */ | ||
524 | if (xfer->tx_buf) | ||
525 | writel_relaxed(0, input_cnt); | ||
526 | else | ||
527 | writel_relaxed(n_words, input_cnt); | ||
528 | |||
529 | writel_relaxed(0, controller->base + QUP_MX_OUTPUT_CNT); | ||
530 | } | ||
384 | } | 531 | } |
385 | 532 | ||
386 | iomode = readl_relaxed(controller->base + QUP_IO_M_MODES); | 533 | iomode = readl_relaxed(controller->base + QUP_IO_M_MODES); |
387 | /* Set input and output transfer mode */ | 534 | /* Set input and output transfer mode */ |
388 | iomode &= ~(QUP_IO_M_INPUT_MODE_MASK | QUP_IO_M_OUTPUT_MODE_MASK); | 535 | iomode &= ~(QUP_IO_M_INPUT_MODE_MASK | QUP_IO_M_OUTPUT_MODE_MASK); |
389 | iomode &= ~(QUP_IO_M_PACK_EN | QUP_IO_M_UNPACK_EN); | 536 | |
537 | if (!controller->use_dma) | ||
538 | iomode &= ~(QUP_IO_M_PACK_EN | QUP_IO_M_UNPACK_EN); | ||
539 | else | ||
540 | iomode |= QUP_IO_M_PACK_EN | QUP_IO_M_UNPACK_EN; | ||
541 | |||
390 | iomode |= (mode << QUP_IO_M_OUTPUT_MODE_MASK_SHIFT); | 542 | iomode |= (mode << QUP_IO_M_OUTPUT_MODE_MASK_SHIFT); |
391 | iomode |= (mode << QUP_IO_M_INPUT_MODE_MASK_SHIFT); | 543 | iomode |= (mode << QUP_IO_M_INPUT_MODE_MASK_SHIFT); |
392 | 544 | ||
@@ -428,11 +580,31 @@ static int spi_qup_io_config(struct spi_device *spi, struct spi_transfer *xfer) | |||
428 | config &= ~(QUP_CONFIG_NO_INPUT | QUP_CONFIG_NO_OUTPUT | QUP_CONFIG_N); | 580 | config &= ~(QUP_CONFIG_NO_INPUT | QUP_CONFIG_NO_OUTPUT | QUP_CONFIG_N); |
429 | config |= xfer->bits_per_word - 1; | 581 | config |= xfer->bits_per_word - 1; |
430 | config |= QUP_CONFIG_SPI_MODE; | 582 | config |= QUP_CONFIG_SPI_MODE; |
583 | |||
584 | if (controller->use_dma) { | ||
585 | if (!xfer->tx_buf) | ||
586 | config |= QUP_CONFIG_NO_OUTPUT; | ||
587 | if (!xfer->rx_buf) | ||
588 | config |= QUP_CONFIG_NO_INPUT; | ||
589 | } | ||
590 | |||
431 | writel_relaxed(config, controller->base + QUP_CONFIG); | 591 | writel_relaxed(config, controller->base + QUP_CONFIG); |
432 | 592 | ||
433 | /* only write to OPERATIONAL_MASK when register is present */ | 593 | /* only write to OPERATIONAL_MASK when register is present */ |
434 | if (!controller->qup_v1) | 594 | if (!controller->qup_v1) { |
435 | writel_relaxed(0, controller->base + QUP_OPERATIONAL_MASK); | 595 | u32 mask = 0; |
596 | |||
597 | /* | ||
598 | * mask INPUT and OUTPUT service flags to prevent IRQs on FIFO | ||
599 | * status change in BAM mode | ||
600 | */ | ||
601 | |||
602 | if (mode == QUP_IO_M_MODE_BAM) | ||
603 | mask = QUP_OP_IN_SERVICE_FLAG | QUP_OP_OUT_SERVICE_FLAG; | ||
604 | |||
605 | writel_relaxed(mask, controller->base + QUP_OPERATIONAL_MASK); | ||
606 | } | ||
607 | |||
436 | return 0; | 608 | return 0; |
437 | } | 609 | } |
438 | 610 | ||
@@ -461,17 +633,13 @@ static int spi_qup_transfer_one(struct spi_master *master, | |||
461 | controller->tx_bytes = 0; | 633 | controller->tx_bytes = 0; |
462 | spin_unlock_irqrestore(&controller->lock, flags); | 634 | spin_unlock_irqrestore(&controller->lock, flags); |
463 | 635 | ||
464 | if (spi_qup_set_state(controller, QUP_STATE_RUN)) { | 636 | if (controller->use_dma) |
465 | dev_warn(controller->dev, "cannot set RUN state\n"); | 637 | ret = spi_qup_do_dma(master, xfer); |
466 | goto exit; | 638 | else |
467 | } | 639 | ret = spi_qup_do_pio(master, xfer); |
468 | 640 | ||
469 | if (spi_qup_set_state(controller, QUP_STATE_PAUSE)) { | 641 | if (ret) |
470 | dev_warn(controller->dev, "cannot set PAUSE state\n"); | ||
471 | goto exit; | 642 | goto exit; |
472 | } | ||
473 | |||
474 | spi_qup_fifo_write(controller, xfer); | ||
475 | 643 | ||
476 | if (spi_qup_set_state(controller, QUP_STATE_RUN)) { | 644 | if (spi_qup_set_state(controller, QUP_STATE_RUN)) { |
477 | dev_warn(controller->dev, "cannot set EXECUTE state\n"); | 645 | dev_warn(controller->dev, "cannot set EXECUTE state\n"); |
@@ -480,6 +648,7 @@ static int spi_qup_transfer_one(struct spi_master *master, | |||
480 | 648 | ||
481 | if (!wait_for_completion_timeout(&controller->done, timeout)) | 649 | if (!wait_for_completion_timeout(&controller->done, timeout)) |
482 | ret = -ETIMEDOUT; | 650 | ret = -ETIMEDOUT; |
651 | |||
483 | exit: | 652 | exit: |
484 | spi_qup_set_state(controller, QUP_STATE_RESET); | 653 | spi_qup_set_state(controller, QUP_STATE_RESET); |
485 | spin_lock_irqsave(&controller->lock, flags); | 654 | spin_lock_irqsave(&controller->lock, flags); |
@@ -487,6 +656,97 @@ exit: | |||
487 | if (!ret) | 656 | if (!ret) |
488 | ret = controller->error; | 657 | ret = controller->error; |
489 | spin_unlock_irqrestore(&controller->lock, flags); | 658 | spin_unlock_irqrestore(&controller->lock, flags); |
659 | |||
660 | if (ret && controller->use_dma) | ||
661 | spi_qup_dma_terminate(master, xfer); | ||
662 | |||
663 | return ret; | ||
664 | } | ||
665 | |||
666 | static bool spi_qup_can_dma(struct spi_master *master, struct spi_device *spi, | ||
667 | struct spi_transfer *xfer) | ||
668 | { | ||
669 | struct spi_qup *qup = spi_master_get_devdata(master); | ||
670 | size_t dma_align = dma_get_cache_alignment(); | ||
671 | u32 mode; | ||
672 | |||
673 | qup->use_dma = 0; | ||
674 | |||
675 | if (xfer->rx_buf && (xfer->len % qup->in_blk_sz || | ||
676 | IS_ERR_OR_NULL(master->dma_rx) || | ||
677 | !IS_ALIGNED((size_t)xfer->rx_buf, dma_align))) | ||
678 | return false; | ||
679 | |||
680 | if (xfer->tx_buf && (xfer->len % qup->out_blk_sz || | ||
681 | IS_ERR_OR_NULL(master->dma_tx) || | ||
682 | !IS_ALIGNED((size_t)xfer->tx_buf, dma_align))) | ||
683 | return false; | ||
684 | |||
685 | mode = spi_qup_get_mode(master, xfer); | ||
686 | if (mode == QUP_IO_M_MODE_FIFO) | ||
687 | return false; | ||
688 | |||
689 | qup->use_dma = 1; | ||
690 | |||
691 | return true; | ||
692 | } | ||
693 | |||
694 | static void spi_qup_release_dma(struct spi_master *master) | ||
695 | { | ||
696 | if (!IS_ERR_OR_NULL(master->dma_rx)) | ||
697 | dma_release_channel(master->dma_rx); | ||
698 | if (!IS_ERR_OR_NULL(master->dma_tx)) | ||
699 | dma_release_channel(master->dma_tx); | ||
700 | } | ||
701 | |||
702 | static int spi_qup_init_dma(struct spi_master *master, resource_size_t base) | ||
703 | { | ||
704 | struct spi_qup *spi = spi_master_get_devdata(master); | ||
705 | struct dma_slave_config *rx_conf = &spi->rx_conf, | ||
706 | *tx_conf = &spi->tx_conf; | ||
707 | struct device *dev = spi->dev; | ||
708 | int ret; | ||
709 | |||
710 | /* allocate dma resources, if available */ | ||
711 | master->dma_rx = dma_request_slave_channel_reason(dev, "rx"); | ||
712 | if (IS_ERR(master->dma_rx)) | ||
713 | return PTR_ERR(master->dma_rx); | ||
714 | |||
715 | master->dma_tx = dma_request_slave_channel_reason(dev, "tx"); | ||
716 | if (IS_ERR(master->dma_tx)) { | ||
717 | ret = PTR_ERR(master->dma_tx); | ||
718 | goto err_tx; | ||
719 | } | ||
720 | |||
721 | /* set DMA parameters */ | ||
722 | rx_conf->direction = DMA_DEV_TO_MEM; | ||
723 | rx_conf->device_fc = 1; | ||
724 | rx_conf->src_addr = base + QUP_INPUT_FIFO; | ||
725 | rx_conf->src_maxburst = spi->in_blk_sz; | ||
726 | |||
727 | tx_conf->direction = DMA_MEM_TO_DEV; | ||
728 | tx_conf->device_fc = 1; | ||
729 | tx_conf->dst_addr = base + QUP_OUTPUT_FIFO; | ||
730 | tx_conf->dst_maxburst = spi->out_blk_sz; | ||
731 | |||
732 | ret = dmaengine_slave_config(master->dma_rx, rx_conf); | ||
733 | if (ret) { | ||
734 | dev_err(dev, "failed to configure RX channel\n"); | ||
735 | goto err; | ||
736 | } | ||
737 | |||
738 | ret = dmaengine_slave_config(master->dma_tx, tx_conf); | ||
739 | if (ret) { | ||
740 | dev_err(dev, "failed to configure TX channel\n"); | ||
741 | goto err; | ||
742 | } | ||
743 | |||
744 | return 0; | ||
745 | |||
746 | err: | ||
747 | dma_release_channel(master->dma_tx); | ||
748 | err_tx: | ||
749 | dma_release_channel(master->dma_rx); | ||
490 | return ret; | 750 | return ret; |
491 | } | 751 | } |
492 | 752 | ||
@@ -563,6 +823,8 @@ static int spi_qup_probe(struct platform_device *pdev) | |||
563 | master->transfer_one = spi_qup_transfer_one; | 823 | master->transfer_one = spi_qup_transfer_one; |
564 | master->dev.of_node = pdev->dev.of_node; | 824 | master->dev.of_node = pdev->dev.of_node; |
565 | master->auto_runtime_pm = true; | 825 | master->auto_runtime_pm = true; |
826 | master->dma_alignment = dma_get_cache_alignment(); | ||
827 | master->max_dma_len = SPI_MAX_DMA_XFER; | ||
566 | 828 | ||
567 | platform_set_drvdata(pdev, master); | 829 | platform_set_drvdata(pdev, master); |
568 | 830 | ||
@@ -574,6 +836,12 @@ static int spi_qup_probe(struct platform_device *pdev) | |||
574 | controller->cclk = cclk; | 836 | controller->cclk = cclk; |
575 | controller->irq = irq; | 837 | controller->irq = irq; |
576 | 838 | ||
839 | ret = spi_qup_init_dma(master, res->start); | ||
840 | if (ret == -EPROBE_DEFER) | ||
841 | goto error; | ||
842 | else if (!ret) | ||
843 | master->can_dma = spi_qup_can_dma; | ||
844 | |||
577 | /* set v1 flag if device is version 1 */ | 845 | /* set v1 flag if device is version 1 */ |
578 | if (of_device_is_compatible(dev->of_node, "qcom,spi-qup-v1.1.1")) | 846 | if (of_device_is_compatible(dev->of_node, "qcom,spi-qup-v1.1.1")) |
579 | controller->qup_v1 = 1; | 847 | controller->qup_v1 = 1; |
@@ -610,7 +878,7 @@ static int spi_qup_probe(struct platform_device *pdev) | |||
610 | ret = spi_qup_set_state(controller, QUP_STATE_RESET); | 878 | ret = spi_qup_set_state(controller, QUP_STATE_RESET); |
611 | if (ret) { | 879 | if (ret) { |
612 | dev_err(dev, "cannot set RESET state\n"); | 880 | dev_err(dev, "cannot set RESET state\n"); |
613 | goto error; | 881 | goto error_dma; |
614 | } | 882 | } |
615 | 883 | ||
616 | writel_relaxed(0, base + QUP_OPERATIONAL); | 884 | writel_relaxed(0, base + QUP_OPERATIONAL); |
@@ -634,7 +902,7 @@ static int spi_qup_probe(struct platform_device *pdev) | |||
634 | ret = devm_request_irq(dev, irq, spi_qup_qup_irq, | 902 | ret = devm_request_irq(dev, irq, spi_qup_qup_irq, |
635 | IRQF_TRIGGER_HIGH, pdev->name, controller); | 903 | IRQF_TRIGGER_HIGH, pdev->name, controller); |
636 | if (ret) | 904 | if (ret) |
637 | goto error; | 905 | goto error_dma; |
638 | 906 | ||
639 | pm_runtime_set_autosuspend_delay(dev, MSEC_PER_SEC); | 907 | pm_runtime_set_autosuspend_delay(dev, MSEC_PER_SEC); |
640 | pm_runtime_use_autosuspend(dev); | 908 | pm_runtime_use_autosuspend(dev); |
@@ -649,6 +917,8 @@ static int spi_qup_probe(struct platform_device *pdev) | |||
649 | 917 | ||
650 | disable_pm: | 918 | disable_pm: |
651 | pm_runtime_disable(&pdev->dev); | 919 | pm_runtime_disable(&pdev->dev); |
920 | error_dma: | ||
921 | spi_qup_release_dma(master); | ||
652 | error: | 922 | error: |
653 | clk_disable_unprepare(cclk); | 923 | clk_disable_unprepare(cclk); |
654 | clk_disable_unprepare(iclk); | 924 | clk_disable_unprepare(iclk); |
@@ -740,6 +1010,8 @@ static int spi_qup_remove(struct platform_device *pdev) | |||
740 | if (ret) | 1010 | if (ret) |
741 | return ret; | 1011 | return ret; |
742 | 1012 | ||
1013 | spi_qup_release_dma(master); | ||
1014 | |||
743 | clk_disable_unprepare(controller->cclk); | 1015 | clk_disable_unprepare(controller->cclk); |
744 | clk_disable_unprepare(controller->iclk); | 1016 | clk_disable_unprepare(controller->iclk); |
745 | 1017 | ||
diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c index 5e4e52cbe053..68e7efeb9a27 100644 --- a/drivers/spi/spi-rockchip.c +++ b/drivers/spi/spi-rockchip.c | |||
@@ -179,6 +179,7 @@ struct rockchip_spi { | |||
179 | u8 tmode; | 179 | u8 tmode; |
180 | u8 bpw; | 180 | u8 bpw; |
181 | u8 n_bytes; | 181 | u8 n_bytes; |
182 | u8 rsd_nsecs; | ||
182 | unsigned len; | 183 | unsigned len; |
183 | u32 speed; | 184 | u32 speed; |
184 | 185 | ||
@@ -302,8 +303,8 @@ static int rockchip_spi_prepare_message(struct spi_master *master, | |||
302 | return 0; | 303 | return 0; |
303 | } | 304 | } |
304 | 305 | ||
305 | static int rockchip_spi_unprepare_message(struct spi_master *master, | 306 | static void rockchip_spi_handle_err(struct spi_master *master, |
306 | struct spi_message *msg) | 307 | struct spi_message *msg) |
307 | { | 308 | { |
308 | unsigned long flags; | 309 | unsigned long flags; |
309 | struct rockchip_spi *rs = spi_master_get_devdata(master); | 310 | struct rockchip_spi *rs = spi_master_get_devdata(master); |
@@ -313,8 +314,8 @@ static int rockchip_spi_unprepare_message(struct spi_master *master, | |||
313 | /* | 314 | /* |
314 | * For DMA mode, we need terminate DMA channel and flush | 315 | * For DMA mode, we need terminate DMA channel and flush |
315 | * fifo for the next transfer if DMA thansfer timeout. | 316 | * fifo for the next transfer if DMA thansfer timeout. |
316 | * unprepare_message() was called by core if transfer complete | 317 | * handle_err() was called by core if transfer failed. |
317 | * or timeout. Maybe it is reasonable for error handling here. | 318 | * Maybe it is reasonable for error handling here. |
318 | */ | 319 | */ |
319 | if (rs->use_dma) { | 320 | if (rs->use_dma) { |
320 | if (rs->state & RXBUSY) { | 321 | if (rs->state & RXBUSY) { |
@@ -327,6 +328,12 @@ static int rockchip_spi_unprepare_message(struct spi_master *master, | |||
327 | } | 328 | } |
328 | 329 | ||
329 | spin_unlock_irqrestore(&rs->lock, flags); | 330 | spin_unlock_irqrestore(&rs->lock, flags); |
331 | } | ||
332 | |||
333 | static int rockchip_spi_unprepare_message(struct spi_master *master, | ||
334 | struct spi_message *msg) | ||
335 | { | ||
336 | struct rockchip_spi *rs = spi_master_get_devdata(master); | ||
330 | 337 | ||
331 | spi_enable_chip(rs, 0); | 338 | spi_enable_chip(rs, 0); |
332 | 339 | ||
@@ -493,6 +500,7 @@ static void rockchip_spi_config(struct rockchip_spi *rs) | |||
493 | { | 500 | { |
494 | u32 div = 0; | 501 | u32 div = 0; |
495 | u32 dmacr = 0; | 502 | u32 dmacr = 0; |
503 | int rsd = 0; | ||
496 | 504 | ||
497 | u32 cr0 = (CR0_BHT_8BIT << CR0_BHT_OFFSET) | 505 | u32 cr0 = (CR0_BHT_8BIT << CR0_BHT_OFFSET) |
498 | | (CR0_SSD_ONE << CR0_SSD_OFFSET); | 506 | | (CR0_SSD_ONE << CR0_SSD_OFFSET); |
@@ -522,6 +530,20 @@ static void rockchip_spi_config(struct rockchip_spi *rs) | |||
522 | div = DIV_ROUND_UP(rs->max_freq, rs->speed); | 530 | div = DIV_ROUND_UP(rs->max_freq, rs->speed); |
523 | div = (div + 1) & 0xfffe; | 531 | div = (div + 1) & 0xfffe; |
524 | 532 | ||
533 | /* Rx sample delay is expressed in parent clock cycles (max 3) */ | ||
534 | rsd = DIV_ROUND_CLOSEST(rs->rsd_nsecs * (rs->max_freq >> 8), | ||
535 | 1000000000 >> 8); | ||
536 | if (!rsd && rs->rsd_nsecs) { | ||
537 | pr_warn_once("rockchip-spi: %u Hz are too slow to express %u ns delay\n", | ||
538 | rs->max_freq, rs->rsd_nsecs); | ||
539 | } else if (rsd > 3) { | ||
540 | rsd = 3; | ||
541 | pr_warn_once("rockchip-spi: %u Hz are too fast to express %u ns delay, clamping at %u ns\n", | ||
542 | rs->max_freq, rs->rsd_nsecs, | ||
543 | rsd * 1000000000U / rs->max_freq); | ||
544 | } | ||
545 | cr0 |= rsd << CR0_RSD_OFFSET; | ||
546 | |||
525 | writel_relaxed(cr0, rs->regs + ROCKCHIP_SPI_CTRLR0); | 547 | writel_relaxed(cr0, rs->regs + ROCKCHIP_SPI_CTRLR0); |
526 | 548 | ||
527 | writel_relaxed(rs->len - 1, rs->regs + ROCKCHIP_SPI_CTRLR1); | 549 | writel_relaxed(rs->len - 1, rs->regs + ROCKCHIP_SPI_CTRLR1); |
@@ -614,6 +636,7 @@ static int rockchip_spi_probe(struct platform_device *pdev) | |||
614 | struct rockchip_spi *rs; | 636 | struct rockchip_spi *rs; |
615 | struct spi_master *master; | 637 | struct spi_master *master; |
616 | struct resource *mem; | 638 | struct resource *mem; |
639 | u32 rsd_nsecs; | ||
617 | 640 | ||
618 | master = spi_alloc_master(&pdev->dev, sizeof(struct rockchip_spi)); | 641 | master = spi_alloc_master(&pdev->dev, sizeof(struct rockchip_spi)); |
619 | if (!master) | 642 | if (!master) |
@@ -665,6 +688,10 @@ static int rockchip_spi_probe(struct platform_device *pdev) | |||
665 | rs->dev = &pdev->dev; | 688 | rs->dev = &pdev->dev; |
666 | rs->max_freq = clk_get_rate(rs->spiclk); | 689 | rs->max_freq = clk_get_rate(rs->spiclk); |
667 | 690 | ||
691 | if (!of_property_read_u32(pdev->dev.of_node, "rx-sample-delay-ns", | ||
692 | &rsd_nsecs)) | ||
693 | rs->rsd_nsecs = rsd_nsecs; | ||
694 | |||
668 | rs->fifo_len = get_fifo_len(rs); | 695 | rs->fifo_len = get_fifo_len(rs); |
669 | if (!rs->fifo_len) { | 696 | if (!rs->fifo_len) { |
670 | dev_err(&pdev->dev, "Failed to get fifo length\n"); | 697 | dev_err(&pdev->dev, "Failed to get fifo length\n"); |
@@ -688,6 +715,7 @@ static int rockchip_spi_probe(struct platform_device *pdev) | |||
688 | master->prepare_message = rockchip_spi_prepare_message; | 715 | master->prepare_message = rockchip_spi_prepare_message; |
689 | master->unprepare_message = rockchip_spi_unprepare_message; | 716 | master->unprepare_message = rockchip_spi_unprepare_message; |
690 | master->transfer_one = rockchip_spi_transfer_one; | 717 | master->transfer_one = rockchip_spi_transfer_one; |
718 | master->handle_err = rockchip_spi_handle_err; | ||
691 | 719 | ||
692 | rs->dma_tx.ch = dma_request_slave_channel(rs->dev, "tx"); | 720 | rs->dma_tx.ch = dma_request_slave_channel(rs->dev, "tx"); |
693 | if (!rs->dma_tx.ch) | 721 | if (!rs->dma_tx.ch) |
diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c index 46ce47076e63..186924aa4740 100644 --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c | |||
@@ -177,6 +177,13 @@ | |||
177 | #define SPBFCR_RXRST 0x40 /* Receive Buffer Data Reset */ | 177 | #define SPBFCR_RXRST 0x40 /* Receive Buffer Data Reset */ |
178 | #define SPBFCR_TXTRG_MASK 0x30 /* Transmit Buffer Data Triggering Number */ | 178 | #define SPBFCR_TXTRG_MASK 0x30 /* Transmit Buffer Data Triggering Number */ |
179 | #define SPBFCR_RXTRG_MASK 0x07 /* Receive Buffer Data Triggering Number */ | 179 | #define SPBFCR_RXTRG_MASK 0x07 /* Receive Buffer Data Triggering Number */ |
180 | /* QSPI on R-Car Gen2 */ | ||
181 | #define SPBFCR_TXTRG_1B 0x00 /* 31 bytes (1 byte available) */ | ||
182 | #define SPBFCR_TXTRG_32B 0x30 /* 0 byte (32 bytes available) */ | ||
183 | #define SPBFCR_RXTRG_1B 0x00 /* 1 byte (31 bytes available) */ | ||
184 | #define SPBFCR_RXTRG_32B 0x07 /* 32 bytes (0 byte available) */ | ||
185 | |||
186 | #define QSPI_BUFFER_SIZE 32u | ||
180 | 187 | ||
181 | struct rspi_data { | 188 | struct rspi_data { |
182 | void __iomem *addr; | 189 | void __iomem *addr; |
@@ -366,6 +373,52 @@ static int qspi_set_config_register(struct rspi_data *rspi, int access_size) | |||
366 | return 0; | 373 | return 0; |
367 | } | 374 | } |
368 | 375 | ||
376 | static void qspi_update(const struct rspi_data *rspi, u8 mask, u8 val, u8 reg) | ||
377 | { | ||
378 | u8 data; | ||
379 | |||
380 | data = rspi_read8(rspi, reg); | ||
381 | data &= ~mask; | ||
382 | data |= (val & mask); | ||
383 | rspi_write8(rspi, data, reg); | ||
384 | } | ||
385 | |||
386 | static int qspi_set_send_trigger(struct rspi_data *rspi, unsigned int len) | ||
387 | { | ||
388 | unsigned int n; | ||
389 | |||
390 | n = min(len, QSPI_BUFFER_SIZE); | ||
391 | |||
392 | if (len >= QSPI_BUFFER_SIZE) { | ||
393 | /* sets triggering number to 32 bytes */ | ||
394 | qspi_update(rspi, SPBFCR_TXTRG_MASK, | ||
395 | SPBFCR_TXTRG_32B, QSPI_SPBFCR); | ||
396 | } else { | ||
397 | /* sets triggering number to 1 byte */ | ||
398 | qspi_update(rspi, SPBFCR_TXTRG_MASK, | ||
399 | SPBFCR_TXTRG_1B, QSPI_SPBFCR); | ||
400 | } | ||
401 | |||
402 | return n; | ||
403 | } | ||
404 | |||
405 | static void qspi_set_receive_trigger(struct rspi_data *rspi, unsigned int len) | ||
406 | { | ||
407 | unsigned int n; | ||
408 | |||
409 | n = min(len, QSPI_BUFFER_SIZE); | ||
410 | |||
411 | if (len >= QSPI_BUFFER_SIZE) { | ||
412 | /* sets triggering number to 32 bytes */ | ||
413 | qspi_update(rspi, SPBFCR_RXTRG_MASK, | ||
414 | SPBFCR_RXTRG_32B, QSPI_SPBFCR); | ||
415 | } else { | ||
416 | /* sets triggering number to 1 byte */ | ||
417 | qspi_update(rspi, SPBFCR_RXTRG_MASK, | ||
418 | SPBFCR_RXTRG_1B, QSPI_SPBFCR); | ||
419 | } | ||
420 | } | ||
421 | |||
369 | #define set_config_register(spi, n) spi->ops->set_config_register(spi, n) | 422 | #define set_config_register(spi, n) spi->ops->set_config_register(spi, n) |
370 | 423 | ||
371 | static void rspi_enable_irq(const struct rspi_data *rspi, u8 enable) | 424 | static void rspi_enable_irq(const struct rspi_data *rspi, u8 enable) |
@@ -609,19 +662,29 @@ static bool rspi_can_dma(struct spi_master *master, struct spi_device *spi, | |||
609 | return __rspi_can_dma(rspi, xfer); | 662 | return __rspi_can_dma(rspi, xfer); |
610 | } | 663 | } |
611 | 664 | ||
612 | static int rspi_common_transfer(struct rspi_data *rspi, | 665 | static int rspi_dma_check_then_transfer(struct rspi_data *rspi, |
613 | struct spi_transfer *xfer) | 666 | struct spi_transfer *xfer) |
614 | { | 667 | { |
615 | int ret; | ||
616 | |||
617 | if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) { | 668 | if (rspi->master->can_dma && __rspi_can_dma(rspi, xfer)) { |
618 | /* rx_buf can be NULL on RSPI on SH in TX-only Mode */ | 669 | /* rx_buf can be NULL on RSPI on SH in TX-only Mode */ |
619 | ret = rspi_dma_transfer(rspi, &xfer->tx_sg, | 670 | int ret = rspi_dma_transfer(rspi, &xfer->tx_sg, |
620 | xfer->rx_buf ? &xfer->rx_sg : NULL); | 671 | xfer->rx_buf ? &xfer->rx_sg : NULL); |
621 | if (ret != -EAGAIN) | 672 | if (ret != -EAGAIN) |
622 | return ret; | 673 | return 0; |
623 | } | 674 | } |
624 | 675 | ||
676 | return -EAGAIN; | ||
677 | } | ||
678 | |||
679 | static int rspi_common_transfer(struct rspi_data *rspi, | ||
680 | struct spi_transfer *xfer) | ||
681 | { | ||
682 | int ret; | ||
683 | |||
684 | ret = rspi_dma_check_then_transfer(rspi, xfer); | ||
685 | if (ret != -EAGAIN) | ||
686 | return ret; | ||
687 | |||
625 | ret = rspi_pio_transfer(rspi, xfer->tx_buf, xfer->rx_buf, xfer->len); | 688 | ret = rspi_pio_transfer(rspi, xfer->tx_buf, xfer->rx_buf, xfer->len); |
626 | if (ret < 0) | 689 | if (ret < 0) |
627 | return ret; | 690 | return ret; |
@@ -661,12 +724,59 @@ static int rspi_rz_transfer_one(struct spi_master *master, | |||
661 | return rspi_common_transfer(rspi, xfer); | 724 | return rspi_common_transfer(rspi, xfer); |
662 | } | 725 | } |
663 | 726 | ||
727 | static int qspi_trigger_transfer_out_int(struct rspi_data *rspi, const u8 *tx, | ||
728 | u8 *rx, unsigned int len) | ||
729 | { | ||
730 | int i, n, ret; | ||
731 | int error; | ||
732 | |||
733 | while (len > 0) { | ||
734 | n = qspi_set_send_trigger(rspi, len); | ||
735 | qspi_set_receive_trigger(rspi, len); | ||
736 | if (n == QSPI_BUFFER_SIZE) { | ||
737 | error = rspi_wait_for_tx_empty(rspi); | ||
738 | if (error < 0) { | ||
739 | dev_err(&rspi->master->dev, "transmit timeout\n"); | ||
740 | return error; | ||
741 | } | ||
742 | for (i = 0; i < n; i++) | ||
743 | rspi_write_data(rspi, *tx++); | ||
744 | |||
745 | error = rspi_wait_for_rx_full(rspi); | ||
746 | if (error < 0) { | ||
747 | dev_err(&rspi->master->dev, "receive timeout\n"); | ||
748 | return error; | ||
749 | } | ||
750 | for (i = 0; i < n; i++) | ||
751 | *rx++ = rspi_read_data(rspi); | ||
752 | } else { | ||
753 | ret = rspi_pio_transfer(rspi, tx, rx, n); | ||
754 | if (ret < 0) | ||
755 | return ret; | ||
756 | } | ||
757 | len -= n; | ||
758 | } | ||
759 | |||
760 | return 0; | ||
761 | } | ||
762 | |||
664 | static int qspi_transfer_out_in(struct rspi_data *rspi, | 763 | static int qspi_transfer_out_in(struct rspi_data *rspi, |
665 | struct spi_transfer *xfer) | 764 | struct spi_transfer *xfer) |
666 | { | 765 | { |
766 | int ret; | ||
767 | |||
667 | qspi_receive_init(rspi); | 768 | qspi_receive_init(rspi); |
668 | 769 | ||
669 | return rspi_common_transfer(rspi, xfer); | 770 | ret = rspi_dma_check_then_transfer(rspi, xfer); |
771 | if (ret != -EAGAIN) | ||
772 | return ret; | ||
773 | |||
774 | ret = qspi_trigger_transfer_out_int(rspi, xfer->tx_buf, | ||
775 | xfer->rx_buf, xfer->len); | ||
776 | if (ret < 0) | ||
777 | return ret; | ||
778 | |||
779 | return 0; | ||
670 | } | 780 | } |
671 | 781 | ||
672 | static int qspi_transfer_out(struct rspi_data *rspi, struct spi_transfer *xfer) | 782 | static int qspi_transfer_out(struct rspi_data *rspi, struct spi_transfer *xfer) |
diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c index 9231c34b5a5c..b1c6731fbf27 100644 --- a/drivers/spi/spi-s3c64xx.c +++ b/drivers/spi/spi-s3c64xx.c | |||
@@ -324,7 +324,7 @@ static int s3c64xx_spi_prepare_transfer(struct spi_master *spi) | |||
324 | 324 | ||
325 | /* Acquire DMA channels */ | 325 | /* Acquire DMA channels */ |
326 | sdd->rx_dma.ch = dma_request_slave_channel_compat(mask, filter, | 326 | sdd->rx_dma.ch = dma_request_slave_channel_compat(mask, filter, |
327 | (void *)sdd->rx_dma.dmach, dev, "rx"); | 327 | (void *)(long)sdd->rx_dma.dmach, dev, "rx"); |
328 | if (!sdd->rx_dma.ch) { | 328 | if (!sdd->rx_dma.ch) { |
329 | dev_err(dev, "Failed to get RX DMA channel\n"); | 329 | dev_err(dev, "Failed to get RX DMA channel\n"); |
330 | ret = -EBUSY; | 330 | ret = -EBUSY; |
@@ -333,7 +333,7 @@ static int s3c64xx_spi_prepare_transfer(struct spi_master *spi) | |||
333 | spi->dma_rx = sdd->rx_dma.ch; | 333 | spi->dma_rx = sdd->rx_dma.ch; |
334 | 334 | ||
335 | sdd->tx_dma.ch = dma_request_slave_channel_compat(mask, filter, | 335 | sdd->tx_dma.ch = dma_request_slave_channel_compat(mask, filter, |
336 | (void *)sdd->tx_dma.dmach, dev, "tx"); | 336 | (void *)(long)sdd->tx_dma.dmach, dev, "tx"); |
337 | if (!sdd->tx_dma.ch) { | 337 | if (!sdd->tx_dma.ch) { |
338 | dev_err(dev, "Failed to get TX DMA channel\n"); | 338 | dev_err(dev, "Failed to get TX DMA channel\n"); |
339 | ret = -EBUSY; | 339 | ret = -EBUSY; |
diff --git a/drivers/spi/spi-sc18is602.c b/drivers/spi/spi-sc18is602.c index 5a56acf8a43e..36af4d48a700 100644 --- a/drivers/spi/spi-sc18is602.c +++ b/drivers/spi/spi-sc18is602.c | |||
@@ -286,7 +286,7 @@ static int sc18is602_probe(struct i2c_client *client, | |||
286 | hw->freq = SC18IS602_CLOCK; | 286 | hw->freq = SC18IS602_CLOCK; |
287 | break; | 287 | break; |
288 | } | 288 | } |
289 | master->bus_num = client->adapter->nr; | 289 | master->bus_num = np ? -1 : client->adapter->nr; |
290 | master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_LSB_FIRST; | 290 | master->mode_bits = SPI_CPHA | SPI_CPOL | SPI_LSB_FIRST; |
291 | master->bits_per_word_mask = SPI_BPW_MASK(8); | 291 | master->bits_per_word_mask = SPI_BPW_MASK(8); |
292 | master->setup = sc18is602_setup; | 292 | master->setup = sc18is602_setup; |