mmc: sdio: Use empty system suspend/resume callbacks at the bus level
authorRafael J. Wysocki <rjw@sisk.pl>
Sun, 1 Apr 2012 04:34:58 +0000 (00:34 -0400)
committerChris Ball <cjb@laptop.org>
Sun, 1 Apr 2012 04:35:06 +0000 (00:35 -0400)
commita4dfa827bb5b9a984d4000ffb80134b9495e4d8a
tree01f4d5ba15b502ee4cc0165c03f82173436a8a1c
parente0aebdb86c1fc153a52081cbf0cf5b11afe7e779
mmc: sdio: Use empty system suspend/resume callbacks at the bus level

Neil Brown reports that commit 35cd133c

   PM: Run the driver callback directly if the subsystem one is not there

breaks suspend for his libertas wifi, because SDIO has a protocol
where the suspend method can return -ENOSYS and this means "There is
no point in suspending, just turn me off".  Moreover, the suspend
methods provided by SDIO drivers are not supposed to be called by
the PM core or bus-level suspend routines (which aren't presend for
SDIO).  Instead, when the SDIO core gets to suspend the device's
ancestor, it calls the device driver's suspend function, catches the
ENOSYS, and turns the device off.

The commit above breaks the SDIO core's assumption that the device
drivers' callbacks won't be executed if it doesn't provide any
bus-level callbacks.  If fact, however, this assumption has never
been really satisfied, because device class or device type suspend
might very well use the driver's callback even without that commit.

The simplest way to address this problem is to make the SDIO core
tell the PM core to ignore driver callbacks, for example by providing
no-operation suspend/resume callbacks at the bus level for it,
which is implemented by this change.

Reported-and-tested-by: Neil Brown <neilb@suse.de>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
[stable: please apply to 3.3-stable only]
Cc: <stable@vger.kernel.org>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/core/sdio_bus.c