diff options
Diffstat (limited to 'drivers/dma/dmaengine.c')
| -rw-r--r-- | drivers/dma/dmaengine.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index 7344f5dbd501..dc003a3a787d 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c | |||
| @@ -169,7 +169,12 @@ static void dma_client_chan_alloc(struct dma_client *client) | |||
| 169 | enum dma_state_client ack; | 169 | enum dma_state_client ack; |
| 170 | 170 | ||
| 171 | /* Find a channel */ | 171 | /* Find a channel */ |
| 172 | list_for_each_entry(device, &dma_device_list, global_node) | 172 | list_for_each_entry(device, &dma_device_list, global_node) { |
| 173 | /* Does the client require a specific DMA controller? */ | ||
| 174 | if (client->slave && client->slave->dma_dev | ||
| 175 | && client->slave->dma_dev != device->dev) | ||
| 176 | continue; | ||
| 177 | |||
| 173 | list_for_each_entry(chan, &device->channels, device_node) { | 178 | list_for_each_entry(chan, &device->channels, device_node) { |
| 174 | if (!dma_chan_satisfies_mask(chan, client->cap_mask)) | 179 | if (!dma_chan_satisfies_mask(chan, client->cap_mask)) |
| 175 | continue; | 180 | continue; |
| @@ -191,6 +196,7 @@ static void dma_client_chan_alloc(struct dma_client *client) | |||
| 191 | return; | 196 | return; |
| 192 | } | 197 | } |
| 193 | } | 198 | } |
| 199 | } | ||
| 194 | } | 200 | } |
| 195 | 201 | ||
| 196 | enum dma_status dma_sync_wait(struct dma_chan *chan, dma_cookie_t cookie) | 202 | enum dma_status dma_sync_wait(struct dma_chan *chan, dma_cookie_t cookie) |
| @@ -289,6 +295,10 @@ static void dma_clients_notify_removed(struct dma_chan *chan) | |||
| 289 | */ | 295 | */ |
| 290 | void dma_async_client_register(struct dma_client *client) | 296 | void dma_async_client_register(struct dma_client *client) |
| 291 | { | 297 | { |
| 298 | /* validate client data */ | ||
| 299 | BUG_ON(dma_has_cap(DMA_SLAVE, client->cap_mask) && | ||
| 300 | !client->slave); | ||
| 301 | |||
| 292 | mutex_lock(&dma_list_mutex); | 302 | mutex_lock(&dma_list_mutex); |
| 293 | list_add_tail(&client->global_node, &dma_client_list); | 303 | list_add_tail(&client->global_node, &dma_client_list); |
| 294 | mutex_unlock(&dma_list_mutex); | 304 | mutex_unlock(&dma_list_mutex); |
| @@ -365,6 +375,10 @@ int dma_async_device_register(struct dma_device *device) | |||
| 365 | !device->device_prep_dma_memset); | 375 | !device->device_prep_dma_memset); |
| 366 | BUG_ON(dma_has_cap(DMA_INTERRUPT, device->cap_mask) && | 376 | BUG_ON(dma_has_cap(DMA_INTERRUPT, device->cap_mask) && |
| 367 | !device->device_prep_dma_interrupt); | 377 | !device->device_prep_dma_interrupt); |
| 378 | BUG_ON(dma_has_cap(DMA_SLAVE, device->cap_mask) && | ||
| 379 | !device->device_prep_slave_sg); | ||
| 380 | BUG_ON(dma_has_cap(DMA_SLAVE, device->cap_mask) && | ||
| 381 | !device->device_terminate_all); | ||
| 368 | 382 | ||
| 369 | BUG_ON(!device->device_alloc_chan_resources); | 383 | BUG_ON(!device->device_alloc_chan_resources); |
| 370 | BUG_ON(!device->device_free_chan_resources); | 384 | BUG_ON(!device->device_free_chan_resources); |
