diff options
Diffstat (limited to 'drivers/spi/spi_imx.c')
| -rw-r--r-- | drivers/spi/spi_imx.c | 70 | 
1 files changed, 35 insertions, 35 deletions
diff --git a/drivers/spi/spi_imx.c b/drivers/spi/spi_imx.c index 61ba147e384..269a55ec52e 100644 --- a/drivers/spi/spi_imx.c +++ b/drivers/spi/spi_imx.c @@ -506,20 +506,6 @@ static int map_dma_buffers(struct driver_data *drv_data)  	if (!IS_DMA_ALIGNED(drv_data->rx) || !IS_DMA_ALIGNED(drv_data->tx))  		return -1; -	/* NULL rx means write-only transfer and no map needed -	   since rx DMA will not be used */ -	if (drv_data->rx) { -		buf = drv_data->rx; -		drv_data->rx_dma = dma_map_single( -					dev, -					buf, -					drv_data->len, -					DMA_FROM_DEVICE); -		if (dma_mapping_error(dev, drv_data->rx_dma)) -			return -1; -		drv_data->rx_dma_needs_unmap = 1; -	} -  	if (drv_data->tx == NULL) {  		/* Read only message --> use drv_data->dummy_dma_buf for dummy  		   writes to achive reads */ @@ -533,18 +519,31 @@ static int map_dma_buffers(struct driver_data *drv_data)  					buf,  					drv_data->tx_map_len,  					DMA_TO_DEVICE); -	if (dma_mapping_error(dev, drv_data->tx_dma)) { -		if (drv_data->rx_dma) { -			dma_unmap_single(dev, -					drv_data->rx_dma, -					drv_data->len, -					DMA_FROM_DEVICE); -			drv_data->rx_dma_needs_unmap = 0; -		} +	if (dma_mapping_error(dev, drv_data->tx_dma))  		return -1; -	}  	drv_data->tx_dma_needs_unmap = 1; +	/* NULL rx means write-only transfer and no map needed +	 * since rx DMA will not be used */ +	if (drv_data->rx) { +		buf = drv_data->rx; +		drv_data->rx_dma = dma_map_single(dev, +						buf, +						drv_data->len, +						DMA_FROM_DEVICE); +		if (dma_mapping_error(dev, drv_data->rx_dma)) { +			if (drv_data->tx_dma) { +				dma_unmap_single(dev, +						drv_data->tx_dma, +						drv_data->tx_map_len, +						DMA_TO_DEVICE); +				drv_data->tx_dma_needs_unmap = 0; +			} +			return -1; +		} +		drv_data->rx_dma_needs_unmap = 1; +	} +  	return 0;  } @@ -1457,7 +1456,7 @@ static int __init spi_imx_probe(struct platform_device *pdev)  	struct device *dev = &pdev->dev;  	struct spi_imx_master *platform_info;  	struct spi_master *master; -	struct driver_data *drv_data = NULL; +	struct driver_data *drv_data;  	struct resource *res;  	int irq, status = 0; @@ -1468,14 +1467,6 @@ static int __init spi_imx_probe(struct platform_device *pdev)  		goto err_no_pdata;  	} -	drv_data->clk = clk_get(&pdev->dev, "perclk2"); -	if (IS_ERR(drv_data->clk)) { -		dev_err(&pdev->dev, "probe - cannot get get\n"); -		status = PTR_ERR(drv_data->clk); -		goto err_no_clk; -	} -	clk_enable(drv_data->clk); -  	/* Allocate master with space for drv_data */  	master = spi_alloc_master(dev, sizeof(struct driver_data));  	if (!master) { @@ -1496,6 +1487,14 @@ static int __init spi_imx_probe(struct platform_device *pdev)  	drv_data->dummy_dma_buf = SPI_DUMMY_u32; +	drv_data->clk = clk_get(&pdev->dev, "perclk2"); +	if (IS_ERR(drv_data->clk)) { +		dev_err(&pdev->dev, "probe - cannot get clock\n"); +		status = PTR_ERR(drv_data->clk); +		goto err_no_clk; +	} +	clk_enable(drv_data->clk); +  	/* Find and map resources */  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);  	if (!res) { @@ -1631,12 +1630,13 @@ err_no_iomap:  	kfree(drv_data->ioarea);  err_no_iores: -	spi_master_put(master); - -err_no_pdata:  	clk_disable(drv_data->clk);  	clk_put(drv_data->clk); +  err_no_clk: +	spi_master_put(master); + +err_no_pdata:  err_no_mem:  	return status;  }  |