Lines Matching +full:enable +full:- +full:gpio

14 /* Rock-chips rfkill driver for bluetooth
25 #include <linux/rfkill-bt.h>
26 #include <linux/rfkill-wlan.h>
33 #include <linux/gpio.h>
35 #include <dt-bindings/gpio/gpio.h>
124 wake_lock_timeout(&rfkill->bt_irq_wl, in rfkill_rk_wake_host_irq()
131 struct rfkill_rk_gpio *gpio, const char *prefix, in rfkill_rk_setup_gpio() argument
134 if (gpio_is_valid(gpio->io)) { in rfkill_rk_setup_gpio()
137 sprintf(gpio->name, "%s_%s", prefix, name); in rfkill_rk_setup_gpio()
138 ret = devm_gpio_request(&pdev->dev, gpio->io, gpio->name); in rfkill_rk_setup_gpio()
140 LOG("Failed to get %s gpio.\n", gpio->name); in rfkill_rk_setup_gpio()
141 return -1; in rfkill_rk_setup_gpio()
151 struct rfkill_rk_irq *irq = &rfkill->pdata->wake_host_irq; in rfkill_rk_setup_wake_irq()
154 rfkill->irq_req = 0; in rfkill_rk_setup_wake_irq()
155 ret = rfkill_rk_setup_gpio(rfkill->pdev, &irq->gpio, in rfkill_rk_setup_wake_irq()
156 rfkill->pdata->name, "wake_host"); in rfkill_rk_setup_wake_irq()
160 if (gpio_is_valid(irq->gpio.io)) { in rfkill_rk_setup_wake_irq()
161 if (rfkill->irq_req) { in rfkill_rk_setup_wake_irq()
162 rfkill->irq_req = 0; in rfkill_rk_setup_wake_irq()
163 free_irq(irq->irq, rfkill); in rfkill_rk_setup_wake_irq()
166 irq->irq = gpio_to_irq(irq->gpio.io); in rfkill_rk_setup_wake_irq()
167 sprintf(irq->name, "%s_irq", irq->gpio.name); in rfkill_rk_setup_wake_irq()
168 ret = request_irq(irq->irq, rfkill_rk_wake_host_irq, in rfkill_rk_setup_wake_irq()
169 (irq->gpio.enable == GPIO_ACTIVE_LOW) ? in rfkill_rk_setup_wake_irq()
172 irq->name, rfkill); in rfkill_rk_setup_wake_irq()
175 rfkill->irq_req = 1; in rfkill_rk_setup_wake_irq()
177 disable_irq(irq->irq); in rfkill_rk_setup_wake_irq()
178 ret = enable_irq_wake(irq->irq); in rfkill_rk_setup_wake_irq()
186 free_irq(irq->irq, rfkill); in rfkill_rk_setup_wake_irq()
188 gpio_free(irq->gpio.io); in rfkill_rk_setup_wake_irq()
196 struct rfkill_rk_gpio *wake = &rfkill->pdata->wake_gpio; in rfkill_rk_sleep_bt_internal()
200 gpio_direction_output(wake->io, sleep ? !wake->enable : wake->enable); in rfkill_rk_sleep_bt_internal()
204 if (rfkill_rk_setup_gpio(rfkill->pdev, wake, in rfkill_rk_sleep_bt_internal()
205 rfkill->pdata->name, "wake") != 0) { in rfkill_rk_sleep_bt_internal()
209 gpio_direction_output(wake->io, wake->enable); in rfkill_rk_sleep_bt_internal()
211 gpio_direction_output(wake->io, !wake->enable); in rfkill_rk_sleep_bt_internal()
213 gpio_free(wake->io); in rfkill_rk_sleep_bt_internal()
242 wake = &rfkill->pdata->wake_gpio; in rfkill_rk_sleep_bt()
243 if (!gpio_is_valid(wake->io)) { in rfkill_rk_sleep_bt()
248 cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work); in rfkill_rk_sleep_bt()
254 schedule_delayed_work(&rfkill->bt_sleep_delay_work, in rfkill_rk_sleep_bt()
267 LOG("%s: rfkill-bt driver has not Successful initialized\n", in rfkill_get_bt_power_state()
269 return -1; in rfkill_get_bt_power_state()
272 *toggle = mrfkill->pdata->power_toggle; in rfkill_get_bt_power_state()
281 struct rfkill_rk_gpio *wake_host = &rfkill->pdata->wake_host_irq.gpio; in rfkill_rk_set_power()
282 struct rfkill_rk_gpio *poweron = &rfkill->pdata->poweron_gpio; in rfkill_rk_set_power()
283 struct rfkill_rk_gpio *reset = &rfkill->pdata->reset_gpio; in rfkill_rk_set_power()
284 struct rfkill_rk_gpio *rts = &rfkill->pdata->rts_gpio; in rfkill_rk_set_power()
285 struct pinctrl *pinctrl = rfkill->pdata->pinctrl; in rfkill_rk_set_power()
293 toggle = rfkill->pdata->power_toggle; in rfkill_rk_set_power()
298 return -1; in rfkill_rk_set_power()
312 if (gpio_is_valid(wake_host->io)) { in rfkill_rk_set_power()
314 gpio_direction_output(wake_host->io, 1); in rfkill_rk_set_power()
318 if (gpio_is_valid(poweron->io)) { in rfkill_rk_set_power()
319 if (gpio_get_value(poweron->io) == !poweron->enable) { in rfkill_rk_set_power()
320 gpio_direction_output(poweron->io, in rfkill_rk_set_power()
321 !poweron->enable); in rfkill_rk_set_power()
323 gpio_direction_output(poweron->io, in rfkill_rk_set_power()
324 poweron->enable); in rfkill_rk_set_power()
329 if (gpio_is_valid(reset->io)) { in rfkill_rk_set_power()
330 if (gpio_get_value(reset->io) == !reset->enable) { in rfkill_rk_set_power()
331 gpio_direction_output(reset->io, in rfkill_rk_set_power()
332 !reset->enable); in rfkill_rk_set_power()
334 gpio_direction_output(reset->io, reset->enable); in rfkill_rk_set_power()
338 if (gpio_is_valid(wake_host->io)) { in rfkill_rk_set_power()
340 gpio_direction_input(wake_host->io); in rfkill_rk_set_power()
343 if (pinctrl && gpio_is_valid(rts->io)) { in rfkill_rk_set_power()
344 pinctrl_select_state(pinctrl, rts->gpio_state); in rfkill_rk_set_power()
345 LOG("ENABLE UART_RTS\n"); in rfkill_rk_set_power()
346 gpio_direction_output(rts->io, rts->enable); in rfkill_rk_set_power()
349 gpio_direction_output(rts->io, !rts->enable); in rfkill_rk_set_power()
350 pinctrl_select_state(pinctrl, rts->default_state); in rfkill_rk_set_power()
357 if (gpio_is_valid(poweron->io)) { in rfkill_rk_set_power()
358 if (gpio_get_value(poweron->io) == poweron->enable) { in rfkill_rk_set_power()
359 gpio_direction_output(poweron->io, in rfkill_rk_set_power()
360 !poweron->enable); in rfkill_rk_set_power()
367 if (gpio_is_valid(reset->io)) { in rfkill_rk_set_power()
368 if (gpio_get_value(reset->io) == reset->enable) { in rfkill_rk_set_power()
369 gpio_direction_output(reset->io, in rfkill_rk_set_power()
370 !reset->enable); in rfkill_rk_set_power()
398 rts = &rfkill->pdata->rts_gpio; in rfkill_rk_pm_prepare()
399 wake_host_irq = &rfkill->pdata->wake_host_irq; in rfkill_rk_pm_prepare()
402 if (rfkill->pdata->pinctrl && gpio_is_valid(rts->io)) { in rfkill_rk_pm_prepare()
404 pinctrl_select_state(rfkill->pdata->pinctrl, rts->gpio_state); in rfkill_rk_pm_prepare()
405 gpio_direction_output(rts->io, !rts->enable); in rfkill_rk_pm_prepare()
412 // enable bt wakeup host in rfkill_rk_pm_prepare()
413 if (gpio_is_valid(wake_host_irq->gpio.io) && bt_power_state) { in rfkill_rk_pm_prepare()
414 DBG("enable irq for bt wakeup host\n"); in rfkill_rk_pm_prepare()
415 enable_irq(wake_host_irq->irq); in rfkill_rk_pm_prepare()
419 rfkill_init_sw_state(rfkill->rfkill_dev, BT_BLOCKED); in rfkill_rk_pm_prepare()
420 rfkill_set_sw_state(rfkill->rfkill_dev, BT_BLOCKED); in rfkill_rk_pm_prepare()
421 rfkill_set_hw_state(rfkill->rfkill_dev, false); in rfkill_rk_pm_prepare()
439 wake_host_irq = &rfkill->pdata->wake_host_irq; in rfkill_rk_pm_complete()
440 rts = &rfkill->pdata->rts_gpio; in rfkill_rk_pm_complete()
442 if (gpio_is_valid(wake_host_irq->gpio.io) && bt_power_state) { in rfkill_rk_pm_complete()
444 disable_irq(wake_host_irq->irq); in rfkill_rk_pm_complete()
447 if (rfkill->pdata->pinctrl && gpio_is_valid(rts->io)) { in rfkill_rk_pm_complete()
448 DBG("Enable UART_RTS\n"); in rfkill_rk_pm_complete()
449 gpio_direction_output(rts->io, rts->enable); in rfkill_rk_pm_complete()
450 pinctrl_select_state(rfkill->pdata->pinctrl, rts->default_state); in rfkill_rk_pm_complete()
489 return -EINVAL; in bluesleep_write_proc_btwrite()
492 return -EFAULT; in bluesleep_write_proc_btwrite()
508 struct device_node *node = dev->of_node; in bluetooth_platdata_parse_dt()
509 int gpio; in bluetooth_platdata_parse_dt() local
513 return -ENODEV; in bluetooth_platdata_parse_dt()
517 if (of_find_property(node, "wifi-bt-power-toggle", NULL)) { in bluetooth_platdata_parse_dt()
518 data->power_toggle = true; in bluetooth_platdata_parse_dt()
519 LOG("%s: get property wifi-bt-power-toggle.\n", __func__); in bluetooth_platdata_parse_dt()
521 data->power_toggle = false; in bluetooth_platdata_parse_dt()
524 gpio = of_get_named_gpio_flags(node, "uart_rts_gpios", 0, &flags); in bluetooth_platdata_parse_dt()
525 if (gpio_is_valid(gpio)) { in bluetooth_platdata_parse_dt()
526 data->rts_gpio.io = gpio; in bluetooth_platdata_parse_dt()
527 data->rts_gpio.enable = (flags == GPIO_ACTIVE_HIGH) ? 1 : 0; in bluetooth_platdata_parse_dt()
528 LOG("%s: get property: uart_rts_gpios = %d.\n", __func__, gpio); in bluetooth_platdata_parse_dt()
529 data->pinctrl = devm_pinctrl_get(dev); in bluetooth_platdata_parse_dt()
530 if (!IS_ERR(data->pinctrl)) { in bluetooth_platdata_parse_dt()
531 data->rts_gpio.default_state = in bluetooth_platdata_parse_dt()
532 pinctrl_lookup_state(data->pinctrl, "default"); in bluetooth_platdata_parse_dt()
533 data->rts_gpio.gpio_state = in bluetooth_platdata_parse_dt()
534 pinctrl_lookup_state(data->pinctrl, "rts_gpio"); in bluetooth_platdata_parse_dt()
536 data->pinctrl = NULL; in bluetooth_platdata_parse_dt()
539 return -EINVAL; in bluetooth_platdata_parse_dt()
542 data->pinctrl = NULL; in bluetooth_platdata_parse_dt()
543 data->rts_gpio.io = -EINVAL; in bluetooth_platdata_parse_dt()
544 LOG("%s: uart_rts_gpios is no-in-use.\n", __func__); in bluetooth_platdata_parse_dt()
547 gpio = of_get_named_gpio_flags(node, "BT,power_gpio", 0, &flags); in bluetooth_platdata_parse_dt()
548 if (gpio_is_valid(gpio)) { in bluetooth_platdata_parse_dt()
549 data->poweron_gpio.io = gpio; in bluetooth_platdata_parse_dt()
550 data->poweron_gpio.enable = (flags == GPIO_ACTIVE_HIGH) ? 1 : 0; in bluetooth_platdata_parse_dt()
551 LOG("%s: get property: BT,power_gpio = %d.\n", __func__, gpio); in bluetooth_platdata_parse_dt()
553 data->poweron_gpio.io = -1; in bluetooth_platdata_parse_dt()
555 gpio = of_get_named_gpio_flags(node, "BT,reset_gpio", 0, &flags); in bluetooth_platdata_parse_dt()
556 if (gpio_is_valid(gpio)) { in bluetooth_platdata_parse_dt()
557 data->reset_gpio.io = gpio; in bluetooth_platdata_parse_dt()
558 data->reset_gpio.enable = (flags == GPIO_ACTIVE_HIGH) ? 1 : 0; in bluetooth_platdata_parse_dt()
559 LOG("%s: get property: BT,reset_gpio = %d.\n", __func__, gpio); in bluetooth_platdata_parse_dt()
561 data->reset_gpio.io = -1; in bluetooth_platdata_parse_dt()
563 gpio = of_get_named_gpio_flags(node, "BT,wake_gpio", 0, &flags); in bluetooth_platdata_parse_dt()
564 if (gpio_is_valid(gpio)) { in bluetooth_platdata_parse_dt()
565 data->wake_gpio.io = gpio; in bluetooth_platdata_parse_dt()
566 data->wake_gpio.enable = (flags == GPIO_ACTIVE_HIGH) ? 1 : 0; in bluetooth_platdata_parse_dt()
567 LOG("%s: get property: BT,wake_gpio = %d.\n", __func__, gpio); in bluetooth_platdata_parse_dt()
569 data->wake_gpio.io = -1; in bluetooth_platdata_parse_dt()
571 gpio = of_get_named_gpio_flags(node, "BT,wake_host_irq", 0, &flags); in bluetooth_platdata_parse_dt()
572 if (gpio_is_valid(gpio)) { in bluetooth_platdata_parse_dt()
573 data->wake_host_irq.gpio.io = gpio; in bluetooth_platdata_parse_dt()
574 data->wake_host_irq.gpio.enable = flags; in bluetooth_platdata_parse_dt()
576 gpio); in bluetooth_platdata_parse_dt()
578 data->wake_host_irq.gpio.io = -1; in bluetooth_platdata_parse_dt()
581 data->ext_clk = devm_clk_get(dev, "ext_clock"); in bluetooth_platdata_parse_dt()
582 if (IS_ERR(data->ext_clk)) { in bluetooth_platdata_parse_dt()
585 clk_prepare_enable(data->ext_clk); in bluetooth_platdata_parse_dt()
604 struct rfkill_rk_platform_data *pdata = pdev->dev.platform_data; in rfkill_rk_probe()
612 pdata = devm_kzalloc(&pdev->dev, in rfkill_rk_probe()
616 return -ENOMEM; in rfkill_rk_probe()
618 ret = bluetooth_platdata_parse_dt(&pdev->dev, pdata); in rfkill_rk_probe()
628 pdata->name = (char *)bt_name; in rfkill_rk_probe()
629 pdata->type = RFKILL_TYPE_BLUETOOTH; in rfkill_rk_probe()
631 rfkill = devm_kzalloc(&pdev->dev, sizeof(*rfkill), GFP_KERNEL); in rfkill_rk_probe()
633 return -ENOMEM; in rfkill_rk_probe()
635 rfkill->pdata = pdata; in rfkill_rk_probe()
636 rfkill->pdev = pdev; in rfkill_rk_probe()
642 return -ENOMEM; in rfkill_rk_probe()
648 return -ENOMEM; in rfkill_rk_probe()
655 ret = -ENOMEM; in rfkill_rk_probe()
663 ret = -ENOMEM; in rfkill_rk_probe()
667 DBG("init gpio\n"); in rfkill_rk_probe()
669 ret = rfkill_rk_setup_gpio(pdev, &pdata->poweron_gpio, pdata->name, in rfkill_rk_probe()
674 ret = rfkill_rk_setup_gpio(pdev, &pdata->reset_gpio, pdata->name, in rfkill_rk_probe()
679 ret = rfkill_rk_setup_gpio(pdev, &pdata->wake_gpio, pdata->name, in rfkill_rk_probe()
684 ret = rfkill_rk_setup_gpio(pdev, &pdata->rts_gpio, rfkill->pdata->name, in rfkill_rk_probe()
689 wake_lock_init(&rfkill->bt_irq_wl, WAKE_LOCK_SUSPEND, in rfkill_rk_probe()
697 rfkill->rfkill_dev = rfkill_alloc(pdata->name, &pdev->dev, pdata->type, in rfkill_rk_probe()
699 if (!rfkill->rfkill_dev) in rfkill_rk_probe()
702 rfkill_init_sw_state(rfkill->rfkill_dev, BT_BLOCKED); in rfkill_rk_probe()
703 rfkill_set_sw_state(rfkill->rfkill_dev, BT_BLOCKED); in rfkill_rk_probe()
704 rfkill_set_hw_state(rfkill->rfkill_dev, false); in rfkill_rk_probe()
705 ret = rfkill_register(rfkill->rfkill_dev); in rfkill_rk_probe()
709 INIT_DELAYED_WORK(&rfkill->bt_sleep_delay_work, in rfkill_rk_probe()
714 if (gpio_is_valid(pdata->poweron_gpio.io)) { in rfkill_rk_probe()
715 gpio_direction_output(pdata->poweron_gpio.io, in rfkill_rk_probe()
716 !pdata->poweron_gpio.enable); in rfkill_rk_probe()
718 if (gpio_is_valid(pdata->reset_gpio.io)) { in rfkill_rk_probe()
719 gpio_direction_output(pdata->reset_gpio.io, in rfkill_rk_probe()
720 !pdata->reset_gpio.enable); in rfkill_rk_probe()
725 LOG("%s device registered.\n", pdata->name); in rfkill_rk_probe()
730 rfkill_destroy(rfkill->rfkill_dev); in rfkill_rk_probe()
736 wake_lock_destroy(&rfkill->bt_irq_wl); in rfkill_rk_probe()
749 rfkill_unregister(rfkill->rfkill_dev); in rfkill_rk_remove()
750 rfkill_destroy(rfkill->rfkill_dev); in rfkill_rk_remove()
752 cancel_delayed_work_sync(&rfkill->bt_sleep_delay_work); in rfkill_rk_remove()
754 // free gpio in rfkill_rk_remove()
755 if (gpio_is_valid(rfkill->pdata->rts_gpio.io)) in rfkill_rk_remove()
756 gpio_free(rfkill->pdata->rts_gpio.io); in rfkill_rk_remove()
758 if (gpio_is_valid(rfkill->pdata->wake_host_irq.gpio.io)) { in rfkill_rk_remove()
759 free_irq(rfkill->pdata->wake_host_irq.irq, rfkill); in rfkill_rk_remove()
761 gpio_free(rfkill->pdata->wake_host_irq.gpio.io); in rfkill_rk_remove()
766 if (gpio_is_valid(rfkill->pdata->wake_gpio.io)) in rfkill_rk_remove()
767 gpio_free(rfkill->pdata->wake_gpio.io); in rfkill_rk_remove()
770 if (gpio_is_valid(rfkill->pdata->reset_gpio.io)) in rfkill_rk_remove()
771 gpio_free(rfkill->pdata->reset_gpio.io); in rfkill_rk_remove()
773 if (gpio_is_valid(rfkill->pdata->poweron_gpio.io)) in rfkill_rk_remove()
774 gpio_free(rfkill->pdata->poweron_gpio.io); in rfkill_rk_remove()
775 clk_disable_unprepare(rfkill->pdata->ext_clk); in rfkill_rk_remove()
776 wake_lock_destroy(&rfkill->bt_irq_wl); in rfkill_rk_remove()
789 { .compatible = "bluetooth-platdata" },
827 MODULE_DESCRIPTION("rock-chips rfkill for Bluetooth v0.3");
828 MODULE_AUTHOR("cmy@rock-chips.com, gwl@rock-chips.com");