diff options
| -rw-r--r-- | drivers/dma/fsldma.c | 45 | ||||
| -rw-r--r-- | drivers/dma/fsldma.h | 3 |
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 | */ |
| 293 | static void fsl_chan_toggle_ext_pause(struct fsl_dma_chan *fsl_chan, int size) | 294 | static 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 | */ | ||
| 312 | static 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) |
