Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1b189876 authored by Ghanim Fodi's avatar Ghanim Fodi Committed by Gerrit - the friendly Code Review server
Browse files

msm: ipa4: initialize IPAHAL at ipa_pre_init()



At virtual platforms, SMMU is not used so IPA HAL
initialization can be done during ipa_pre_init() instead
of ipa_post_init().
IPAHAL need to be initialized at ipa_pre_init() on
virtual platforms as it is used to load IPA firmwares.

CRx-fixed: 2266802
Change-Id: I00201ab6386639ede06a7ba9ac022834f5244e56
Signed-off-by: default avatarGhanim Fodi <gfodi@codeaurora.org>
parent 0fc39cea
Loading
Loading
Loading
Loading
+32 −8
Original line number Diff line number Diff line
@@ -4562,13 +4562,20 @@ static int ipa3_post_init(const struct ipa3_plat_drv_res *resource_p,
	/* move proxy vote for modem on ipa3_post_init */
	if (ipa3_ctx->ipa_hw_type != IPA_HW_v4_0)
		ipa3_proxy_clk_vote();
	/* SMMU was already attached if used, safe to do allocations */

	/*
	 * In Virtual mode, IPAHAL initialized at pre_init as
	 * there is no SMMU. In normal mode need to wait until
	 * SMMU is attached and thus initialization done here.
	 */
	if (ipa3_ctx->ipa3_hw_mode != IPA_HW_MODE_VIRTUAL) {
		if (ipahal_init(ipa3_ctx->ipa_hw_type, ipa3_ctx->mmio,
			ipa3_ctx->pdev)) {
			IPAERR("fail to init ipahal\n");
			result = -EFAULT;
			goto fail_ipahal;
		}
	}

	result = ipa3_init_hw();
	if (result) {
@@ -4797,9 +4804,9 @@ static int ipa3_post_init(const struct ipa3_plat_drv_res *resource_p,
	ipa3_free_dma_task_for_gsi();
fail_dma_task:
fail_init_hw:
	if (ipa3_ctx->ipa3_hw_mode != IPA_HW_MODE_VIRTUAL)
		ipahal_destroy();
fail_ipahal:

	return result;
}

@@ -5252,6 +5259,20 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p,
		goto fail_remap;
	}

	/*
	 * In Virtual mode, IPAHAL used to load the firmwares
	 * and there is no SMMU so IPAHAL is initialized here.
	 */
	if (ipa3_ctx->ipa3_hw_mode == IPA_HW_MODE_VIRTUAL) {
		if (ipahal_init(ipa3_ctx->ipa_hw_type,
				ipa3_ctx->mmio,
				&(ipa3_ctx->master_pdev->dev))) {
			IPAERR("fail to init ipahal\n");
			result = -EFAULT;
			goto fail_ipahal_init;
		}
	}

	mutex_init(&ipa3_ctx->ipa3_active_clients.mutex);

	IPA_ACTIVE_CLIENTS_PREP_SPECIAL(log_info, "PROXY_CLK_VOTE");
@@ -5538,6 +5559,9 @@ static int ipa3_pre_init(const struct ipa3_plat_drv_res *resource_p,
fail_create_transport_wq:
	destroy_workqueue(ipa3_ctx->power_mgmt_wq);
fail_init_hw:
	if (ipa3_ctx->ipa3_hw_mode == IPA_HW_MODE_VIRTUAL)
		ipahal_destroy();
fail_ipahal_init:
	iounmap(ipa3_ctx->mmio);
fail_remap:
	ipa3_disable_clks();