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

Commit b183c19f authored by Richard Zhao's avatar Richard Zhao Committed by Greg Kroah-Hartman
Browse files

USB: chipidea: re-order irq handling to avoid unhandled irqs



- let role driver handle irq before ID change check; this gives the
  role driver a chance to handle disconnect;
- disable irq during switch role; no role driver to handle irq in
  the period.

Tested-by: default avatarMichael Grzeschik <m.grzeschik@pengutronix.de>
Tested-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: default avatarRichard Zhao <richard.zhao@freescale.com>
Signed-off-by: default avatarAlexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 388ed487
Loading
Loading
Loading
Loading
+13 −8
Original line number Diff line number Diff line
@@ -279,6 +279,7 @@ static void ci_role_work(struct work_struct *work)

		ci_role_stop(ci);
		ci_role_start(ci, role);
		enable_irq(ci->irq);
	}
}

@@ -318,18 +319,22 @@ static irqreturn_t ci_irq(int irq, void *data)
{
	struct ci13xxx *ci = data;
	irqreturn_t ret = IRQ_NONE;
	u32 otgsc = 0;

	if (ci->is_otg) {
		u32 sts = hw_read(ci, OP_OTGSC, ~0);
	if (ci->is_otg)
		otgsc = hw_read(ci, OP_OTGSC, ~0);

	if (ci->role != CI_ROLE_END)
		ret = ci_role(ci)->irq(ci);

		if (sts & OTGSC_IDIS) {
	if (ci->is_otg && (otgsc & OTGSC_IDIS)) {
		hw_write(ci, OP_OTGSC, OTGSC_IDIS, OTGSC_IDIS);
		disable_irq_nosync(ci->irq);
		queue_work(ci->wq, &ci->work);
		ret = IRQ_HANDLED;
	}
	}

	return ci->role == CI_ROLE_END ? ret : ci_role(ci)->irq(ci);
	return ret;
}

static DEFINE_IDA(ci_ida);