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

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

Merge "drm/msm/sde: take irq callback lock before reading cb list"

parents 8d9f2f3c 1eed217c
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -31,14 +31,17 @@ static void sde_core_irq_callback_handler(void *arg, int irq_idx)
	struct sde_irq *irq_obj = &sde_kms->irq_obj;
	struct sde_irq_callback *cb;
	unsigned long irq_flags;
	bool cb_tbl_error = false;
	int enable_counts = 0;

	pr_debug("irq_idx=%d\n", irq_idx);

	spin_lock_irqsave(&sde_kms->irq_obj.cb_lock, irq_flags);
	if (list_empty(&irq_obj->irq_cb_tbl[irq_idx])) {
		SDE_ERROR("irq_idx=%d has no registered callback\n", irq_idx);
		SDE_EVT32_IRQ(irq_idx, atomic_read(
				&sde_kms->irq_obj.enable_counts[irq_idx]),
				SDE_EVTLOG_ERROR);
		/* print error outside lock */
		cb_tbl_error = true;
		enable_counts = atomic_read(
				&sde_kms->irq_obj.enable_counts[irq_idx]);
	}

	atomic_inc(&irq_obj->irq_counts[irq_idx]);
@@ -46,12 +49,17 @@ static void sde_core_irq_callback_handler(void *arg, int irq_idx)
	/*
	 * Perform registered function callback
	 */
	spin_lock_irqsave(&sde_kms->irq_obj.cb_lock, irq_flags);
	list_for_each_entry(cb, &irq_obj->irq_cb_tbl[irq_idx], list)
		if (cb->func)
			cb->func(cb->arg, irq_idx);
	spin_unlock_irqrestore(&sde_kms->irq_obj.cb_lock, irq_flags);

	if (cb_tbl_error) {
		SDE_ERROR("irq has no registered callback, idx %d enables %d\n",
				irq_idx, enable_counts);
		SDE_EVT32_IRQ(irq_idx, enable_counts, SDE_EVTLOG_ERROR);
	}

	/*
	 * Clear pending interrupt status in HW.
	 * NOTE: sde_core_irq_callback_handler is protected by top-level