diff options
| -rw-r--r-- | drivers/dma/hsu/hsu.c | 13 | ||||
| -rw-r--r-- | drivers/dma/hsu/hsu.h | 3 |
2 files changed, 11 insertions, 5 deletions
diff --git a/drivers/dma/hsu/hsu.c b/drivers/dma/hsu/hsu.c index eef145edb936..ee510515ce18 100644 --- a/drivers/dma/hsu/hsu.c +++ b/drivers/dma/hsu/hsu.c | |||
| @@ -64,10 +64,10 @@ static void hsu_dma_chan_start(struct hsu_dma_chan *hsuc) | |||
| 64 | 64 | ||
| 65 | if (hsuc->direction == DMA_MEM_TO_DEV) { | 65 | if (hsuc->direction == DMA_MEM_TO_DEV) { |
| 66 | bsr = config->dst_maxburst; | 66 | bsr = config->dst_maxburst; |
| 67 | mtsr = config->dst_addr_width; | 67 | mtsr = config->src_addr_width; |
| 68 | } else if (hsuc->direction == DMA_DEV_TO_MEM) { | 68 | } else if (hsuc->direction == DMA_DEV_TO_MEM) { |
| 69 | bsr = config->src_maxburst; | 69 | bsr = config->src_maxburst; |
| 70 | mtsr = config->src_addr_width; | 70 | mtsr = config->dst_addr_width; |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | hsu_chan_disable(hsuc); | 73 | hsu_chan_disable(hsuc); |
| @@ -135,7 +135,7 @@ static u32 hsu_dma_chan_get_sr(struct hsu_dma_chan *hsuc) | |||
| 135 | sr = hsu_chan_readl(hsuc, HSU_CH_SR); | 135 | sr = hsu_chan_readl(hsuc, HSU_CH_SR); |
| 136 | spin_unlock_irqrestore(&hsuc->vchan.lock, flags); | 136 | spin_unlock_irqrestore(&hsuc->vchan.lock, flags); |
| 137 | 137 | ||
| 138 | return sr; | 138 | return sr & ~(HSU_CH_SR_DESCE_ANY | HSU_CH_SR_CDESC_ANY); |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | irqreturn_t hsu_dma_irq(struct hsu_dma_chip *chip, unsigned short nr) | 141 | irqreturn_t hsu_dma_irq(struct hsu_dma_chip *chip, unsigned short nr) |
| @@ -254,10 +254,13 @@ static void hsu_dma_issue_pending(struct dma_chan *chan) | |||
| 254 | static size_t hsu_dma_active_desc_size(struct hsu_dma_chan *hsuc) | 254 | static size_t hsu_dma_active_desc_size(struct hsu_dma_chan *hsuc) |
| 255 | { | 255 | { |
| 256 | struct hsu_dma_desc *desc = hsuc->desc; | 256 | struct hsu_dma_desc *desc = hsuc->desc; |
| 257 | size_t bytes = desc->length; | 257 | size_t bytes = 0; |
| 258 | int i; | 258 | int i; |
| 259 | 259 | ||
| 260 | i = desc->active % HSU_DMA_CHAN_NR_DESC; | 260 | for (i = desc->active; i < desc->nents; i++) |
| 261 | bytes += desc->sg[i].len; | ||
| 262 | |||
| 263 | i = HSU_DMA_CHAN_NR_DESC - 1; | ||
| 261 | do { | 264 | do { |
| 262 | bytes += hsu_chan_readl(hsuc, HSU_CH_DxTSR(i)); | 265 | bytes += hsu_chan_readl(hsuc, HSU_CH_DxTSR(i)); |
| 263 | } while (--i >= 0); | 266 | } while (--i >= 0); |
diff --git a/drivers/dma/hsu/hsu.h b/drivers/dma/hsu/hsu.h index 578a8ee8cd05..6b070c22b1df 100644 --- a/drivers/dma/hsu/hsu.h +++ b/drivers/dma/hsu/hsu.h | |||
| @@ -41,6 +41,9 @@ | |||
| 41 | #define HSU_CH_SR_DESCTO(x) BIT(8 + (x)) | 41 | #define HSU_CH_SR_DESCTO(x) BIT(8 + (x)) |
| 42 | #define HSU_CH_SR_DESCTO_ANY (BIT(11) | BIT(10) | BIT(9) | BIT(8)) | 42 | #define HSU_CH_SR_DESCTO_ANY (BIT(11) | BIT(10) | BIT(9) | BIT(8)) |
| 43 | #define HSU_CH_SR_CHE BIT(15) | 43 | #define HSU_CH_SR_CHE BIT(15) |
| 44 | #define HSU_CH_SR_DESCE(x) BIT(16 + (x)) | ||
| 45 | #define HSU_CH_SR_DESCE_ANY (BIT(19) | BIT(18) | BIT(17) | BIT(16)) | ||
| 46 | #define HSU_CH_SR_CDESC_ANY (BIT(31) | BIT(30)) | ||
| 44 | 47 | ||
| 45 | /* Bits in HSU_CH_CR */ | 48 | /* Bits in HSU_CH_CR */ |
| 46 | #define HSU_CH_CR_CHA BIT(0) | 49 | #define HSU_CH_CR_CHA BIT(0) |
