Skip to content

Commit d0f19a4

Browse files
Zhenfang Wangvinodkoul
authored andcommitted
dmaengine: sprd: Set request pending flag when DMA controller is active
On new Spreadtrum platforms, when the CPU enters idle, it will close the DMA controllers' clock to save power if the DMA controller is not busy. Moreover the DMA controller's busy signal depends on the DMA enable flag and the request pending flag. When DMA controller starts to transfer data, which means we already set the DMA enable flag, but now we should also set the request pending flag, in case the DMA clock will be closed accidentally if the CPU can not detect the DMA controller's busy signal. Signed-off-by: Zhenfang Wang <[email protected]> Signed-off-by: Baolin Wang <[email protected]> Link: https://lore.kernel.org/r/02adbe4364ec436ec2c5bc8fd2386bab98edd884.1584019223.git.baolin.wang7@gmail.com Signed-off-by: Vinod Koul <[email protected]>
1 parent 3a5a8a2 commit d0f19a4

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

drivers/dma/sprd-dma.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,28 @@ static int sprd_dma_set_2stage_config(struct sprd_dma_chn *schan)
486486
return 0;
487487
}
488488

489+
static void sprd_dma_set_pending(struct sprd_dma_chn *schan, bool enable)
490+
{
491+
struct sprd_dma_dev *sdev = to_sprd_dma_dev(&schan->vc.chan);
492+
u32 reg, val, req_id;
493+
494+
if (schan->dev_id == SPRD_DMA_SOFTWARE_UID)
495+
return;
496+
497+
/* The DMA request id always starts from 0. */
498+
req_id = schan->dev_id - 1;
499+
500+
if (req_id < 32) {
501+
reg = SPRD_DMA_GLB_REQ_PEND0_EN;
502+
val = BIT(req_id);
503+
} else {
504+
reg = SPRD_DMA_GLB_REQ_PEND1_EN;
505+
val = BIT(req_id - 32);
506+
}
507+
508+
sprd_dma_glb_update(sdev, reg, val, enable ? val : 0);
509+
}
510+
489511
static void sprd_dma_set_chn_config(struct sprd_dma_chn *schan,
490512
struct sprd_dma_desc *sdesc)
491513
{
@@ -532,6 +554,7 @@ static void sprd_dma_start(struct sprd_dma_chn *schan)
532554
*/
533555
sprd_dma_set_chn_config(schan, schan->cur_desc);
534556
sprd_dma_set_uid(schan);
557+
sprd_dma_set_pending(schan, true);
535558
sprd_dma_enable_chn(schan);
536559

537560
if (schan->dev_id == SPRD_DMA_SOFTWARE_UID &&
@@ -543,6 +566,7 @@ static void sprd_dma_start(struct sprd_dma_chn *schan)
543566
static void sprd_dma_stop(struct sprd_dma_chn *schan)
544567
{
545568
sprd_dma_stop_and_disable(schan);
569+
sprd_dma_set_pending(schan, false);
546570
sprd_dma_unset_uid(schan);
547571
sprd_dma_clear_int(schan);
548572
schan->cur_desc = NULL;

0 commit comments

Comments
 (0)