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

Commit 57b851d2 authored by Mayank Rana's avatar Mayank Rana
Browse files

eud: Handle multiple events with eud interrupt



With USB spoof connect functionality, eud hardware is generating
interrupt with status register updated with VBUS present and TX
buffer empty. Current eud ISR expects to have only single event
generated with each interrupt. It doesn't handle received valid
events. Fix this ISR logic to handle multiple events.

Change-Id: I819b8a7f5be5b32753467495416103b690a4a83e
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent 4c93b2bd
Loading
Loading
Loading
Loading
+27 −15
Original line number Original line Diff line number Diff line
@@ -453,41 +453,53 @@ static void eud_uart_tx(struct eud_chip *chip)
static irqreturn_t handle_eud_irq(int irq, void *data)
static irqreturn_t handle_eud_irq(int irq, void *data)
{
{
	struct eud_chip *chip = data;
	struct eud_chip *chip = data;
	u32 reg;
	u8 reg;
	u32 int_mask_en1 = readl_relaxed(chip->eud_reg_base +
	u32 int_mask_en1 = readl_relaxed(chip->eud_reg_base +
					EUD_REG_INT1_EN_MASK);
					EUD_REG_INT1_EN_MASK);


	/* read status register and find out which interrupt triggered */
	/* read status register and find out which interrupt triggered */
	reg = readl_relaxed(chip->eud_reg_base + EUD_REG_INT_STATUS_1);
	reg = readb_relaxed(chip->eud_reg_base + EUD_REG_INT_STATUS_1);
	switch (reg & EUD_INT_ALL) {
	dev_dbg(chip->dev, "EUD Interrupt is received status:%x\n", reg);
	case EUD_INT_RX:

	if (reg & EUD_INT_RX) {
		dev_dbg(chip->dev, "EUD RX Interrupt is received\n");
		dev_dbg(chip->dev, "EUD RX Interrupt is received\n");
		eud_uart_rx(chip);
		eud_uart_rx(chip);
		break;
		reg &= ~EUD_INT_RX;
	case EUD_INT_TX:
	}

	if (reg & EUD_INT_TX) {
		if (EUD_INT_TX & int_mask_en1) {
		if (EUD_INT_TX & int_mask_en1) {
			dev_dbg(chip->dev, "EUD TX Interrupt is received\n");
			dev_dbg(chip->dev, "EUD TX Interrupt is received\n");
			eud_uart_tx(chip);
			eud_uart_tx(chip);
		}
		}
		break;
		reg &= ~EUD_INT_TX;
	case EUD_INT_VBUS:
	}

	if (reg & EUD_INT_VBUS) {
		dev_dbg(chip->dev, "EUD VBUS Interrupt is received\n");
		dev_dbg(chip->dev, "EUD VBUS Interrupt is received\n");
		chip->int_status = EUD_INT_VBUS;
		chip->int_status = EUD_INT_VBUS;
		usb_attach_detach(chip);
		usb_attach_detach(chip);
		break;
		reg &= ~EUD_INT_VBUS;
	case EUD_INT_CHGR:
	}

	if (reg & EUD_INT_CHGR) {
		dev_dbg(chip->dev, "EUD CHGR Interrupt is received\n");
		dev_dbg(chip->dev, "EUD CHGR Interrupt is received\n");
		chip->int_status = EUD_INT_CHGR;
		chip->int_status = EUD_INT_CHGR;
		chgr_enable_disable(chip);
		chgr_enable_disable(chip);
		break;
		reg &= ~EUD_INT_CHGR;
	case EUD_INT_SAFE_MODE:
	}

	if (reg & EUD_INT_SAFE_MODE) {
		dev_dbg(chip->dev, "EUD SAFE MODE Interrupt is received\n");
		dev_dbg(chip->dev, "EUD SAFE MODE Interrupt is received\n");
		pet_eud(chip);
		pet_eud(chip);
		break;
		reg &= ~EUD_INT_SAFE_MODE;
	default:
	}
		dev_dbg(chip->dev, "Unknown EUD Interrupt is received\n");

	if (reg) {
		dev_dbg(chip->dev, "Unhandled EUD interrupt status:%x\n", reg);
		return IRQ_NONE;
		return IRQ_NONE;
	}
	}

	return IRQ_HANDLED;
	return IRQ_HANDLED;
}
}