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

Commit 4d2fcc28 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: ipa: fix sps power management handling"

parents 74b9b4e6 ad96e0fc
Loading
Loading
Loading
Loading
+14 −4
Original line number Diff line number Diff line
@@ -2765,7 +2765,7 @@ void ipa_suspend_handler(enum ipa_irq_type interrupt,
static void ipa_sps_process_irq_schedule_rel(void)
{
	ipa_ctx->sps_pm.res_rel_in_prog = true;
	queue_delayed_work(ipa_ctx->power_mgmt_wq,
	queue_delayed_work(ipa_ctx->sps_power_mgmt_wq,
			   &ipa_dec_clients_delayed_work,
			   msecs_to_jiffies(IPA_SPS_PROD_TIMEOUT_MSEC));
}
@@ -2882,7 +2882,7 @@ static void sps_event_cb(enum sps_callback_case event, void *param)
				ipa_ctx->sps_pm.res_granted = true;
				*ready = true;
			} else {
				queue_work(ipa_ctx->power_mgmt_wq,
				queue_work(ipa_ctx->sps_power_mgmt_wq,
					   &ipa_sps_process_irq_work);
				*ready = false;
			}
@@ -3052,15 +3052,23 @@ static int ipa_init(const struct ipa_plat_drv_res *resource_p,
	spin_lock_init(&ipa_ctx->ipa_active_clients.spinlock);
	ipa_ctx->ipa_active_clients.cnt = 1;

	/* Create workqueue for power management */
	/* Create workqueues for power management */
	ipa_ctx->power_mgmt_wq =
		create_singlethread_workqueue("ipa_power_mgmt");
	if (!ipa_ctx->power_mgmt_wq) {
		IPAERR("failed to create wq\n");
		IPAERR("failed to create power mgmt wq\n");
		result = -ENOMEM;
		goto fail_init_hw;
	}

	ipa_ctx->sps_power_mgmt_wq =
		create_singlethread_workqueue("sps_ipa_power_mgmt");
	if (!ipa_ctx->sps_power_mgmt_wq) {
		IPAERR("failed to create sps power mgmt wq\n");
		result = -ENOMEM;
		goto fail_create_sps_wq;
	}

	spin_lock_init(&ipa_ctx->sps_pm.lock);
	ipa_ctx->sps_pm.res_granted = false;
	ipa_ctx->sps_pm.res_rel_in_prog = false;
@@ -3422,6 +3430,8 @@ fail_rt_rule_cache:
fail_flt_rule_cache:
	sps_deregister_bam_device(ipa_ctx->bam_handle);
fail_register_bam_device:
	destroy_workqueue(ipa_ctx->sps_power_mgmt_wq);
fail_create_sps_wq:
	destroy_workqueue(ipa_ctx->power_mgmt_wq);
fail_init_hw:
	iounmap(ipa_ctx->mmio);
+2 −0
Original line number Diff line number Diff line
@@ -1001,6 +1001,7 @@ struct ipa_sps_pm {
 * @ip6_flt_tbl_lcl: where ip6 flt tables reside 1-local; 0-system
 * @empty_rt_tbl_mem: empty routing tables memory
 * @power_mgmt_wq: workqueue for power management
 * @sps_power_mgmt_wq: workqueue SPS related power management
 * @tag_process_before_gating: indicates whether to start tag process before
 *  gating IPA clocks
 * @sps_pm: sps power management related information
@@ -1072,6 +1073,7 @@ struct ipa_context {
	struct dma_pool *dma_pool;
	struct ipa_active_clients ipa_active_clients;
	struct workqueue_struct *power_mgmt_wq;
	struct workqueue_struct *sps_power_mgmt_wq;
	bool tag_process_before_gating;
	struct ipa_sps_pm sps_pm;
	u32 clnt_hdl_cmd;