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

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

Merge "usb: pdphy: Prevent sending when message is just received"

parents 86ab90cb e24693ce
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -602,6 +602,8 @@ static void kick_sm(struct usbpd *pd, int ms)

static void phy_sig_received(struct usbpd *pd, enum pd_sig_type type)
{
	union power_supply_propval val = {1};

	if (type != HARD_RESET_SIG) {
		usbpd_err(&pd->dev, "invalid signal (%d) received\n", type);
		return;
@@ -612,6 +614,9 @@ static void phy_sig_received(struct usbpd *pd, enum pd_sig_type type)
	/* Force CC logic to source/sink to keep Rp/Rd unchanged */
	set_power_role(pd, pd->current_pr);
	pd->hard_reset_recvd = true;
	power_supply_set_property(pd->usb_psy,
			POWER_SUPPLY_PROP_PD_IN_HARD_RESET, &val);

	kick_sm(pd, 0);
}

@@ -1625,10 +1630,6 @@ static void usbpd_sm(struct work_struct *w)
	if (pd->hard_reset_recvd) {
		pd->hard_reset_recvd = false;

		val.intval = 1;
		power_supply_set_property(pd->usb_psy,
				POWER_SUPPLY_PROP_PD_IN_HARD_RESET, &val);

		if (pd->requested_current) {
			val.intval = pd->requested_current = 0;
			power_supply_set_property(pd->usb_psy,
+18 −1
Original line number Diff line number Diff line
@@ -108,6 +108,7 @@ struct usb_pdphy {
	int tx_status;
	u8 frame_filter_val;
	bool in_test_data_mode;
	bool rx_busy;

	enum data_role data_role;
	enum power_role power_role;
@@ -492,6 +493,12 @@ int pd_phy_write(u16 hdr, const u8 *data, size_t data_len,
		return -EINVAL;
	}

	ret = pdphy_reg_read(pdphy, &val, USB_PDPHY_RX_ACKNOWLEDGE, 1);
	if (ret || val || pdphy->rx_busy) {
		dev_err(pdphy->dev, "%s: RX message pending\n", __func__);
		return -EBUSY;
	}

	pdphy->tx_status = -EINPROGRESS;

	/* write 2 byte SOP message header */
@@ -664,6 +671,15 @@ static int pd_phy_bist_mode(u8 bist_mode)
			BIST_MODE_MASK | BIST_ENABLE, bist_mode | BIST_ENABLE);
}

static irqreturn_t pdphy_msg_rx_irq(int irq, void *data)
{
	struct usb_pdphy *pdphy = data;

	pdphy->rx_busy = true;

	return IRQ_WAKE_THREAD;
}

static irqreturn_t pdphy_msg_rx_irq_thread(int irq, void *data)
{
	u8 size, rx_status, frame_type;
@@ -720,6 +736,7 @@ static irqreturn_t pdphy_msg_rx_irq_thread(int irq, void *data)
		false);
	pdphy->rx_bytes += size + 1;
done:
	pdphy->rx_busy = false;
	return IRQ_HANDLED;
}

@@ -805,7 +822,7 @@ static int pdphy_probe(struct platform_device *pdev)
		return ret;

	ret = pdphy_request_irq(pdphy, pdev->dev.of_node,
		&pdphy->msg_rx_irq, "msg-rx", NULL,
		&pdphy->msg_rx_irq, "msg-rx", pdphy_msg_rx_irq,
		pdphy_msg_rx_irq_thread, (IRQF_TRIGGER_RISING | IRQF_ONESHOT));
	if (ret < 0)
		return ret;