]> Pileus Git - ~andy/linux/blobdiff - drivers/spi/spi-rspi.c
Merge remote-tracking branch 'spi/topic/tle62x0' into spi-next
[~andy/linux] / drivers / spi / spi-rspi.c
index 5f122d9d2063d39bdc4da2a0415e0caa8f5f48f2..8719206a03a00e59a7dea523afe7f6c841745d50 100644 (file)
@@ -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;
@@ -664,8 +666,8 @@ static irqreturn_t rspi_irq(int irq, void *_sr)
 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);
-       struct rspi_plat_data *rspi_pd = pdev->dev.platform_data;
        dma_cap_mask_t mask;
        struct dma_slave_config cfg;
        int ret;
@@ -724,7 +726,7 @@ static void rspi_release_dma(struct rspi_data *rspi)
 
 static int rspi_remove(struct platform_device *pdev)
 {
-       struct rspi_data *rspi = platform_get_drvdata(pdev);
+       struct rspi_data *rspi = spi_master_get(platform_get_drvdata(pdev));
 
        spi_unregister_master(rspi->master);
        rspi_release_dma(rspi);