firmware: qcom: scm: Fix __scm and waitq completion variable initialization
[linux-2.6-block.git] / drivers / firmware / qcom / qcom_scm.c
index d9cee441d81c1322b81442d535ba61ec359ae628..84aa30b5a19e652582657b223f48eac137490223 100644 (file)
@@ -1737,7 +1737,7 @@ static int qcom_scm_qseecom_init(struct qcom_scm *scm)
  */
 bool qcom_scm_is_available(void)
 {
-       return !!__scm;
+       return !!READ_ONCE(__scm);
 }
 EXPORT_SYMBOL_GPL(qcom_scm_is_available);
 
@@ -1818,10 +1818,12 @@ static int qcom_scm_probe(struct platform_device *pdev)
        if (!scm)
                return -ENOMEM;
 
+       scm->dev = &pdev->dev;
        ret = qcom_scm_find_dload_address(&pdev->dev, &scm->dload_mode_addr);
        if (ret < 0)
                return ret;
 
+       init_completion(&scm->waitq_comp);
        mutex_init(&scm->scm_bw_lock);
 
        scm->path = devm_of_icc_get(&pdev->dev, NULL);
@@ -1853,10 +1855,8 @@ static int qcom_scm_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
-       __scm = scm;
-       __scm->dev = &pdev->dev;
-
-       init_completion(&__scm->waitq_comp);
+       /* Let all above stores be available after this */
+       smp_store_release(&__scm, scm);
 
        irq = platform_get_irq_optional(pdev, 0);
        if (irq < 0) {