BT: add rts control.
authorgwl <gwl@rock-chips.com>
Thu, 13 Mar 2014 13:04:35 +0000 (21:04 +0800)
committergwl <gwl@rock-chips.com>
Thu, 13 Mar 2014 13:04:59 +0000 (21:04 +0800)
arch/arm/boot/dts/rk3188-pinctrl.dtsi
arch/arm/boot/dts/rk3188-tb.dts
net/rfkill/rfkill-bt.c

index 686593d44d9c1dbb371929943c20c94f82ee8349..e946d705c59e2e3fc7465c8ed4e5d94a6b3e2321 100755 (executable)
                                rockchip,drive = <VALUE_DRV_DEFAULT>;
                                //rockchip,tristate = <VALUE_TRI_DEFAULT>;
                        };
+
+                       uart0_rts_gpio: uart0-rts-gpio {
+                               rockchip,pins = <FUNC_TO_GPIO(UART0_RTSN)>;
+                               rockchip,drive = <VALUE_DRV_DEFAULT>;
+                       };
                };
 
                gpio1_uart1 {
                                rockchip,drive = <VALUE_DRV_DEFAULT>;
                                //rockchip,tristate = <VALUE_TRI_DEFAULT>;
                        };
+
+                       uart1_rts_gpio: uart1-rts-gpio {
+                               rockchip,pins = <FUNC_TO_GPIO(UART1_RTSN)>;
+                               rockchip,drive = <VALUE_DRV_DEFAULT>;
+                       };
                };
 
                gpio1_uart2 {
                                rockchip,drive = <VALUE_DRV_DEFAULT>;
                                //rockchip,tristate = <VALUE_TRI_DEFAULT>;
                        };
+
+                       uart3_rts_gpio: uart3-rts-gpio {
+                               rockchip,pins = <FUNC_TO_GPIO(UART3_RTSN)>;
+                               rockchip,drive = <VALUE_DRV_DEFAULT>;
+                       };
                };
 
                gpio1_i2c0 {
index 86eb29b413b42bf3c4c88d4f1c5ac1df4221e916..d75078f127bab01448bee1dbe1e14c32ad70306b 100644 (file)
     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>;
 &uart0 {
        status = "okay";
        dma-names = "!tx", "!rx";
+    pinctrl-0 = <&uart0_xfer &uart0_cts>;
 };
 
 
index db8a89db36e93425d0acd1a1cec187007ed79e9a..bcd5ac2068d77d33dce3cf52b34fa16369006184 100755 (executable)
@@ -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,