|
@@ -79,67 +79,18 @@ static const struct of_device_id mwifiex_sdio_of_match_table[] = {
|
|
|
{ }
|
|
|
};
|
|
|
|
|
|
-static irqreturn_t mwifiex_wake_irq_wifi(int irq, void *priv)
|
|
|
-{
|
|
|
- struct mwifiex_plt_wake_cfg *cfg = priv;
|
|
|
-
|
|
|
- if (cfg->irq_wifi >= 0) {
|
|
|
- pr_info("%s: wake by wifi", __func__);
|
|
|
- cfg->wake_by_wifi = true;
|
|
|
- disable_irq_nosync(irq);
|
|
|
- }
|
|
|
-
|
|
|
- /* Notify PM core we are wakeup source */
|
|
|
- pm_wakeup_event(cfg->dev, 0);
|
|
|
-
|
|
|
- return IRQ_HANDLED;
|
|
|
-}
|
|
|
-
|
|
|
/* This function parse device tree node using mmc subnode devicetree API.
|
|
|
* The device node is saved in card->plt_of_node.
|
|
|
* if the device tree node exist and include interrupts attributes, this
|
|
|
* function will also request platform specific wakeup interrupt.
|
|
|
*/
|
|
|
-static int mwifiex_sdio_probe_of(struct device *dev, struct sdio_mmc_card *card)
|
|
|
+static int mwifiex_sdio_probe_of(struct device *dev)
|
|
|
{
|
|
|
- struct mwifiex_plt_wake_cfg *cfg;
|
|
|
- int ret;
|
|
|
-
|
|
|
if (!of_match_node(mwifiex_sdio_of_match_table, dev->of_node)) {
|
|
|
dev_err(dev, "required compatible string missing\n");
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- card->plt_of_node = dev->of_node;
|
|
|
- card->plt_wake_cfg = devm_kzalloc(dev, sizeof(*card->plt_wake_cfg),
|
|
|
- GFP_KERNEL);
|
|
|
- cfg = card->plt_wake_cfg;
|
|
|
- if (cfg && card->plt_of_node) {
|
|
|
- cfg->dev = dev;
|
|
|
- cfg->irq_wifi = irq_of_parse_and_map(card->plt_of_node, 0);
|
|
|
- if (!cfg->irq_wifi) {
|
|
|
- dev_dbg(dev,
|
|
|
- "fail to parse irq_wifi from device tree\n");
|
|
|
- } else {
|
|
|
- ret = devm_request_irq(dev, cfg->irq_wifi,
|
|
|
- mwifiex_wake_irq_wifi,
|
|
|
- IRQF_TRIGGER_LOW,
|
|
|
- "wifi_wake", cfg);
|
|
|
- if (ret) {
|
|
|
- dev_dbg(dev,
|
|
|
- "Failed to request irq_wifi %d (%d)\n",
|
|
|
- cfg->irq_wifi, ret);
|
|
|
- card->plt_wake_cfg = NULL;
|
|
|
- return 0;
|
|
|
- }
|
|
|
- disable_irq(cfg->irq_wifi);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- ret = device_init_wakeup(dev, true);
|
|
|
- if (ret)
|
|
|
- dev_err(dev, "fail to init wakeup for mwifiex");
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -198,11 +149,9 @@ mwifiex_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id)
|
|
|
|
|
|
/* device tree node parsing and platform specific configuration*/
|
|
|
if (func->dev.of_node) {
|
|
|
- ret = mwifiex_sdio_probe_of(&func->dev, card);
|
|
|
- if (ret) {
|
|
|
- dev_err(&func->dev, "SDIO dt node parse failed\n");
|
|
|
+ ret = mwifiex_sdio_probe_of(&func->dev);
|
|
|
+ if (ret)
|
|
|
goto err_disable;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
ret = mwifiex_add_card(card, &add_remove_card_sem, &sdio_ops,
|
|
@@ -265,12 +214,7 @@ static int mwifiex_sdio_resume(struct device *dev)
|
|
|
mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
|
|
|
MWIFIEX_SYNC_CMD);
|
|
|
|
|
|
- /* Disable platform specific wakeup interrupt */
|
|
|
- if (card->plt_wake_cfg && card->plt_wake_cfg->irq_wifi >= 0) {
|
|
|
- disable_irq_wake(card->plt_wake_cfg->irq_wifi);
|
|
|
- if (!card->plt_wake_cfg->wake_by_wifi)
|
|
|
- disable_irq(card->plt_wake_cfg->irq_wifi);
|
|
|
- }
|
|
|
+ mwifiex_disable_wake(adapter);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -350,13 +294,7 @@ static int mwifiex_sdio_suspend(struct device *dev)
|
|
|
}
|
|
|
|
|
|
adapter = card->adapter;
|
|
|
-
|
|
|
- /* Enable platform specific wakeup interrupt */
|
|
|
- if (card->plt_wake_cfg && card->plt_wake_cfg->irq_wifi >= 0) {
|
|
|
- card->plt_wake_cfg->wake_by_wifi = false;
|
|
|
- enable_irq(card->plt_wake_cfg->irq_wifi);
|
|
|
- enable_irq_wake(card->plt_wake_cfg->irq_wifi);
|
|
|
- }
|
|
|
+ mwifiex_enable_wake(adapter);
|
|
|
|
|
|
/* Enable the Host Sleep */
|
|
|
if (!mwifiex_enable_hs(adapter)) {
|