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

Commit 83874a18 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "disp: msm: sde: add cb func check before enabling irq"

parents 2ed05b48 39ca5600
Loading
Loading
Loading
Loading
+14 −12
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved.
 */

#define pr_fmt(fmt)	"[drm:%s:%d] " fmt, __func__, __LINE__
@@ -115,24 +115,26 @@ static int _sde_core_irq_enable(struct sde_kms *sde_kms, int irq_idx)

	SDE_EVT32(irq_idx,
			atomic_read(&sde_kms->irq_obj.enable_counts[irq_idx]));

	if (atomic_inc_return(&sde_kms->irq_obj.enable_counts[irq_idx]) == 1) {
		spin_lock_irqsave(&sde_kms->irq_obj.cb_lock, irq_flags);
		/* empty callback list but interrupt is being enabled */
		if (list_empty(&sde_kms->irq_obj.irq_cb_tbl[irq_idx]))
			SDE_ERROR("enabling irq_idx=%d with no callback\n",
					irq_idx);
		spin_unlock_irqrestore(&sde_kms->irq_obj.cb_lock, irq_flags);

		spin_lock_irqsave(&sde_kms->hw_intr->irq_lock, irq_flags);
	if (atomic_inc_return(&sde_kms->irq_obj.enable_counts[irq_idx]) == 1)
		ret = sde_kms->hw_intr->ops.enable_irq_nolock(
				sde_kms->hw_intr, irq_idx);
		spin_unlock_irqrestore(&sde_kms->hw_intr->irq_lock, irq_flags);
	}

	if (ret)
		SDE_ERROR("Fail to enable IRQ for irq_idx:%d\n", irq_idx);

	SDE_DEBUG("irq_idx=%d ret=%d\n", irq_idx, ret);

	if (atomic_read(&sde_kms->irq_obj.enable_counts[irq_idx]) == 1) {
		spin_lock_irqsave(&sde_kms->irq_obj.cb_lock, irq_flags);
		/* empty callback list but interrupt is enabled */
		if (list_empty(&sde_kms->irq_obj.irq_cb_tbl[irq_idx]))
			SDE_ERROR("irq_idx=%d enabled with no callback\n",
					irq_idx);
		spin_unlock_irqrestore(&sde_kms->irq_obj.cb_lock, irq_flags);
	}
	return ret;
}