diff --git a/Documentation/devicetree/bindings/cnss/icnss.txt b/Documentation/devicetree/bindings/cnss/icnss.txt index f07a2beafbb3..08fab81f3393 100644 --- a/Documentation/devicetree/bindings/cnss/icnss.txt +++ b/Documentation/devicetree/bindings/cnss/icnss.txt @@ -14,6 +14,7 @@ Required properties: - qcom,wlan-msa-memory: MSA memory size Optional properties: + - qcom,skip-qmi: Boolean property to decide whether to use QMI or not Example: @@ -35,4 +36,5 @@ Example: <0 140 0 /* CE10 */ >, <0 141 0 /* CE11 */ >; qcom,wlan-msa-memory = <0x200000>; + qcom,skip-qmi; }; diff --git a/drivers/soc/qcom/icnss.c b/drivers/soc/qcom/icnss.c index e9f7b8931d9b..477a35b9b6e3 100644 --- a/drivers/soc/qcom/icnss.c +++ b/drivers/soc/qcom/icnss.c @@ -99,6 +99,7 @@ static struct { u32 rf_pin_result; struct icnss_mem_region_info icnss_mem_region[QMI_WLFW_MAX_NUM_MEMORY_REGIONS_V01]; + bool skip_qmi; } *penv; static int icnss_qmi_event_post(enum icnss_qmi_event_type type, void *data) @@ -810,6 +811,9 @@ int icnss_register_driver(struct icnss_driver_ops *ops) } penv->ops = ops; + if (penv->skip_qmi) + penv->state |= ICNSS_FW_READY; + /* check for all conditions before invoking probe */ if (ICNSS_IS_FW_READY(penv->state) && penv->ops->probe) { ret = penv->ops->probe(&pdev->dev); @@ -1101,6 +1105,9 @@ skip: if (ret) pr_err("%s: Failed to send mode, ret = %d\n", __func__, ret); out: + if (penv->skip_qmi) + ret = 0; + return ret; } EXPORT_SYMBOL(icnss_wlan_enable); @@ -1175,6 +1182,9 @@ static int icnss_probe(struct platform_device *pdev) goto out; } + penv->skip_qmi = of_property_read_bool(dev->of_node, + "qcom,skip-qmi"); + penv->qmi_event_wq = alloc_workqueue("icnss_qmi_event", 0, 0); if (!penv->qmi_event_wq) { pr_err("%s: workqueue creation failed\n", __func__);