Skip to content

Commit c7e301d

Browse files
Mark Chenholtmann
authored andcommitted
Bluetooth: btmtksdio: refactor btmtksdio_runtime_[suspend|resume]()
Refactor btmtksdio_runtime_[suspend|resume]() to create the common funcitons btmtksdio_[fw|drv]_pmctrl() shared with btmtksdio_[open|close]() to avoid the redundant code as well. This is also a prerequisite patch for the incoming patches. Co-developed-by: Sean Wang <[email protected]> Signed-off-by: Sean Wang <[email protected]> Signed-off-by: Mark Chen <[email protected]> Signed-off-by: Marcel Holtmann <[email protected]>
1 parent 2fc967c commit c7e301d

File tree

1 file changed

+53
-41
lines changed

1 file changed

+53
-41
lines changed

drivers/bluetooth/btmtksdio.c

Lines changed: 53 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
285333
static 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)
541589
static 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)
633673
static 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

11931215
static 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

Comments
 (0)