Skip to content

Commit 4ed924f

Browse files
Zhengping JiangVudentz
authored andcommitted
Bluetooth: btmtksdio: enable bluetooth wakeup in system suspend
The BTMTKSDIO_BT_WAKE_ENABLED flag is set for bluetooth interrupt during system suspend and increases wakeup count for bluetooth event. Signed-off-by: Zhengping Jiang <[email protected]> Signed-off-by: Luiz Augusto von Dentz <[email protected]>
1 parent da06ff1 commit 4ed924f

File tree

1 file changed

+38
-6
lines changed

1 file changed

+38
-6
lines changed

drivers/bluetooth/btmtksdio.c

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ MODULE_DEVICE_TABLE(sdio, btmtksdio_table);
118118
#define BTMTKSDIO_FUNC_ENABLED 3
119119
#define BTMTKSDIO_PATCH_ENABLED 4
120120
#define BTMTKSDIO_HW_RESET_ACTIVE 5
121+
#define BTMTKSDIO_BT_WAKE_ENABLED 6
121122

122123
struct mtkbtsdio_hdr {
123124
__le16 len;
@@ -554,7 +555,7 @@ static void btmtksdio_txrx_work(struct work_struct *work)
554555
sdio_claim_host(bdev->func);
555556

556557
/* Disable interrupt */
557-
sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, 0);
558+
sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, NULL);
558559

559560
txrx_timeout = jiffies + 5 * HZ;
560561

@@ -576,7 +577,7 @@ static void btmtksdio_txrx_work(struct work_struct *work)
576577
if ((int_status & FW_MAILBOX_INT) &&
577578
bdev->data->chipid == 0x7921) {
578579
sdio_writel(bdev->func, PH2DSM0R_DRIVER_OWN,
579-
MTK_REG_PH2DSM0R, 0);
580+
MTK_REG_PH2DSM0R, NULL);
580581
}
581582

582583
if (int_status & FW_OWN_BACK_INT)
@@ -608,7 +609,7 @@ static void btmtksdio_txrx_work(struct work_struct *work)
608609
} while (int_status || time_is_before_jiffies(txrx_timeout));
609610

610611
/* Enable interrupt */
611-
sdio_writel(bdev->func, C_INT_EN_SET, MTK_REG_CHLPCR, 0);
612+
sdio_writel(bdev->func, C_INT_EN_SET, MTK_REG_CHLPCR, NULL);
612613

613614
sdio_release_host(bdev->func);
614615

@@ -620,8 +621,14 @@ static void btmtksdio_interrupt(struct sdio_func *func)
620621
{
621622
struct btmtksdio_dev *bdev = sdio_get_drvdata(func);
622623

624+
if (test_bit(BTMTKSDIO_BT_WAKE_ENABLED, &bdev->tx_state)) {
625+
if (bdev->hdev->suspended)
626+
pm_wakeup_event(bdev->dev, 0);
627+
clear_bit(BTMTKSDIO_BT_WAKE_ENABLED, &bdev->tx_state);
628+
}
629+
623630
/* Disable interrupt */
624-
sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, 0);
631+
sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, NULL);
625632

626633
schedule_work(&bdev->txrx_work);
627634
}
@@ -1454,6 +1461,23 @@ static int btmtksdio_runtime_suspend(struct device *dev)
14541461
return err;
14551462
}
14561463

1464+
static int btmtksdio_system_suspend(struct device *dev)
1465+
{
1466+
struct sdio_func *func = dev_to_sdio_func(dev);
1467+
struct btmtksdio_dev *bdev;
1468+
1469+
bdev = sdio_get_drvdata(func);
1470+
if (!bdev)
1471+
return 0;
1472+
1473+
if (!test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state))
1474+
return 0;
1475+
1476+
set_bit(BTMTKSDIO_BT_WAKE_ENABLED, &bdev->tx_state);
1477+
1478+
return btmtksdio_runtime_suspend(dev);
1479+
}
1480+
14571481
static int btmtksdio_runtime_resume(struct device *dev)
14581482
{
14591483
struct sdio_func *func = dev_to_sdio_func(dev);
@@ -1474,8 +1498,16 @@ static int btmtksdio_runtime_resume(struct device *dev)
14741498
return err;
14751499
}
14761500

1477-
static UNIVERSAL_DEV_PM_OPS(btmtksdio_pm_ops, btmtksdio_runtime_suspend,
1478-
btmtksdio_runtime_resume, NULL);
1501+
static int btmtksdio_system_resume(struct device *dev)
1502+
{
1503+
return btmtksdio_runtime_resume(dev);
1504+
}
1505+
1506+
static const struct dev_pm_ops btmtksdio_pm_ops = {
1507+
SYSTEM_SLEEP_PM_OPS(btmtksdio_system_suspend, btmtksdio_system_resume)
1508+
RUNTIME_PM_OPS(btmtksdio_runtime_suspend, btmtksdio_runtime_resume, NULL)
1509+
};
1510+
14791511
#define BTMTKSDIO_PM_OPS (&btmtksdio_pm_ops)
14801512
#else /* CONFIG_PM */
14811513
#define BTMTKSDIO_PM_OPS NULL

0 commit comments

Comments
 (0)