From 668a1834bb4d7ebf76ad983e4f9b4e4767adfcfa Mon Sep 17 00:00:00 2001 From: gwl Date: Thu, 13 Mar 2014 21:04:35 +0800 Subject: [PATCH] BT: add rts control. --- arch/arm/boot/dts/rk3188-pinctrl.dtsi | 15 +++++++++ arch/arm/boot/dts/rk3188-tb.dts | 5 +-- net/rfkill/rfkill-bt.c | 45 +++++++++++++-------------- 3 files changed, 40 insertions(+), 25 deletions(-) diff --git a/arch/arm/boot/dts/rk3188-pinctrl.dtsi b/arch/arm/boot/dts/rk3188-pinctrl.dtsi index 686593d44d9c..e946d705c59e 100755 --- a/arch/arm/boot/dts/rk3188-pinctrl.dtsi +++ b/arch/arm/boot/dts/rk3188-pinctrl.dtsi @@ -116,6 +116,11 @@ rockchip,drive = ; //rockchip,tristate = ; }; + + uart0_rts_gpio: uart0-rts-gpio { + rockchip,pins = ; + rockchip,drive = ; + }; }; gpio1_uart1 { @@ -143,6 +148,11 @@ rockchip,drive = ; //rockchip,tristate = ; }; + + uart1_rts_gpio: uart1-rts-gpio { + rockchip,pins = ; + rockchip,drive = ; + }; }; gpio1_uart2 { @@ -182,6 +192,11 @@ rockchip,drive = ; //rockchip,tristate = ; }; + + uart3_rts_gpio: uart3-rts-gpio { + rockchip,pins = ; + rockchip,drive = ; + }; }; gpio1_i2c0 { diff --git a/arch/arm/boot/dts/rk3188-tb.dts b/arch/arm/boot/dts/rk3188-tb.dts index 86eb29b413b4..d75078f127ba 100644 --- a/arch/arm/boot/dts/rk3188-tb.dts +++ b/arch/arm/boot/dts/rk3188-tb.dts @@ -41,10 +41,10 @@ wireless-bluetooth { compatible = "bluetooth-platdata"; - support_uart_rts_ctrl; uart_rts_gpios = <&gpio1 GPIO_A3 GPIO_ACTIVE_LOW>; - pinctrl-names = "default"; + pinctrl-names = "default","rts_gpio"; pinctrl-0 = <&uart0_rts>; + pinctrl-1 = <&uart0_rts_gpio>; BT,power_gpio = <&gpio3 GPIO_C7 GPIO_ACTIVE_HIGH>; BT,reset_gpio = <&gpio3 GPIO_D1 GPIO_ACTIVE_HIGH>; @@ -131,6 +131,7 @@ &uart0 { status = "okay"; dma-names = "!tx", "!rx"; + pinctrl-0 = <&uart0_xfer &uart0_cts>; }; diff --git a/net/rfkill/rfkill-bt.c b/net/rfkill/rfkill-bt.c index db8a89db36e9..bcd5ac2068d7 100755 --- a/net/rfkill/rfkill-bt.c +++ b/net/rfkill/rfkill-bt.c @@ -274,9 +274,8 @@ static int rfkill_rk_set_power(void *data, bool blocked) msleep(20); gpio_direction_output(reset->io, reset->enable); } - #if defined(CONFIG_AP6210) || defined(CONFIG_AP6335) - if (gpio_is_valid(rts->io)) + if (pinctrl != NULL && gpio_is_valid(rts->io)) { pinctrl_select_state(pinctrl, rts->gpio_state); LOG("ENABLE UART_RTS\n"); @@ -287,7 +286,6 @@ static int rfkill_rk_set_power(void *data, bool blocked) pinctrl_select_state(pinctrl, rts->default_state); } #endif - LOG("bt turn on power\n"); } else { if (gpio_is_valid(poweron->io)) @@ -323,11 +321,11 @@ static int rfkill_rk_pm_prepare(struct device *dev) wake_host_irq = &rfkill->pdata->wake_host_irq; //To prevent uart to receive bt data when suspended - if (gpio_is_valid(rts->io)) + if (pinctrl != NULL && gpio_is_valid(rts->io)) { DBG("Disable UART_RTS\n"); - //pinctrl_select_state(pinctrl, rts->gpio_state); - //gpio_direction_output(rts->io, !rts->enable); + pinctrl_select_state(pinctrl, rts->gpio_state); + gpio_direction_output(rts->io, !rts->enable); } #ifdef CONFIG_BT_AUTOSLEEP @@ -370,7 +368,7 @@ static void rfkill_rk_pm_complete(struct device *dev) disable_irq(wake_host_irq->irq); } - if (gpio_is_valid(rts->io)) + if (pinctrl != NULL && gpio_is_valid(rts->io)) { DBG("Enable UART_RTS\n"); gpio_direction_output(rts->io, rts->enable); @@ -439,23 +437,24 @@ static int bluetooth_platdata_parse_dt(struct device *dev, memset(data, 0, sizeof(*data)); - if (of_find_property(node, "support_uart_rts_ctrl", NULL)) { - gpio = of_get_named_gpio_flags(node, "uart_rts_gpios", 0, &flags); - if (gpio_is_valid(gpio)) { - data->rts_gpio.io = gpio; - data->rts_gpio.enable = flags; - LOG("%s: get property: uart_rts_gpios = %d.\n", __func__, gpio); - data->pinctrl = devm_pinctrl_get(dev); - if (!IS_ERR(data->pinctrl)) { - data->rts_gpio.default_state = pinctrl_lookup_state(data->pinctrl, "default"); - } else { - LOG("%s: dts does't define the uart rts iomux.\n", __func__); - return -EINVAL; - } + gpio = of_get_named_gpio_flags(node, "uart_rts_gpios", 0, &flags); + if (gpio_is_valid(gpio)) { + data->rts_gpio.io = gpio; + data->rts_gpio.enable = (flags == GPIO_ACTIVE_HIGH)? 1:0; + LOG("%s: get property: uart_rts_gpios = %d.\n", __func__, gpio); + data->pinctrl = devm_pinctrl_get(dev); + if (!IS_ERR(data->pinctrl)) { + data->rts_gpio.default_state = pinctrl_lookup_state(data->pinctrl, "default"); + data->rts_gpio.gpio_state = pinctrl_lookup_state(data->pinctrl, "rts_gpio"); } else { - LOG("%s: uart_rts_gpios is unvalid.\n", __func__); + data->pinctrl = NULL; + LOG("%s: dts does't define the uart rts iomux.\n", __func__); return -EINVAL; } + } else { + data->pinctrl = NULL; + LOG("%s: uart_rts_gpios is unvalid.\n", __func__); + return -EINVAL; } gpio = of_get_named_gpio_flags(node, "BT,power_gpio", 0, &flags); @@ -579,8 +578,8 @@ static int rfkill_rk_probe(struct platform_device *pdev) ret = rfkill_rk_setup_wake_irq(rfkill); if (ret) goto fail_gpio; - //ret = rfkill_rk_setup_gpio(pdev, &pdata->rts_gpio, rfkill->pdata->name, "rts"); - //if (ret) goto fail_gpio; + ret = rfkill_rk_setup_gpio(pdev, &pdata->rts_gpio, rfkill->pdata->name, "rts"); + if (ret) goto fail_gpio; DBG("setup rfkill\n"); rfkill->rfkill_dev = rfkill_alloc(pdata->name, &pdev->dev, pdata->type, -- 2.34.1