Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bb400d21 authored by Roger Tseng's avatar Roger Tseng Committed by Lee Jones
Browse files

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: default avatarRoger Tseng <rogerable@realtek.com>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
parent c7f15d43
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -681,9 +681,27 @@ static void rtsx_usb_disconnect(struct usb_interface *intf)
#ifdef CONFIG_PM
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",
			__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;
}