BT: add rts control.

This commit is contained in:
gwl
2014-03-13 21:04:35 +08:00
parent ec30763386
commit 668a1834bb
3 changed files with 40 additions and 25 deletions

View File

@@ -116,6 +116,11 @@
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 {
@@ -143,6 +148,11 @@
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 {
@@ -182,6 +192,11 @@
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 {

View File

@@ -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>;
};

View File

@@ -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,