mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 10:00:03 -04:00
mfd: rtsx_usb: Defer autosuspend while card exists
A card insertion happens after the lastest polling before reader is suspended may never have a chance to be detected. Under current 1-HZ polling interval setting in mmc_core, the worst case of such undetectablility is about 1 second. To further reduce the undetectability, detect card slot again in suspend method and defer the autosuspend if the slot is loaded. The default 2 second autosuspend delay of USB subsystem should let the next polling detects the card. Signed-off-by: Roger Tseng <rogerable@realtek.com> Signed-off-by: Lee Jones <lee.jones@linaro.org>
This commit is contained in:
@@ -681,9 +681,27 @@ static void rtsx_usb_disconnect(struct usb_interface *intf)
|
|||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
static int rtsx_usb_suspend(struct usb_interface *intf, pm_message_t message)
|
static int rtsx_usb_suspend(struct usb_interface *intf, pm_message_t message)
|
||||||
{
|
{
|
||||||
|
struct rtsx_ucr *ucr =
|
||||||
|
(struct rtsx_ucr *)usb_get_intfdata(intf);
|
||||||
|
u16 val = 0;
|
||||||
|
|
||||||
dev_dbg(&intf->dev, "%s called with pm message 0x%04x\n",
|
dev_dbg(&intf->dev, "%s called with pm message 0x%04x\n",
|
||||||
__func__, message.event);
|
__func__, message.event);
|
||||||
|
|
||||||
|
if (PMSG_IS_AUTO(message)) {
|
||||||
|
if (mutex_trylock(&ucr->dev_mutex)) {
|
||||||
|
rtsx_usb_get_card_status(ucr, &val);
|
||||||
|
mutex_unlock(&ucr->dev_mutex);
|
||||||
|
|
||||||
|
/* Defer the autosuspend if card exists */
|
||||||
|
if (val & (SD_CD | MS_CD))
|
||||||
|
return -EAGAIN;
|
||||||
|
} else {
|
||||||
|
/* There is an ongoing operation*/
|
||||||
|
return -EAGAIN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user