Commit 26aafa77df61c4190eae80646211ee6f07c88eaf
1 parent
0e91e434c8
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
spi: mxs-spi: move to use generic DMA helper
With the generic DMA device tree helper supported by mxs-dma driver, client devices only need to call dma_request_slave_channel() for requesting a DMA channel from dmaengine. Since mxs is a DT only platform now, along with the changes, the non-DT case handling in probe function also gets removed. Signed-off-by: Shawn Guo <shawn.guo@linaro.org> Acked-by: Grant Likely <grant.likely@secretlab.ca> Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Showing 3 changed files with 18 additions and 58 deletions Side-by-side Diff
Documentation/devicetree/bindings/spi/mxs-spi.txt
... | ... | @@ -3,8 +3,11 @@ |
3 | 3 | Required properties: |
4 | 4 | - compatible: Should be "fsl,<soc>-spi", where soc is "imx23" or "imx28" |
5 | 5 | - reg: Offset and length of the register set for the device |
6 | -- interrupts: Should contain SSP interrupts (error irq first, dma irq second) | |
7 | -- fsl,ssp-dma-channel: APBX DMA channel for the SSP | |
6 | +- interrupts: Should contain SSP ERROR interrupt | |
7 | +- dmas: DMA specifier, consisting of a phandle to DMA controller node | |
8 | + and SSP DMA channel ID. | |
9 | + Refer to dma.txt and fsl-mxs-dma.txt for details. | |
10 | +- dma-names: Must be "rx-tx". | |
8 | 11 | |
9 | 12 | Optional properties: |
10 | 13 | - clock-frequency : Input clock frequency to the SPI block in Hz. |
... | ... | @@ -17,7 +20,8 @@ |
17 | 20 | #size-cells = <0>; |
18 | 21 | compatible = "fsl,imx28-spi"; |
19 | 22 | reg = <0x80010000 0x2000>; |
20 | - interrupts = <96 82>; | |
21 | - fsl,ssp-dma-channel = <0>; | |
23 | + interrupts = <96>; | |
24 | + dmas = <&dma_apbh 0>; | |
25 | + dma-names = "rx-tx"; | |
22 | 26 | }; |
drivers/spi/spi-mxs.c
... | ... | @@ -490,21 +490,6 @@ |
490 | 490 | return status; |
491 | 491 | } |
492 | 492 | |
493 | -static bool mxs_ssp_dma_filter(struct dma_chan *chan, void *param) | |
494 | -{ | |
495 | - struct mxs_ssp *ssp = param; | |
496 | - | |
497 | - if (!mxs_dma_is_apbh(chan)) | |
498 | - return false; | |
499 | - | |
500 | - if (chan->chan_id != ssp->dma_channel) | |
501 | - return false; | |
502 | - | |
503 | - chan->private = &ssp->dma_data; | |
504 | - | |
505 | - return true; | |
506 | -} | |
507 | - | |
508 | 493 | static const struct of_device_id mxs_spi_dt_ids[] = { |
509 | 494 | { .compatible = "fsl,imx23-spi", .data = (void *) IMX23_SSP, }, |
510 | 495 | { .compatible = "fsl,imx28-spi", .data = (void *) IMX28_SSP, }, |
511 | 496 | |
... | ... | @@ -520,13 +505,12 @@ |
520 | 505 | struct spi_master *master; |
521 | 506 | struct mxs_spi *spi; |
522 | 507 | struct mxs_ssp *ssp; |
523 | - struct resource *iores, *dmares; | |
508 | + struct resource *iores; | |
524 | 509 | struct pinctrl *pinctrl; |
525 | 510 | struct clk *clk; |
526 | 511 | void __iomem *base; |
527 | - int devid, dma_channel, clk_freq; | |
528 | - int ret = 0, irq_err, irq_dma; | |
529 | - dma_cap_mask_t mask; | |
512 | + int devid, clk_freq; | |
513 | + int ret = 0, irq_err; | |
530 | 514 | |
531 | 515 | /* |
532 | 516 | * Default clock speed for the SPI core. 160MHz seems to |
... | ... | @@ -537,8 +521,7 @@ |
537 | 521 | |
538 | 522 | iores = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
539 | 523 | irq_err = platform_get_irq(pdev, 0); |
540 | - irq_dma = platform_get_irq(pdev, 1); | |
541 | - if (!iores || irq_err < 0 || irq_dma < 0) | |
524 | + if (!iores || irq_err < 0) | |
542 | 525 | return -EINVAL; |
543 | 526 | |
544 | 527 | base = devm_ioremap_resource(&pdev->dev, iores); |
545 | 528 | |
... | ... | @@ -553,32 +536,11 @@ |
553 | 536 | if (IS_ERR(clk)) |
554 | 537 | return PTR_ERR(clk); |
555 | 538 | |
556 | - if (np) { | |
557 | - devid = (enum mxs_ssp_id) of_id->data; | |
558 | - /* | |
559 | - * TODO: This is a temporary solution and should be changed | |
560 | - * to use generic DMA binding later when the helpers get in. | |
561 | - */ | |
562 | - ret = of_property_read_u32(np, "fsl,ssp-dma-channel", | |
563 | - &dma_channel); | |
564 | - if (ret) { | |
565 | - dev_err(&pdev->dev, | |
566 | - "Failed to get DMA channel\n"); | |
567 | - return -EINVAL; | |
568 | - } | |
569 | - | |
570 | - ret = of_property_read_u32(np, "clock-frequency", | |
571 | - &clk_freq); | |
572 | - if (ret) | |
573 | - clk_freq = clk_freq_default; | |
574 | - } else { | |
575 | - dmares = platform_get_resource(pdev, IORESOURCE_DMA, 0); | |
576 | - if (!dmares) | |
577 | - return -EINVAL; | |
578 | - devid = pdev->id_entry->driver_data; | |
579 | - dma_channel = dmares->start; | |
539 | + devid = (enum mxs_ssp_id) of_id->data; | |
540 | + ret = of_property_read_u32(np, "clock-frequency", | |
541 | + &clk_freq); | |
542 | + if (ret) | |
580 | 543 | clk_freq = clk_freq_default; |
581 | - } | |
582 | 544 | |
583 | 545 | master = spi_alloc_master(&pdev->dev, sizeof(*spi)); |
584 | 546 | if (!master) |
... | ... | @@ -597,7 +559,6 @@ |
597 | 559 | ssp->clk = clk; |
598 | 560 | ssp->base = base; |
599 | 561 | ssp->devid = devid; |
600 | - ssp->dma_channel = dma_channel; | |
601 | 562 | |
602 | 563 | init_completion(&spi->c); |
603 | 564 | |
... | ... | @@ -606,10 +567,7 @@ |
606 | 567 | if (ret) |
607 | 568 | goto out_master_free; |
608 | 569 | |
609 | - dma_cap_zero(mask); | |
610 | - dma_cap_set(DMA_SLAVE, mask); | |
611 | - ssp->dma_data.chan_irq = irq_dma; | |
612 | - ssp->dmach = dma_request_channel(mask, mxs_ssp_dma_filter, ssp); | |
570 | + ssp->dmach = dma_request_slave_channel(&pdev->dev, "rx-tx"); | |
613 | 571 | if (!ssp->dmach) { |
614 | 572 | dev_err(ssp->dev, "Failed to request DMA\n"); |
615 | 573 | goto out_master_free; |
include/linux/spi/mxs-spi.h
... | ... | @@ -24,7 +24,7 @@ |
24 | 24 | #ifndef __LINUX_SPI_MXS_SPI_H__ |
25 | 25 | #define __LINUX_SPI_MXS_SPI_H__ |
26 | 26 | |
27 | -#include <linux/fsl/mxs-dma.h> | |
27 | +#include <linux/dmaengine.h> | |
28 | 28 | |
29 | 29 | #define ssp_is_old(host) ((host)->devid == IMX23_SSP) |
30 | 30 | |
31 | 31 | |
... | ... | @@ -137,9 +137,7 @@ |
137 | 137 | unsigned int clk_rate; |
138 | 138 | enum mxs_ssp_id devid; |
139 | 139 | |
140 | - int dma_channel; | |
141 | 140 | struct dma_chan *dmach; |
142 | - struct mxs_dma_data dma_data; | |
143 | 141 | unsigned int dma_dir; |
144 | 142 | enum dma_transfer_direction slave_dirn; |
145 | 143 | u32 ssp_pio_words[SSP_PIO_NUM]; |