@@ -282,6 +282,54 @@ static u32 btmtksdio_drv_own_query(struct btmtksdio_dev *bdev)
282282 return sdio_readl (bdev -> func , MTK_REG_CHLPCR , NULL );
283283}
284284
285+ static int btmtksdio_fw_pmctrl (struct btmtksdio_dev * bdev )
286+ {
287+ u32 status ;
288+ int err ;
289+
290+ sdio_claim_host (bdev -> func );
291+
292+ /* Return ownership to the device */
293+ sdio_writel (bdev -> func , C_FW_OWN_REQ_SET , MTK_REG_CHLPCR , & err );
294+ if (err < 0 )
295+ goto out ;
296+
297+ err = readx_poll_timeout (btmtksdio_drv_own_query , bdev , status ,
298+ !(status & C_COM_DRV_OWN ), 2000 , 1000000 );
299+
300+ out :
301+ sdio_release_host (bdev -> func );
302+
303+ if (err < 0 )
304+ bt_dev_err (bdev -> hdev , "Cannot return ownership to device" );
305+
306+ return err ;
307+ }
308+
309+ static int btmtksdio_drv_pmctrl (struct btmtksdio_dev * bdev )
310+ {
311+ u32 status ;
312+ int err ;
313+
314+ sdio_claim_host (bdev -> func );
315+
316+ /* Get ownership from the device */
317+ sdio_writel (bdev -> func , C_FW_OWN_REQ_CLR , MTK_REG_CHLPCR , & err );
318+ if (err < 0 )
319+ goto out ;
320+
321+ err = readx_poll_timeout (btmtksdio_drv_own_query , bdev , status ,
322+ status & C_COM_DRV_OWN , 2000 , 1000000 );
323+
324+ out :
325+ sdio_release_host (bdev -> func );
326+
327+ if (err < 0 )
328+ bt_dev_err (bdev -> hdev , "Cannot get ownership from device" );
329+
330+ return err ;
331+ }
332+
285333static int btmtksdio_recv_event (struct hci_dev * hdev , struct sk_buff * skb )
286334{
287335 struct btmtksdio_dev * bdev = hci_get_drvdata (hdev );
@@ -541,7 +589,7 @@ static void btmtksdio_interrupt(struct sdio_func *func)
541589static int btmtksdio_open (struct hci_dev * hdev )
542590{
543591 struct btmtksdio_dev * bdev = hci_get_drvdata (hdev );
544- u32 status , val ;
592+ u32 val ;
545593 int err ;
546594
547595 sdio_claim_host (bdev -> func );
@@ -552,18 +600,10 @@ static int btmtksdio_open(struct hci_dev *hdev)
552600
553601 set_bit (BTMTKSDIO_FUNC_ENABLED , & bdev -> tx_state );
554602
555- /* Get ownership from the device */
556- sdio_writel (bdev -> func , C_FW_OWN_REQ_CLR , MTK_REG_CHLPCR , & err );
603+ err = btmtksdio_drv_pmctrl (bdev );
557604 if (err < 0 )
558605 goto err_disable_func ;
559606
560- err = readx_poll_timeout (btmtksdio_drv_own_query , bdev , status ,
561- status & C_COM_DRV_OWN , 2000 , 1000000 );
562- if (err < 0 ) {
563- bt_dev_err (bdev -> hdev , "Cannot get ownership from device" );
564- goto err_disable_func ;
565- }
566-
567607 /* Disable interrupt & mask out all interrupt sources */
568608 sdio_writel (bdev -> func , C_INT_EN_CLR , MTK_REG_CHLPCR , & err );
569609 if (err < 0 )
@@ -633,8 +673,6 @@ static int btmtksdio_open(struct hci_dev *hdev)
633673static int btmtksdio_close (struct hci_dev * hdev )
634674{
635675 struct btmtksdio_dev * bdev = hci_get_drvdata (hdev );
636- u32 status ;
637- int err ;
638676
639677 sdio_claim_host (bdev -> func );
640678
@@ -645,13 +683,7 @@ static int btmtksdio_close(struct hci_dev *hdev)
645683
646684 cancel_work_sync (& bdev -> txrx_work );
647685
648- /* Return ownership to the device */
649- sdio_writel (bdev -> func , C_FW_OWN_REQ_SET , MTK_REG_CHLPCR , NULL );
650-
651- err = readx_poll_timeout (btmtksdio_drv_own_query , bdev , status ,
652- !(status & C_COM_DRV_OWN ), 2000 , 1000000 );
653- if (err < 0 )
654- bt_dev_err (bdev -> hdev , "Cannot return ownership to device" );
686+ btmtksdio_fw_pmctrl (bdev );
655687
656688 clear_bit (BTMTKSDIO_FUNC_ENABLED , & bdev -> tx_state );
657689 sdio_disable_func (bdev -> func );
@@ -1162,7 +1194,6 @@ static int btmtksdio_runtime_suspend(struct device *dev)
11621194{
11631195 struct sdio_func * func = dev_to_sdio_func (dev );
11641196 struct btmtksdio_dev * bdev ;
1165- u32 status ;
11661197 int err ;
11671198
11681199 bdev = sdio_get_drvdata (func );
@@ -1174,27 +1205,17 @@ static int btmtksdio_runtime_suspend(struct device *dev)
11741205
11751206 sdio_set_host_pm_flags (func , MMC_PM_KEEP_POWER );
11761207
1177- sdio_claim_host (bdev -> func );
1178-
1179- sdio_writel (bdev -> func , C_FW_OWN_REQ_SET , MTK_REG_CHLPCR , & err );
1180- if (err < 0 )
1181- goto out ;
1208+ err = btmtksdio_fw_pmctrl (bdev );
11821209
1183- err = readx_poll_timeout (btmtksdio_drv_own_query , bdev , status ,
1184- !(status & C_COM_DRV_OWN ), 2000 , 1000000 );
1185- out :
11861210 bt_dev_info (bdev -> hdev , "status (%d) return ownership to device" , err );
11871211
1188- sdio_release_host (bdev -> func );
1189-
11901212 return err ;
11911213}
11921214
11931215static int btmtksdio_runtime_resume (struct device * dev )
11941216{
11951217 struct sdio_func * func = dev_to_sdio_func (dev );
11961218 struct btmtksdio_dev * bdev ;
1197- u32 status ;
11981219 int err ;
11991220
12001221 bdev = sdio_get_drvdata (func );
@@ -1204,19 +1225,10 @@ static int btmtksdio_runtime_resume(struct device *dev)
12041225 if (!test_bit (BTMTKSDIO_FUNC_ENABLED , & bdev -> tx_state ))
12051226 return 0 ;
12061227
1207- sdio_claim_host (bdev -> func );
1208-
1209- sdio_writel (bdev -> func , C_FW_OWN_REQ_CLR , MTK_REG_CHLPCR , & err );
1210- if (err < 0 )
1211- goto out ;
1228+ err = btmtksdio_drv_pmctrl (bdev );
12121229
1213- err = readx_poll_timeout (btmtksdio_drv_own_query , bdev , status ,
1214- status & C_COM_DRV_OWN , 2000 , 1000000 );
1215- out :
12161230 bt_dev_info (bdev -> hdev , "status (%d) get ownership from device" , err );
12171231
1218- sdio_release_host (bdev -> func );
1219-
12201232 return err ;
12211233}
12221234
0 commit comments