1 /*
2 * Copyright (C) 2012 ROCKCHIP, Inc.
3 *
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 */
14 /* Rock-chips rfkill driver for bluetooth
15 *
16 */
17
18 #include <linux/kernel.h>
19 #include <linux/platform_device.h>
20 #include <linux/module.h>
21 #include <linux/rfkill.h>
22 #include <linux/init.h>
23 #include <linux/slab.h>
24 #include <linux/delay.h>
25 #include <linux/rfkill-bt.h>
26 #include <linux/rfkill-wlan.h>
27 #include <linux/wakelock.h>
28 #include <linux/interrupt.h>
29 #include <asm/irq.h>
30 #include <linux/suspend.h>
31 #include <linux/proc_fs.h>
32 #include <linux/uaccess.h>
33 #include <linux/gpio.h>
34 #include <linux/fs.h>
35 #include <dt-bindings/gpio/gpio.h>
36 #include <uapi/linux/rfkill.h>
37 #ifdef CONFIG_OF
38 #include <linux/of.h>
39 #include <linux/of_device.h>
40 #include <linux/of_gpio.h>
41 #endif
42
43 #define DBG(x...) pr_info("[BT_RFKILL]: " x)
44 #define LOG(x...) pr_info("[BT_RFKILL]: " x)
45
46 #define BT_WAKEUP_TIMEOUT 10000
47 #define BT_IRQ_WAKELOCK_TIMEOUT (10 * 1000)
48
49 #define BT_BLOCKED true
50 #define BT_UNBLOCK false
51 #define BT_SLEEP true
52 #define BT_WAKEUP false
53
54 enum {
55 IOMUX_FNORMAL = 0,
56 IOMUX_FGPIO,
57 IOMUX_FMUX,
58 };
59
60 struct rfkill_rk_data {
61 struct rfkill_rk_platform_data *pdata;
62 struct platform_device *pdev;
63 struct rfkill *rfkill_dev;
64 struct wake_lock bt_irq_wl;
65 struct delayed_work bt_sleep_delay_work;
66 int irq_req;
67 };
68
69 static struct rfkill_rk_data *g_rfkill = NULL;
70
71 static const char bt_name[] =
72 #if defined(CONFIG_BCM4330)
73 #if defined(CONFIG_BT_MODULE_NH660)
74 "nh660"
75 #else
76 "bcm4330"
77 #endif
78 #elif defined(CONFIG_RK903)
79 #if defined(CONFIG_RKWIFI_26M)
80 "rk903_26M"
81 #else
82 "rk903"
83 #endif
84 #elif defined(CONFIG_BCM4329)
85 "bcm4329"
86 #elif defined(CONFIG_MV8787)
87 "mv8787"
88 #elif defined(CONFIG_AP6210)
89 #if defined(CONFIG_RKWIFI_26M)
90 "ap6210"
91 #else
92 "ap6210_24M"
93 #endif
94 #elif defined(CONFIG_AP6330)
95 "ap6330"
96 #elif defined(CONFIG_AP6476)
97 "ap6476"
98 #elif defined(CONFIG_AP6493)
99 "ap6493"
100 #elif defined(CONFIG_AP6441)
101 "ap6441"
102 #elif defined(CONFIG_AP6335)
103 "ap6335"
104 #elif defined(CONFIG_GB86302I)
105 "gb86302i"
106 #else
107 "bt_default"
108 #endif
109 ;
110
rfkill_rk_wake_host_irq(int irq,void * dev)111 static irqreturn_t rfkill_rk_wake_host_irq(int irq, void *dev)
112 {
113 struct rfkill_rk_data *rfkill = dev;
114
115 LOG("BT_WAKE_HOST IRQ fired\n");
116
117 DBG("BT IRQ wakeup, request %dms wakelock\n", BT_IRQ_WAKELOCK_TIMEOUT);
118
119 wake_lock_timeout(&rfkill->bt_irq_wl, msecs_to_jiffies(BT_IRQ_WAKELOCK_TIMEOUT));
120
121 return IRQ_HANDLED;
122 }
123
rfkill_rk_setup_gpio(struct platform_device * pdev,struct rfkill_rk_gpio * gpio,const char * prefix,const char * name)124 static int rfkill_rk_setup_gpio(struct platform_device *pdev, struct rfkill_rk_gpio *gpio, const char *prefix,
125 const char *name)
126 {
127 if (gpio_is_valid(gpio->io)) {
128 int ret = 0;
129
130 sprintf(gpio->name, "%s_%s", prefix, name);
131 ret = devm_gpio_request(&pdev->dev, gpio->io, gpio->name);
132 if (ret) {
133 LOG("Failed to get %s gpio.\n", gpio->name);
134 return -1;
135 }
136 }
137
138 return 0;
139 }
140
rfkill_rk_setup_wake_irq(struct rfkill_rk_data * rfkill,int flag)141 static int rfkill_rk_setup_wake_irq(struct rfkill_rk_data *rfkill, int flag)
142 {
143 int ret = 0;
144 struct rfkill_rk_irq *irq = &rfkill->pdata->wake_host_irq;
145
146 if (!flag) {
147 rfkill->irq_req = 0;
148 ret = rfkill_rk_setup_gpio(rfkill->pdev, &irq->gpio, rfkill->pdata->name, "wake_host");
149 if (ret) {
150 goto fail1;
151 }
152 }
153 if (gpio_is_valid(irq->gpio.io)) {
154 if (rfkill->irq_req) {
155 rfkill->irq_req = 0;
156 free_irq(irq->irq, rfkill);
157 }
158 LOG("Request irq for bt wakeup host\n");
159 irq->irq = gpio_to_irq(irq->gpio.io);
160 sprintf(irq->name, "%s_irq", irq->gpio.name);
161 ret = request_irq(irq->irq, rfkill_rk_wake_host_irq,
162 (irq->gpio.enable == GPIO_ACTIVE_LOW) ? IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING, irq->name,
163 rfkill);
164 if (ret) {
165 goto fail2;
166 }
167 rfkill->irq_req = 1;
168 LOG("** disable irq\n");
169 disable_irq(irq->irq);
170 ret = enable_irq_wake(irq->irq);
171 if (ret) {
172 goto fail3;
173 }
174 }
175
176 return ret;
177
178 fail3:
179 free_irq(irq->irq, rfkill);
180 fail2:
181 gpio_free(irq->gpio.io);
182 fail1:
183 return ret;
184 }
185
rfkill_rk_sleep_bt_internal(struct rfkill_rk_data * rfkill,bool sleep)186 static inline void rfkill_rk_sleep_bt_internal(struct rfkill_rk_data *rfkill, bool sleep)
187 {
188 struct rfkill_rk_gpio *wake = &rfkill->pdata->wake_gpio;
189
190 DBG("*** bt sleep: %d ***\n", sleep);
191 #ifndef CONFIG_BK3515A_COMBO
192 gpio_direction_output(wake->io, sleep ? !wake->enable : wake->enable);
193 #else
194 if (!sleep) {
195 DBG("HOST_UART0_TX pull down 10us\n");
196 if (rfkill_rk_setup_gpio(rfkill->pdev, wake, rfkill->pdata->name, "wake") != 0) {
197 return;
198 }
199
200 gpio_direction_output(wake->io, wake->enable);
201 usleep_range(0x0A, 0x14);
202 gpio_direction_output(wake->io, !wake->enable);
203
204 gpio_free(wake->io);
205 }
206 #endif
207 }
208
rfkill_rk_delay_sleep_bt(struct work_struct * work)209 static void rfkill_rk_delay_sleep_bt(struct work_struct *work)
210 {
211 struct rfkill_rk_data *rfkill = NULL;
212
213 DBG("Enter %s\n", __func__);
214
215 rfkill = container_of(work, struct rfkill_rk_data, bt_sleep_delay_work.work);
216
217 rfkill_rk_sleep_bt_internal(rfkill, BT_SLEEP);
218 }
219
rfkill_rk_sleep_bt(bool sleep)220 void rfkill_rk_sleep_bt(bool sleep)
221 {
222 struct rfkill_rk_data *rfkill = g_rfkill;
223 struct rfkill_rk_gpio *wake;
224 bool ret;
225
226 DBG("Enter %s\n", __func__);
227
228 if (!rfkill) {
229 LOG("*** RFKILL is empty???\n");
230 return;
231 }
232
233 wake = &rfkill->pdata->wake_gpio;
234 if (!gpio_is_valid(wake->io)) {
235 DBG("*** Not support bt wakeup and sleep\n");
236 return;
237 }
238
239 ret = cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work);
240
241 rfkill_rk_sleep_bt_internal(rfkill, sleep);
242
243 #ifdef CONFIG_BT_AUTOSLEEP
244 if (sleep == BT_WAKEUP) {
245 schedule_delayed_work(&rfkill->bt_sleep_delay_work, msecs_to_jiffies(BT_WAKEUP_TIMEOUT));
246 }
247 #endif
248 }
249 EXPORT_SYMBOL(rfkill_rk_sleep_bt);
250
251 static int bt_power_state = 0;
rfkill_get_bt_power_state(int * power,bool * toggle)252 int rfkill_get_bt_power_state(int *power, bool *toggle)
253 {
254 struct rfkill_rk_data *mrfkill = g_rfkill;
255
256 if (!mrfkill) {
257 LOG("%s: rfkill-bt driver has not Successful initialized\n", __func__);
258 return -1;
259 }
260
261 *toggle = mrfkill->pdata->power_toggle;
262 *power = bt_power_state;
263
264 return 0;
265 }
266
rfkill_rk_set_power(void * data,bool blocked)267 static int rfkill_rk_set_power(void *data, bool blocked)
268 {
269 struct rfkill_rk_data *rfkill = data;
270 struct rfkill_rk_gpio *wake_host = &rfkill->pdata->wake_host_irq.gpio;
271 struct rfkill_rk_gpio *poweron = &rfkill->pdata->poweron_gpio;
272 struct rfkill_rk_gpio *reset = &rfkill->pdata->reset_gpio;
273 struct rfkill_rk_gpio *rts = &rfkill->pdata->rts_gpio;
274 struct pinctrl *pinctrl = rfkill->pdata->pinctrl;
275 int wifi_power = 0;
276 bool toggle = false;
277
278 DBG("Enter %s\n", __func__);
279
280 DBG("Set blocked:%d\n", blocked);
281
282 toggle = rfkill->pdata->power_toggle;
283
284 if (toggle) {
285 if (rfkill_get_wifi_power_state(&wifi_power)) {
286 LOG("%s: cannot get wifi power state!\n", __func__);
287 return -1;
288 }
289 }
290
291 DBG("%s: toggle = %s\n", __func__, toggle ? "true" : "false");
292
293 if (!blocked) {
294 if (toggle) {
295 rfkill_set_wifi_bt_power(1);
296 msleep(0x64);
297 }
298
299 rfkill_rk_sleep_bt(BT_WAKEUP); // ensure bt is wakeup
300
301 if (gpio_is_valid(wake_host->io)) {
302 LOG("%s: set bt wake_host high!\n", __func__);
303 gpio_direction_output(wake_host->io, 1);
304 msleep(0x14);
305 }
306
307 if (gpio_is_valid(poweron->io)) {
308 if (gpio_get_value(poweron->io) == !poweron->enable) {
309 gpio_direction_output(poweron->io, !poweron->enable);
310 msleep(0x14);
311 gpio_direction_output(poweron->io, poweron->enable);
312 msleep(0x14);
313 if (gpio_is_valid(wake_host->io)) {
314 gpio_direction_input(wake_host->io);
315 }
316 }
317 }
318
319 if (gpio_is_valid(reset->io)) {
320 if (gpio_get_value(reset->io) == !reset->enable) {
321 gpio_direction_output(reset->io, !reset->enable);
322 msleep(0x14);
323 gpio_direction_output(reset->io, reset->enable);
324 }
325 }
326
327 if (pinctrl && gpio_is_valid(rts->io)) {
328 pinctrl_select_state(pinctrl, rts->gpio_state);
329 LOG("ENABLE UART_RTS\n");
330 gpio_direction_output(rts->io, rts->enable);
331 msleep(0x64);
332 LOG("DISABLE UART_RTS\n");
333 gpio_direction_output(rts->io, !rts->enable);
334 pinctrl_select_state(pinctrl, rts->default_state);
335 }
336
337 bt_power_state = 1;
338 LOG("bt turn on power\n");
339 rfkill_rk_setup_wake_irq(rfkill, 1);
340 } else {
341 if (gpio_is_valid(poweron->io)) {
342 if (gpio_get_value(poweron->io) == poweron->enable) {
343 gpio_direction_output(poweron->io, !poweron->enable);
344 msleep(0x14);
345 }
346 }
347
348 bt_power_state = 0;
349 LOG("bt shut off power\n");
350 if (gpio_is_valid(reset->io)) {
351 if (gpio_get_value(reset->io) == reset->enable) {
352 gpio_direction_output(reset->io, !reset->enable);
353 msleep(0x14);
354 }
355 }
356 if (toggle) {
357 if (!wifi_power) {
358 LOG("%s: bt will set vbat to low\n", __func__);
359 rfkill_set_wifi_bt_power(0);
360 } else {
361 LOG("%s: bt shouldn't control the vbat\n", __func__);
362 }
363 }
364 }
365
366 return 0;
367 }
368
rfkill_rk_pm_prepare(struct device * dev)369 static int rfkill_rk_pm_prepare(struct device *dev)
370 {
371 struct rfkill_rk_data *rfkill = g_rfkill;
372 struct rfkill_rk_gpio *rts;
373 struct rfkill_rk_irq *wake_host_irq;
374 struct pinctrl *pinctrl = rfkill->pdata->pinctrl;
375
376 DBG("Enter %s\n", __func__);
377
378 if (!rfkill) {
379 return 0;
380 }
381
382 rts = &rfkill->pdata->rts_gpio;
383 wake_host_irq = &rfkill->pdata->wake_host_irq;
384
385 // To prevent uart to receive bt data when suspended
386 if (pinctrl && gpio_is_valid(rts->io)) {
387 DBG("Disable UART_RTS\n");
388 pinctrl_select_state(pinctrl, rts->gpio_state);
389 gpio_direction_output(rts->io, !rts->enable);
390 }
391
392 #ifdef CONFIG_BT_AUTOSLEEP
393 rfkill_rk_sleep_bt(BT_SLEEP);
394 #endif
395
396 // enable bt wakeup host
397 if (gpio_is_valid(wake_host_irq->gpio.io) && bt_power_state) {
398 DBG("enable irq for bt wakeup host\n");
399 enable_irq(wake_host_irq->irq);
400 }
401
402 #ifdef CONFIG_RFKILL_RESET
403 rfkill_set_states(rfkill->rfkill_dev, BT_BLOCKED, false);
404 rfkill_rk_set_power(rfkill, BT_BLOCKED);
405 #endif
406
407 return 0;
408 }
409
rfkill_rk_pm_complete(struct device * dev)410 static void rfkill_rk_pm_complete(struct device *dev)
411 {
412 struct rfkill_rk_data *rfkill = g_rfkill;
413 struct rfkill_rk_irq *wake_host_irq;
414 struct rfkill_rk_gpio *rts;
415 struct pinctrl *pinctrl = rfkill->pdata->pinctrl;
416
417 DBG("Enter %s\n", __func__);
418
419 if (!rfkill) {
420 return;
421 }
422
423 wake_host_irq = &rfkill->pdata->wake_host_irq;
424 rts = &rfkill->pdata->rts_gpio;
425
426 if (gpio_is_valid(wake_host_irq->gpio.io) && bt_power_state) {
427 LOG("** disable irq\n");
428 disable_irq(wake_host_irq->irq);
429 }
430
431 if (pinctrl && gpio_is_valid(rts->io)) {
432 DBG("Enable UART_RTS\n");
433 gpio_direction_output(rts->io, rts->enable);
434 pinctrl_select_state(pinctrl, rts->default_state);
435 }
436 }
437
438 static const struct rfkill_ops rfkill_rk_ops = {
439 .set_block = rfkill_rk_set_power,
440 };
441
442 #define PROC_DIR "bluetooth/sleep"
443
444 static struct proc_dir_entry *bluetooth_dir, *sleep_dir;
445
bluesleep_read_proc_lpm(struct file * file,char __user * buffer,size_t count,loff_t * data)446 static ssize_t bluesleep_read_proc_lpm(struct file *file, char __user *buffer, size_t count, loff_t *data)
447 {
448 return sprintf(buffer, "unsupported to read\n");
449 }
450
bluesleep_write_proc_lpm(struct file * file,const char __user * buffer,size_t count,loff_t * data)451 static ssize_t bluesleep_write_proc_lpm(struct file *file, const char __user *buffer, size_t count, loff_t *data)
452 {
453 return count;
454 }
455
bluesleep_read_proc_btwrite(struct file * file,char __user * buffer,size_t count,loff_t * data)456 static ssize_t bluesleep_read_proc_btwrite(struct file *file, char __user *buffer, size_t count, loff_t *data)
457 {
458 return sprintf(buffer, "unsupported to read\n");
459 }
460
bluesleep_write_proc_btwrite(struct file * file,const char __user * buffer,size_t count,loff_t * data)461 static ssize_t bluesleep_write_proc_btwrite(struct file *file, const char __user *buffer, size_t count, loff_t *data)
462 {
463 char b;
464
465 if (count < 1) {
466 return -EINVAL;
467 }
468
469 if (copy_from_user(&b, buffer, 1)) {
470 return -EFAULT;
471 }
472
473 DBG("btwrite %c\n", b);
474 /* HCI_DEV_WRITE */
475 if (b != '0') {
476 rfkill_rk_sleep_bt(BT_WAKEUP);
477 } else {
478 rfkill_rk_sleep_bt(BT_SLEEP);
479 }
480
481 return count;
482 }
483
484 #ifdef CONFIG_OF
bluetooth_platdata_parse_dt(struct device * dev,struct rfkill_rk_platform_data * data)485 static int bluetooth_platdata_parse_dt(struct device *dev, struct rfkill_rk_platform_data *data)
486 {
487 struct device_node *node = dev->of_node;
488 int gpio;
489 enum of_gpio_flags flags;
490
491 if (!node) {
492 return -ENODEV;
493 }
494
495 memset(data, 0, sizeof(*data));
496
497 if (of_find_property(node, "wifi-bt-power-toggle", NULL)) {
498 data->power_toggle = true;
499 LOG("%s: get property wifi-bt-power-toggle.\n", __func__);
500 } else {
501 data->power_toggle = false;
502 }
503
504 gpio = of_get_named_gpio_flags(node, "uart_rts_gpios", 0, &flags);
505 if (gpio_is_valid(gpio)) {
506 data->rts_gpio.io = gpio;
507 data->rts_gpio.enable = (flags == GPIO_ACTIVE_HIGH) ? 1 : 0;
508 LOG("%s: get property: uart_rts_gpios = %d.\n", __func__, gpio);
509 data->pinctrl = devm_pinctrl_get(dev);
510 if (!IS_ERR(data->pinctrl)) {
511 data->rts_gpio.default_state = pinctrl_lookup_state(data->pinctrl, "default");
512 data->rts_gpio.gpio_state = pinctrl_lookup_state(data->pinctrl, "rts_gpio");
513 } else {
514 data->pinctrl = NULL;
515 LOG("%s: dts does't define the uart rts iomux.\n", __func__);
516 return -EINVAL;
517 }
518 } else {
519 data->pinctrl = NULL;
520 data->rts_gpio.io = -EINVAL;
521 LOG("%s: uart_rts_gpios is no-in-use.\n", __func__);
522 }
523
524 gpio = of_get_named_gpio_flags(node, "BT,power_gpio", 0, &flags);
525 if (gpio_is_valid(gpio)) {
526 data->poweron_gpio.io = gpio;
527 data->poweron_gpio.enable = (flags == GPIO_ACTIVE_HIGH) ? 1 : 0;
528 LOG("%s: get property: BT,power_gpio = %d.\n", __func__, gpio);
529 } else {
530 data->poweron_gpio.io = -1;
531 }
532 gpio = of_get_named_gpio_flags(node, "BT,reset_gpio", 0, &flags);
533 if (gpio_is_valid(gpio)) {
534 data->reset_gpio.io = gpio;
535 data->reset_gpio.enable = (flags == GPIO_ACTIVE_HIGH) ? 1 : 0;
536 LOG("%s: get property: BT,reset_gpio = %d.\n", __func__, gpio);
537 } else {
538 data->reset_gpio.io = -1;
539 }
540 gpio = of_get_named_gpio_flags(node, "BT,wake_gpio", 0, &flags);
541 if (gpio_is_valid(gpio)) {
542 data->wake_gpio.io = gpio;
543 data->wake_gpio.enable = (flags == GPIO_ACTIVE_HIGH) ? 1 : 0;
544 LOG("%s: get property: BT,wake_gpio = %d.\n", __func__, gpio);
545 } else {
546 data->wake_gpio.io = -1;
547 }
548 gpio = of_get_named_gpio_flags(node, "BT,wake_host_irq", 0, &flags);
549 if (gpio_is_valid(gpio)) {
550 data->wake_host_irq.gpio.io = gpio;
551 data->wake_host_irq.gpio.enable = flags;
552 LOG("%s: get property: BT,wake_host_irq = %d.\n", __func__, gpio);
553 } else {
554 data->wake_host_irq.gpio.io = -1;
555 }
556
557 data->ext_clk = devm_clk_get(dev, "ext_clock");
558 if (IS_ERR(data->ext_clk)) {
559 LOG("%s: clk_get failed!!!.\n", __func__);
560 } else {
561 clk_prepare_enable(data->ext_clk);
562 }
563 return 0;
564 }
565 #endif // CONFIG_OF
566
567 static const struct file_operations bluesleep_lpm = {
568 .owner = THIS_MODULE,
569 .read = bluesleep_read_proc_lpm,
570 .write = bluesleep_write_proc_lpm,
571 };
572
573 static const struct file_operations bluesleep_btwrite = {
574 .owner = THIS_MODULE,
575 .read = bluesleep_read_proc_btwrite,
576 .write = bluesleep_write_proc_btwrite,
577 };
578
rfkill_rk_probe(struct platform_device * pdev)579 static int rfkill_rk_probe(struct platform_device *pdev)
580 {
581 struct rfkill_rk_data *rfkill;
582 struct rfkill_rk_platform_data *pdata = pdev->dev.platform_data;
583 int ret = 0;
584 struct proc_dir_entry *ent;
585
586 DBG("Enter %s\n", __func__);
587
588 if (!pdata) {
589 #ifdef CONFIG_OF
590 pdata = devm_kzalloc(&pdev->dev, sizeof(struct rfkill_rk_platform_data), GFP_KERNEL);
591 if (!pdata) {
592 return -ENOMEM;
593 }
594
595 ret = bluetooth_platdata_parse_dt(&pdev->dev, pdata);
596 if (ret < 0) {
597 #endif
598 LOG("%s: No platform data specified\n", __func__);
599 return ret;
600 #ifdef CONFIG_OF
601 }
602 #endif
603 }
604
605 pdata->name = (char *)bt_name;
606 pdata->type = RFKILL_TYPE_BLUETOOTH;
607
608 rfkill = devm_kzalloc(&pdev->dev, sizeof(*rfkill), GFP_KERNEL);
609 if (!rfkill) {
610 return -ENOMEM;
611 }
612
613 rfkill->pdata = pdata;
614 rfkill->pdev = pdev;
615 g_rfkill = rfkill;
616
617 bluetooth_dir = proc_mkdir("bluetooth", NULL);
618 if (!bluetooth_dir) {
619 LOG("Unable to create /proc/bluetooth directory");
620 return -ENOMEM;
621 }
622
623 sleep_dir = proc_mkdir("sleep", bluetooth_dir);
624 if (!sleep_dir) {
625 LOG("Unable to create /proc/%s directory", PROC_DIR);
626 return -ENOMEM;
627 }
628
629 /* read/write proc entries */
630 ent = proc_create("lpm", 0, sleep_dir, &bluesleep_lpm);
631 if (!ent) {
632 LOG("Unable to create /proc/%s/lpm entry", PROC_DIR);
633 ret = -ENOMEM;
634 goto fail_alloc;
635 }
636
637 /* read/write proc entries */
638 ent = proc_create("btwrite", 0, sleep_dir, &bluesleep_btwrite);
639 if (!ent) {
640 LOG("Unable to create /proc/%s/btwrite entry", PROC_DIR);
641 ret = -ENOMEM;
642 goto fail_alloc;
643 }
644
645 DBG("init gpio\n");
646
647 ret = rfkill_rk_setup_gpio(pdev, &pdata->poweron_gpio, pdata->name, "poweron");
648 if (ret) {
649 goto fail_gpio;
650 }
651
652 ret = rfkill_rk_setup_gpio(pdev, &pdata->reset_gpio, pdata->name, "reset");
653 if (ret) {
654 goto fail_gpio;
655 }
656
657 ret = rfkill_rk_setup_gpio(pdev, &pdata->wake_gpio, pdata->name, "wake");
658 if (ret) {
659 goto fail_gpio;
660 }
661
662 ret = rfkill_rk_setup_gpio(pdev, &pdata->rts_gpio, rfkill->pdata->name, "rts");
663 if (ret) {
664 goto fail_gpio;
665 }
666
667 wake_lock_init(&rfkill->bt_irq_wl, WAKE_LOCK_SUSPEND, "rfkill_rk_irq_wl");
668
669 ret = rfkill_rk_setup_wake_irq(rfkill, 0);
670 if (ret) {
671 goto fail_setup_wake_irq;
672 }
673
674 DBG("setup rfkill\n");
675 rfkill->rfkill_dev = rfkill_alloc(pdata->name, &pdev->dev, pdata->type, &rfkill_rk_ops, rfkill);
676 if (!rfkill->rfkill_dev) {
677 goto fail_alloc;
678 }
679
680 rfkill_set_states(rfkill->rfkill_dev, BT_BLOCKED, false);
681 ret = rfkill_register(rfkill->rfkill_dev);
682 if (ret < 0) {
683 goto fail_rfkill;
684 }
685
686 INIT_DELAYED_WORK(&rfkill->bt_sleep_delay_work, rfkill_rk_delay_sleep_bt);
687
688 // bt turn off power
689 if (gpio_is_valid(pdata->poweron_gpio.io)) {
690 gpio_direction_output(pdata->poweron_gpio.io, !pdata->poweron_gpio.enable);
691 }
692 if (gpio_is_valid(pdata->reset_gpio.io)) {
693 gpio_direction_output(pdata->reset_gpio.io, !pdata->reset_gpio.enable);
694 }
695
696 platform_set_drvdata(pdev, rfkill);
697
698 LOG("%s device registered.\n", pdata->name);
699
700 return 0;
701
702 fail_rfkill:
703 rfkill_destroy(rfkill->rfkill_dev);
704 fail_alloc:
705
706 remove_proc_entry("btwrite", sleep_dir);
707 remove_proc_entry("lpm", sleep_dir);
708 fail_setup_wake_irq:
709 wake_lock_destroy(&rfkill->bt_irq_wl);
710 fail_gpio:
711
712 g_rfkill = NULL;
713 return ret;
714 }
715
rfkill_rk_remove(struct platform_device * pdev)716 static int rfkill_rk_remove(struct platform_device *pdev)
717 {
718 struct rfkill_rk_data *rfkill = platform_get_drvdata(pdev);
719
720 LOG("Enter %s\n", __func__);
721
722 rfkill_unregister(rfkill->rfkill_dev);
723 rfkill_destroy(rfkill->rfkill_dev);
724
725 cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work);
726
727 // free gpio
728 if (gpio_is_valid(rfkill->pdata->rts_gpio.io)) {
729 gpio_free(rfkill->pdata->rts_gpio.io);
730 }
731
732 if (gpio_is_valid(rfkill->pdata->wake_host_irq.gpio.io)) {
733 free_irq(rfkill->pdata->wake_host_irq.irq, rfkill);
734 #ifndef CONFIG_BK3515A_COMBO
735 gpio_free(rfkill->pdata->wake_host_irq.gpio.io);
736 #endif
737 }
738
739 #ifndef CONFIG_BK3515A_COMBO
740 if (gpio_is_valid(rfkill->pdata->wake_gpio.io)) {
741 gpio_free(rfkill->pdata->wake_gpio.io);
742 }
743 #endif
744
745 if (gpio_is_valid(rfkill->pdata->reset_gpio.io)) {
746 gpio_free(rfkill->pdata->reset_gpio.io);
747 }
748
749 if (gpio_is_valid(rfkill->pdata->poweron_gpio.io)) {
750 gpio_free(rfkill->pdata->poweron_gpio.io);
751 }
752 clk_disable_unprepare(rfkill->pdata->ext_clk);
753 wake_lock_destroy(&rfkill->bt_irq_wl);
754 g_rfkill = NULL;
755
756 return 0;
757 }
758
759 static const struct dev_pm_ops rfkill_rk_pm_ops = {
760 .prepare = rfkill_rk_pm_prepare,
761 .complete = rfkill_rk_pm_complete,
762 };
763
764 #ifdef CONFIG_OF
765 static struct of_device_id bt_platdata_of_match[] = {{.compatible = "bluetooth-platdata"}, {}};
766 MODULE_DEVICE_TABLE(of, bt_platdata_of_match);
767 #endif // CONFIG_OF
768
769 static struct platform_driver rfkill_rk_driver = {
770 .probe = rfkill_rk_probe,
771 .remove = rfkill_rk_remove,
772 .driver =
773 {
774 .name = "rfkill_bt",
775 .owner = THIS_MODULE,
776 .pm = &rfkill_rk_pm_ops,
777 .of_match_table = of_match_ptr(bt_platdata_of_match),
778 },
779 };
780
rfkill_rk_init(void)781 static int __init rfkill_rk_init(void)
782 {
783 int err;
784
785 LOG("Enter %s\n", __func__);
786 err = rfkill_wlan_init();
787 if (err) {
788 return err;
789 }
790 return platform_driver_register(&rfkill_rk_driver);
791 }
792
rfkill_rk_exit(void)793 static void __exit rfkill_rk_exit(void)
794 {
795 LOG("Enter %s\n", __func__);
796 platform_driver_unregister(&rfkill_rk_driver);
797 rfkill_wlan_exit();
798 }
799
800 module_init(rfkill_rk_init);
801 module_exit(rfkill_rk_exit);
802
803 MODULE_DESCRIPTION("rock-chips rfkill for Bluetooth v0.3");
804 MODULE_AUTHOR("cmy@rock-chips.com, gwl@rock-chips.com");
805 MODULE_LICENSE("GPL");
806