From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 11 Dec 2023 08:20:59 +0000 Subject: [PATCH] kernel_5.10 no rt --- kernel/net/rfkill/rfkill-bt.c | 180 ++++++++++-------------------------------------------------- 1 files changed, 30 insertions(+), 150 deletions(-) diff --git a/kernel/net/rfkill/rfkill-bt.c b/kernel/net/rfkill/rfkill-bt.c index a2d31bc..73b802c 100644 --- a/kernel/net/rfkill/rfkill-bt.c +++ b/kernel/net/rfkill/rfkill-bt.c @@ -25,7 +25,6 @@ #include <linux/rfkill-bt.h> #include <linux/rfkill-wlan.h> #include <linux/wakelock.h> -#include <linux/input.h> #include <linux/interrupt.h> #include <asm/irq.h> #include <linux/suspend.h> @@ -70,11 +69,9 @@ struct wake_lock bt_irq_wl; struct delayed_work bt_sleep_delay_work; int irq_req; - bool enable_power_key; }; static struct rfkill_rk_data *g_rfkill = NULL; -static struct input_dev *power_key_dev; static const char bt_name[] = #if defined(CONFIG_BCM4330) @@ -116,20 +113,6 @@ #endif ; -static int rfkill_rk_power_key_up(void) -{ - if (!power_key_dev) - return -ENODEV; - - input_report_key(power_key_dev, KEY_POWER, 1); - input_sync(power_key_dev); - msleep(20); - input_report_key(power_key_dev, KEY_POWER, 0); - input_sync(power_key_dev); - - return 0; -} - static irqreturn_t rfkill_rk_wake_host_irq(int irq, void *dev) { struct rfkill_rk_data *rfkill = dev; @@ -140,16 +123,6 @@ wake_lock_timeout(&rfkill->bt_irq_wl, msecs_to_jiffies(BT_IRQ_WAKELOCK_TIMEOUT)); - - if (rfkill->enable_power_key) - return IRQ_WAKE_THREAD; - - return IRQ_HANDLED; -} - -static irqreturn_t rfkill_rk_wake_host_irq_thread(int irq, void *dev) -{ - rfkill_rk_power_key_up(); return IRQ_HANDLED; } @@ -192,12 +165,11 @@ LOG("Request irq for bt wakeup host\n"); irq->irq = gpio_to_irq(irq->gpio.io); sprintf(irq->name, "%s_irq", irq->gpio.name); - ret = request_threaded_irq(irq->irq, rfkill_rk_wake_host_irq, - rfkill_rk_wake_host_irq_thread, - IRQF_ONESHOT | ((irq->gpio.enable == GPIO_ACTIVE_LOW) ? - IRQF_TRIGGER_FALLING : - IRQF_TRIGGER_RISING), - irq->name, rfkill); + ret = request_irq(irq->irq, rfkill_rk_wake_host_irq, + (irq->gpio.enable == GPIO_ACTIVE_LOW) ? + IRQF_TRIGGER_FALLING : + IRQF_TRIGGER_RISING, + irq->name, rfkill); if (ret) goto fail2; rfkill->irq_req = 1; @@ -255,7 +227,6 @@ { struct rfkill_rk_data *rfkill = g_rfkill; struct rfkill_rk_gpio *wake; - bool ret; DBG("Enter %s\n", __func__); @@ -270,7 +241,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); @@ -342,8 +313,6 @@ gpio_direction_output(poweron->io, poweron->enable); msleep(20); - if (gpio_is_valid(wake_host->io)) - gpio_direction_input(wake_host->io); } } @@ -354,6 +323,11 @@ msleep(20); gpio_direction_output(reset->io, reset->enable); } + } + + if (gpio_is_valid(wake_host->io)) { + LOG("%s: set bt wake_host input!\n", __func__); + gpio_direction_input(wake_host->io); } if (pinctrl && gpio_is_valid(rts->io)) { @@ -409,7 +383,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__); @@ -420,9 +393,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); } @@ -438,7 +411,9 @@ } #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 @@ -450,7 +425,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__); @@ -466,10 +440,10 @@ 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); } } @@ -514,56 +488,11 @@ return -EFAULT; DBG("btwrite %c\n", b); + /* HCI_DEV_WRITE */ if (b != '0') rfkill_rk_sleep_bt(BT_WAKEUP); else rfkill_rk_sleep_bt(BT_SLEEP); - - return count; -} - -static ssize_t bluesleep_read_proc_powerupkey(struct file *file, - char __user *buffer, size_t count, - loff_t *data) -{ - struct rfkill_rk_data *rfkill = g_rfkill; - char src[2]; - - if (*data >= 1) - return 0; - - if (!rfkill) - return -EFAULT; - - src[0] = rfkill->enable_power_key ? '1' : '0'; - src[1] = '\n'; - if (copy_to_user(buffer, src, 2)) - return -EFAULT; - *data = 1; - - return 2; -} - -static ssize_t bluesleep_write_proc_powerupkey(struct file *file, - const char __user *buffer, - size_t count, loff_t *data) -{ - char b; - struct rfkill_rk_data *rfkill = g_rfkill; - - if (!rfkill) - return -EFAULT; - - if (count < 1) - return -EINVAL; - - if (copy_from_user(&b, buffer, 1)) - return -EFAULT; - - if (b != '0') - rfkill->enable_power_key = true; - else - rfkill->enable_power_key = false; return count; } @@ -655,50 +584,15 @@ } #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 const struct file_operations bluesleep_powerupkey = { - .owner = THIS_MODULE, - .read = bluesleep_read_proc_powerupkey, - .write = bluesleep_write_proc_powerupkey, -}; - -static int rfkill_rk_register_power_key(void) -{ - int ret = 0; - - /* register input device */ - power_key_dev = input_allocate_device(); - if (!power_key_dev) { - LOG("ir_dev: not enough memory for input device\n"); - return -ENOMEM; - } - - power_key_dev->name = "bt-powerkey"; - power_key_dev->id.bustype = BUS_HOST; - - power_key_dev->evbit[0] = BIT_MASK(EV_KEY); - set_bit(KEY_POWER, power_key_dev->keybit); - - ret = input_register_device(power_key_dev); - if (ret) { - input_free_device(power_key_dev); - LOG("ir_rx_init: register input device exception, exit\n"); - return -EBUSY; - } - - return ret; -} static int rfkill_rk_probe(struct platform_device *pdev) { @@ -751,7 +645,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,17 +653,9 @@ } /* 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; - goto fail_alloc; - } - - /* read/write proc entries */ - ent = proc_create("powerupkey", 0, sleep_dir, &bluesleep_powerupkey); - if (!ent) { - LOG("Unable to create /proc/%s/powerupkey entry", PROC_DIR); ret = -ENOMEM; goto fail_alloc; } @@ -809,7 +695,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; @@ -832,16 +720,12 @@ LOG("%s device registered.\n", pdata->name); - if (rfkill_rk_register_power_key() != 0) - goto fail_rfkill; - return 0; fail_rfkill: rfkill_destroy(rfkill->rfkill_dev); fail_alloc: - remove_proc_entry("powerupkey", sleep_dir); remove_proc_entry("btwrite", sleep_dir); remove_proc_entry("lpm", sleep_dir); fail_setup_wake_irq: @@ -860,11 +744,7 @@ rfkill_unregister(rfkill->rfkill_dev); rfkill_destroy(rfkill->rfkill_dev); - remove_proc_entry("powerupkey", sleep_dir); - remove_proc_entry("btwrite", sleep_dir); - remove_proc_entry("lpm", sleep_dir); - input_unregister_device(power_key_dev); cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work); // free gpio -- Gitblit v1.6.2