struct wlfw_cal_report_resp_msg_v01 resp = {};
        struct wlfw_cal_report_req_msg_v01 req = {};
        struct ath10k *ar = qmi->ar;
+       struct ath10k_snoc *ar_snoc = ath10k_snoc_priv(ar);
        struct qmi_txn txn;
        int i, j = 0;
        int ret;
 
+       if (ar_snoc->xo_cal_supported) {
+               req.xo_cal_data_valid = 1;
+               req.xo_cal_data = ar_snoc->xo_cal_data;
+       }
+
        ret = qmi_txn_init(&qmi->qmi_hdl, &txn, wlfw_cal_report_resp_msg_v01_ei,
                           &resp);
        if (ret < 0)
        struct wlfw_ind_register_resp_msg_v01 resp = {};
        struct wlfw_ind_register_req_msg_v01 req = {};
        struct ath10k *ar = qmi->ar;
+       struct ath10k_snoc *ar_snoc = ath10k_snoc_priv(ar);
        struct qmi_txn txn;
        int ret;
 
        req.msa_ready_enable_valid = 1;
        req.msa_ready_enable = 1;
 
+       if (ar_snoc->xo_cal_supported) {
+               req.xo_cal_enable_valid = 1;
+               req.xo_cal_enable = 1;
+       }
+
        ret = qmi_txn_init(&qmi->qmi_hdl, &txn,
                           wlfw_ind_register_resp_msg_v01_ei, &resp);
        if (ret < 0)
 
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
+#include <linux/property.h>
 #include <linux/regulator/consumer.h>
 
 #include "ce.h"
                ar_snoc->ce_irqs[i].irq_line = res->start;
        }
 
+       ret = device_property_read_u32(&pdev->dev, "qcom,xo-cal-data",
+                                      &ar_snoc->xo_cal_data);
+       ath10k_dbg(ar, ATH10K_DBG_SNOC, "snoc xo-cal-data return %d\n", ret);
+       if (ret == 0) {
+               ar_snoc->xo_cal_supported = true;
+               ath10k_dbg(ar, ATH10K_DBG_SNOC, "xo cal data %x\n",
+                          ar_snoc->xo_cal_data);
+       }
+       ret = 0;
+
 out:
        return ret;
 }