diff options
Diffstat (limited to 'drivers/dma/txx9dmac.c')
| -rw-r--r-- | drivers/dma/txx9dmac.c | 109 | 
1 files changed, 31 insertions, 78 deletions
diff --git a/drivers/dma/txx9dmac.c b/drivers/dma/txx9dmac.c index cbd83e362b5..17686caf64d 100644 --- a/drivers/dma/txx9dmac.c +++ b/drivers/dma/txx9dmac.c @@ -15,6 +15,8 @@  #include <linux/platform_device.h>  #include <linux/slab.h>  #include <linux/scatterlist.h> + +#include "dmaengine.h"  #include "txx9dmac.h"  static struct txx9dmac_chan *to_txx9dmac_chan(struct dma_chan *chan) @@ -279,21 +281,6 @@ static void txx9dmac_desc_put(struct txx9dmac_chan *dc,  	}  } -/* Called with dc->lock held and bh disabled */ -static dma_cookie_t -txx9dmac_assign_cookie(struct txx9dmac_chan *dc, struct txx9dmac_desc *desc) -{ -	dma_cookie_t cookie = dc->chan.cookie; - -	if (++cookie < 0) -		cookie = 1; - -	dc->chan.cookie = cookie; -	desc->txd.cookie = cookie; - -	return cookie; -} -  /*----------------------------------------------------------------------*/  static void txx9dmac_dump_regs(struct txx9dmac_chan *dc) @@ -419,12 +406,11 @@ txx9dmac_descriptor_complete(struct txx9dmac_chan *dc,  	dma_async_tx_callback callback;  	void *param;  	struct dma_async_tx_descriptor *txd = &desc->txd; -	struct txx9dmac_slave *ds = dc->chan.private;  	dev_vdbg(chan2dev(&dc->chan), "descriptor %u %p complete\n",  		 txd->cookie, desc); -	dc->completed = txd->cookie; +	dma_cookie_complete(txd);  	callback = txd->callback;  	param = txd->callback_param; @@ -432,30 +418,7 @@ txx9dmac_descriptor_complete(struct txx9dmac_chan *dc,  	list_splice_init(&desc->tx_list, &dc->free_list);  	list_move(&desc->desc_node, &dc->free_list); -	if (!ds) { -		dma_addr_t dmaaddr; -		if (!(txd->flags & DMA_COMPL_SKIP_DEST_UNMAP)) { -			dmaaddr = is_dmac64(dc) ? -				desc->hwdesc.DAR : desc->hwdesc32.DAR; -			if (txd->flags & DMA_COMPL_DEST_UNMAP_SINGLE) -				dma_unmap_single(chan2parent(&dc->chan), -					dmaaddr, desc->len, DMA_FROM_DEVICE); -			else -				dma_unmap_page(chan2parent(&dc->chan), -					dmaaddr, desc->len, DMA_FROM_DEVICE); -		} -		if (!(txd->flags & DMA_COMPL_SKIP_SRC_UNMAP)) { -			dmaaddr = is_dmac64(dc) ? -				desc->hwdesc.SAR : desc->hwdesc32.SAR; -			if (txd->flags & DMA_COMPL_SRC_UNMAP_SINGLE) -				dma_unmap_single(chan2parent(&dc->chan), -					dmaaddr, desc->len, DMA_TO_DEVICE); -			else -				dma_unmap_page(chan2parent(&dc->chan), -					dmaaddr, desc->len, DMA_TO_DEVICE); -		} -	} - +	dma_descriptor_unmap(txd);  	/*  	 * The API requires that no submissions are done from a  	 * callback, so we don't need to drop the lock here @@ -738,7 +701,7 @@ static dma_cookie_t txx9dmac_tx_submit(struct dma_async_tx_descriptor *tx)  	dma_cookie_t cookie;  	spin_lock_bh(&dc->lock); -	cookie = txx9dmac_assign_cookie(dc, desc); +	cookie = dma_cookie_assign(tx);  	dev_vdbg(chan2dev(tx->chan), "tx_submit: queued %u %p\n",  		 desc->txd.cookie, desc); @@ -845,8 +808,8 @@ txx9dmac_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dest, dma_addr_t src,  static struct dma_async_tx_descriptor *  txx9dmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, -		unsigned int sg_len, enum dma_data_direction direction, -		unsigned long flags) +		unsigned int sg_len, enum dma_transfer_direction direction, +		unsigned long flags, void *context)  {  	struct txx9dmac_chan *dc = to_txx9dmac_chan(chan);  	struct txx9dmac_dev *ddev = dc->ddev; @@ -860,9 +823,9 @@ txx9dmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,  	BUG_ON(!ds || !ds->reg_width);  	if (ds->tx_reg) -		BUG_ON(direction != DMA_TO_DEVICE); +		BUG_ON(direction != DMA_MEM_TO_DEV);  	else -		BUG_ON(direction != DMA_FROM_DEVICE); +		BUG_ON(direction != DMA_DEV_TO_MEM);  	if (unlikely(!sg_len))  		return NULL; @@ -882,7 +845,7 @@ txx9dmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,  		mem = sg_dma_address(sg);  		if (__is_dmac64(ddev)) { -			if (direction == DMA_TO_DEVICE) { +			if (direction == DMA_MEM_TO_DEV) {  				desc->hwdesc.SAR = mem;  				desc->hwdesc.DAR = ds->tx_reg;  			} else { @@ -891,7 +854,7 @@ txx9dmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,  			}  			desc->hwdesc.CNTR = sg_dma_len(sg);  		} else { -			if (direction == DMA_TO_DEVICE) { +			if (direction == DMA_MEM_TO_DEV) {  				desc->hwdesc32.SAR = mem;  				desc->hwdesc32.DAR = ds->tx_reg;  			} else { @@ -900,7 +863,7 @@ txx9dmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,  			}  			desc->hwdesc32.CNTR = sg_dma_len(sg);  		} -		if (direction == DMA_TO_DEVICE) { +		if (direction == DMA_MEM_TO_DEV) {  			sai = ds->reg_width;  			dai = 0;  		} else { @@ -972,28 +935,17 @@ txx9dmac_tx_status(struct dma_chan *chan, dma_cookie_t cookie,  		   struct dma_tx_state *txstate)  {  	struct txx9dmac_chan *dc = to_txx9dmac_chan(chan); -	dma_cookie_t last_used; -	dma_cookie_t last_complete; -	int ret; - -	last_complete = dc->completed; -	last_used = chan->cookie; - -	ret = dma_async_is_complete(cookie, last_complete, last_used); -	if (ret != DMA_SUCCESS) { -		spin_lock_bh(&dc->lock); -		txx9dmac_scan_descriptors(dc); -		spin_unlock_bh(&dc->lock); - -		last_complete = dc->completed; -		last_used = chan->cookie; +	enum dma_status ret; -		ret = dma_async_is_complete(cookie, last_complete, last_used); -	} +	ret = dma_cookie_status(chan, cookie, txstate); +	if (ret == DMA_COMPLETE) +		return DMA_COMPLETE; -	dma_set_tx_state(txstate, last_complete, last_used, 0); +	spin_lock_bh(&dc->lock); +	txx9dmac_scan_descriptors(dc); +	spin_unlock_bh(&dc->lock); -	return ret; +	return dma_cookie_status(chan, cookie, txstate);  }  static void txx9dmac_chain_dynamic(struct txx9dmac_chan *dc, @@ -1057,7 +1009,7 @@ static int txx9dmac_alloc_chan_resources(struct dma_chan *chan)  		return -EIO;  	} -	dc->completed = chan->cookie = 1; +	dma_cookie_init(chan);  	dc->ccr = TXX9_DMA_CCR_IMMCHN | TXX9_DMA_CCR_INTENE | CCR_LE;  	txx9dmac_chan_set_SMPCHN(dc); @@ -1141,9 +1093,10 @@ static void txx9dmac_off(struct txx9dmac_dev *ddev)  static int __init txx9dmac_chan_probe(struct platform_device *pdev)  { -	struct txx9dmac_chan_platform_data *cpdata = pdev->dev.platform_data; +	struct txx9dmac_chan_platform_data *cpdata = +			dev_get_platdata(&pdev->dev);  	struct platform_device *dmac_dev = cpdata->dmac_dev; -	struct txx9dmac_platform_data *pdata = dmac_dev->dev.platform_data; +	struct txx9dmac_platform_data *pdata = dev_get_platdata(&dmac_dev->dev);  	struct txx9dmac_chan *dc;  	int err;  	int ch = pdev->id % TXX9_DMA_MAX_NR_CHANNELS; @@ -1186,7 +1139,7 @@ static int __init txx9dmac_chan_probe(struct platform_device *pdev)  	dc->ddev->chan[ch] = dc;  	dc->chan.device = &dc->dma;  	list_add_tail(&dc->chan.device_node, &dc->chan.device->channels); -	dc->chan.cookie = dc->completed = 1; +	dma_cookie_init(&dc->chan);  	if (is_dmac64(dc))  		dc->ch_regs = &__txx9dmac_regs(dc->ddev)->CHAN[ch]; @@ -1213,7 +1166,7 @@ static int __init txx9dmac_chan_probe(struct platform_device *pdev)  	return 0;  } -static int __exit txx9dmac_chan_remove(struct platform_device *pdev) +static int txx9dmac_chan_remove(struct platform_device *pdev)  {  	struct txx9dmac_chan *dc = platform_get_drvdata(pdev); @@ -1226,7 +1179,7 @@ static int __exit txx9dmac_chan_remove(struct platform_device *pdev)  static int __init txx9dmac_probe(struct platform_device *pdev)  { -	struct txx9dmac_platform_data *pdata = pdev->dev.platform_data; +	struct txx9dmac_platform_data *pdata = dev_get_platdata(&pdev->dev);  	struct resource *io;  	struct txx9dmac_dev *ddev;  	u32 mcr; @@ -1275,7 +1228,7 @@ static int __init txx9dmac_probe(struct platform_device *pdev)  	return 0;  } -static int __exit txx9dmac_remove(struct platform_device *pdev) +static int txx9dmac_remove(struct platform_device *pdev)  {  	struct txx9dmac_dev *ddev = platform_get_drvdata(pdev); @@ -1305,7 +1258,7 @@ static int txx9dmac_resume_noirq(struct device *dev)  {  	struct platform_device *pdev = to_platform_device(dev);  	struct txx9dmac_dev *ddev = platform_get_drvdata(pdev); -	struct txx9dmac_platform_data *pdata = pdev->dev.platform_data; +	struct txx9dmac_platform_data *pdata = dev_get_platdata(&pdev->dev);  	u32 mcr;  	mcr = TXX9_DMA_MCR_MSTEN | MCR_LE; @@ -1322,14 +1275,14 @@ static const struct dev_pm_ops txx9dmac_dev_pm_ops = {  };  static struct platform_driver txx9dmac_chan_driver = { -	.remove		= __exit_p(txx9dmac_chan_remove), +	.remove		= txx9dmac_chan_remove,  	.driver = {  		.name	= "txx9dmac-chan",  	},  };  static struct platform_driver txx9dmac_driver = { -	.remove		= __exit_p(txx9dmac_remove), +	.remove		= txx9dmac_remove,  	.shutdown	= txx9dmac_shutdown,  	.driver = {  		.name	= "txx9dmac",  | 
