Commit fdc2ac1a authored by Glen Lee's avatar Glen Lee Committed by Greg Kroah-Hartman

staging: wilc1000: support suspend/resume functionality

wilc supports suspend/resume functionality. Introduce new sleep and wakeup
functions and remove old codes since that will be handled in the new functions.
Signed-off-by: default avatarGlen Lee <glen.lee@atmel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 33c64975
...@@ -522,6 +522,7 @@ static inline void chip_allow_sleep(struct wilc *wilc) ...@@ -522,6 +522,7 @@ static inline void chip_allow_sleep(struct wilc *wilc)
wilc->hif_func->hif_read_reg(wilc, 0xf0, &reg); wilc->hif_func->hif_read_reg(wilc, 0xf0, &reg);
wilc->hif_func->hif_write_reg(wilc, 0xf0, reg & ~BIT(0)); wilc->hif_func->hif_write_reg(wilc, 0xf0, reg & ~BIT(0));
wilc->hif_func->hif_write_reg(wilc, 0xfa, 0);
} }
static inline void chip_wakeup(struct wilc *wilc) static inline void chip_wakeup(struct wilc *wilc)
...@@ -543,6 +544,8 @@ static inline void chip_wakeup(struct wilc *wilc) ...@@ -543,6 +544,8 @@ static inline void chip_wakeup(struct wilc *wilc)
} while (wilc_get_chipid(wilc, true) == 0); } while (wilc_get_chipid(wilc, true) == 0);
} else if ((wilc->io_type & 0x1) == HIF_SDIO) { } else if ((wilc->io_type & 0x1) == HIF_SDIO) {
wilc->hif_func->hif_write_reg(wilc, 0xfa, 1);
udelay(200);
wilc->hif_func->hif_read_reg(wilc, 0xf0, &reg); wilc->hif_func->hif_read_reg(wilc, 0xf0, &reg);
do { do {
wilc->hif_func->hif_write_reg(wilc, 0xf0, wilc->hif_func->hif_write_reg(wilc, 0xf0,
...@@ -567,11 +570,7 @@ static inline void chip_wakeup(struct wilc *wilc) ...@@ -567,11 +570,7 @@ static inline void chip_wakeup(struct wilc *wilc)
} }
if (chip_ps_state == CHIP_SLEEPING_MANUAL) { if (chip_ps_state == CHIP_SLEEPING_MANUAL) {
wilc->hif_func->hif_read_reg(wilc, 0x1C0C, &reg); if (wilc_get_chipid(wilc, false) < 0x1002b0) {
reg &= ~BIT(0);
wilc->hif_func->hif_write_reg(wilc, 0x1C0C, reg);
if (wilc_get_chipid(wilc, false) >= 0x1002b0) {
u32 val32; u32 val32;
wilc->hif_func->hif_read_reg(wilc, 0x1e1c, &val32); wilc->hif_func->hif_read_reg(wilc, 0x1e1c, &val32);
...@@ -599,6 +598,20 @@ void wilc_chip_sleep_manually(struct wilc *wilc) ...@@ -599,6 +598,20 @@ void wilc_chip_sleep_manually(struct wilc *wilc)
release_bus(wilc, RELEASE_ONLY); release_bus(wilc, RELEASE_ONLY);
} }
void host_wakeup_notify(struct wilc *wilc)
{
acquire_bus(wilc, ACQUIRE_ONLY);
wilc->hif_func->hif_write_reg(wilc, 0x10b0, 1);
release_bus(wilc, RELEASE_ONLY);
}
void host_sleep_notify(struct wilc *wilc)
{
acquire_bus(wilc, ACQUIRE_ONLY);
wilc->hif_func->hif_write_reg(wilc, 0x10ac, 1);
release_bus(wilc, RELEASE_ONLY);
}
int wilc_wlan_handle_txq(struct net_device *dev, u32 *txq_count) int wilc_wlan_handle_txq(struct net_device *dev, u32 *txq_count)
{ {
int i, entries = 0; int i, entries = 0;
...@@ -701,9 +714,6 @@ int wilc_wlan_handle_txq(struct net_device *dev, u32 *txq_count) ...@@ -701,9 +714,6 @@ int wilc_wlan_handle_txq(struct net_device *dev, u32 *txq_count)
break; break;
} }
PRINT_WRN(GENERIC_DBG, "[wilc txq]: warn, vmm table not clear yet, wait...\n"); PRINT_WRN(GENERIC_DBG, "[wilc txq]: warn, vmm table not clear yet, wait...\n");
release_bus(wilc, RELEASE_ALLOW_SLEEP);
usleep_range(3000, 3000);
acquire_bus(wilc, ACQUIRE_AND_WAKEUP);
} }
} while (!wilc->quit); } while (!wilc->quit);
...@@ -736,9 +746,6 @@ int wilc_wlan_handle_txq(struct net_device *dev, u32 *txq_count) ...@@ -736,9 +746,6 @@ int wilc_wlan_handle_txq(struct net_device *dev, u32 *txq_count)
break; break;
} else { } else {
release_bus(wilc, RELEASE_ALLOW_SLEEP); release_bus(wilc, RELEASE_ALLOW_SLEEP);
usleep_range(3000, 3000);
acquire_bus(wilc, ACQUIRE_AND_WAKEUP);
PRINT_WRN(GENERIC_DBG, "Can't get VMM entery - reg = %2x\n", reg);
} }
} while (--timeout); } while (--timeout);
if (timeout <= 0) { if (timeout <= 0) {
...@@ -1156,7 +1163,7 @@ int wilc_wlan_start(struct wilc *wilc) ...@@ -1156,7 +1163,7 @@ int wilc_wlan_start(struct wilc *wilc)
#ifdef WILC_EXT_PA_INV_TX_RX #ifdef WILC_EXT_PA_INV_TX_RX
reg |= WILC_HAVE_EXT_PA_INV_TX_RX; reg |= WILC_HAVE_EXT_PA_INV_TX_RX;
#endif #endif
reg |= WILC_HAVE_USE_IRQ_AS_HOST_WAKE;
reg |= WILC_HAVE_LEGACY_RF_SETTINGS; reg |= WILC_HAVE_LEGACY_RF_SETTINGS;
#ifdef XTAL_24 #ifdef XTAL_24
reg |= WILC_HAVE_XTAL_24; reg |= WILC_HAVE_XTAL_24;
......
...@@ -106,6 +106,7 @@ ...@@ -106,6 +106,7 @@
#define WILC_HAVE_LEGACY_RF_SETTINGS BIT(5) #define WILC_HAVE_LEGACY_RF_SETTINGS BIT(5)
#define WILC_HAVE_XTAL_24 BIT(6) #define WILC_HAVE_XTAL_24 BIT(6)
#define WILC_HAVE_DISABLE_WILC_UART BIT(7) #define WILC_HAVE_DISABLE_WILC_UART BIT(7)
#define WILC_HAVE_USE_IRQ_AS_HOST_WAKE BIT(8)
/******************************************** /********************************************
* *
...@@ -294,7 +295,8 @@ int wilc_mac_close(struct net_device *ndev); ...@@ -294,7 +295,8 @@ int wilc_mac_close(struct net_device *ndev);
int wilc_wlan_set_bssid(struct net_device *wilc_netdev, u8 *pBSSID); int wilc_wlan_set_bssid(struct net_device *wilc_netdev, u8 *pBSSID);
void WILC_WFI_p2p_rx(struct net_device *dev, u8 *buff, u32 size); void WILC_WFI_p2p_rx(struct net_device *dev, u8 *buff, u32 size);
void host_wakeup_notify(struct wilc *wilc);
void host_sleep_notify(struct wilc *wilc);
extern bool wilc_enable_ps; extern bool wilc_enable_ps;
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment