hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/net/wireless/rockchip_wlan/uwe5621ds/unisocwcn/platform/wcn_boot.c
....@@ -17,11 +17,13 @@
1717 #include <linux/firmware.h>
1818 #include <linux/file.h>
1919 #include <linux/kernel.h>
20
+#include <linux/input.h>
2021 #include <linux/module.h>
2122 #include <linux/mfd/syscon.h>
2223 #include <linux/of_gpio.h>
2324 #include <linux/of_device.h>
2425 #include <linux/platform_device.h>
26
+#include <linux/proc_fs.h>
2527 #include <linux/regulator/consumer.h>
2628 #include <linux/regmap.h>
2729 #include <linux/slab.h>
....@@ -430,6 +432,14 @@
430432 * 0x5663000x: Marlin3E series
431433 * 0: read chipid fail or not unisoc module
432434 */
435
+
436
+#ifdef CONFIG_RK_BOARD
437
+#define PROC_DIR "bluetooth/sleep"
438
+static struct proc_dir_entry *bluetooth_dir, *sleep_dir;
439
+static struct input_dev *power_key_dev;
440
+static unsigned char enable_power_key = 0;
441
+#endif
442
+
433443 #define WCN_CHIPID_MASK (0xFFFFF000)
434444 unsigned int marlin_get_wcn_chipid(void)
435445 {
....@@ -1418,12 +1428,111 @@
14181428 disable_irq(marlin_dev->bt_wake_host_int_num);
14191429 }
14201430
1431
+#if defined CONFIG_RK_BOARD
1432
+static int rkbt_power_key_up(void)
1433
+{
1434
+ if (!power_key_dev)
1435
+ return -ENODEV;
1436
+ input_report_key(power_key_dev, KEY_POWER, 1);
1437
+ input_sync(power_key_dev);
1438
+ msleep(20);
1439
+ input_report_key(power_key_dev, KEY_POWER, 0);
1440
+ input_sync(power_key_dev);
1441
+
1442
+ return 0;
1443
+}
1444
+
1445
+static irqreturn_t rkbt_wake_host_irq_thread(int irq, void *dev)
1446
+{
1447
+ rkbt_power_key_up();
1448
+
1449
+ return IRQ_HANDLED;
1450
+}
1451
+
1452
+static ssize_t bluesleep_read_proc_powerupkey(struct file *file,
1453
+ char __user *buffer, size_t count,
1454
+ loff_t *data)
1455
+{
1456
+ char src[2];
1457
+
1458
+ if (*data >= 1)
1459
+ return 0;
1460
+
1461
+ src[0] = enable_power_key ? '1' : '0';
1462
+ src[1] = '\n';
1463
+ if (copy_to_user(buffer, src, 2))
1464
+ return -EFAULT;
1465
+ *data = 1;
1466
+
1467
+ return 2;
1468
+}
1469
+
1470
+static ssize_t bluesleep_write_proc_powerupkey(struct file *file,
1471
+ const char __user *buffer,
1472
+ size_t count, loff_t *data)
1473
+{
1474
+ char b;
1475
+
1476
+ if (count < 1)
1477
+ return -EINVAL;
1478
+
1479
+ if (copy_from_user(&b, buffer, 1))
1480
+ return -EFAULT;
1481
+
1482
+ if (b != '0')
1483
+ enable_power_key = 1;
1484
+ else
1485
+ enable_power_key = 0;
1486
+
1487
+ return count;
1488
+}
1489
+
1490
+static const struct file_operations bluesleep_powerupkey = {
1491
+ .owner = THIS_MODULE,
1492
+ .read = bluesleep_read_proc_powerupkey,
1493
+ .write = bluesleep_write_proc_powerupkey,
1494
+};
1495
+
1496
+static int rkbt_register_power_key(void)
1497
+{
1498
+ int ret = 0;
1499
+
1500
+ /* register input device */
1501
+ power_key_dev = input_allocate_device();
1502
+ if (!power_key_dev) {
1503
+ WCN_ERR("ir_dev: not enough memory for input device\n");
1504
+ return -ENOMEM;
1505
+ }
1506
+
1507
+ power_key_dev->name = "bt-powerkey";
1508
+ power_key_dev->id.bustype = BUS_HOST;
1509
+
1510
+ power_key_dev->evbit[0] = BIT_MASK(EV_KEY);
1511
+ set_bit(KEY_POWER, power_key_dev->keybit);
1512
+
1513
+ ret = input_register_device(power_key_dev);
1514
+ if (ret) {
1515
+ input_free_device(power_key_dev);
1516
+ WCN_ERR("ir_rx_init: register input device exception, exit\n");
1517
+ return -EBUSY;
1518
+ }
1519
+
1520
+ return ret;
1521
+}
1522
+#endif
1523
+
14211524 static irqreturn_t marlin_bt_wake_int_isr(int irq, void *para)
14221525 {
14231526 static int bt_wake_cnt;
14241527
14251528 bt_wake_cnt++;
14261529 WCN_DEBUG("bt_wake_irq_cnt %d\n", bt_wake_cnt);
1530
+
1531
+ #if defined CONFIG_RK_BOARD
1532
+ if (enable_power_key)
1533
+ return IRQ_WAKE_THREAD;
1534
+ #endif
1535
+
14271536 return IRQ_HANDLED;
14281537 }
14291538
....@@ -1466,12 +1575,22 @@
14661575 return ret;
14671576 }
14681577
1578
+ #if defined CONFIG_RK_BOARD
1579
+ ret = request_threaded_irq(marlin_dev->bt_wake_host_int_num,
1580
+ marlin_bt_wake_int_isr,
1581
+ rkbt_wake_host_irq_thread,
1582
+ IRQF_ONESHOT | IRQF_TRIGGER_RISING |
1583
+ IRQF_NO_SUSPEND,
1584
+ "bt_wake_isr",
1585
+ NULL);
1586
+ #else
14691587 ret = request_irq(marlin_dev->bt_wake_host_int_num,
14701588 marlin_bt_wake_int_isr,
14711589 IRQF_TRIGGER_RISING |
14721590 IRQF_NO_SUSPEND,
14731591 "bt_wake_isr",
14741592 NULL);
1593
+ #endif
14751594 if (ret != 0) {
14761595 WCN_ERR("req bt_hostwake irq-%d err! ret=%d",
14771596 marlin_dev->bt_wake_host_int_num, ret);
....@@ -3971,6 +4090,9 @@
39714090 static void marlin_reset_notify_init(void);
39724091 static int marlin_probe(struct platform_device *pdev)
39734092 {
4093
+#if defined CONFIG_RK_BOARD
4094
+ struct proc_dir_entry *ent;
4095
+#endif
39744096 #ifdef CONFIG_WCN_PMIC
39754097 struct device_node *regmap_np;
39764098 struct platform_device *pdev_regmap = NULL;
....@@ -4074,13 +4196,44 @@
40744196 marlin_dev->marlin_probe_status = 1;
40754197 #endif
40764198
4077
- WCN_INFO("marlin_probe ok!\n");
4199
+#if defined CONFIG_RK_BOARD
4200
+ bluetooth_dir = proc_mkdir("bluetooth", NULL);
4201
+ if (!bluetooth_dir) {
4202
+ WCN_ERR("Unable to create /proc/bluetooth directory");
4203
+ return -ENOMEM;
4204
+ }
40784205
4206
+ sleep_dir = proc_mkdir("sleep", bluetooth_dir);
4207
+ if (!sleep_dir) {
4208
+ WCN_ERR("Unable to create /proc/%s directory", PROC_DIR);
4209
+ return -ENOMEM;
4210
+ }
4211
+
4212
+ /* read/write proc entries */
4213
+ ent = proc_create("powerupkey", 0, sleep_dir, &bluesleep_powerupkey);
4214
+ if (!ent) {
4215
+ WCN_ERR("Unable to create /proc/%s/powerupkey entry", PROC_DIR);
4216
+ remove_proc_entry("powerupkey", sleep_dir);
4217
+ return -ENOMEM;
4218
+ }
4219
+
4220
+ if (rkbt_register_power_key() != 0) {
4221
+ WCN_ERR("Unable to register power_key");
4222
+ return -EBUSY;
4223
+ }
4224
+#endif
4225
+
4226
+ WCN_INFO("marlin_probe ok!\n");
40794227 return 0;
40804228 }
40814229
40824230 static int marlin_remove(struct platform_device *pdev)
40834231 {
4232
+#if defined CONFIG_RK_BOARD
4233
+ input_unregister_device(power_key_dev);
4234
+ remove_proc_entry("powerupkey", sleep_dir);
4235
+#endif
4236
+
40844237 #if (defined(CONFIG_BT_WAKE_HOST_EN) && defined(CONFIG_AW_BOARD)) \
40854238 || defined(CONFIG_RK_BOARD)
40864239 marlin_unregistsr_bt_wake();