From: Heikki Krogerus <heikki.krogerus@linux.intel.com>
To: Sven Peter <sven@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Felipe Balbi <balbi@kernel.org>, Janne Grunau <j@jannau.net>,
Alyssa Rosenzweig <alyssa@rosenzweig.io>,
Neal Gompa <neal@gompa.dev>, Vinod Koul <vkoul@kernel.org>,
Kishon Vijay Abraham I <kishon@kernel.org>,
Thinh Nguyen <Thinh.Nguyen@synopsys.com>,
Philipp Zabel <p.zabel@pengutronix.de>,
linux-usb@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, asahi@lists.linux.dev,
linux-arm-kernel@lists.infradead.org,
linux-phy@lists.infradead.org, stable@kernel.org
Subject: Re: [PATCH RFC 08/22] usb: typec: tipd: Clear interrupts first
Date: Fri, 29 Aug 2025 12:37:23 +0300 [thread overview]
Message-ID: <aLF00zGWg2MPUlyJ@kuha.fi.intel.com> (raw)
In-Reply-To: <20250821-atcphy-6-17-v1-8-172beda182b8@kernel.org>
On Thu, Aug 21, 2025 at 03:39:00PM +0000, Sven Peter wrote:
> Right now the interrupt handler first reads all updated status registers
> and only then clears the interrupts. It's possible that a duplicate
> interrupt for a changed register or plug state comes in after the
> interrupts have been processed but before they have been cleared:
>
> * plug is inserted, TPS_REG_INT_PLUG_EVENT is set
> * TPS_REG_INT_EVENT1 is read
> * tps6598x_handle_plug_event() has run and registered the plug
> * plug is removed again, TPS_REG_INT_PLUG_EVENT is set (again)
> * TPS_REG_INT_CLEAR1 is written, TPS_REG_INT_PLUG_EVENT is cleared
>
> We then have no plug connected and no pending interrupt but the tipd
> core still thinks there is a plug. It's possible to trigger this with
> e.g. a slightly broken Type-C to USB A converter.
>
> Fix this by first clearing the interrupts and only then reading the
> updated registers.
>
> Fixes: 45188f27b3d0 ("usb: typec: tipd: Add support for Apple CD321X")
> Fixes: 0a4c005bd171 ("usb: typec: driver for TI TPS6598x USB Power Delivery controllers")
> Cc: stable@kernel.org
> Signed-off-by: Sven Peter <sven@kernel.org>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> ---
> drivers/usb/typec/tipd/core.c | 24 +++++++++++-------------
> 1 file changed, 11 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c
> index dcf141ada07812295a6f07e41d77f95f98116010..1c80296c3b273e24ceacb3feff432c4f6e6835cc 100644
> --- a/drivers/usb/typec/tipd/core.c
> +++ b/drivers/usb/typec/tipd/core.c
> @@ -545,24 +545,23 @@ static irqreturn_t cd321x_interrupt(int irq, void *data)
> if (!event)
> goto err_unlock;
>
> + tps6598x_write64(tps, TPS_REG_INT_CLEAR1, event);
> +
> if (!tps6598x_read_status(tps, &status))
> - goto err_clear_ints;
> + goto err_unlock;
>
> if (event & APPLE_CD_REG_INT_POWER_STATUS_UPDATE)
> if (!tps6598x_read_power_status(tps))
> - goto err_clear_ints;
> + goto err_unlock;
>
> if (event & APPLE_CD_REG_INT_DATA_STATUS_UPDATE)
> if (!tps6598x_read_data_status(tps))
> - goto err_clear_ints;
> + goto err_unlock;
>
> /* Handle plug insert or removal */
> if (event & APPLE_CD_REG_INT_PLUG_EVENT)
> tps6598x_handle_plug_event(tps, status);
>
> -err_clear_ints:
> - tps6598x_write64(tps, TPS_REG_INT_CLEAR1, event);
> -
> err_unlock:
> mutex_unlock(&tps->lock);
>
> @@ -668,25 +667,24 @@ static irqreturn_t tps6598x_interrupt(int irq, void *data)
> if (!(event1[0] | event1[1] | event2[0] | event2[1]))
> goto err_unlock;
>
> + tps6598x_block_write(tps, TPS_REG_INT_CLEAR1, event1, intev_len);
> + tps6598x_block_write(tps, TPS_REG_INT_CLEAR2, event2, intev_len);
> +
> if (!tps6598x_read_status(tps, &status))
> - goto err_clear_ints;
> + goto err_unlock;
>
> if ((event1[0] | event2[0]) & TPS_REG_INT_POWER_STATUS_UPDATE)
> if (!tps6598x_read_power_status(tps))
> - goto err_clear_ints;
> + goto err_unlock;
>
> if ((event1[0] | event2[0]) & TPS_REG_INT_DATA_STATUS_UPDATE)
> if (!tps6598x_read_data_status(tps))
> - goto err_clear_ints;
> + goto err_unlock;
>
> /* Handle plug insert or removal */
> if ((event1[0] | event2[0]) & TPS_REG_INT_PLUG_EVENT)
> tps6598x_handle_plug_event(tps, status);
>
> -err_clear_ints:
> - tps6598x_block_write(tps, TPS_REG_INT_CLEAR1, event1, intev_len);
> - tps6598x_block_write(tps, TPS_REG_INT_CLEAR2, event2, intev_len);
> -
> err_unlock:
> mutex_unlock(&tps->lock);
>
>
> --
> 2.34.1
>
--
heikki
WARNING: multiple messages have this Message-ID (diff)
From: Heikki Krogerus <heikki.krogerus@linux.intel.com>
To: Sven Peter <sven@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Felipe Balbi <balbi@kernel.org>, Janne Grunau <j@jannau.net>,
Alyssa Rosenzweig <alyssa@rosenzweig.io>,
Neal Gompa <neal@gompa.dev>, Vinod Koul <vkoul@kernel.org>,
Kishon Vijay Abraham I <kishon@kernel.org>,
Thinh Nguyen <Thinh.Nguyen@synopsys.com>,
Philipp Zabel <p.zabel@pengutronix.de>,
linux-usb@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, asahi@lists.linux.dev,
linux-arm-kernel@lists.infradead.org,
linux-phy@lists.infradead.org, stable@kernel.org
Subject: Re: [PATCH RFC 08/22] usb: typec: tipd: Clear interrupts first
Date: Fri, 29 Aug 2025 12:37:23 +0300 [thread overview]
Message-ID: <aLF00zGWg2MPUlyJ@kuha.fi.intel.com> (raw)
In-Reply-To: <20250821-atcphy-6-17-v1-8-172beda182b8@kernel.org>
On Thu, Aug 21, 2025 at 03:39:00PM +0000, Sven Peter wrote:
> Right now the interrupt handler first reads all updated status registers
> and only then clears the interrupts. It's possible that a duplicate
> interrupt for a changed register or plug state comes in after the
> interrupts have been processed but before they have been cleared:
>
> * plug is inserted, TPS_REG_INT_PLUG_EVENT is set
> * TPS_REG_INT_EVENT1 is read
> * tps6598x_handle_plug_event() has run and registered the plug
> * plug is removed again, TPS_REG_INT_PLUG_EVENT is set (again)
> * TPS_REG_INT_CLEAR1 is written, TPS_REG_INT_PLUG_EVENT is cleared
>
> We then have no plug connected and no pending interrupt but the tipd
> core still thinks there is a plug. It's possible to trigger this with
> e.g. a slightly broken Type-C to USB A converter.
>
> Fix this by first clearing the interrupts and only then reading the
> updated registers.
>
> Fixes: 45188f27b3d0 ("usb: typec: tipd: Add support for Apple CD321X")
> Fixes: 0a4c005bd171 ("usb: typec: driver for TI TPS6598x USB Power Delivery controllers")
> Cc: stable@kernel.org
> Signed-off-by: Sven Peter <sven@kernel.org>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
> ---
> drivers/usb/typec/tipd/core.c | 24 +++++++++++-------------
> 1 file changed, 11 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c
> index dcf141ada07812295a6f07e41d77f95f98116010..1c80296c3b273e24ceacb3feff432c4f6e6835cc 100644
> --- a/drivers/usb/typec/tipd/core.c
> +++ b/drivers/usb/typec/tipd/core.c
> @@ -545,24 +545,23 @@ static irqreturn_t cd321x_interrupt(int irq, void *data)
> if (!event)
> goto err_unlock;
>
> + tps6598x_write64(tps, TPS_REG_INT_CLEAR1, event);
> +
> if (!tps6598x_read_status(tps, &status))
> - goto err_clear_ints;
> + goto err_unlock;
>
> if (event & APPLE_CD_REG_INT_POWER_STATUS_UPDATE)
> if (!tps6598x_read_power_status(tps))
> - goto err_clear_ints;
> + goto err_unlock;
>
> if (event & APPLE_CD_REG_INT_DATA_STATUS_UPDATE)
> if (!tps6598x_read_data_status(tps))
> - goto err_clear_ints;
> + goto err_unlock;
>
> /* Handle plug insert or removal */
> if (event & APPLE_CD_REG_INT_PLUG_EVENT)
> tps6598x_handle_plug_event(tps, status);
>
> -err_clear_ints:
> - tps6598x_write64(tps, TPS_REG_INT_CLEAR1, event);
> -
> err_unlock:
> mutex_unlock(&tps->lock);
>
> @@ -668,25 +667,24 @@ static irqreturn_t tps6598x_interrupt(int irq, void *data)
> if (!(event1[0] | event1[1] | event2[0] | event2[1]))
> goto err_unlock;
>
> + tps6598x_block_write(tps, TPS_REG_INT_CLEAR1, event1, intev_len);
> + tps6598x_block_write(tps, TPS_REG_INT_CLEAR2, event2, intev_len);
> +
> if (!tps6598x_read_status(tps, &status))
> - goto err_clear_ints;
> + goto err_unlock;
>
> if ((event1[0] | event2[0]) & TPS_REG_INT_POWER_STATUS_UPDATE)
> if (!tps6598x_read_power_status(tps))
> - goto err_clear_ints;
> + goto err_unlock;
>
> if ((event1[0] | event2[0]) & TPS_REG_INT_DATA_STATUS_UPDATE)
> if (!tps6598x_read_data_status(tps))
> - goto err_clear_ints;
> + goto err_unlock;
>
> /* Handle plug insert or removal */
> if ((event1[0] | event2[0]) & TPS_REG_INT_PLUG_EVENT)
> tps6598x_handle_plug_event(tps, status);
>
> -err_clear_ints:
> - tps6598x_block_write(tps, TPS_REG_INT_CLEAR1, event1, intev_len);
> - tps6598x_block_write(tps, TPS_REG_INT_CLEAR2, event2, intev_len);
> -
> err_unlock:
> mutex_unlock(&tps->lock);
>
>
> --
> 2.34.1
>
--
heikki
--
linux-phy mailing list
linux-phy@lists.infradead.org
https://lists.infradead.org/mailman/listinfo/linux-phy
next prev parent reply other threads:[~2025-08-29 9:37 UTC|newest]
Thread overview: 108+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-21 15:38 [PATCH RFC 00/22] Apple Silicon USB3 support Sven Peter
2025-08-21 15:38 ` Sven Peter
2025-08-21 15:38 ` [PATCH RFC 01/22] dt-bindings: usb: snps,dwc3: Allow multiple iommus Sven Peter
2025-08-21 15:38 ` Sven Peter
2025-08-21 22:39 ` Rob Herring (Arm)
2025-08-21 22:39 ` Rob Herring (Arm)
2025-08-22 7:22 ` Krzysztof Kozlowski
2025-08-22 7:22 ` Krzysztof Kozlowski
2025-08-24 8:31 ` Krzysztof Kozlowski
2025-08-24 8:31 ` Krzysztof Kozlowski
2025-08-27 16:07 ` Sven Peter
2025-08-27 16:07 ` Sven Peter
2025-08-28 6:54 ` Krzysztof Kozlowski
2025-08-28 6:54 ` Krzysztof Kozlowski
2025-08-21 15:38 ` [PATCH RFC 02/22] dt-bindings: usb: Add Apple dwc3 Sven Peter
2025-08-21 15:38 ` Sven Peter
2025-08-21 22:39 ` Rob Herring (Arm)
2025-08-21 22:39 ` Rob Herring (Arm)
2025-08-22 7:24 ` Krzysztof Kozlowski
2025-08-22 7:24 ` Krzysztof Kozlowski
2025-08-24 15:30 ` Sven Peter
2025-08-24 15:30 ` Sven Peter
2025-08-21 15:38 ` [PATCH RFC 03/22] dt-bindings: phy: Add Apple Type-C PHY Sven Peter
2025-08-21 15:38 ` Sven Peter
2025-08-21 16:33 ` Janne Grunau
2025-08-21 16:33 ` Janne Grunau
2025-08-21 23:00 ` Rob Herring
2025-08-21 23:00 ` Rob Herring
2025-08-24 15:33 ` Sven Peter
2025-08-24 15:33 ` Sven Peter
2025-08-21 22:39 ` Rob Herring (Arm)
2025-08-21 22:39 ` Rob Herring (Arm)
2025-08-21 15:38 ` [PATCH RFC 04/22] usb: dwc3: apple: Reset dwc3 during role switches Sven Peter
2025-08-21 15:38 ` Sven Peter
2025-08-21 23:25 ` Thinh Nguyen
2025-08-21 23:25 ` Thinh Nguyen
2025-08-24 13:18 ` Janne Grunau
2025-08-24 13:18 ` Janne Grunau
2025-08-28 23:07 ` Thinh Nguyen
2025-08-28 23:07 ` Thinh Nguyen
2025-08-24 15:24 ` Sven Peter
2025-08-24 15:24 ` Sven Peter
2025-08-28 23:14 ` Thinh Nguyen
2025-08-28 23:14 ` Thinh Nguyen
2025-08-21 15:38 ` [PATCH RFC 05/22] usb: dwc3: apple: Do not use host-vbus-glitches workaround Sven Peter
2025-08-21 15:38 ` Sven Peter
2025-08-21 22:28 ` Thinh Nguyen
2025-08-21 22:28 ` Thinh Nguyen
2025-08-23 11:42 ` Sven Peter
2025-08-23 11:42 ` Sven Peter
2025-08-28 23:06 ` Thinh Nguyen
2025-08-28 23:06 ` Thinh Nguyen
2025-08-21 15:38 ` [PATCH RFC 06/22] usb: dwc3: apple: Use synchronous role switch for apple Sven Peter
2025-08-21 15:38 ` Sven Peter
2025-08-21 15:38 ` [PATCH RFC 07/22] usb: dwc3: apple: Adjust vendor-specific registers during init Sven Peter
2025-08-21 15:38 ` Sven Peter
2025-08-21 22:18 ` Thinh Nguyen
2025-08-21 22:18 ` Thinh Nguyen
2025-08-23 9:32 ` Sven Peter
2025-08-23 9:32 ` Sven Peter
2025-08-28 22:51 ` Thinh Nguyen
2025-08-28 22:51 ` Thinh Nguyen
2025-08-21 15:39 ` [PATCH RFC 08/22] usb: typec: tipd: Clear interrupts first Sven Peter
2025-08-21 15:39 ` Sven Peter
2025-08-29 9:37 ` Heikki Krogerus [this message]
2025-08-29 9:37 ` Heikki Krogerus
2025-08-21 15:39 ` [PATCH RFC 09/22] usb: typec: tipd: Move initial irq mask to tipd_data Sven Peter
2025-08-21 15:39 ` Sven Peter
2025-09-05 11:03 ` Heikki Krogerus
2025-09-05 11:03 ` Heikki Krogerus
2025-08-21 15:39 ` [PATCH RFC 10/22] usb: typec: tipd: Move switch_power_state " Sven Peter
2025-08-21 15:39 ` Sven Peter
2025-09-05 11:09 ` Heikki Krogerus
2025-09-05 11:09 ` Heikki Krogerus
2025-08-21 15:39 ` [PATCH RFC 11/22] usb: typec: tipd: Trace data status for CD321x correctly Sven Peter
2025-08-21 15:39 ` Sven Peter
2025-09-05 11:11 ` Heikki Krogerus
2025-09-05 11:11 ` Heikki Krogerus
2025-08-21 15:39 ` [PATCH RFC 12/22] usb: typec: tipd: Add cd321x struct with separate size Sven Peter
2025-08-21 15:39 ` Sven Peter
2025-09-05 11:15 ` Heikki Krogerus
2025-09-05 11:15 ` Heikki Krogerus
2025-08-21 15:39 ` [PATCH RFC 13/22] usb: typec: tipd: Read USB4, Thunderbolt and DisplayPort status for cd321x Sven Peter
2025-08-21 15:39 ` Sven Peter
2025-08-21 16:46 ` Janne Grunau
2025-08-21 16:46 ` Janne Grunau
2025-08-21 15:39 ` [PATCH RFC 14/22] usb: typec: tipd: Register DisplayPort and Thunderbolt altmodes " Sven Peter
2025-08-21 15:39 ` Sven Peter
2025-09-05 11:20 ` Heikki Krogerus
2025-09-05 11:20 ` Heikki Krogerus
2025-08-21 15:39 ` [PATCH RFC 15/22] usb: typec: tipd: Update partner identity when power status was updated Sven Peter
2025-08-21 15:39 ` Sven Peter
2025-09-05 11:40 ` Heikki Krogerus
2025-09-05 11:40 ` Heikki Krogerus
2025-08-21 15:39 ` [PATCH RFC 16/22] usb: typec: tipd: Use read_power_status function in probe Sven Peter
2025-08-21 15:39 ` Sven Peter
2025-08-21 15:39 ` [PATCH RFC 17/22] usb: typec: tipd: Read data status in probe and cache its value Sven Peter
2025-08-21 15:39 ` Sven Peter
2025-08-21 15:39 ` [PATCH RFC 18/22] usb: typec: mux: Introduce data_role to mux state Sven Peter
2025-08-21 15:39 ` Sven Peter
2025-08-21 15:39 ` [PATCH RFC 19/22] usb: typec: tipd: Handle mode transitions for CD321x Sven Peter
2025-08-21 15:39 ` Sven Peter
2025-08-21 15:39 ` [PATCH RFC 20/22] soc: apple: Add hardware tunable support Sven Peter
2025-08-21 15:39 ` Sven Peter
2025-08-21 15:39 ` [PATCH RFC 21/22] phy: apple: Add Apple Type-C PHY Sven Peter
2025-08-21 15:39 ` Sven Peter
2025-08-21 15:39 ` [PATCH RFC 22/22] arm64: dts: apple: t8103: Add Apple Type-C PHY and dwc3 nodes Sven Peter
2025-08-21 15:39 ` Sven Peter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aLF00zGWg2MPUlyJ@kuha.fi.intel.com \
--to=heikki.krogerus@linux.intel.com \
--cc=Thinh.Nguyen@synopsys.com \
--cc=alyssa@rosenzweig.io \
--cc=asahi@lists.linux.dev \
--cc=balbi@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=j@jannau.net \
--cc=kishon@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-phy@lists.infradead.org \
--cc=linux-usb@vger.kernel.org \
--cc=neal@gompa.dev \
--cc=p.zabel@pengutronix.de \
--cc=robh@kernel.org \
--cc=stable@kernel.org \
--cc=sven@kernel.org \
--cc=vkoul@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.