return 0;
 }
 
+static bool btmtksdio_sdio_wakeup(struct hci_dev *hdev)
+{
+       struct btmtksdio_dev *bdev = hci_get_drvdata(hdev);
+       bool may_wakeup = device_may_wakeup(bdev->dev);
+       const struct btmtk_wakeon bt_awake = {
+               .mode = 0x1,
+               .gpo = 0,
+               .active_high = 0x1,
+               .enable_delay = cpu_to_le16(0xc80),
+               .wakeup_delay = cpu_to_le16(0x20),
+       };
+
+       if (may_wakeup && bdev->data->chipid == 0x7921) {
+               struct sk_buff *skb;
+
+               skb =  __hci_cmd_sync(hdev, 0xfc27, sizeof(bt_awake),
+                                     &bt_awake, HCI_CMD_TIMEOUT);
+               if (IS_ERR(skb))
+                       may_wakeup = false;
+
+               kfree_skb(skb);
+       }
+
+       return may_wakeup;
+}
+
 static int btmtksdio_probe(struct sdio_func *func,
                           const struct sdio_device_id *id)
 {
        hdev->setup    = btmtksdio_setup;
        hdev->shutdown = btmtksdio_shutdown;
        hdev->send     = btmtksdio_send_frame;
+       hdev->wakeup   = btmtksdio_sdio_wakeup;
        hdev->set_bdaddr = btmtk_set_bdaddr;
 
        SET_HCIDEV_DEV(hdev, &func->dev);
         */
        pm_runtime_put_noidle(bdev->dev);
 
-       return 0;
+       err = device_init_wakeup(bdev->dev, true);
+       if (err)
+               bt_dev_err(hdev, "failed to initialize device wakeup");
+
+       return err;
 }
 
 static void btmtksdio_remove(struct sdio_func *func)