• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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