summaryrefslogtreecommitdiffstats
path: root/drivers/dma
diff options
context:
space:
mode:
authorEric Long <eric.long@spreadtrum.com>2018-11-06 00:01:36 -0500
committerVinod Koul <vkoul@kernel.org>2018-12-05 03:57:12 -0500
commit770399df90b6e43bd086653f0a35888dca056576 (patch)
tree30e8ba646dc6085fc48f7e127aded24e1c9e2d47 /drivers/dma
parent97dbd6ea02beb3a7027c158e0a110b5095268d59 (diff)
dmaengine: sprd: Support DMA 2-stage transfer mode
The Spreadtrum DMA controller supports channel 2-stage tansfer mode, that means we can request 2 dma channels, one for source channel, and another one for destination channel. Once the source channel's transaction is done, it will trigger the destination channel's transaction automatically by hardware signal. Signed-off-by: Eric Long <eric.long@spreadtrum.com> Signed-off-by: Baolin Wang <baolin.wang@linaro.org> Signed-off-by: Vinod Koul <vkoul@kernel.org>
Diffstat (limited to 'drivers/dma')
-rw-r--r--drivers/dma/sprd-dma.c98
1 files changed, 97 insertions, 1 deletions
diff --git a/drivers/dma/sprd-dma.c b/drivers/dma/sprd-dma.c
index cefe42fb7100..50d6569585b4 100644
--- a/drivers/dma/sprd-dma.c
+++ b/drivers/dma/sprd-dma.c
@@ -36,6 +36,8 @@
36#define SPRD_DMA_GLB_CHN_EN_STS 0x1c 36#define SPRD_DMA_GLB_CHN_EN_STS 0x1c
37#define SPRD_DMA_GLB_DEBUG_STS 0x20 37#define SPRD_DMA_GLB_DEBUG_STS 0x20
38#define SPRD_DMA_GLB_ARB_SEL_STS 0x24 38#define SPRD_DMA_GLB_ARB_SEL_STS 0x24
39#define SPRD_DMA_GLB_2STAGE_GRP1 0x28
40#define SPRD_DMA_GLB_2STAGE_GRP2 0x2c
39#define SPRD_DMA_GLB_REQ_UID(uid) (0x4 * ((uid) - 1)) 41#define SPRD_DMA_GLB_REQ_UID(uid) (0x4 * ((uid) - 1))
40#define SPRD_DMA_GLB_REQ_UID_OFFSET 0x2000 42#define SPRD_DMA_GLB_REQ_UID_OFFSET 0x2000
41 43
@@ -57,6 +59,18 @@
57#define SPRD_DMA_CHN_SRC_BLK_STEP 0x38 59#define SPRD_DMA_CHN_SRC_BLK_STEP 0x38
58#define SPRD_DMA_CHN_DES_BLK_STEP 0x3c 60#define SPRD_DMA_CHN_DES_BLK_STEP 0x3c
59 61
62/* SPRD_DMA_GLB_2STAGE_GRP register definition */
63#define SPRD_DMA_GLB_2STAGE_EN BIT(24)
64#define SPRD_DMA_GLB_CHN_INT_MASK GENMASK(23, 20)
65#define SPRD_DMA_GLB_LIST_DONE_TRG BIT(19)
66#define SPRD_DMA_GLB_TRANS_DONE_TRG BIT(18)
67#define SPRD_DMA_GLB_BLOCK_DONE_TRG BIT(17)
68#define SPRD_DMA_GLB_FRAG_DONE_TRG BIT(16)
69#define SPRD_DMA_GLB_TRG_OFFSET 16
70#define SPRD_DMA_GLB_DEST_CHN_MASK GENMASK(13, 8)
71#define SPRD_DMA_GLB_DEST_CHN_OFFSET 8
72#define SPRD_DMA_GLB_SRC_CHN_MASK GENMASK(5, 0)
73
60/* SPRD_DMA_CHN_INTC register definition */ 74/* SPRD_DMA_CHN_INTC register definition */
61#define SPRD_DMA_INT_MASK GENMASK(4, 0) 75#define SPRD_DMA_INT_MASK GENMASK(4, 0)
62#define SPRD_DMA_INT_CLR_OFFSET 24 76#define SPRD_DMA_INT_CLR_OFFSET 24
@@ -118,6 +132,10 @@
118#define SPRD_DMA_SRC_TRSF_STEP_OFFSET 0 132#define SPRD_DMA_SRC_TRSF_STEP_OFFSET 0
119#define SPRD_DMA_TRSF_STEP_MASK GENMASK(15, 0) 133#define SPRD_DMA_TRSF_STEP_MASK GENMASK(15, 0)
120 134
135/* define DMA channel mode & trigger mode mask */
136#define SPRD_DMA_CHN_MODE_MASK GENMASK(7, 0)
137#define SPRD_DMA_TRG_MODE_MASK GENMASK(7, 0)
138
121/* define the DMA transfer step type */ 139/* define the DMA transfer step type */
122#define SPRD_DMA_NONE_STEP 0 140#define SPRD_DMA_NONE_STEP 0
123#define SPRD_DMA_BYTE_STEP 1 141#define SPRD_DMA_BYTE_STEP 1
@@ -170,6 +188,8 @@ struct sprd_dma_chn {
170 struct dma_slave_config slave_cfg; 188 struct dma_slave_config slave_cfg;
171 u32 chn_num; 189 u32 chn_num;
172 u32 dev_id; 190 u32 dev_id;
191 enum sprd_dma_chn_mode chn_mode;
192 enum sprd_dma_trg_mode trg_mode;
173 struct sprd_dma_desc *cur_desc; 193 struct sprd_dma_desc *cur_desc;
174}; 194};
175 195
@@ -206,6 +226,16 @@ static inline struct sprd_dma_desc *to_sprd_dma_desc(struct virt_dma_desc *vd)
206 return container_of(vd, struct sprd_dma_desc, vd); 226 return container_of(vd, struct sprd_dma_desc, vd);
207} 227}
208 228
229static void sprd_dma_glb_update(struct sprd_dma_dev *sdev, u32 reg,
230 u32 mask, u32 val)
231{
232 u32 orig = readl(sdev->glb_base + reg);
233 u32 tmp;
234
235 tmp = (orig & ~mask) | val;
236 writel(tmp, sdev->glb_base + reg);
237}
238
209static void sprd_dma_chn_update(struct sprd_dma_chn *schan, u32 reg, 239static void sprd_dma_chn_update(struct sprd_dma_chn *schan, u32 reg,
210 u32 mask, u32 val) 240 u32 mask, u32 val)
211{ 241{
@@ -389,6 +419,49 @@ static enum sprd_dma_req_mode sprd_dma_get_req_type(struct sprd_dma_chn *schan)
389 return (frag_reg >> SPRD_DMA_REQ_MODE_OFFSET) & SPRD_DMA_REQ_MODE_MASK; 419 return (frag_reg >> SPRD_DMA_REQ_MODE_OFFSET) & SPRD_DMA_REQ_MODE_MASK;
390} 420}
391 421
422static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan)
423{
424 struct sprd_dma_dev *sdev = to_sprd_dma_dev(&schan->vc.chan);
425 u32 val, chn = schan->chn_num + 1;
426
427 switch (schan->chn_mode) {
428 case SPRD_DMA_SRC_CHN0:
429 val = chn & SPRD_DMA_GLB_SRC_CHN_MASK;
430 val |= BIT(schan->trg_mode - 1) << SPRD_DMA_GLB_TRG_OFFSET;
431 val |= SPRD_DMA_GLB_2STAGE_EN;
432 sprd_dma_glb_update(sdev, SPRD_DMA_GLB_2STAGE_GRP1, val, val);
433 break;
434
435 case SPRD_DMA_SRC_CHN1:
436 val = chn & SPRD_DMA_GLB_SRC_CHN_MASK;
437 val |= BIT(schan->trg_mode - 1) << SPRD_DMA_GLB_TRG_OFFSET;
438 val |= SPRD_DMA_GLB_2STAGE_EN;
439 sprd_dma_glb_update(sdev, SPRD_DMA_GLB_2STAGE_GRP2, val, val);
440 break;
441
442 case SPRD_DMA_DST_CHN0:
443 val = (chn << SPRD_DMA_GLB_DEST_CHN_OFFSET) &
444 SPRD_DMA_GLB_DEST_CHN_MASK;
445 val |= SPRD_DMA_GLB_2STAGE_EN;
446 sprd_dma_glb_update(sdev, SPRD_DMA_GLB_2STAGE_GRP1, val, val);
447 break;
448
449 case SPRD_DMA_DST_CHN1:
450 val = (chn << SPRD_DMA_GLB_DEST_CHN_OFFSET) &
451 SPRD_DMA_GLB_DEST_CHN_MASK;
452 val |= SPRD_DMA_GLB_2STAGE_EN;
453 sprd_dma_glb_update(sdev, SPRD_DMA_GLB_2STAGE_GRP2, val, val);
454 break;
455
456 default:
457 dev_err(sdev->dma_dev.dev, "invalid channel mode setting %d\n",
458 schan->chn_mode);
459 return -EINVAL;
460 }
461
462 return 0;
463}
464
392static void sprd_dma_set_chn_config(struct sprd_dma_chn *schan, 465static void sprd_dma_set_chn_config(struct sprd_dma_chn *schan,
393 struct sprd_dma_desc *sdesc) 466 struct sprd_dma_desc *sdesc)
394{ 467{
@@ -423,6 +496,13 @@ static void sprd_dma_start(struct sprd_dma_chn *schan)
423 schan->cur_desc = to_sprd_dma_desc(vd); 496 schan->cur_desc = to_sprd_dma_desc(vd);
424 497
425 /* 498 /*
499 * Set 2-stage configuration if the channel starts one 2-stage
500 * transfer.
501 */
502 if (schan->chn_mode && sprd_dma_set_2stage_config(schan))
503 return;
504
505 /*
426 * Copy the DMA configuration from DMA descriptor to this hardware 506 * Copy the DMA configuration from DMA descriptor to this hardware
427 * channel. 507 * channel.
428 */ 508 */
@@ -617,6 +697,7 @@ static int sprd_dma_fill_desc(struct dma_chan *chan,
617{ 697{
618 struct sprd_dma_dev *sdev = to_sprd_dma_dev(chan); 698 struct sprd_dma_dev *sdev = to_sprd_dma_dev(chan);
619 struct sprd_dma_chn *schan = to_sprd_dma_chan(chan); 699 struct sprd_dma_chn *schan = to_sprd_dma_chan(chan);
700 enum sprd_dma_chn_mode chn_mode = schan->chn_mode;
620 u32 req_mode = (flags >> SPRD_DMA_REQ_SHIFT) & SPRD_DMA_REQ_MODE_MASK; 701 u32 req_mode = (flags >> SPRD_DMA_REQ_SHIFT) & SPRD_DMA_REQ_MODE_MASK;
621 u32 int_mode = flags & SPRD_DMA_INT_MASK; 702 u32 int_mode = flags & SPRD_DMA_INT_MASK;
622 int src_datawidth, dst_datawidth, src_step, dst_step; 703 int src_datawidth, dst_datawidth, src_step, dst_step;
@@ -628,7 +709,16 @@ static int sprd_dma_fill_desc(struct dma_chan *chan,
628 dev_err(sdev->dma_dev.dev, "invalid source step\n"); 709 dev_err(sdev->dma_dev.dev, "invalid source step\n");
629 return src_step; 710 return src_step;
630 } 711 }
631 dst_step = SPRD_DMA_NONE_STEP; 712
713 /*
714 * For 2-stage transfer, destination channel step can not be 0,
715 * since destination device is AON IRAM.
716 */
717 if (chn_mode == SPRD_DMA_DST_CHN0 ||
718 chn_mode == SPRD_DMA_DST_CHN1)
719 dst_step = src_step;
720 else
721 dst_step = SPRD_DMA_NONE_STEP;
632 } else { 722 } else {
633 dst_step = sprd_dma_get_step(slave_cfg->dst_addr_width); 723 dst_step = sprd_dma_get_step(slave_cfg->dst_addr_width);
634 if (dst_step < 0) { 724 if (dst_step < 0) {
@@ -855,6 +945,12 @@ sprd_dma_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
855 } 945 }
856 } 946 }
857 947
948 /* Set channel mode and trigger mode for 2-stage transfer */
949 schan->chn_mode =
950 (flags >> SPRD_DMA_CHN_MODE_SHIFT) & SPRD_DMA_CHN_MODE_MASK;
951 schan->trg_mode =
952 (flags >> SPRD_DMA_TRG_MODE_SHIFT) & SPRD_DMA_TRG_MODE_MASK;
953
858 ret = sprd_dma_fill_desc(chan, &sdesc->chn_hw, 0, 0, src, dst, len, 954 ret = sprd_dma_fill_desc(chan, &sdesc->chn_hw, 0, 0, src, dst, len,
859 dir, flags, slave_cfg); 955 dir, flags, slave_cfg);
860 if (ret) { 956 if (ret) {