static int wcnss_start()

in qcom_wcnss.c [217:281]


static int wcnss_start(struct rproc *rproc)
{
	struct qcom_wcnss *wcnss = (struct qcom_wcnss *)rproc->priv;
	int ret, i;

	mutex_lock(&wcnss->iris_lock);
	if (!wcnss->iris) {
		dev_err(wcnss->dev, "no iris registered\n");
		ret = -EINVAL;
		goto release_iris_lock;
	}

	for (i = 0; i < wcnss->num_pds; i++) {
		dev_pm_genpd_set_performance_state(wcnss->pds[i], INT_MAX);
		ret = pm_runtime_get_sync(wcnss->pds[i]);
		if (ret < 0) {
			pm_runtime_put_noidle(wcnss->pds[i]);
			goto disable_pds;
		}
	}

	ret = regulator_bulk_enable(wcnss->num_vregs, wcnss->vregs);
	if (ret)
		goto disable_pds;

	ret = qcom_iris_enable(wcnss->iris);
	if (ret)
		goto disable_regulators;

	wcnss_indicate_nv_download(wcnss);
	wcnss_configure_iris(wcnss);

	ret = qcom_scm_pas_auth_and_reset(WCNSS_PAS_ID);
	if (ret) {
		dev_err(wcnss->dev,
			"failed to authenticate image and release reset\n");
		goto disable_iris;
	}

	ret = wait_for_completion_timeout(&wcnss->start_done,
					  msecs_to_jiffies(5000));
	if (wcnss->ready_irq > 0 && ret == 0) {
		/* We have a ready_irq, but it didn't fire in time. */
		dev_err(wcnss->dev, "start timed out\n");
		qcom_scm_pas_shutdown(WCNSS_PAS_ID);
		ret = -ETIMEDOUT;
		goto disable_iris;
	}

	ret = 0;

disable_iris:
	qcom_iris_disable(wcnss->iris);
disable_regulators:
	regulator_bulk_disable(wcnss->num_vregs, wcnss->vregs);
disable_pds:
	for (i--; i >= 0; i--) {
		pm_runtime_put(wcnss->pds[i]);
		dev_pm_genpd_set_performance_state(wcnss->pds[i], 0);
	}
release_iris_lock:
	mutex_unlock(&wcnss->iris_lock);

	return ret;
}