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]>
---
Changes in v2:
- Add Bluetooth prefix to patch subject
- Fix warnings regarding using plain integer as NULL
- Add static to btmtksdio_pm_ops
Changes in v1:
- Add BTMTKSDIO_BT_WAKE_ENABLED flag
- Call pm_wakeup_event in btmtksdio_interrupt
drivers/bluetooth/btmtksdio.c | 44 ++++++++++++++++++++++++++++++-----
1 file changed, 38 insertions(+), 6 deletions(-)
diff --git a/drivers/bluetooth/btmtksdio.c b/drivers/bluetooth/btmtksdio.c
index f9a3444753c2..404105e69c67 100644
--- a/drivers/bluetooth/btmtksdio.c
+++ b/drivers/bluetooth/btmtksdio.c
@@ -118,6 +118,7 @@ MODULE_DEVICE_TABLE(sdio, btmtksdio_table);
#define BTMTKSDIO_FUNC_ENABLED 3
#define BTMTKSDIO_PATCH_ENABLED 4
#define BTMTKSDIO_HW_RESET_ACTIVE 5
+#define BTMTKSDIO_BT_WAKE_ENABLED 6
struct mtkbtsdio_hdr {
__le16 len;
@@ -554,7 +555,7 @@ static void btmtksdio_txrx_work(struct work_struct *work)
sdio_claim_host(bdev->func);
/* Disable interrupt */
- sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, 0);
+ sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, NULL);
txrx_timeout = jiffies + 5 * HZ;
@@ -576,7 +577,7 @@ static void btmtksdio_txrx_work(struct work_struct *work)
if ((int_status & FW_MAILBOX_INT) &&
bdev->data->chipid == 0x7921) {
sdio_writel(bdev->func, PH2DSM0R_DRIVER_OWN,
- MTK_REG_PH2DSM0R, 0);
+ MTK_REG_PH2DSM0R, NULL);
}
if (int_status & FW_OWN_BACK_INT)
@@ -608,7 +609,7 @@ static void btmtksdio_txrx_work(struct work_struct *work)
} while (int_status || time_is_before_jiffies(txrx_timeout));
/* Enable interrupt */
- sdio_writel(bdev->func, C_INT_EN_SET, MTK_REG_CHLPCR, 0);
+ sdio_writel(bdev->func, C_INT_EN_SET, MTK_REG_CHLPCR, NULL);
sdio_release_host(bdev->func);
@@ -620,8 +621,14 @@ static void btmtksdio_interrupt(struct sdio_func *func)
{
struct btmtksdio_dev *bdev = sdio_get_drvdata(func);
+ if (test_bit(BTMTKSDIO_BT_WAKE_ENABLED, &bdev->tx_state)) {
+ if (bdev->hdev->suspended)
+ pm_wakeup_event(bdev->dev, 0);
+ clear_bit(BTMTKSDIO_BT_WAKE_ENABLED, &bdev->tx_state);
+ }
+
/* Disable interrupt */
- sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, 0);
+ sdio_writel(bdev->func, C_INT_EN_CLR, MTK_REG_CHLPCR, NULL);
schedule_work(&bdev->txrx_work);
}
@@ -1454,6 +1461,23 @@ static int btmtksdio_runtime_suspend(struct device *dev)
return err;
}
+static int btmtksdio_system_suspend(struct device *dev)
+{
+ struct sdio_func *func = dev_to_sdio_func(dev);
+ struct btmtksdio_dev *bdev;
+
+ bdev = sdio_get_drvdata(func);
+ if (!bdev)
+ return 0;
+
+ if (!test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state))
+ return 0;
+
+ set_bit(BTMTKSDIO_BT_WAKE_ENABLED, &bdev->tx_state);
+
+ return btmtksdio_runtime_suspend(dev);
+}
+
static int btmtksdio_runtime_resume(struct device *dev)
{
struct sdio_func *func = dev_to_sdio_func(dev);
@@ -1474,8 +1498,16 @@ static int btmtksdio_runtime_resume(struct device *dev)
return err;
}
-static UNIVERSAL_DEV_PM_OPS(btmtksdio_pm_ops, btmtksdio_runtime_suspend,
- btmtksdio_runtime_resume, NULL);
+static int btmtksdio_system_resume(struct device *dev)
+{
+ return btmtksdio_runtime_resume(dev);
+}
+
+static const struct dev_pm_ops __maybe_unused btmtksdio_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(btmtksdio_system_suspend, btmtksdio_system_resume)
+ SET_RUNTIME_PM_OPS(btmtksdio_runtime_suspend, btmtksdio_runtime_resume, NULL)
+};
+
#define BTMTKSDIO_PM_OPS (&btmtksdio_pm_ops)
#else /* CONFIG_PM */
#define BTMTKSDIO_PM_OPS NULL
--
2.42.0.609.gbb76f46606-goog
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=792370
---Test result---
Test Summary:
CheckPatch PASS 0.75 seconds
GitLint PASS 0.35 seconds
SubjectPrefix PASS 0.12 seconds
BuildKernel PASS 34.96 seconds
CheckAllWarning PASS 38.36 seconds
CheckSparse PASS 44.17 seconds
CheckSmatch PASS 119.51 seconds
BuildKernel32 PASS 33.90 seconds
TestRunnerSetup PASS 524.90 seconds
TestRunner_l2cap-tester PASS 31.18 seconds
TestRunner_iso-tester PASS 55.05 seconds
TestRunner_bnep-tester PASS 10.58 seconds
TestRunner_mgmt-tester PASS 224.21 seconds
TestRunner_rfcomm-tester PASS 16.44 seconds
TestRunner_sco-tester PASS 19.55 seconds
TestRunner_ioctl-tester PASS 18.44 seconds
TestRunner_mesh-tester PASS 13.42 seconds
TestRunner_smp-tester PASS 14.64 seconds
TestRunner_userchan-tester PASS 11.67 seconds
IncrementalBuild PASS 33.12 seconds
---
Regards,
Linux Bluetooth
Hi Zhengping,
kernel test robot noticed the following build warnings:
[auto build test WARNING on bluetooth/master]
[also build test WARNING on bluetooth-next/master linus/master v6.6-rc5 next-20231012]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Zhengping-Jiang/Bluetooth-btmtksdio-enable-bluetooth-wakeup-in-system-suspend/20231012-064116
base: https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git master
patch link: https://lore.kernel.org/r/20231011153928.kernel.v2.1.I6dbfc1fedddf0633b55ce7e7a10ef7f3929a9bdc%40changeid
patch subject: [kernel PATCH v2] Bluetooth: btmtksdio: enable bluetooth wakeup in system suspend
config: sh-allyesconfig (https://download.01.org/0day-ci/archive/20231013/[email protected]/config)
compiler: sh4-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231013/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All warnings (new ones prefixed by >>):
>> drivers/bluetooth/btmtksdio.c:1501:12: warning: 'btmtksdio_system_resume' defined but not used [-Wunused-function]
1501 | static int btmtksdio_system_resume(struct device *dev)
| ^~~~~~~~~~~~~~~~~~~~~~~
>> drivers/bluetooth/btmtksdio.c:1464:12: warning: 'btmtksdio_system_suspend' defined but not used [-Wunused-function]
1464 | static int btmtksdio_system_suspend(struct device *dev)
| ^~~~~~~~~~~~~~~~~~~~~~~~
vim +/btmtksdio_system_resume +1501 drivers/bluetooth/btmtksdio.c
1463
> 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
1481 static int btmtksdio_runtime_resume(struct device *dev)
1482 {
1483 struct sdio_func *func = dev_to_sdio_func(dev);
1484 struct btmtksdio_dev *bdev;
1485 int err;
1486
1487 bdev = sdio_get_drvdata(func);
1488 if (!bdev)
1489 return 0;
1490
1491 if (!test_bit(BTMTKSDIO_FUNC_ENABLED, &bdev->tx_state))
1492 return 0;
1493
1494 err = btmtksdio_drv_pmctrl(bdev);
1495
1496 bt_dev_dbg(bdev->hdev, "status (%d) get ownership from device", err);
1497
1498 return err;
1499 }
1500
> 1501 static int btmtksdio_system_resume(struct device *dev)
1502 {
1503 return btmtksdio_runtime_resume(dev);
1504 }
1505
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki