Commit 848c536a authored by Haavard Skinnemoen's avatar Haavard Skinnemoen Committed by Dan Williams

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: default avatarMaciej Sosnowski <maciej.sosnowski@intel.com>
Signed-off-by: default avatarHaavard Skinnemoen <haavard.skinnemoen@atmel.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 4a776f0a
...@@ -174,7 +174,8 @@ static void dma_client_chan_alloc(struct dma_client *client) ...@@ -174,7 +174,8 @@ static void dma_client_chan_alloc(struct dma_client *client)
if (!dma_chan_satisfies_mask(chan, client->cap_mask)) if (!dma_chan_satisfies_mask(chan, client->cap_mask))
continue; continue;
desc = chan->device->device_alloc_chan_resources(chan); desc = chan->device->device_alloc_chan_resources(
chan, client);
if (desc >= 0) { if (desc >= 0) {
ack = client->event_callback(client, ack = client->event_callback(client,
chan, chan,
......
...@@ -366,7 +366,8 @@ static struct fsl_desc_sw *fsl_dma_alloc_descriptor( ...@@ -366,7 +366,8 @@ static struct fsl_desc_sw *fsl_dma_alloc_descriptor(
* *
* Return - The number of descriptors allocated. * Return - The number of descriptors allocated.
*/ */
static int fsl_dma_alloc_chan_resources(struct dma_chan *chan) static int fsl_dma_alloc_chan_resources(struct dma_chan *chan,
struct dma_client *client)
{ {
struct fsl_dma_chan *fsl_chan = to_fsl_chan(chan); struct fsl_dma_chan *fsl_chan = to_fsl_chan(chan);
LIST_HEAD(tmp_list); LIST_HEAD(tmp_list);
...@@ -819,7 +820,7 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan) ...@@ -819,7 +820,7 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan)
chan = &fsl_chan->common; chan = &fsl_chan->common;
if (fsl_dma_alloc_chan_resources(chan) < 1) { if (fsl_dma_alloc_chan_resources(chan, NULL) < 1) {
dev_err(fsl_chan->dev, dev_err(fsl_chan->dev,
"selftest: Cannot alloc resources for DMA\n"); "selftest: Cannot alloc resources for DMA\n");
err = -ENODEV; err = -ENODEV;
...@@ -847,7 +848,7 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan) ...@@ -847,7 +848,7 @@ static int fsl_dma_self_test(struct fsl_dma_chan *fsl_chan)
/* Test free and re-alloc channel resources */ /* Test free and re-alloc channel resources */
fsl_dma_free_chan_resources(chan); fsl_dma_free_chan_resources(chan);
if (fsl_dma_alloc_chan_resources(chan) < 1) { if (fsl_dma_alloc_chan_resources(chan, NULL) < 1) {
dev_err(fsl_chan->dev, dev_err(fsl_chan->dev,
"selftest: Cannot alloc resources for DMA\n"); "selftest: Cannot alloc resources for DMA\n");
err = -ENODEV; err = -ENODEV;
......
...@@ -452,7 +452,8 @@ static void ioat2_dma_massage_chan_desc(struct ioat_dma_chan *ioat_chan) ...@@ -452,7 +452,8 @@ static void ioat2_dma_massage_chan_desc(struct ioat_dma_chan *ioat_chan)
* ioat_dma_alloc_chan_resources - returns the number of allocated descriptors * ioat_dma_alloc_chan_resources - returns the number of allocated descriptors
* @chan: the channel to be filled out * @chan: the channel to be filled out
*/ */
static int ioat_dma_alloc_chan_resources(struct dma_chan *chan) static int ioat_dma_alloc_chan_resources(struct dma_chan *chan,
struct dma_client *client)
{ {
struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan); struct ioat_dma_chan *ioat_chan = to_ioat_chan(chan);
struct ioat_desc_sw *desc; struct ioat_desc_sw *desc;
...@@ -1049,7 +1050,7 @@ static int ioat_dma_self_test(struct ioatdma_device *device) ...@@ -1049,7 +1050,7 @@ static int ioat_dma_self_test(struct ioatdma_device *device)
dma_chan = container_of(device->common.channels.next, dma_chan = container_of(device->common.channels.next,
struct dma_chan, struct dma_chan,
device_node); device_node);
if (device->common.device_alloc_chan_resources(dma_chan) < 1) { if (device->common.device_alloc_chan_resources(dma_chan, NULL) < 1) {
dev_err(&device->pdev->dev, dev_err(&device->pdev->dev,
"selftest cannot allocate chan resource\n"); "selftest cannot allocate chan resource\n");
err = -ENODEV; err = -ENODEV;
......
...@@ -444,7 +444,8 @@ static void iop_chan_start_null_memcpy(struct iop_adma_chan *iop_chan); ...@@ -444,7 +444,8 @@ static void iop_chan_start_null_memcpy(struct iop_adma_chan *iop_chan);
static void iop_chan_start_null_xor(struct iop_adma_chan *iop_chan); static void iop_chan_start_null_xor(struct iop_adma_chan *iop_chan);
/* returns the number of allocated descriptors */ /* returns the number of allocated descriptors */
static int iop_adma_alloc_chan_resources(struct dma_chan *chan) static int iop_adma_alloc_chan_resources(struct dma_chan *chan,
struct dma_client *client)
{ {
char *hw_desc; char *hw_desc;
int idx; int idx;
...@@ -838,7 +839,7 @@ static int __devinit iop_adma_memcpy_self_test(struct iop_adma_device *device) ...@@ -838,7 +839,7 @@ static int __devinit iop_adma_memcpy_self_test(struct iop_adma_device *device)
dma_chan = container_of(device->common.channels.next, dma_chan = container_of(device->common.channels.next,
struct dma_chan, struct dma_chan,
device_node); device_node);
if (iop_adma_alloc_chan_resources(dma_chan) < 1) { if (iop_adma_alloc_chan_resources(dma_chan, NULL) < 1) {
err = -ENODEV; err = -ENODEV;
goto out; goto out;
} }
...@@ -936,7 +937,7 @@ iop_adma_xor_zero_sum_self_test(struct iop_adma_device *device) ...@@ -936,7 +937,7 @@ iop_adma_xor_zero_sum_self_test(struct iop_adma_device *device)
dma_chan = container_of(device->common.channels.next, dma_chan = container_of(device->common.channels.next,
struct dma_chan, struct dma_chan,
device_node); device_node);
if (iop_adma_alloc_chan_resources(dma_chan) < 1) { if (iop_adma_alloc_chan_resources(dma_chan, NULL) < 1) {
err = -ENODEV; err = -ENODEV;
goto out; goto out;
} }
......
...@@ -588,7 +588,8 @@ mv_xor_tx_submit(struct dma_async_tx_descriptor *tx) ...@@ -588,7 +588,8 @@ mv_xor_tx_submit(struct dma_async_tx_descriptor *tx)
} }
/* returns the number of allocated descriptors */ /* returns the number of allocated descriptors */
static int mv_xor_alloc_chan_resources(struct dma_chan *chan) static int mv_xor_alloc_chan_resources(struct dma_chan *chan,
struct dma_client *client)
{ {
char *hw_desc; char *hw_desc;
int idx; int idx;
...@@ -938,7 +939,7 @@ static int __devinit mv_xor_memcpy_self_test(struct mv_xor_device *device) ...@@ -938,7 +939,7 @@ static int __devinit mv_xor_memcpy_self_test(struct mv_xor_device *device)
dma_chan = container_of(device->common.channels.next, dma_chan = container_of(device->common.channels.next,
struct dma_chan, struct dma_chan,
device_node); device_node);
if (mv_xor_alloc_chan_resources(dma_chan) < 1) { if (mv_xor_alloc_chan_resources(dma_chan, NULL) < 1) {
err = -ENODEV; err = -ENODEV;
goto out; goto out;
} }
...@@ -1033,7 +1034,7 @@ mv_xor_xor_self_test(struct mv_xor_device *device) ...@@ -1033,7 +1034,7 @@ mv_xor_xor_self_test(struct mv_xor_device *device)
dma_chan = container_of(device->common.channels.next, dma_chan = container_of(device->common.channels.next,
struct dma_chan, struct dma_chan,
device_node); device_node);
if (mv_xor_alloc_chan_resources(dma_chan) < 1) { if (mv_xor_alloc_chan_resources(dma_chan, NULL) < 1) {
err = -ENODEV; err = -ENODEV;
goto out; goto out;
} }
......
...@@ -281,7 +281,8 @@ struct dma_device { ...@@ -281,7 +281,8 @@ struct dma_device {
int dev_id; int dev_id;
struct device *dev; struct device *dev;
int (*device_alloc_chan_resources)(struct dma_chan *chan); int (*device_alloc_chan_resources)(struct dma_chan *chan,
struct dma_client *client);
void (*device_free_chan_resources)(struct dma_chan *chan); void (*device_free_chan_resources)(struct dma_chan *chan);
struct dma_async_tx_descriptor *(*device_prep_dma_memcpy)( struct dma_async_tx_descriptor *(*device_prep_dma_memcpy)(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment