diff options
Diffstat (limited to 'drivers/spi')
| -rw-r--r-- | drivers/spi/spi-mxs.c | 3 | ||||
| -rw-r--r-- | drivers/spi/spi-pl022.c | 3 | ||||
| -rw-r--r-- | drivers/spi/spi-rspi.c | 56 | 
3 files changed, 36 insertions, 26 deletions
diff --git a/drivers/spi/spi-mxs.c b/drivers/spi/spi-mxs.c index edf1360ab09..86dd04d6bc8 100644 --- a/drivers/spi/spi-mxs.c +++ b/drivers/spi/spi-mxs.c @@ -323,6 +323,7 @@ static int mxs_spi_txrx_dma(struct mxs_spi *spi, int cs,  	if (!ret) {  		dev_err(ssp->dev, "DMA transfer timeout\n");  		ret = -ETIMEDOUT; +		dmaengine_terminate_all(ssp->dmach);  		goto err_vmalloc;  	} @@ -480,7 +481,7 @@ static int mxs_spi_transfer_one(struct spi_master *master,  		first = last = 0;  	} -	m->status = 0; +	m->status = status;  	spi_finalize_current_message(master);  	return status; diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c index 919464102d3..a1db91a99b8 100644 --- a/drivers/spi/spi-pl022.c +++ b/drivers/spi/spi-pl022.c @@ -2186,8 +2186,6 @@ pl022_probe(struct amba_device *adev, const struct amba_id *id)  	printk(KERN_INFO "pl022: mapped registers from 0x%08x to %p\n",  	       adev->res.start, pl022->virtbase); -	pm_runtime_resume(dev); -  	pl022->clk = devm_clk_get(&adev->dev, NULL);  	if (IS_ERR(pl022->clk)) {  		status = PTR_ERR(pl022->clk); @@ -2292,7 +2290,6 @@ pl022_remove(struct amba_device *adev)  	clk_disable(pl022->clk);  	clk_unprepare(pl022->clk); -	pm_runtime_disable(&adev->dev);  	amba_release_regions(adev);  	tasklet_disable(&pl022->pump_transfers);  	spi_unregister_master(pl022->master); diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c index 4894bde4bbf..30faf6d4ab9 100644 --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c @@ -147,8 +147,6 @@ struct rspi_data {  	unsigned char spsr;  	/* for dmaengine */ -	struct sh_dmae_slave dma_tx; -	struct sh_dmae_slave dma_rx;  	struct dma_chan *chan_tx;  	struct dma_chan *chan_rx;  	int irq; @@ -663,20 +661,16 @@ static irqreturn_t rspi_irq(int irq, void *_sr)  	return ret;  } -static bool rspi_filter(struct dma_chan *chan, void *filter_param) -{ -	chan->private = filter_param; -	return true; -} - -static void __devinit rspi_request_dma(struct rspi_data *rspi, -				       struct platform_device *pdev) +static int __devinit rspi_request_dma(struct rspi_data *rspi, +				      struct platform_device *pdev)  {  	struct rspi_plat_data *rspi_pd = pdev->dev.platform_data;  	dma_cap_mask_t mask; +	struct dma_slave_config cfg; +	int ret;  	if (!rspi_pd) -		return; +		return 0;	/* The driver assumes no error. */  	rspi->dma_width_16bit = rspi_pd->dma_width_16bit; @@ -684,21 +678,35 @@ static void __devinit rspi_request_dma(struct rspi_data *rspi,  	if (rspi_pd->dma_rx_id && rspi_pd->dma_tx_id) {  		dma_cap_zero(mask);  		dma_cap_set(DMA_SLAVE, mask); -		rspi->dma_rx.slave_id = rspi_pd->dma_rx_id; -		rspi->chan_rx = dma_request_channel(mask, rspi_filter, -						    &rspi->dma_rx); -		if (rspi->chan_rx) -			dev_info(&pdev->dev, "Use DMA when rx.\n"); +		rspi->chan_rx = dma_request_channel(mask, shdma_chan_filter, +						    (void *)rspi_pd->dma_rx_id); +		if (rspi->chan_rx) { +			cfg.slave_id = rspi_pd->dma_rx_id; +			cfg.direction = DMA_DEV_TO_MEM; +			ret = dmaengine_slave_config(rspi->chan_rx, &cfg); +			if (!ret) +				dev_info(&pdev->dev, "Use DMA when rx.\n"); +			else +				return ret; +		}  	}  	if (rspi_pd->dma_tx_id) {  		dma_cap_zero(mask);  		dma_cap_set(DMA_SLAVE, mask); -		rspi->dma_tx.slave_id = rspi_pd->dma_tx_id; -		rspi->chan_tx = dma_request_channel(mask, rspi_filter, -						    &rspi->dma_tx); -		if (rspi->chan_tx) -			dev_info(&pdev->dev, "Use DMA when tx\n"); +		rspi->chan_tx = dma_request_channel(mask, shdma_chan_filter, +						    (void *)rspi_pd->dma_tx_id); +		if (rspi->chan_tx) { +			cfg.slave_id = rspi_pd->dma_tx_id; +			cfg.direction = DMA_MEM_TO_DEV; +			ret = dmaengine_slave_config(rspi->chan_tx, &cfg); +			if (!ret) +				dev_info(&pdev->dev, "Use DMA when tx\n"); +			else +				return ret; +		}  	} + +	return 0;  }  static void __devexit rspi_release_dma(struct rspi_data *rspi) @@ -788,7 +796,11 @@ static int __devinit rspi_probe(struct platform_device *pdev)  	}  	rspi->irq = irq; -	rspi_request_dma(rspi, pdev); +	ret = rspi_request_dma(rspi, pdev); +	if (ret < 0) { +		dev_err(&pdev->dev, "rspi_request_dma failed.\n"); +		goto error4; +	}  	ret = spi_register_master(master);  	if (ret < 0) {  |