diff options
author | Haavard Skinnemoen <haavard.skinnemoen@atmel.com> | 2008-07-08 14:58:58 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2008-07-08 14:58:58 -0400 |
commit | 848c536a37b8db4e461f14ca15fe29850151c822 (patch) | |
tree | f4a88e92e31de28511e3a3de99200a77d2613dae | |
parent | 4a776f0aa922a552460192c07b56f4fe9cd82632 (diff) |
dmaengine: Add dma_client parameter to device_alloc_chan_resources
A DMA controller capable of doing slave transfers may need to know a
few things about the slave when preparing the channel. We don't want
to add this information to struct dma_channel since the channel hasn't
yet been bound to a client at this point.
Instead, pass a reference to the client requesting the channel to the
driver's device_alloc_chan_resources hook so that it can pick the
necessary information from the dma_client struct by itself.
[dan.j.williams@intel.com: fixed up fsldma and mv_xor]
Acked-by: Maciej Sosnowski <maciej.sosnowski@intel.com>
Signed-off-by: Haavard Skinnemoen <haavard.skinnemoen@atmel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r-- | drivers/dma/dmaengine.c | 3 | ||||
-rw-r--r-- | drivers/dma/fsldma.c | 7 | ||||
-rw-r--r-- | drivers/dma/ioat_dma.c | 5 | ||||
-rw-r--r-- | drivers/dma/iop-adma.c | 7 | ||||
-rw-r--r-- | drivers/dma/mv_xor.c | 7 | ||||
-rw-r--r-- | include/linux/dmaengine.h | 3 |
6 files changed, 19 insertions, 13 deletions
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index 10de69eb1a3..7344f5dbd50 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c | |||
@@ -174,7 +174,8 @@ static void dma_client_chan_alloc(struct dma_client *client) | |||
174 | if (!dma_chan_satisfies_mask(chan, client->cap_mask)) | 174 | if (!dma_chan_satisfies_mask(chan, client->cap_mask)) |
175 | continue; | 175 | continue; |
176 | 176 | ||
177 | desc = chan->device->device_alloc_chan_resources(chan); | 177 | desc = chan->device->device_alloc_chan_resources( |
178 | chan, client); | ||
178 | if (desc >= 0) { | 179 | if (desc >= 0) { |
179 | ack = client->event_callback(client, | 180 | ack = client->event_callback(client, |
180 | chan, | 181 | chan, |
diff --git a/drivers/dma/fsldma.c b/drivers/dma/fsldma.c index 724f6fdd0af..c0059ca5834 100644 --- a/drivers/dma/fsldma.c +++ b/drivers/dma/fsldma.c | |||
@@ -366,7 +366,8 @@ static struct fsl_desc_sw *fsl_dma_alloc_descriptor( | |||
366 | * | 366 | * |
367 | * Return - The number of descriptors allocated. | 367 | * Return - The number of descriptors allocated. |
368 | */ | 368 | */ |
369 | static int fsl_dma_alloc_chan_resources(struct dma_chan *chan) | 369 | static int fsl_dma_alloc_chan_resources(struct dma_chan *chan, |
370 | struct dma_client *client) | ||
370 | { | 371 | { |
371 | struct fsl_dma_chan *fsl_chan = to_fsl_chan(chan); | 372 | struct fsl_dma_chan *fsl_chan = to_fsl_chan(chan); |
372 | LIST_HEAD(tmp_list); | 373 | LIST_HEAD(tmp_list); |
@@ -819,7 +820,7 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan) | |||
819 | 820 | ||
820 | chan = &fsl_chan->common; | 821 | chan = &fsl_chan->common; |
821 | 822 | ||
822 | if (fsl_dma_alloc_chan_resources(chan) < 1) { | 823 | if (fsl_dma_alloc_chan_resources(chan, NULL) < 1) { |
823 | dev_err(fsl_chan->dev, | 824 | dev_err(fsl_chan->dev, |
824 | "selftest: Cannot alloc resources for DMA\n"); | 825 | "selftest: Cannot alloc resources for DMA\n"); |
825 | err = -ENODEV; | 826 | err = -ENODEV; |
@@ -847,7 +848,7 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan) | |||
847 | /* Test free and re-alloc channel resources */ | 848 | /* Test free and re-alloc channel resources */ |
848 | fsl_dma_free_chan_resources(chan); | 849 | fsl_dma_free_chan_resources(chan); |
849 | 850 | ||
850 | if (fsl_dma_alloc_chan_resources(chan) < 1) { | 851 | if (fsl_dma_alloc_chan_resources(chan, NULL) < 1) { |
851 | dev_err(fsl_chan->dev, | 852 | dev_err(fsl_chan->dev, |
852 | "selftest: Cannot alloc resources for DMA\n"); | 853 | "selftest: Cannot alloc resources for DMA\n"); |
853 | err = -ENODEV; | 854 | err = -ENODEV; |
diff --git a/drivers/dma/ioat_dma.c b/drivers/dma/ioat_dma.c index 318e8a22d81..90e5b0a28cb 100644 --- a/drivers/dma/ioat_dma.c +++ b/drivers/dma/ioat_dma.c | |||
@@ -452,7 +452,8 @@ static void ioat2_dma_massage_chan_desc(struct ioat_dma_chan *ioat_chan) | |||
452 | * ioat_dma_alloc_chan_resources - returns the number of allocated descriptors | 452 | * ioat_dma_alloc_chan_resources - returns the number of allocated descriptors |
453 | * @chan: the channel to be filled out | 453 | * @chan: the channel to be filled out |
454 | */ | 454 | */ |
455 | static int ioat_dma_alloc_chan_resources(struct dma_chan *chan) | 455 | static int ioat_dma_alloc_chan_resources(struct dma_chan *chan, |
456 | struct dma_client *client) | ||
456 | { | 457 | { |
457 | struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan); | 458 | struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan); |
458 | struct ioat_desc_sw *desc; | 459 | struct ioat_desc_sw *desc; |
@@ -1049,7 +1050,7 @@ static int ioat_dma_self_test(struct ioatdma_device *device) | |||
1049 | dma_chan = container_of(device->common.channels.next, | 1050 | dma_chan = container_of(device->common.channels.next, |
1050 | struct dma_chan, | 1051 | struct dma_chan, |
1051 | device_node); | 1052 | device_node); |
1052 | if (device->common.device_alloc_chan_resources(dma_chan) < 1) { | 1053 | if (device->common.device_alloc_chan_resources(dma_chan, NULL) < 1) { |
1053 | dev_err(&device->pdev->dev, | 1054 | dev_err(&device->pdev->dev, |
1054 | "selftest cannot allocate chan resource\n"); | 1055 | "selftest cannot allocate chan resource\n"); |
1055 | err = -ENODEV; | 1056 | err = -ENODEV; |
diff --git a/drivers/dma/iop-adma.c b/drivers/dma/iop-adma.c index 4e6b052c065..b57564dd023 100644 --- a/drivers/dma/iop-adma.c +++ b/drivers/dma/iop-adma.c | |||
@@ -444,7 +444,8 @@ static void iop_chan_start_null_memcpy(struct iop_adma_chan *iop_chan); | |||
444 | static void iop_chan_start_null_xor(struct iop_adma_chan *iop_chan); | 444 | static void iop_chan_start_null_xor(struct iop_adma_chan *iop_chan); |
445 | 445 | ||
446 | /* returns the number of allocated descriptors */ | 446 | /* returns the number of allocated descriptors */ |
447 | static int iop_adma_alloc_chan_resources(struct dma_chan *chan) | 447 | static int iop_adma_alloc_chan_resources(struct dma_chan *chan, |
448 | struct dma_client *client) | ||
448 | { | 449 | { |
449 | char *hw_desc; | 450 | char *hw_desc; |
450 | int idx; | 451 | int idx; |
@@ -838,7 +839,7 @@ static int __devinit iop_adma_memcpy_self_test(struct iop_adma_device *device) | |||
838 | dma_chan = container_of(device->common.channels.next, | 839 | dma_chan = container_of(device->common.channels.next, |
839 | struct dma_chan, | 840 | struct dma_chan, |
840 | device_node); | 841 | device_node); |
841 | if (iop_adma_alloc_chan_resources(dma_chan) < 1) { | 842 | if (iop_adma_alloc_chan_resources(dma_chan, NULL) < 1) { |
842 | err = -ENODEV; | 843 | err = -ENODEV; |
843 | goto out; | 844 | goto out; |
844 | } | 845 | } |
@@ -936,7 +937,7 @@ iop_adma_xor_zero_sum_self_test(struct iop_adma_device *device) | |||
936 | dma_chan = container_of(device->common.channels.next, | 937 | dma_chan = container_of(device->common.channels.next, |
937 | struct dma_chan, | 938 | struct dma_chan, |
938 | device_node); | 939 | device_node); |
939 | if (iop_adma_alloc_chan_resources(dma_chan) < 1) { | 940 | if (iop_adma_alloc_chan_resources(dma_chan, NULL) < 1) { |
940 | err = -ENODEV; | 941 | err = -ENODEV; |
941 | goto out; | 942 | goto out; |
942 | } | 943 | } |
diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c index f0c123ce8ae..8239cfdbc2e 100644 --- a/drivers/dma/mv_xor.c +++ b/drivers/dma/mv_xor.c | |||
@@ -588,7 +588,8 @@ submit_done: | |||
588 | } | 588 | } |
589 | 589 | ||
590 | /* returns the number of allocated descriptors */ | 590 | /* returns the number of allocated descriptors */ |
591 | static int mv_xor_alloc_chan_resources(struct dma_chan *chan) | 591 | static int mv_xor_alloc_chan_resources(struct dma_chan *chan, |
592 | struct dma_client *client) | ||
592 | { | 593 | { |
593 | char *hw_desc; | 594 | char *hw_desc; |
594 | int idx; | 595 | int idx; |
@@ -938,7 +939,7 @@ static int __devinit mv_xor_memcpy_self_test(struct mv_xor_device *device) | |||
938 | dma_chan = container_of(device->common.channels.next, | 939 | dma_chan = container_of(device->common.channels.next, |
939 | struct dma_chan, | 940 | struct dma_chan, |
940 | device_node); | 941 | device_node); |
941 | if (mv_xor_alloc_chan_resources(dma_chan) < 1) { | 942 | if (mv_xor_alloc_chan_resources(dma_chan, NULL) < 1) { |
942 | err = -ENODEV; | 943 | err = -ENODEV; |
943 | goto out; | 944 | goto out; |
944 | } | 945 | } |
@@ -1033,7 +1034,7 @@ mv_xor_xor_self_test(struct mv_xor_device *device) | |||
1033 | dma_chan = container_of(device->common.channels.next, | 1034 | dma_chan = container_of(device->common.channels.next, |
1034 | struct dma_chan, | 1035 | struct dma_chan, |
1035 | device_node); | 1036 | device_node); |
1036 | if (mv_xor_alloc_chan_resources(dma_chan) < 1) { | 1037 | if (mv_xor_alloc_chan_resources(dma_chan, NULL) < 1) { |
1037 | err = -ENODEV; | 1038 | err = -ENODEV; |
1038 | goto out; | 1039 | goto out; |
1039 | } | 1040 | } |
diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index 6432b834322..ba89b0f5056 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h | |||
@@ -281,7 +281,8 @@ struct dma_device { | |||
281 | int dev_id; | 281 | int dev_id; |
282 | struct device *dev; | 282 | struct device *dev; |
283 | 283 | ||
284 | int (*device_alloc_chan_resources)(struct dma_chan *chan); | 284 | int (*device_alloc_chan_resources)(struct dma_chan *chan, |
285 | struct dma_client *client); | ||
285 | void (*device_free_chan_resources)(struct dma_chan *chan); | 286 | void (*device_free_chan_resources)(struct dma_chan *chan); |
286 | 287 | ||
287 | struct dma_async_tx_descriptor *(*device_prep_dma_memcpy)( | 288 | struct dma_async_tx_descriptor *(*device_prep_dma_memcpy)( |