diff options
Diffstat (limited to 'drivers/dma/hsu/hsu.c')
-rw-r--r-- | drivers/dma/hsu/hsu.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/dma/hsu/hsu.c b/drivers/dma/hsu/hsu.c index eef145edb936..59d1e7c6fd0f 100644 --- a/drivers/dma/hsu/hsu.c +++ b/drivers/dma/hsu/hsu.c | |||
@@ -77,8 +77,8 @@ static void hsu_dma_chan_start(struct hsu_dma_chan *hsuc) | |||
77 | hsu_chan_writel(hsuc, HSU_CH_MTSR, mtsr); | 77 | hsu_chan_writel(hsuc, HSU_CH_MTSR, mtsr); |
78 | 78 | ||
79 | /* Set descriptors */ | 79 | /* Set descriptors */ |
80 | count = (desc->nents - desc->active) % HSU_DMA_CHAN_NR_DESC; | 80 | count = desc->nents - desc->active; |
81 | for (i = 0; i < count; i++) { | 81 | for (i = 0; i < count && i < HSU_DMA_CHAN_NR_DESC; i++) { |
82 | hsu_chan_writel(hsuc, HSU_CH_DxSAR(i), desc->sg[i].addr); | 82 | hsu_chan_writel(hsuc, HSU_CH_DxSAR(i), desc->sg[i].addr); |
83 | hsu_chan_writel(hsuc, HSU_CH_DxTSR(i), desc->sg[i].len); | 83 | hsu_chan_writel(hsuc, HSU_CH_DxTSR(i), desc->sg[i].len); |
84 | 84 | ||
@@ -160,7 +160,7 @@ irqreturn_t hsu_dma_irq(struct hsu_dma_chip *chip, unsigned short nr) | |||
160 | return IRQ_NONE; | 160 | return IRQ_NONE; |
161 | 161 | ||
162 | /* Timeout IRQ, need wait some time, see Errata 2 */ | 162 | /* Timeout IRQ, need wait some time, see Errata 2 */ |
163 | if (hsuc->direction == DMA_DEV_TO_MEM && (sr & HSU_CH_SR_DESCTO_ANY)) | 163 | if (sr & HSU_CH_SR_DESCTO_ANY) |
164 | udelay(2); | 164 | udelay(2); |
165 | 165 | ||
166 | sr &= ~HSU_CH_SR_DESCTO_ANY; | 166 | sr &= ~HSU_CH_SR_DESCTO_ANY; |
@@ -417,6 +417,8 @@ int hsu_dma_probe(struct hsu_dma_chip *chip) | |||
417 | 417 | ||
418 | hsu->dma.dev = chip->dev; | 418 | hsu->dma.dev = chip->dev; |
419 | 419 | ||
420 | dma_set_max_seg_size(hsu->dma.dev, HSU_CH_DxTSR_MASK); | ||
421 | |||
420 | ret = dma_async_device_register(&hsu->dma); | 422 | ret = dma_async_device_register(&hsu->dma); |
421 | if (ret) | 423 | if (ret) |
422 | return ret; | 424 | return ret; |