@@ -118,6 +118,7 @@ MODULE_DEVICE_TABLE(sdio, btmtksdio_table);
118
118
#define BTMTKSDIO_FUNC_ENABLED 3
119
119
#define BTMTKSDIO_PATCH_ENABLED 4
120
120
#define BTMTKSDIO_HW_RESET_ACTIVE 5
121
+ #define BTMTKSDIO_BT_WAKE_ENABLED 6
121
122
122
123
struct mtkbtsdio_hdr {
123
124
__le16 len ;
@@ -554,7 +555,7 @@ static void btmtksdio_txrx_work(struct work_struct *work)
554
555
sdio_claim_host (bdev -> func );
555
556
556
557
/* 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 );
558
559
559
560
txrx_timeout = jiffies + 5 * HZ ;
560
561
@@ -576,7 +577,7 @@ static void btmtksdio_txrx_work(struct work_struct *work)
576
577
if ((int_status & FW_MAILBOX_INT ) &&
577
578
bdev -> data -> chipid == 0x7921 ) {
578
579
sdio_writel (bdev -> func , PH2DSM0R_DRIVER_OWN ,
579
- MTK_REG_PH2DSM0R , 0 );
580
+ MTK_REG_PH2DSM0R , NULL );
580
581
}
581
582
582
583
if (int_status & FW_OWN_BACK_INT )
@@ -608,7 +609,7 @@ static void btmtksdio_txrx_work(struct work_struct *work)
608
609
} while (int_status || time_is_before_jiffies (txrx_timeout ));
609
610
610
611
/* 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 );
612
613
613
614
sdio_release_host (bdev -> func );
614
615
@@ -620,8 +621,14 @@ static void btmtksdio_interrupt(struct sdio_func *func)
620
621
{
621
622
struct btmtksdio_dev * bdev = sdio_get_drvdata (func );
622
623
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
+
623
630
/* 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 );
625
632
626
633
schedule_work (& bdev -> txrx_work );
627
634
}
@@ -1454,6 +1461,23 @@ static int btmtksdio_runtime_suspend(struct device *dev)
1454
1461
return err ;
1455
1462
}
1456
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
+
1457
1481
static int btmtksdio_runtime_resume (struct device * dev )
1458
1482
{
1459
1483
struct sdio_func * func = dev_to_sdio_func (dev );
@@ -1474,8 +1498,16 @@ static int btmtksdio_runtime_resume(struct device *dev)
1474
1498
return err ;
1475
1499
}
1476
1500
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
+
1479
1511
#define BTMTKSDIO_PM_OPS (&btmtksdio_pm_ops)
1480
1512
#else /* CONFIG_PM */
1481
1513
#define BTMTKSDIO_PM_OPS NULL
0 commit comments