From 1f93a7dfd1f8d5ff7a5c53246c7534fe2332d6f4 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 11 Dec 2023 02:46:07 +0000 Subject: [PATCH] add audio --- kernel/net/rfkill/rfkill-bt.c | 159 +++++++++------------------------------------------- 1 files changed, 28 insertions(+), 131 deletions(-) diff --git a/kernel/net/rfkill/rfkill-bt.c b/kernel/net/rfkill/rfkill-bt.c index 378fdc9..719a23d 100644 --- a/kernel/net/rfkill/rfkill-bt.c +++ b/kernel/net/rfkill/rfkill-bt.c @@ -175,11 +175,15 @@ rfkill->irq_req = 1; LOG("** disable irq\n"); disable_irq(irq->irq); - /*ret = disable_irq_wake(irq->irq);init irq wake is disabled,no need to disable*/ + ret = enable_irq_wake(irq->irq); + if (ret) + goto fail3; } return ret; +fail3: + free_irq(irq->irq, rfkill); fail2: gpio_free(irq->gpio.io); fail1: @@ -227,7 +231,6 @@ { struct rfkill_rk_data *rfkill = g_rfkill; struct rfkill_rk_gpio *wake; - bool ret; DBG("Enter %s\n", __func__); @@ -242,7 +245,7 @@ return; } - ret = cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work); + cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work); rfkill_rk_sleep_bt_internal(rfkill, sleep); @@ -271,110 +274,6 @@ return 0; } -static int proc_rk_set_power(void *data, bool blocked) -{ - struct rfkill_rk_data *rfkill = data; - struct rfkill_rk_gpio *wake_host = &rfkill->pdata->wake_host_irq.gpio; - struct rfkill_rk_gpio *poweron = &rfkill->pdata->poweron_gpio; - struct rfkill_rk_gpio *reset = &rfkill->pdata->reset_gpio; - struct rfkill_rk_gpio *rts = &rfkill->pdata->rts_gpio; - struct pinctrl *pinctrl = rfkill->pdata->pinctrl; - int wifi_power = 0; - bool toggle = false; - - DBG("Enter %s\n", __func__); - - DBG("Set blocked:%d\n", blocked); - - toggle = rfkill->pdata->power_toggle; - - - DBG("%s: toggle = %s\n", __func__, toggle ? "true" : "false"); - - if (!blocked) { - if (toggle) { - rfkill_set_wifi_bt_power(1); - msleep(100); - } - - rfkill_rk_sleep_bt(BT_WAKEUP); // ensure bt is wakeup - - if (gpio_is_valid(wake_host->io)) { - LOG("%s: set bt wake_host high!\n", __func__); - gpio_direction_output(wake_host->io, 1); - msleep(20); - } - - if (gpio_is_valid(poweron->io)) { - if (gpio_get_value(poweron->io) == !poweron->enable) { - gpio_direction_output(poweron->io, - !poweron->enable); - msleep(20); - gpio_direction_output(poweron->io, - poweron->enable); - msleep(20); - if (gpio_is_valid(wake_host->io)) - gpio_direction_input(wake_host->io); - } - } - - if (gpio_is_valid(reset->io)) { - if (gpio_get_value(reset->io) == !reset->enable) { - gpio_direction_output(reset->io, - !reset->enable); - msleep(20); - gpio_direction_output(reset->io, reset->enable); - } - } - - if (pinctrl && gpio_is_valid(rts->io)) { - pinctrl_select_state(pinctrl, rts->gpio_state); - LOG("ENABLE UART_RTS\n"); - gpio_direction_output(rts->io, rts->enable); - msleep(100); - LOG("DISABLE UART_RTS\n"); - gpio_direction_output(rts->io, !rts->enable); - pinctrl_select_state(pinctrl, rts->default_state); - } - - bt_power_state = 1; - LOG("bt turn on power\n"); - rfkill_rk_setup_wake_irq(rfkill, 1); - } else { - if (gpio_is_valid(poweron->io)) { - if (gpio_get_value(poweron->io) == poweron->enable) { - gpio_direction_output(poweron->io, - !poweron->enable); - msleep(20); - } - } - - bt_power_state = 0; - LOG("bt shut off power\n"); - if (gpio_is_valid(reset->io)) { - if (gpio_get_value(reset->io) == reset->enable) { - gpio_direction_output(reset->io, - !reset->enable); - msleep(20); - } - } - if (toggle) { - if (rfkill_get_wifi_power_state(&wifi_power)) { - LOG("%s: cannot get wifi power state!\n", __func__); - return -EPERM; - } - if (!wifi_power) { - LOG("%s: bt will set vbat to low\n", __func__); - rfkill_set_wifi_bt_power(0); - } else { - LOG("%s: bt shouldn't control the vbat\n", __func__); - } - } - } - - return 0; -} - static int rfkill_rk_set_power(void *data, bool blocked) { @@ -455,7 +354,7 @@ if (gpio_is_valid(poweron->io)) { if (gpio_get_value(poweron->io) == poweron->enable) { gpio_direction_output(poweron->io, - poweron->enable); + !poweron->enable); msleep(20); } } @@ -465,7 +364,7 @@ if (gpio_is_valid(reset->io)) { if (gpio_get_value(reset->io) == reset->enable) { gpio_direction_output(reset->io, - reset->enable); + !reset->enable); msleep(20); } } @@ -487,7 +386,6 @@ struct rfkill_rk_data *rfkill = g_rfkill; struct rfkill_rk_gpio *rts; struct rfkill_rk_irq *wake_host_irq; - struct pinctrl *pinctrl = rfkill->pdata->pinctrl; DBG("Enter %s\n", __func__); @@ -498,9 +396,9 @@ wake_host_irq = &rfkill->pdata->wake_host_irq; //To prevent uart to receive bt data when suspended - if (pinctrl && gpio_is_valid(rts->io)) { + if (rfkill->pdata->pinctrl && gpio_is_valid(rts->io)) { DBG("Disable UART_RTS\n"); - pinctrl_select_state(pinctrl, rts->gpio_state); + pinctrl_select_state(rfkill->pdata->pinctrl, rts->gpio_state); gpio_direction_output(rts->io, !rts->enable); } @@ -512,11 +410,12 @@ if (gpio_is_valid(wake_host_irq->gpio.io) && bt_power_state) { DBG("enable irq for bt wakeup host\n"); enable_irq(wake_host_irq->irq); - enable_irq_wake(wake_host_irq->irq); } #ifdef CONFIG_RFKILL_RESET - rfkill_set_states(rfkill->rfkill_dev, BT_BLOCKED, false); + rfkill_init_sw_state(rfkill->rfkill_dev, BT_BLOCKED); + rfkill_set_sw_state(rfkill->rfkill_dev, BT_BLOCKED); + rfkill_set_hw_state(rfkill->rfkill_dev, false); rfkill_rk_set_power(rfkill, BT_BLOCKED); #endif @@ -528,7 +427,6 @@ struct rfkill_rk_data *rfkill = g_rfkill; struct rfkill_rk_irq *wake_host_irq; struct rfkill_rk_gpio *rts; - struct pinctrl *pinctrl = rfkill->pdata->pinctrl; DBG("Enter %s\n", __func__); @@ -541,13 +439,12 @@ if (gpio_is_valid(wake_host_irq->gpio.io) && bt_power_state) { LOG("** disable irq\n"); disable_irq(wake_host_irq->irq); - disable_irq_wake(wake_host_irq->irq); } - if (pinctrl && gpio_is_valid(rts->io)) { + if (rfkill->pdata->pinctrl && gpio_is_valid(rts->io)) { DBG("Enable UART_RTS\n"); gpio_direction_output(rts->io, rts->enable); - pinctrl_select_state(pinctrl, rts->default_state); + pinctrl_select_state(rfkill->pdata->pinctrl, rts->default_state); } } @@ -594,9 +491,9 @@ DBG("btwrite %c\n", b); /* HCI_DEV_WRITE */ if (b != '0') - proc_rk_set_power(g_rfkill, 0); + rfkill_rk_sleep_bt(BT_WAKEUP); else - proc_rk_set_power(g_rfkill, 1); + rfkill_rk_sleep_bt(BT_SLEEP); return count; } @@ -688,16 +585,14 @@ } #endif //CONFIG_OF -static const struct file_operations bluesleep_lpm = { - .owner = THIS_MODULE, - .read = bluesleep_read_proc_lpm, - .write = bluesleep_write_proc_lpm, +static const struct proc_ops bluesleep_lpm = { + .proc_read = bluesleep_read_proc_lpm, + .proc_write = bluesleep_write_proc_lpm, }; -static const struct file_operations bluesleep_btwrite = { - .owner = THIS_MODULE, - .read = bluesleep_read_proc_btwrite, - .write = bluesleep_write_proc_btwrite, +static const struct proc_ops bluesleep_btwrite = { + .proc_read = bluesleep_read_proc_btwrite, + .proc_write = bluesleep_write_proc_btwrite, }; static int rfkill_rk_probe(struct platform_device *pdev) @@ -751,7 +646,7 @@ } /* read/write proc entries */ - ent = proc_create("lpm", 0, sleep_dir, &bluesleep_lpm); + ent = proc_create("lpm", 0444, sleep_dir, &bluesleep_lpm); if (!ent) { LOG("Unable to create /proc/%s/lpm entry", PROC_DIR); ret = -ENOMEM; @@ -759,7 +654,7 @@ } /* read/write proc entries */ - ent = proc_create("btwrite", 0, sleep_dir, &bluesleep_btwrite); + ent = proc_create("btwrite", 0444, sleep_dir, &bluesleep_btwrite); if (!ent) { LOG("Unable to create /proc/%s/btwrite entry", PROC_DIR); ret = -ENOMEM; @@ -801,7 +696,9 @@ if (!rfkill->rfkill_dev) goto fail_alloc; - rfkill_set_states(rfkill->rfkill_dev, BT_BLOCKED, false); + rfkill_init_sw_state(rfkill->rfkill_dev, BT_BLOCKED); + rfkill_set_sw_state(rfkill->rfkill_dev, BT_BLOCKED); + rfkill_set_hw_state(rfkill->rfkill_dev, false); ret = rfkill_register(rfkill->rfkill_dev); if (ret < 0) goto fail_rfkill; -- Gitblit v1.6.2