diff options
author | Mark Brown <broonie@linaro.org> | 2013-08-29 13:59:05 +0100 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-08-29 13:59:05 +0100 |
commit | b5f9a9d5113efe11a3b9dad600a6f833274da595 (patch) | |
tree | 6db5fb34a2d590086e25f7f682fecb5f43e6b283 /drivers/spi/spi-rspi.c | |
parent | a1216394e620d0dfbb03c712ae3210e7b77c9e11 (diff) | |
parent | 8d4d08ce8319ae26227c4dd558405963c14c2037 (diff) | |
download | linux-stable-b5f9a9d5113efe11a3b9dad600a6f833274da595.tar.gz linux-stable-b5f9a9d5113efe11a3b9dad600a6f833274da595.tar.bz2 linux-stable-b5f9a9d5113efe11a3b9dad600a6f833274da595.zip |
Merge remote-tracking branch 'spi/topic/rspi' into spi-pdata
Conflicts:
drivers/spi/spi-rspi.c
Diffstat (limited to 'drivers/spi/spi-rspi.c')
-rw-r--r-- | drivers/spi/spi-rspi.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c index aa5fc52abd04..57de139f76dc 100644 --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c @@ -564,8 +564,12 @@ static void rspi_work(struct work_struct *work) unsigned long flags; int ret; - spin_lock_irqsave(&rspi->lock, flags); - while (!list_empty(&rspi->queue)) { + while (1) { + spin_lock_irqsave(&rspi->lock, flags); + if (list_empty(&rspi->queue)) { + spin_unlock_irqrestore(&rspi->lock, flags); + break; + } mesg = list_entry(rspi->queue.next, struct spi_message, queue); list_del_init(&mesg->queue); spin_unlock_irqrestore(&rspi->lock, flags); @@ -595,8 +599,6 @@ static void rspi_work(struct work_struct *work) mesg->status = 0; mesg->complete(mesg->context); - - spin_lock_irqsave(&rspi->lock, flags); } return; @@ -665,11 +667,12 @@ static int rspi_request_dma(struct rspi_data *rspi, struct platform_device *pdev) { struct rspi_plat_data *rspi_pd = dev_get_platdata(&pdev->dev); + struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); dma_cap_mask_t mask; struct dma_slave_config cfg; int ret; - if (!rspi_pd) + if (!res || !rspi_pd) return 0; /* The driver assumes no error. */ rspi->dma_width_16bit = rspi_pd->dma_width_16bit; @@ -683,6 +686,8 @@ static int rspi_request_dma(struct rspi_data *rspi, if (rspi->chan_rx) { cfg.slave_id = rspi_pd->dma_rx_id; cfg.direction = DMA_DEV_TO_MEM; + cfg.dst_addr = 0; + cfg.src_addr = res->start + RSPI_SPDR; ret = dmaengine_slave_config(rspi->chan_rx, &cfg); if (!ret) dev_info(&pdev->dev, "Use DMA when rx.\n"); @@ -698,6 +703,8 @@ static int rspi_request_dma(struct rspi_data *rspi, if (rspi->chan_tx) { cfg.slave_id = rspi_pd->dma_tx_id; cfg.direction = DMA_MEM_TO_DEV; + cfg.dst_addr = res->start + RSPI_SPDR; + cfg.src_addr = 0; ret = dmaengine_slave_config(rspi->chan_tx, &cfg); if (!ret) dev_info(&pdev->dev, "Use DMA when tx\n"); |