Devicetree
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Kaustabh Chakraborty" <kauschluss@disroot.org>
Cc: robh@kernel.org, krzk+dt@kernel.org, devicetree@vger.kernel.org,
	conor+dt@kernel.org
Subject: Re: [PATCH v6 10/11] extcon: add support for Samsung S2M series PMIC extcon devices
Date: Fri, 15 May 2026 11:17:11 +0000	[thread overview]
Message-ID: <20260515111712.3EF89C2BCB0@smtp.kernel.org> (raw)
In-Reply-To: <20260515-s2mu005-pmic-v6-10-1979106992d4@disroot.org>

Thank you for your contribution! Sashiko AI review found 7 potential issue(s) to consider:
- [High] The driver attempts to set the extcon state using an unallocated `priv->extcon` pointer during initialization, causing the initial connection state to be lost.
- [High] The driver writes instance-specific IRQ numbers into a globally shared static array, breaking driver re-entrancy and multi-instance support.
- [High] The driver suppresses the `-EPROBE_DEFER` error code when requesting IRQs, permanently failing the probe.
- [High] The USB DM/DP pin configuration and extcon logic incorrectly handles Dedicated Charging Ports (DCP) and Charging Downstream Ports (CDP).
- [High] Unconditional dereference of `platform_get_device_id(pdev)` will cause a kernel panic when probed via Device Tree.
- [High] Missing synchronization locks allow concurrent threaded IRQ handlers and the `remove` callback to race and corrupt shared hardware state.
- [Medium] A bitmask register value is evaluated using an exact-match `switch` statement, leading to silent failures if multiple bits are set.
--

commit f656e24319a7eaa1f4ea39f962f29d98ebf1b285
Author: Kaustabh Chakraborty <kauschluss@disroot.org>

extcon: add support for Samsung S2M series PMIC extcon devices

Add a driver for MUIC devices found in certain Samsung S2M series PMICs.
These are USB port accessory detectors. These devices report multiple
cable states depending on the ID-GND resistance measured by an internal
ADC.

> diff --git a/drivers/extcon/extcon-s2m.c b/drivers/extcon/extcon-s2m.c
> new file mode 100644
> --- /dev/null
> +++ b/drivers/extcon/extcon-s2m.c
[ ... ]
> +static int s2mu005_muic_attach(struct s2m_muic *priv)
> +{
> +	unsigned int type;
> +	int ret;
[ ... ]
> +	/*
> +	 * All USB connections which require communication via its D+
> +	 * and D- wires need it.
> +	 */
> +	if (type & (S2MU005_MUIC_OTG | S2MU005_MUIC_DCP | S2MU005_MUIC_SDP)) {
> +		ret = regmap_update_bits(priv->regmap, S2MU005_REG_MUIC_SWCTRL,

Does this pin configuration logic erroneously include S2MU005_MUIC_DCP (which
shorts D+/D- and performs no data communication) and omit S2MU005_MUIC_CDP
(which does require data communication)?

[ ... ]
> +	switch (type) {
> +	case S2MU005_MUIC_OTG:
> +		dev_dbg(priv->dev, "USB OTG connection detected\n");
> +		extcon_set_state_sync(priv->extcon, EXTCON_USB_HOST, true);
> +		priv->attached = true;
> +		break;

Since the type variable was previously checked using a bitwise AND, indicating
it acts as a bitmask, could this exact-match switch statement fail to process
the attachment if any other bits or status flags are set in the register?

> +	case S2MU005_MUIC_CDP:
> +		dev_dbg(priv->dev, "USB CDP connection detected\n");
> +		extcon_set_state_sync(priv->extcon, EXTCON_USB, true);
> +		extcon_set_state_sync(priv->extcon, EXTCON_CHG_USB_CDP, true);
> +		priv->attached = true;
> +		break;
> +	case S2MU005_MUIC_SDP:
> +		dev_dbg(priv->dev, "USB SDP connection detected\n");
> +		extcon_set_state_sync(priv->extcon, EXTCON_USB, true);
> +		extcon_set_state_sync(priv->extcon, EXTCON_CHG_USB_SDP, true);
> +		priv->attached = true;
> +		break;
> +	case S2MU005_MUIC_DCP:
> +		dev_dbg(priv->dev, "USB DCP connection detected\n");
> +		extcon_set_state_sync(priv->extcon, EXTCON_USB, true);

Is it correct to assert the EXTCON_USB state for DCP connections? EXTCON_USB
typically signals a standard data connection to the system. Setting it for a
charger with shorted data pins could wake the USB PHY and cause enumeration
timeouts.

[ ... ]
> +static int s2m_muic_probe(struct platform_device *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct sec_pmic_dev *pmic_drvdata = dev_get_drvdata(dev->parent);
> +	struct s2m_muic *priv;
> +	int ret;
> +	int i;
> +
> +	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
> +	if (!priv)
> +		return -ENOMEM;
> +
> +	platform_set_drvdata(pdev, priv);
> +	priv->dev = dev;
> +	priv->regmap = pmic_drvdata->regmap_pmic;
> +
> +	switch (platform_get_device_id(pdev)->driver_data) {

Can platform_get_device_id(pdev) return NULL when the driver is matched via
Device Tree, since the platform bus does not populate pdev->id_entry?
Dereferencing it unconditionally could cause a NULL pointer dereference crash.
Would device_get_match_data() be more robust here?

> +	case S2MU005:
> +		priv->extcon_cable = s2mu005_muic_extcon_cable;
> +		priv->irq_data = s2mu005_muic_irq_data;
> +		/* Initialize MUIC */
> +		ret = s2mu005_muic_init(priv);
> +		break;
> +	default:
> +		return dev_err_probe(dev, -ENODEV,
> +				     "device type %d is not supported by driver\n",
> +				     pmic_drvdata->device_type);
> +	}
> +	if (ret < 0)
> +		return dev_err_probe(dev, ret, "failed to initialize MUIC\n");
> +
> +	priv->extcon = devm_extcon_dev_allocate(dev, priv->extcon_cable);

Since s2mu005_muic_init() configures the hardware and calls s2mu005_muic_attach(),
it will attempt to set the extcon state before priv->extcon is allocated:

    extcon_set_state_sync(priv->extcon, EXTCON_USB_HOST, true);

Because priv->extcon is NULL at that point, the extcon subsystem will return
-EINVAL. Will this cause the driver to silently drop the initial cable state if
an accessory is already connected at boot?

[ ... ]
> +	for (i = 0; priv->irq_data[i].handler; i++) {
> +		int irq = platform_get_irq_byname_optional(pdev,
> +							   priv->irq_data[i].name);
> +		if (irq == -ENXIO)
> +			continue;
> +		if (irq <= 0)
> +			return dev_err_probe(dev, -EINVAL, "failed to get IRQ %s\n",
> +					     priv->irq_data[i].name);

If platform_get_irq_byname_optional() returns -EPROBE_DEFER, will returning a
hardcoded -EINVAL here prevent the driver from properly participating in the
kernel's deferred probing mechanism?

> +
> +		priv->irq_data[i].irq = irq;

Because priv->irq_data points to s2mu005_muic_irq_data, which is a global static
array, does modifying the array here break driver re-entrancy and multi-instance
support?

If multiple devices are instantiated or a device is rebound, the global array
is overwritten, which could cause earlier instances to fail to match their
interrupts and silently drop them.

> +		ret = devm_request_threaded_irq(dev, irq, NULL,
> +						s2m_muic_irq_func, IRQF_ONESHOT,
> +						priv->irq_data[i].name, priv);
> +		if (ret)
> +			return dev_err_probe(dev, ret, "failed to request IRQ\n");
> +	}
> +
> +	return 0;
> +}
> +
> +static void s2m_muic_remove(struct platform_device *pdev)
> +{
> +	struct s2m_muic *priv = dev_get_drvdata(&pdev->dev);
> +
> +	/*
> +	 * Disabling the MUIC device is important as it disables manual
> +	 * switching mode, thereby enabling auto switching mode.
> +	 *
> +	 * This is to ensure that when the board is powered off, it
> +	 * goes into LPM charging mode when a USB charger is connected.
> +	 */
> +	switch (platform_get_device_id(pdev)->driver_data) {
> +	case S2MU005:
> +		s2mu005_muic_detach(priv);
> +		break;
> +	}
> +}

Is there a race condition between the threaded IRQ handlers and the remove
callback?

The IRQ handlers perform read-modify-write operations on the shared
priv->attached flag and issue regmap commands without holding any locks. Since
the IRQs are managed by devres, they remain active during the execution of
s2m_muic_remove().

If an interrupt fires during module unload, it could run concurrently with
s2mu005_muic_detach(), potentially corrupting shared hardware state or
re-enabling manual switching right as the driver is removed.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260515-s2mu005-pmic-v6-0-1979106992d4@disroot.org?part=10

  reply	other threads:[~2026-05-15 11:17 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-15 10:38 [PATCH v6 00/11] Support for Samsung S2MU005 PMIC and its sub-devices Kaustabh Chakraborty
2026-05-15 10:38 ` [PATCH v6 01/11] dt-bindings: leds: document Samsung S2M series PMIC flash LED device Kaustabh Chakraborty
2026-05-15 10:38 ` [PATCH v6 02/11] dt-bindings: extcon: document Samsung S2M series PMIC extcon device Kaustabh Chakraborty
2026-05-15 11:05   ` sashiko-bot
2026-05-15 10:38 ` [PATCH v6 03/11] dt-bindings: mfd: add documentation for S2MU005 PMIC Kaustabh Chakraborty
2026-05-15 10:52   ` sashiko-bot
2026-05-15 10:39 ` [PATCH v6 04/11] mfd: sec: add support " Kaustabh Chakraborty
2026-05-15 11:16   ` sashiko-bot
2026-05-15 10:39 ` [PATCH v6 05/11] mfd: sec: set DMA coherent mask Kaustabh Chakraborty
2026-05-15 11:10   ` sashiko-bot
2026-05-15 10:39 ` [PATCH v6 06/11] mfd: sec: resolve PMIC revision in S2MU005 Kaustabh Chakraborty
2026-05-15 10:39 ` [PATCH v6 07/11] leds: flash: add support for Samsung S2M series PMIC flash LED device Kaustabh Chakraborty
2026-05-15 11:05   ` sashiko-bot
2026-05-15 10:39 ` [PATCH v6 08/11] leds: rgb: add support for Samsung S2M series PMIC RGB " Kaustabh Chakraborty
2026-05-15 11:13   ` sashiko-bot
2026-05-15 10:39 ` [PATCH v6 09/11] Documentation: leds: document pattern behavior of Samsung S2M series PMIC RGB LEDs Kaustabh Chakraborty
2026-05-15 11:03   ` sashiko-bot
2026-05-15 10:39 ` [PATCH v6 10/11] extcon: add support for Samsung S2M series PMIC extcon devices Kaustabh Chakraborty
2026-05-15 11:17   ` sashiko-bot [this message]
2026-05-15 10:39 ` [PATCH v6 11/11] power: supply: add support for Samsung S2M series PMIC charger device Kaustabh Chakraborty
2026-05-15 11:20   ` sashiko-bot

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=20260515111712.3EF89C2BCB0@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=kauschluss@disroot.org \
    --cc=krzk+dt@kernel.org \
    --cc=robh@kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox