diff options
author | Dan Williams <dan.j.williams@intel.com> | 2009-02-18 17:48:26 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-02-18 18:37:55 -0500 |
commit | 287d859222e0adbc67666a6154aaf42d7d5bbb54 (patch) | |
tree | a3e00f7b42f91c0d00f9d5a8d79414939b3c566f | |
parent | 9ccf3b5e8409927835c4d38cb2f380c9e4349e76 (diff) |
atmel-mci: fix initialization of dma slave data
The conversion of atmel-mci to dma_request_channel missed the
initialization of the channel dma_slave information. The filter_fn passed
to dma_request_channel is responsible for initializing the channel's
private data. This implementation has the additional benefit of enabling
a generic client-channel data passing mechanism.
Reviewed-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Acked-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | drivers/dma/dmaengine.c | 2 | ||||
-rw-r--r-- | drivers/dma/dw_dmac.c | 5 | ||||
-rw-r--r-- | drivers/dma/dw_dmac_regs.h | 2 | ||||
-rw-r--r-- | drivers/mmc/host/atmel-mci.c | 5 | ||||
-rw-r--r-- | include/linux/dmaengine.h | 2 |
5 files changed, 9 insertions, 7 deletions
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index a58993011edb..280a9d263eb3 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c | |||
@@ -518,6 +518,7 @@ struct dma_chan *__dma_request_channel(dma_cap_mask_t *mask, dma_filter_fn fn, v | |||
518 | dma_chan_name(chan), err); | 518 | dma_chan_name(chan), err); |
519 | else | 519 | else |
520 | break; | 520 | break; |
521 | chan->private = NULL; | ||
521 | chan = NULL; | 522 | chan = NULL; |
522 | } | 523 | } |
523 | } | 524 | } |
@@ -536,6 +537,7 @@ void dma_release_channel(struct dma_chan *chan) | |||
536 | WARN_ONCE(chan->client_count != 1, | 537 | WARN_ONCE(chan->client_count != 1, |
537 | "chan reference count %d != 1\n", chan->client_count); | 538 | "chan reference count %d != 1\n", chan->client_count); |
538 | dma_chan_put(chan); | 539 | dma_chan_put(chan); |
540 | chan->private = NULL; | ||
539 | mutex_unlock(&dma_list_mutex); | 541 | mutex_unlock(&dma_list_mutex); |
540 | } | 542 | } |
541 | EXPORT_SYMBOL_GPL(dma_release_channel); | 543 | EXPORT_SYMBOL_GPL(dma_release_channel); |
diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c index 6b702cc46b3d..a97c07eef7ec 100644 --- a/drivers/dma/dw_dmac.c +++ b/drivers/dma/dw_dmac.c | |||
@@ -560,7 +560,7 @@ dwc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, | |||
560 | unsigned long flags) | 560 | unsigned long flags) |
561 | { | 561 | { |
562 | struct dw_dma_chan *dwc = to_dw_dma_chan(chan); | 562 | struct dw_dma_chan *dwc = to_dw_dma_chan(chan); |
563 | struct dw_dma_slave *dws = dwc->dws; | 563 | struct dw_dma_slave *dws = chan->private; |
564 | struct dw_desc *prev; | 564 | struct dw_desc *prev; |
565 | struct dw_desc *first; | 565 | struct dw_desc *first; |
566 | u32 ctllo; | 566 | u32 ctllo; |
@@ -790,7 +790,7 @@ static int dwc_alloc_chan_resources(struct dma_chan *chan) | |||
790 | cfghi = DWC_CFGH_FIFO_MODE; | 790 | cfghi = DWC_CFGH_FIFO_MODE; |
791 | cfglo = 0; | 791 | cfglo = 0; |
792 | 792 | ||
793 | dws = dwc->dws; | 793 | dws = chan->private; |
794 | if (dws) { | 794 | if (dws) { |
795 | /* | 795 | /* |
796 | * We need controller-specific data to set up slave | 796 | * We need controller-specific data to set up slave |
@@ -866,7 +866,6 @@ static void dwc_free_chan_resources(struct dma_chan *chan) | |||
866 | spin_lock_bh(&dwc->lock); | 866 | spin_lock_bh(&dwc->lock); |
867 | list_splice_init(&dwc->free_list, &list); | 867 | list_splice_init(&dwc->free_list, &list); |
868 | dwc->descs_allocated = 0; | 868 | dwc->descs_allocated = 0; |
869 | dwc->dws = NULL; | ||
870 | 869 | ||
871 | /* Disable interrupts */ | 870 | /* Disable interrupts */ |
872 | channel_clear_bit(dw, MASK.XFER, dwc->mask); | 871 | channel_clear_bit(dw, MASK.XFER, dwc->mask); |
diff --git a/drivers/dma/dw_dmac_regs.h b/drivers/dma/dw_dmac_regs.h index 00fdd187bb0c..b252b202c5cf 100644 --- a/drivers/dma/dw_dmac_regs.h +++ b/drivers/dma/dw_dmac_regs.h | |||
@@ -139,8 +139,6 @@ struct dw_dma_chan { | |||
139 | struct list_head queue; | 139 | struct list_head queue; |
140 | struct list_head free_list; | 140 | struct list_head free_list; |
141 | 141 | ||
142 | struct dw_dma_slave *dws; | ||
143 | |||
144 | unsigned int descs_allocated; | 142 | unsigned int descs_allocated; |
145 | }; | 143 | }; |
146 | 144 | ||
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index 76bfe16c09b1..2b1196e6142c 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c | |||
@@ -1548,9 +1548,10 @@ static bool filter(struct dma_chan *chan, void *slave) | |||
1548 | { | 1548 | { |
1549 | struct dw_dma_slave *dws = slave; | 1549 | struct dw_dma_slave *dws = slave; |
1550 | 1550 | ||
1551 | if (dws->dma_dev == chan->device->dev) | 1551 | if (dws->dma_dev == chan->device->dev) { |
1552 | chan->private = dws; | ||
1552 | return true; | 1553 | return true; |
1553 | else | 1554 | } else |
1554 | return false; | 1555 | return false; |
1555 | } | 1556 | } |
1556 | #endif | 1557 | #endif |
diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h index 3e68469c1885..f0413845f20e 100644 --- a/include/linux/dmaengine.h +++ b/include/linux/dmaengine.h | |||
@@ -121,6 +121,7 @@ struct dma_chan_percpu { | |||
121 | * @local: per-cpu pointer to a struct dma_chan_percpu | 121 | * @local: per-cpu pointer to a struct dma_chan_percpu |
122 | * @client-count: how many clients are using this channel | 122 | * @client-count: how many clients are using this channel |
123 | * @table_count: number of appearances in the mem-to-mem allocation table | 123 | * @table_count: number of appearances in the mem-to-mem allocation table |
124 | * @private: private data for certain client-channel associations | ||
124 | */ | 125 | */ |
125 | struct dma_chan { | 126 | struct dma_chan { |
126 | struct dma_device *device; | 127 | struct dma_device *device; |
@@ -134,6 +135,7 @@ struct dma_chan { | |||
134 | struct dma_chan_percpu *local; | 135 | struct dma_chan_percpu *local; |
135 | int client_count; | 136 | int client_count; |
136 | int table_count; | 137 | int table_count; |
138 | void *private; | ||
137 | }; | 139 | }; |
138 | 140 | ||
139 | /** | 141 | /** |