static void qca_power_shutdown(struct hci_uart *hu);
 static int qca_power_off(struct hci_dev *hdev);
 
+static enum qca_btsoc_type qca_soc_type(struct hci_uart *hu)
+{
+       enum qca_btsoc_type soc_type;
+
+       if (hu->serdev) {
+               struct qca_serdev *qsd = serdev_device_get_drvdata(hu->serdev);
+
+               soc_type = qsd->btsoc_type;
+       } else {
+               soc_type = QCA_ROME;
+       }
+
+       return soc_type;
+}
+
 static void __serial_clock_on(struct tty_struct *tty)
 {
        /* TODO: Some chipset requires to enable UART clock on client
 {
        struct hci_uart *hu = hci_get_drvdata(hdev);
        struct qca_data *qca = hu->priv;
-       struct qca_serdev *qcadev;
        struct sk_buff *skb;
        u8 cmd[] = { 0x01, 0x48, 0xFC, 0x01, 0x00 };
 
        skb_queue_tail(&qca->txq, skb);
        hci_uart_tx_wakeup(hu);
 
-       qcadev = serdev_device_get_drvdata(hu->serdev);
-
        /* Wait for the baudrate change request to be sent */
 
        while (!skb_queue_empty(&qca->txq))
                      msecs_to_jiffies(CMD_TRANS_TIMEOUT_MS));
 
        /* Give the controller time to process the request */
-       if (qcadev->btsoc_type == QCA_WCN3990)
+       if (qca_soc_type(hu) == QCA_WCN3990)
                msleep(10);
        else
                msleep(300);
 
 static int qca_check_speeds(struct hci_uart *hu)
 {
-       struct qca_serdev *qcadev;
-
-       qcadev = serdev_device_get_drvdata(hu->serdev);
-       if (qcadev->btsoc_type == QCA_WCN3990) {
+       if (qca_soc_type(hu) == QCA_WCN3990) {
                if (!qca_get_speed(hu, QCA_INIT_SPEED) &&
                    !qca_get_speed(hu, QCA_OPER_SPEED))
                        return -EINVAL;
 static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type)
 {
        unsigned int speed, qca_baudrate;
-       struct qca_serdev *qcadev;
        int ret = 0;
 
        if (speed_type == QCA_INIT_SPEED) {
                if (speed)
                        host_set_baudrate(hu, speed);
        } else {
+               enum qca_btsoc_type soc_type = qca_soc_type(hu);
+
                speed = qca_get_speed(hu, QCA_OPER_SPEED);
                if (!speed)
                        return 0;
                /* Disable flow control for wcn3990 to deassert RTS while
                 * changing the baudrate of chip and host.
                 */
-               qcadev = serdev_device_get_drvdata(hu->serdev);
-               if (qcadev->btsoc_type == QCA_WCN3990)
+               if (soc_type == QCA_WCN3990)
                        hci_uart_set_flow_control(hu, true);
 
                qca_baudrate = qca_get_baudrate_value(speed);
                host_set_baudrate(hu, speed);
 
 error:
-               if (qcadev->btsoc_type == QCA_WCN3990)
+               if (soc_type == QCA_WCN3990)
                        hci_uart_set_flow_control(hu, false);
        }
 
        struct hci_dev *hdev = hu->hdev;
        struct qca_data *qca = hu->priv;
        unsigned int speed, qca_baudrate = QCA_BAUDRATE_115200;
-       struct qca_serdev *qcadev;
+       enum qca_btsoc_type soc_type = qca_soc_type(hu);
        int ret;
        int soc_ver = 0;
 
-       qcadev = serdev_device_get_drvdata(hu->serdev);
-
        ret = qca_check_speeds(hu);
        if (ret)
                return ret;
        /* Patch downloading has to be done without IBS mode */
        clear_bit(STATE_IN_BAND_SLEEP_ENABLED, &qca->flags);
 
-       if (qcadev->btsoc_type == QCA_WCN3990) {
+       if (soc_type == QCA_WCN3990) {
                bt_dev_info(hdev, "setting up wcn3990");
 
                /* Enable NON_PERSISTENT_SETUP QUIRK to ensure to execute
                qca_baudrate = qca_get_baudrate_value(speed);
        }
 
-       if (qcadev->btsoc_type != QCA_WCN3990) {
+       if (soc_type != QCA_WCN3990) {
                /* Get QCA version information */
                ret = qca_read_soc_version(hdev, &soc_ver);
                if (ret)
 
        bt_dev_info(hdev, "QCA controller version 0x%08x", soc_ver);
        /* Setup patch / NVM configurations */
-       ret = qca_uart_setup(hdev, qca_baudrate, qcadev->btsoc_type, soc_ver);
+       ret = qca_uart_setup(hdev, qca_baudrate, soc_type, soc_ver);
        if (!ret) {
                set_bit(STATE_IN_BAND_SLEEP_ENABLED, &qca->flags);
                qca_debugfs_init(hdev);
        }
 
        /* Setup bdaddr */
-       if (qcadev->btsoc_type == QCA_WCN3990)
+       if (soc_type == QCA_WCN3990)
                hu->hdev->set_bdaddr = qca_set_bdaddr;
        else
                hu->hdev->set_bdaddr = qca_set_bdaddr_rome;