hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/net/rfkill/rfkill-bt.c
....@@ -25,7 +25,6 @@
2525 #include <linux/rfkill-bt.h>
2626 #include <linux/rfkill-wlan.h>
2727 #include <linux/wakelock.h>
28
-#include <linux/input.h>
2928 #include <linux/interrupt.h>
3029 #include <asm/irq.h>
3130 #include <linux/suspend.h>
....@@ -70,11 +69,9 @@
7069 struct wake_lock bt_irq_wl;
7170 struct delayed_work bt_sleep_delay_work;
7271 int irq_req;
73
- bool enable_power_key;
7472 };
7573
7674 static struct rfkill_rk_data *g_rfkill = NULL;
77
-static struct input_dev *power_key_dev;
7875
7976 static const char bt_name[] =
8077 #if defined(CONFIG_BCM4330)
....@@ -116,20 +113,6 @@
116113 #endif
117114 ;
118115
119
-static int rfkill_rk_power_key_up(void)
120
-{
121
- if (!power_key_dev)
122
- return -ENODEV;
123
-
124
- input_report_key(power_key_dev, KEY_POWER, 1);
125
- input_sync(power_key_dev);
126
- msleep(20);
127
- input_report_key(power_key_dev, KEY_POWER, 0);
128
- input_sync(power_key_dev);
129
-
130
- return 0;
131
-}
132
-
133116 static irqreturn_t rfkill_rk_wake_host_irq(int irq, void *dev)
134117 {
135118 struct rfkill_rk_data *rfkill = dev;
....@@ -140,16 +123,6 @@
140123
141124 wake_lock_timeout(&rfkill->bt_irq_wl,
142125 msecs_to_jiffies(BT_IRQ_WAKELOCK_TIMEOUT));
143
-
144
- if (rfkill->enable_power_key)
145
- return IRQ_WAKE_THREAD;
146
-
147
- return IRQ_HANDLED;
148
-}
149
-
150
-static irqreturn_t rfkill_rk_wake_host_irq_thread(int irq, void *dev)
151
-{
152
- rfkill_rk_power_key_up();
153126
154127 return IRQ_HANDLED;
155128 }
....@@ -192,12 +165,11 @@
192165 LOG("Request irq for bt wakeup host\n");
193166 irq->irq = gpio_to_irq(irq->gpio.io);
194167 sprintf(irq->name, "%s_irq", irq->gpio.name);
195
- ret = request_threaded_irq(irq->irq, rfkill_rk_wake_host_irq,
196
- rfkill_rk_wake_host_irq_thread,
197
- IRQF_ONESHOT | ((irq->gpio.enable == GPIO_ACTIVE_LOW) ?
198
- IRQF_TRIGGER_FALLING :
199
- IRQF_TRIGGER_RISING),
200
- irq->name, rfkill);
168
+ ret = request_irq(irq->irq, rfkill_rk_wake_host_irq,
169
+ (irq->gpio.enable == GPIO_ACTIVE_LOW) ?
170
+ IRQF_TRIGGER_FALLING :
171
+ IRQF_TRIGGER_RISING,
172
+ irq->name, rfkill);
201173 if (ret)
202174 goto fail2;
203175 rfkill->irq_req = 1;
....@@ -255,7 +227,6 @@
255227 {
256228 struct rfkill_rk_data *rfkill = g_rfkill;
257229 struct rfkill_rk_gpio *wake;
258
- bool ret;
259230
260231 DBG("Enter %s\n", __func__);
261232
....@@ -270,7 +241,7 @@
270241 return;
271242 }
272243
273
- ret = cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work);
244
+ cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work);
274245
275246 rfkill_rk_sleep_bt_internal(rfkill, sleep);
276247
....@@ -342,8 +313,6 @@
342313 gpio_direction_output(poweron->io,
343314 poweron->enable);
344315 msleep(20);
345
- if (gpio_is_valid(wake_host->io))
346
- gpio_direction_input(wake_host->io);
347316 }
348317 }
349318
....@@ -354,6 +323,11 @@
354323 msleep(20);
355324 gpio_direction_output(reset->io, reset->enable);
356325 }
326
+ }
327
+
328
+ if (gpio_is_valid(wake_host->io)) {
329
+ LOG("%s: set bt wake_host input!\n", __func__);
330
+ gpio_direction_input(wake_host->io);
357331 }
358332
359333 if (pinctrl && gpio_is_valid(rts->io)) {
....@@ -409,7 +383,6 @@
409383 struct rfkill_rk_data *rfkill = g_rfkill;
410384 struct rfkill_rk_gpio *rts;
411385 struct rfkill_rk_irq *wake_host_irq;
412
- struct pinctrl *pinctrl = rfkill->pdata->pinctrl;
413386
414387 DBG("Enter %s\n", __func__);
415388
....@@ -420,9 +393,9 @@
420393 wake_host_irq = &rfkill->pdata->wake_host_irq;
421394
422395 //To prevent uart to receive bt data when suspended
423
- if (pinctrl && gpio_is_valid(rts->io)) {
396
+ if (rfkill->pdata->pinctrl && gpio_is_valid(rts->io)) {
424397 DBG("Disable UART_RTS\n");
425
- pinctrl_select_state(pinctrl, rts->gpio_state);
398
+ pinctrl_select_state(rfkill->pdata->pinctrl, rts->gpio_state);
426399 gpio_direction_output(rts->io, !rts->enable);
427400 }
428401
....@@ -438,7 +411,9 @@
438411 }
439412
440413 #ifdef CONFIG_RFKILL_RESET
441
- rfkill_set_states(rfkill->rfkill_dev, BT_BLOCKED, false);
414
+ rfkill_init_sw_state(rfkill->rfkill_dev, BT_BLOCKED);
415
+ rfkill_set_sw_state(rfkill->rfkill_dev, BT_BLOCKED);
416
+ rfkill_set_hw_state(rfkill->rfkill_dev, false);
442417 rfkill_rk_set_power(rfkill, BT_BLOCKED);
443418 #endif
444419
....@@ -450,7 +425,6 @@
450425 struct rfkill_rk_data *rfkill = g_rfkill;
451426 struct rfkill_rk_irq *wake_host_irq;
452427 struct rfkill_rk_gpio *rts;
453
- struct pinctrl *pinctrl = rfkill->pdata->pinctrl;
454428
455429 DBG("Enter %s\n", __func__);
456430
....@@ -466,10 +440,10 @@
466440 disable_irq_wake(wake_host_irq->irq);
467441 }
468442
469
- if (pinctrl && gpio_is_valid(rts->io)) {
443
+ if (rfkill->pdata->pinctrl && gpio_is_valid(rts->io)) {
470444 DBG("Enable UART_RTS\n");
471445 gpio_direction_output(rts->io, rts->enable);
472
- pinctrl_select_state(pinctrl, rts->default_state);
446
+ pinctrl_select_state(rfkill->pdata->pinctrl, rts->default_state);
473447 }
474448 }
475449
....@@ -514,56 +488,11 @@
514488 return -EFAULT;
515489
516490 DBG("btwrite %c\n", b);
491
+ /* HCI_DEV_WRITE */
517492 if (b != '0')
518493 rfkill_rk_sleep_bt(BT_WAKEUP);
519494 else
520495 rfkill_rk_sleep_bt(BT_SLEEP);
521
-
522
- return count;
523
-}
524
-
525
-static ssize_t bluesleep_read_proc_powerupkey(struct file *file,
526
- char __user *buffer, size_t count,
527
- loff_t *data)
528
-{
529
- struct rfkill_rk_data *rfkill = g_rfkill;
530
- char src[2];
531
-
532
- if (*data >= 1)
533
- return 0;
534
-
535
- if (!rfkill)
536
- return -EFAULT;
537
-
538
- src[0] = rfkill->enable_power_key ? '1' : '0';
539
- src[1] = '\n';
540
- if (copy_to_user(buffer, src, 2))
541
- return -EFAULT;
542
- *data = 1;
543
-
544
- return 2;
545
-}
546
-
547
-static ssize_t bluesleep_write_proc_powerupkey(struct file *file,
548
- const char __user *buffer,
549
- size_t count, loff_t *data)
550
-{
551
- char b;
552
- struct rfkill_rk_data *rfkill = g_rfkill;
553
-
554
- if (!rfkill)
555
- return -EFAULT;
556
-
557
- if (count < 1)
558
- return -EINVAL;
559
-
560
- if (copy_from_user(&b, buffer, 1))
561
- return -EFAULT;
562
-
563
- if (b != '0')
564
- rfkill->enable_power_key = true;
565
- else
566
- rfkill->enable_power_key = false;
567496
568497 return count;
569498 }
....@@ -655,50 +584,15 @@
655584 }
656585 #endif //CONFIG_OF
657586
658
-static const struct file_operations bluesleep_lpm = {
659
- .owner = THIS_MODULE,
660
- .read = bluesleep_read_proc_lpm,
661
- .write = bluesleep_write_proc_lpm,
587
+static const struct proc_ops bluesleep_lpm = {
588
+ .proc_read = bluesleep_read_proc_lpm,
589
+ .proc_write = bluesleep_write_proc_lpm,
662590 };
663591
664
-static const struct file_operations bluesleep_btwrite = {
665
- .owner = THIS_MODULE,
666
- .read = bluesleep_read_proc_btwrite,
667
- .write = bluesleep_write_proc_btwrite,
592
+static const struct proc_ops bluesleep_btwrite = {
593
+ .proc_read = bluesleep_read_proc_btwrite,
594
+ .proc_write = bluesleep_write_proc_btwrite,
668595 };
669
-
670
-static const struct file_operations bluesleep_powerupkey = {
671
- .owner = THIS_MODULE,
672
- .read = bluesleep_read_proc_powerupkey,
673
- .write = bluesleep_write_proc_powerupkey,
674
-};
675
-
676
-static int rfkill_rk_register_power_key(void)
677
-{
678
- int ret = 0;
679
-
680
- /* register input device */
681
- power_key_dev = input_allocate_device();
682
- if (!power_key_dev) {
683
- LOG("ir_dev: not enough memory for input device\n");
684
- return -ENOMEM;
685
- }
686
-
687
- power_key_dev->name = "bt-powerkey";
688
- power_key_dev->id.bustype = BUS_HOST;
689
-
690
- power_key_dev->evbit[0] = BIT_MASK(EV_KEY);
691
- set_bit(KEY_POWER, power_key_dev->keybit);
692
-
693
- ret = input_register_device(power_key_dev);
694
- if (ret) {
695
- input_free_device(power_key_dev);
696
- LOG("ir_rx_init: register input device exception, exit\n");
697
- return -EBUSY;
698
- }
699
-
700
- return ret;
701
-}
702596
703597 static int rfkill_rk_probe(struct platform_device *pdev)
704598 {
....@@ -751,7 +645,7 @@
751645 }
752646
753647 /* read/write proc entries */
754
- ent = proc_create("lpm", 0, sleep_dir, &bluesleep_lpm);
648
+ ent = proc_create("lpm", 0444, sleep_dir, &bluesleep_lpm);
755649 if (!ent) {
756650 LOG("Unable to create /proc/%s/lpm entry", PROC_DIR);
757651 ret = -ENOMEM;
....@@ -759,17 +653,9 @@
759653 }
760654
761655 /* read/write proc entries */
762
- ent = proc_create("btwrite", 0, sleep_dir, &bluesleep_btwrite);
656
+ ent = proc_create("btwrite", 0444, sleep_dir, &bluesleep_btwrite);
763657 if (!ent) {
764658 LOG("Unable to create /proc/%s/btwrite entry", PROC_DIR);
765
- ret = -ENOMEM;
766
- goto fail_alloc;
767
- }
768
-
769
- /* read/write proc entries */
770
- ent = proc_create("powerupkey", 0, sleep_dir, &bluesleep_powerupkey);
771
- if (!ent) {
772
- LOG("Unable to create /proc/%s/powerupkey entry", PROC_DIR);
773659 ret = -ENOMEM;
774660 goto fail_alloc;
775661 }
....@@ -809,7 +695,9 @@
809695 if (!rfkill->rfkill_dev)
810696 goto fail_alloc;
811697
812
- rfkill_set_states(rfkill->rfkill_dev, BT_BLOCKED, false);
698
+ rfkill_init_sw_state(rfkill->rfkill_dev, BT_BLOCKED);
699
+ rfkill_set_sw_state(rfkill->rfkill_dev, BT_BLOCKED);
700
+ rfkill_set_hw_state(rfkill->rfkill_dev, false);
813701 ret = rfkill_register(rfkill->rfkill_dev);
814702 if (ret < 0)
815703 goto fail_rfkill;
....@@ -832,16 +720,12 @@
832720
833721 LOG("%s device registered.\n", pdata->name);
834722
835
- if (rfkill_rk_register_power_key() != 0)
836
- goto fail_rfkill;
837
-
838723 return 0;
839724
840725 fail_rfkill:
841726 rfkill_destroy(rfkill->rfkill_dev);
842727 fail_alloc:
843728
844
- remove_proc_entry("powerupkey", sleep_dir);
845729 remove_proc_entry("btwrite", sleep_dir);
846730 remove_proc_entry("lpm", sleep_dir);
847731 fail_setup_wake_irq:
....@@ -860,11 +744,7 @@
860744
861745 rfkill_unregister(rfkill->rfkill_dev);
862746 rfkill_destroy(rfkill->rfkill_dev);
863
- remove_proc_entry("powerupkey", sleep_dir);
864
- remove_proc_entry("btwrite", sleep_dir);
865
- remove_proc_entry("lpm", sleep_dir);
866747
867
- input_unregister_device(power_key_dev);
868748 cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work);
869749
870750 // free gpio