Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=a836f5856ae46ccb2464ea76031ea05ae967b832
Commit:     a836f5856ae46ccb2464ea76031ea05ae967b832
Parent:     65b8291c4000e5f38fc94fb2ca0cb7e8683c8a1b
Author:     Chris Lesiak <[EMAIL PROTECTED]>
AuthorDate: Fri Mar 16 13:38:13 2007 -0800
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Fri Mar 16 19:25:04 2007 -0700

    [PATCH] spi: destroy workqueue after spi_unregister_master
    
    Fix a bug in the cleanup of an spi_bitbang bus.
    
    The workqueue associated with the bus was destroyed before the call to
    spi_unregister_master.  That meant that spi devices on that bus would be
    unable to do IO in their remove method.  The shutdown flag should have been
    able to prevent a segfault, but was never getting set.  By waiting to
    destroy the workqueue until after the master is unregistered, devices are
    able to do IO in their remove methods.  An added benefit is that neither
    the shutdown flag nor a wait for the queue of messages to empty is needed.
    
    Signed-off-by: Chris Lesiak <[EMAIL PROTECTED]>
    Signed-off-by: David Brownell <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 drivers/spi/spi_bitbang.c       |   26 ++------------------------
 include/linux/spi/spi_bitbang.h |    1 -
 2 files changed, 2 insertions(+), 25 deletions(-)

diff --git a/drivers/spi/spi_bitbang.c b/drivers/spi/spi_bitbang.c
index 24a330d..88425e1 100644
--- a/drivers/spi/spi_bitbang.c
+++ b/drivers/spi/spi_bitbang.c
@@ -302,10 +302,6 @@ static void bitbang_work(struct work_struct *work)
                setup_transfer = NULL;
 
                list_for_each_entry (t, &m->transfers, transfer_list) {
-                       if (bitbang->shutdown) {
-                               status = -ESHUTDOWN;
-                               break;
-                       }
 
                        /* override or restore speed and wordsize */
                        if (t->speed_hz || t->bits_per_word) {
@@ -410,8 +406,6 @@ int spi_bitbang_transfer(struct spi_device *spi, struct 
spi_message *m)
        m->status = -EINPROGRESS;
 
        bitbang = spi_master_get_devdata(spi->master);
-       if (bitbang->shutdown)
-               return -ESHUTDOWN;
 
        spin_lock_irqsave(&bitbang->lock, flags);
        if (!spi->max_speed_hz)
@@ -507,28 +501,12 @@ EXPORT_SYMBOL_GPL(spi_bitbang_start);
  */
 int spi_bitbang_stop(struct spi_bitbang *bitbang)
 {
-       unsigned        limit = 500;
-
-       spin_lock_irq(&bitbang->lock);
-       bitbang->shutdown = 0;
-       while (!list_empty(&bitbang->queue) && limit--) {
-               spin_unlock_irq(&bitbang->lock);
+       spi_unregister_master(bitbang->master);
 
-               dev_dbg(bitbang->master->cdev.dev, "wait for queue\n");
-               msleep(10);
-
-               spin_lock_irq(&bitbang->lock);
-       }
-       spin_unlock_irq(&bitbang->lock);
-       if (!list_empty(&bitbang->queue)) {
-               dev_err(bitbang->master->cdev.dev, "queue didn't empty\n");
-               return -EBUSY;
-       }
+       WARN_ON(!list_empty(&bitbang->queue));
 
        destroy_workqueue(bitbang->workqueue);
 
-       spi_unregister_master(bitbang->master);
-
        return 0;
 }
 EXPORT_SYMBOL_GPL(spi_bitbang_stop);
diff --git a/include/linux/spi/spi_bitbang.h b/include/linux/spi/spi_bitbang.h
index 2e8c048..9dbca62 100644
--- a/include/linux/spi/spi_bitbang.h
+++ b/include/linux/spi/spi_bitbang.h
@@ -25,7 +25,6 @@ struct spi_bitbang {
        spinlock_t              lock;
        struct list_head        queue;
        u8                      busy;
-       u8                      shutdown;
        u8                      use_dma;
 
        struct spi_master       *master;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to