diff options
author | Roger Tseng <rogerable@realtek.com> | 2015-01-21 05:09:21 -0500 |
---|---|---|
committer | Lee Jones <lee.jones@linaro.org> | 2015-01-22 11:08:02 -0500 |
commit | bb400d2120bd253d73661c452b18485d2d5b42dd (patch) | |
tree | 686ede6c3d3404102019913178d4a0a501c299ec | |
parent | c7f15d43a5c59c6cedb438e02032060558303589 (diff) |
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>
-rw-r--r-- | drivers/mfd/rtsx_usb.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/mfd/rtsx_usb.c b/drivers/mfd/rtsx_usb.c index 210d1f85679e..ede50244f265 100644 --- a/drivers/mfd/rtsx_usb.c +++ b/drivers/mfd/rtsx_usb.c | |||
@@ -681,9 +681,27 @@ static void rtsx_usb_disconnect(struct usb_interface *intf) | |||
681 | #ifdef CONFIG_PM | 681 | #ifdef CONFIG_PM |
682 | static int rtsx_usb_suspend(struct usb_interface *intf, pm_message_t message) | 682 | static int rtsx_usb_suspend(struct usb_interface *intf, pm_message_t message) |
683 | { | 683 | { |
684 | struct rtsx_ucr *ucr = | ||
685 | (struct rtsx_ucr *)usb_get_intfdata(intf); | ||
686 | u16 val = 0; | ||
687 | |||
684 | dev_dbg(&intf->dev, "%s called with pm message 0x%04x\n", | 688 | dev_dbg(&intf->dev, "%s called with pm message 0x%04x\n", |
685 | __func__, message.event); | 689 | __func__, message.event); |
686 | 690 | ||
691 | if (PMSG_IS_AUTO(message)) { | ||
692 | if (mutex_trylock(&ucr->dev_mutex)) { | ||
693 | rtsx_usb_get_card_status(ucr, &val); | ||
694 | mutex_unlock(&ucr->dev_mutex); | ||
695 | |||
696 | /* Defer the autosuspend if card exists */ | ||
697 | if (val & (SD_CD | MS_CD)) | ||
698 | return -EAGAIN; | ||
699 | } else { | ||
700 | /* There is an ongoing operation*/ | ||
701 | return -EAGAIN; | ||
702 | } | ||
703 | } | ||
704 | |||
687 | return 0; | 705 | return 0; |
688 | } | 706 | } |
689 | 707 | ||