struct regulator *vcc;
        struct gpio_desc *reset;
+       struct gpio_desc *boot;
        struct pinctrl *pinctrl;
        struct pinctrl_state *pins_runtime;
        struct pinctrl_state *pins_boot;
                        return err;
                }
 
+               bdev->boot = devm_gpiod_get_optional(&serdev->dev, "boot",
+                                                    GPIOD_OUT_LOW);
+               if (IS_ERR(bdev->boot)) {
+                       err = PTR_ERR(bdev->boot);
+                       return err;
+               }
+
                bdev->pinctrl = devm_pinctrl_get(&serdev->dev);
                if (IS_ERR(bdev->pinctrl)) {
                        err = PTR_ERR(bdev->pinctrl);
 
                bdev->pins_boot = pinctrl_lookup_state(bdev->pinctrl,
                                                       "default");
-               if (IS_ERR(bdev->pins_boot)) {
+               if (IS_ERR(bdev->pins_boot) && !bdev->boot) {
                        err = PTR_ERR(bdev->pins_boot);
+                       dev_err(&serdev->dev,
+                               "Should assign RXD to LOW at boot stage\n");
                        return err;
                }
 
        set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks);
 
        if (btmtkuart_is_standalone(bdev)) {
-               /* Switch to the specific pin state for the booting requires */
-               pinctrl_select_state(bdev->pinctrl, bdev->pins_boot);
+               if (bdev->boot) {
+                       gpiod_set_value_cansleep(bdev->boot, 1);
+               } else {
+                       /* Switch to the specific pin state for the booting
+                        * requires.
+                        */
+                       pinctrl_select_state(bdev->pinctrl, bdev->pins_boot);
+               }
 
                /* Power on */
                err = regulator_enable(bdev->vcc);
                 * mode the device requires for UART transfers.
                 */
                msleep(50);
+
+               if (bdev->boot)
+                       devm_gpiod_put(&serdev->dev, bdev->boot);
+
                pinctrl_select_state(bdev->pinctrl, bdev->pins_runtime);
 
                /* A standalone device doesn't depends on power domain on SoC,
        return 0;
 
 err_regulator_disable:
-       if (btmtkuart_is_standalone(bdev))  {
-               pinctrl_select_state(bdev->pinctrl, bdev->pins_boot);
+       if (btmtkuart_is_standalone(bdev))
                regulator_disable(bdev->vcc);
-       }
 
        return err;
 }
        struct btmtkuart_dev *bdev = serdev_device_get_drvdata(serdev);
        struct hci_dev *hdev = bdev->hdev;
 
-       if (btmtkuart_is_standalone(bdev))  {
-               pinctrl_select_state(bdev->pinctrl, bdev->pins_boot);
+       if (btmtkuart_is_standalone(bdev))
                regulator_disable(bdev->vcc);
-       }
 
        hci_unregister_dev(hdev);
        hci_free_dev(hdev);