]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/spi/spi_bitbang.c
i2c/scx200_acb: Don't use 0 as NULL pointer
[linux-2.6-omap-h63xx.git] / drivers / spi / spi_bitbang.c
index 0c85c984ccb4fd53e5b243fbe1cd5d38d877d563..71e881419cddaa6ba9c77f588ae6723ff633249a 100644 (file)
@@ -184,6 +184,7 @@ int spi_bitbang_setup(struct spi_device *spi)
        struct spi_bitbang_cs   *cs = spi->controller_state;
        struct spi_bitbang      *bitbang;
        int                     retval;
+       unsigned long           flags;
 
        bitbang = spi_master_get_devdata(spi->master);
 
@@ -222,12 +223,12 @@ int spi_bitbang_setup(struct spi_device *spi)
         */
 
        /* deselect chip (low or high) */
-       spin_lock(&bitbang->lock);
+       spin_lock_irqsave(&bitbang->lock, flags);
        if (!bitbang->busy) {
                bitbang->chipselect(spi, BITBANG_CS_INACTIVE);
                ndelay(cs->nsecs);
        }
-       spin_unlock(&bitbang->lock);
+       spin_unlock_irqrestore(&bitbang->lock, flags);
 
        return 0;
 }
@@ -343,12 +344,14 @@ static void bitbang_work(struct work_struct *work)
                                        t->rx_dma = t->tx_dma = 0;
                                status = bitbang->txrx_bufs(spi, t);
                        }
+                       if (status > 0)
+                               m->actual_length += status;
                        if (status != t->len) {
-                               if (status > 0)
-                                       status = -EMSGSIZE;
+                               /* always report some kind of error */
+                               if (status >= 0)
+                                       status = -EREMOTEIO;
                                break;
                        }
-                       m->actual_length += status;
                        status = 0;
 
                        /* protocol tweaks before next transfer */
@@ -472,7 +475,7 @@ int spi_bitbang_start(struct spi_bitbang *bitbang)
        /* this task is the only thing to touch the SPI bits */
        bitbang->busy = 0;
        bitbang->workqueue = create_singlethread_workqueue(
-                       bitbang->master->cdev.dev->bus_id);
+                       bitbang->master->dev.parent->bus_id);
        if (bitbang->workqueue == NULL) {
                status = -EBUSY;
                goto err1;