ssb: reset device only if it was enabled
authorRafał Miłecki <zajec5@gmail.com>
Thu, 17 Feb 2011 00:50:51 +0000 (01:50 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 18 Feb 2011 21:54:55 +0000 (16:54 -0500)
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/ssb/main.c

index 06c0b6d5250d083ac03864989bc406e5332e177d..e05ba6eefc7e7d148fe94db458e2055bf342b9dc 100644 (file)
@@ -1226,27 +1226,31 @@ void ssb_device_disable(struct ssb_device *dev, u32 core_specific_flags)
                return;
 
        reject = ssb_tmslow_reject_bitmask(dev);
-       ssb_write32(dev, SSB_TMSLOW, reject | SSB_TMSLOW_CLOCK);
-       ssb_wait_bits(dev, SSB_TMSLOW, reject, 1000, 1);
-       ssb_wait_bits(dev, SSB_TMSHIGH, SSB_TMSHIGH_BUSY, 1000, 0);
 
-       if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
-               val = ssb_read32(dev, SSB_IMSTATE);
-               val |= SSB_IMSTATE_REJECT;
-               ssb_write32(dev, SSB_IMSTATE, val);
-               ssb_wait_bits(dev, SSB_IMSTATE, SSB_IMSTATE_BUSY, 1000, 0);
-       }
+       if (ssb_read32(dev, SSB_TMSLOW) & SSB_TMSLOW_CLOCK) {
+               ssb_write32(dev, SSB_TMSLOW, reject | SSB_TMSLOW_CLOCK);
+               ssb_wait_bits(dev, SSB_TMSLOW, reject, 1000, 1);
+               ssb_wait_bits(dev, SSB_TMSHIGH, SSB_TMSHIGH_BUSY, 1000, 0);
+
+               if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
+                       val = ssb_read32(dev, SSB_IMSTATE);
+                       val |= SSB_IMSTATE_REJECT;
+                       ssb_write32(dev, SSB_IMSTATE, val);
+                       ssb_wait_bits(dev, SSB_IMSTATE, SSB_IMSTATE_BUSY, 1000,
+                                     0);
+               }
 
-       ssb_write32(dev, SSB_TMSLOW,
-                   SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK |
-                   reject | SSB_TMSLOW_RESET |
-                   core_specific_flags);
-       ssb_flush_tmslow(dev);
+               ssb_write32(dev, SSB_TMSLOW,
+                       SSB_TMSLOW_FGC | SSB_TMSLOW_CLOCK |
+                       reject | SSB_TMSLOW_RESET |
+                       core_specific_flags);
+               ssb_flush_tmslow(dev);
 
-       if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
-               val = ssb_read32(dev, SSB_IMSTATE);
-               val &= ~SSB_IMSTATE_REJECT;
-               ssb_write32(dev, SSB_IMSTATE, val);
+               if (ssb_read32(dev, SSB_IDLOW) & SSB_IDLOW_INITIATOR) {
+                       val = ssb_read32(dev, SSB_IMSTATE);
+                       val &= ~SSB_IMSTATE_REJECT;
+                       ssb_write32(dev, SSB_IMSTATE, val);
+               }
        }
 
        ssb_write32(dev, SSB_TMSLOW,