aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/dma/fsldma.c45
-rw-r--r--drivers/dma/fsldma.h3
2 files changed, 31 insertions, 17 deletions
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c
index 73dd74823195..7a0cb6064f83 100644
--- a/drivers/dma/fsldma.c
+++ b/drivers/dma/fsldma.c
@@ -280,28 +280,40 @@ static void fsl_chan_set_dest_loop_size(struct fsl_dma_chan *fsl_chan, int size)
280} 280}
281 281
282/** 282/**
283 * fsl_chan_toggle_ext_pause - Toggle channel external pause status 283 * fsl_chan_set_request_count - Set DMA Request Count for external control
284 * @fsl_chan : Freescale DMA channel 284 * @fsl_chan : Freescale DMA channel
285 * @size : Pause control size, 0 for disable external pause control. 285 * @size : Number of bytes to transfer in a single request
286 * The maximum is 1024. 286 *
287 * The Freescale DMA channel can be controlled by the external signal DREQ#.
288 * The DMA request count is how many bytes are allowed to transfer before
289 * pausing the channel, after which a new assertion of DREQ# resumes channel
290 * operation.
287 * 291 *
288 * The Freescale DMA channel can be controlled by the external 292 * A size of 0 disables external pause control. The maximum size is 1024.
289 * signal DREQ#. The pause control size is how many bytes are allowed
290 * to transfer before pausing the channel, after which a new assertion
291 * of DREQ# resumes channel operation.
292 */ 293 */
293static void fsl_chan_toggle_ext_pause(struct fsl_dma_chan *fsl_chan, int size) 294static void fsl_chan_set_request_count(struct fsl_dma_chan *fsl_chan, int size)
294{ 295{
295 if (size > 1024) 296 BUG_ON(size > 1024);
296 return; 297 DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr,
298 DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32)
299 | ((__ilog2(size) << 24) & 0x0f000000),
300 32);
301}
297 302
298 if (size) { 303/**
299 DMA_OUT(fsl_chan, &fsl_chan->reg_base->mr, 304 * fsl_chan_toggle_ext_pause - Toggle channel external pause status
300 DMA_IN(fsl_chan, &fsl_chan->reg_base->mr, 32) 305 * @fsl_chan : Freescale DMA channel
301 | ((__ilog2(size) << 24) & 0x0f000000), 306 * @enable : 0 is disabled, 1 is enabled.
302 32); 307 *
308 * The Freescale DMA channel can be controlled by the external signal DREQ#.
309 * The DMA Request Count feature should be used in addition to this feature
310 * to set the number of bytes to transfer before pausing the channel.
311 */
312static void fsl_chan_toggle_ext_pause(struct fsl_dma_chan *fsl_chan, int enable)
313{
314 if (enable)
303 fsl_chan->feature |= FSL_DMA_CHAN_PAUSE_EXT; 315 fsl_chan->feature |= FSL_DMA_CHAN_PAUSE_EXT;
304 } else 316 else
305 fsl_chan->feature &= ~FSL_DMA_CHAN_PAUSE_EXT; 317 fsl_chan->feature &= ~FSL_DMA_CHAN_PAUSE_EXT;
306} 318}
307 319
@@ -885,6 +897,7 @@ static int __devinit fsl_dma_chan_probe(struct fsl_dma_device *fdev,
885 new_fsl_chan->toggle_ext_start = fsl_chan_toggle_ext_start; 897 new_fsl_chan->toggle_ext_start = fsl_chan_toggle_ext_start;
886 new_fsl_chan->set_src_loop_size = fsl_chan_set_src_loop_size; 898 new_fsl_chan->set_src_loop_size = fsl_chan_set_src_loop_size;
887 new_fsl_chan->set_dest_loop_size = fsl_chan_set_dest_loop_size; 899 new_fsl_chan->set_dest_loop_size = fsl_chan_set_dest_loop_size;
900 new_fsl_chan->set_request_count = fsl_chan_set_request_count;
888 } 901 }
889 902
890 spin_lock_init(&new_fsl_chan->desc_lock); 903 spin_lock_init(&new_fsl_chan->desc_lock);
diff --git a/drivers/dma/fsldma.h b/drivers/dma/fsldma.h
index 4493afed53f0..0df14cbb8ca3 100644
--- a/drivers/dma/fsldma.h
+++ b/drivers/dma/fsldma.h
@@ -144,10 +144,11 @@ struct fsl_dma_chan {
144 struct tasklet_struct tasklet; 144 struct tasklet_struct tasklet;
145 u32 feature; 145 u32 feature;
146 146
147 void (*toggle_ext_pause)(struct fsl_dma_chan *fsl_chan, int size); 147 void (*toggle_ext_pause)(struct fsl_dma_chan *fsl_chan, int enable);
148 void (*toggle_ext_start)(struct fsl_dma_chan *fsl_chan, int enable); 148 void (*toggle_ext_start)(struct fsl_dma_chan *fsl_chan, int enable);
149 void (*set_src_loop_size)(struct fsl_dma_chan *fsl_chan, int size); 149 void (*set_src_loop_size)(struct fsl_dma_chan *fsl_chan, int size);
150 void (*set_dest_loop_size)(struct fsl_dma_chan *fsl_chan, int size); 150 void (*set_dest_loop_size)(struct fsl_dma_chan *fsl_chan, int size);
151 void (*set_request_count)(struct fsl_dma_chan *fsl_chan, int size);
151}; 152};
152 153
153#define to_fsl_chan(chan) container_of(chan, struct fsl_dma_chan, common) 154#define to_fsl_chan(chan) container_of(chan, struct fsl_dma_chan, common)