#include <linux/serdev.h>
 #include <linux/skbuff.h>
 #include <linux/ti_wilink_st.h>
+#include <linux/clk.h>
 
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci_core.h>
        struct hci_uart hu;
        struct serdev_device *serdev;
        struct gpio_desc *enable_gpio;
+       struct clk *ext_clk;
 };
 
 struct ll_struct {
 
        hu->priv = ll;
 
-       if (hu->serdev)
+       if (hu->serdev) {
+               struct ll_device *lldev = serdev_device_get_drvdata(hu->serdev);
                serdev_device_open(hu->serdev);
+               if (!IS_ERR(lldev->ext_clk))
+                       clk_prepare_enable(lldev->ext_clk);
+       }
 
        return 0;
 }
                struct ll_device *lldev = serdev_device_get_drvdata(hu->serdev);
                gpiod_set_value_cansleep(lldev->enable_gpio, 0);
 
+               clk_disable_unprepare(lldev->ext_clk);
+
                serdev_device_close(hu->serdev);
        }
 
        if (IS_ERR(lldev->enable_gpio))
                return PTR_ERR(lldev->enable_gpio);
 
+       lldev->ext_clk = devm_clk_get(&serdev->dev, "ext_clock");
+       if (IS_ERR(lldev->ext_clk) && PTR_ERR(lldev->ext_clk) != -ENOENT)
+               return PTR_ERR(lldev->ext_clk);
+
        of_property_read_u32(serdev->dev.of_node, "max-speed", &max_speed);
        hci_uart_set_speeds(hu, 115200, max_speed);