linux-can.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v9 0/4] can: m_can: Add am62 wakeup support
@ 2025-08-20 12:42 Markus Schneider-Pargmann
  2025-08-20 12:42 ` [PATCH v9 1/4] dt-bindings: can: m_can: Add wakeup properties Markus Schneider-Pargmann
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Markus Schneider-Pargmann @ 2025-08-20 12:42 UTC (permalink / raw)
  To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley
  Cc: Vishal Mahaveer, Kevin Hilman, Dhruva Gole, Sebin Francis,
	Kendall Willis, Akashdeep Kaur, Simon Horman, Vincent MAILHOL,
	linux-can, devicetree, linux-kernel, Markus Schneider-Pargmann

Hi,

This series adds support for wakeup capabilities to the m_can driver, which 
is necessary for enabling Partial-IO functionality on am62, am62a, and am62p 
SoCs. It implements the wake-on-lan interface for m_can devices and handles 
the pinctrl states needed for wakeup functionality.

am62, am62a and am62p support Partial-IO, a low power system state in which 
nearly everything is turned off except the pins of the CANUART group. This group
contains mcu_mcan0, mcu_mcan1, wkup_uart0 and mcu_uart0 devices.

To support mcu_mcan0 and mcu_mcan1 wakeup for the mentioned SoCs, the
series introduces a notion of wake-on-lan for m_can. If the user decides
to enable wake-on-lan for a m_can device, the device is set to wakeup
enabled. A 'wakeup' pinctrl state is selected to enable wakeup flags for
the relevant pins. If wake-on-lan is disabled the default pinctrl is
selected.

Partial-IO Overview
------------------
Partial-IO is a low power system state in which nearly everything is
turned off except the pins of the CANUART group (mcu_mcan0, mcu_mcan1, 
wkup_uart0 and mcu_uart0). These devices can trigger a wakeup of the system 
on pin activity. Note that this does not resume the system as the DDR is 
off as well. So this state can be considered a power-off state with wakeup 
capabilities.

A documentation can also be found in section 6.2.4 in the TRM:
  https://www.ti.com/lit/pdf/spruiv7

Implementation Details
----------------------
The complete Partial-IO feature requires three coordinated series, each handling
a different aspect of the implementation:

1. This series (m_can driver): Implements device-specific wakeup functionality
   for m_can devices, allowing them to be set as wakeup sources.

2. Devicetree series: Defines system states and wakeup sources in the
   devicetree for am62, am62a and am62p.
   https://gitlab.baylibre.com/msp8/linux/-/tree/topic/am62-dt-partialio/v6.17?ref_type=heads

3. TI-SCI firmware series: Implements the firmware interface to enter Partial-IO
   mode when appropriate wakeup sources are enabled.
   https://gitlab.baylibre.com/msp8/linux/-/tree/topic/tisci-partialio/v6.17?ref_type=heads

Devicetree Bindings
-------------------
The wakeup-source property is used with references to
system-idle-states. This depends on the dt-schema pull request that adds
bindings for system-idle-states and updates the binding for wakeup-source:
  https://github.com/devicetree-org/dt-schema/pull/150

This is merged now and upstream in dt-schema.

Testing
-------
A test branch is available here that includes all patches required to
test Partial-IO:

https://gitlab.baylibre.com/msp8/linux/-/tree/integration/am62-partialio/v6.17?ref_type=heads

After enabling Wake-on-LAN the system can be powered off and will enter
the Partial-IO state in which it can be woken up by activity on the
specific pins:
    ethtool -s can0 wol p
    ethtool -s can1 wol p
    poweroff

I tested these patches on am62-lp-sk.

Best,
Markus

Previous versions:
 v1: https://lore.kernel.org/lkml/20240523075347.1282395-1-msp@baylibre.com/
 v2: https://lore.kernel.org/lkml/20240729074135.3850634-1-msp@baylibre.com/
 v3: https://lore.kernel.org/lkml/20241011-topic-mcan-wakeup-source-v6-12-v3-0-9752c714ad12@baylibre.com
 v4: https://lore.kernel.org/r/20241015-topic-mcan-wakeup-source-v6-12-v4-0-fdac1d1e7aa6@baylibre.com
 v5: https://lore.kernel.org/r/20241028-topic-mcan-wakeup-source-v6-12-v5-0-33edc0aba629@baylibre.com
 v6: https://lore.kernel.org/r/20241219-topic-mcan-wakeup-source-v6-12-v6-0-1356c7f7cfda@baylibre.com
 v7: https://lore.kernel.org/r/20250421-topic-mcan-wakeup-source-v6-12-v7-0-1b7b916c9832@baylibre.com
 v8: https://lore.kernel.org/r/20250812-topic-mcan-wakeup-source-v6-12-v8-0-6972a810d63b@baylibre.com

Changes in v9:
 - Update the binding to accept the sleep pinctrl state which is
   already in use by other devicetrees
 - Modify suspend/resume to not set the sleep state if wakeup is enabled
   and a wakeup pinctrl state is present. If wakeup pinctrl is active
   this should be kept enabled even after suspend
 - Modify m_can_set_wol() to use pinctrl_pm_select_default_state() to
   get rid of the manually managed default pinctrl.

Changes in v8:
 - Rebase to v6.17-rc1

Changes in v7:
 - Separate this series from "firmware: ti_sci: Partial-IO support"
   again as was requested internally
 - All DT changes are now in their own series to avoid conflicts
 - wakeup-source definition in the m_can binding is now only an
   extension to the dt-schema binding and a pull request was created

Changes in v6:
 - Rebased to v6.13-rc1
 - After feedback of the other Partial-IO series, I updated this series
   and removed all use of regulator-related patches.
 - wakeup-source is now not only a boolean property but can also be a
   list of power states in which the device is wakeup capable.

Changes in v5:
 - Make the check of wol options nicer to read

Changes in v4:
 - Remove leftover testing code that always returned -EIO in a specific
 - Redesign pincontrol setup to be easier understandable and less nested
 - Fix missing parantheses around wol_enable expression
 - Remove | from binding description

Changes in v3:
 - Rebase to v6.12-rc1
 - Change 'wakeup-source' to only 'true'
 - Simplify m_can_set_wol by returning early on error
 - Add vio-suuply binding and handling of this optional property.
   vio-supply is used to reflect the SoC architecture and which power
   line powers the m_can unit. This is important as some units are
   powered in special low power modes.

Changes in v2:
 - Rebase to v6.11-rc1
 - Squash these two patches for the binding into one:
   dt-bindings: can: m_can: Add wakeup-source property
   dt-bindings: can: m_can: Add wakeup pinctrl state
 - Add error handling to multiple patches of the m_can driver
 - Add error handling in m_can_class_allocate_dev(). This also required
   to add a new patch to return error pointers from
   m_can_class_allocate_dev().

Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
Markus Schneider-Pargmann (4):
      dt-bindings: can: m_can: Add wakeup properties
      can: m_can: Map WoL to device_set_wakeup_enable
      can: m_can: Return ERR_PTR on error in allocation
      can: m_can: Support pinctrl wakeup state

 .../devicetree/bindings/net/can/bosch,m_can.yaml   |  25 +++++
 drivers/net/can/m_can/m_can.c                      | 112 ++++++++++++++++++++-
 drivers/net/can/m_can/m_can.h                      |   3 +
 drivers/net/can/m_can/m_can_pci.c                  |   4 +-
 drivers/net/can/m_can/m_can_platform.c             |   4 +-
 drivers/net/can/m_can/tcan4x5x-core.c              |   4 +-
 6 files changed, 141 insertions(+), 11 deletions(-)
---
base-commit: 8f5ae30d69d7543eee0d70083daf4de8fe15d585
change-id: 20241009-topic-mcan-wakeup-source-v6-12-8c1d69931bd8

Best regards,
-- 
Markus Schneider-Pargmann <msp@baylibre.com>


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v9 1/4] dt-bindings: can: m_can: Add wakeup properties
  2025-08-20 12:42 [PATCH v9 0/4] can: m_can: Add am62 wakeup support Markus Schneider-Pargmann
@ 2025-08-20 12:42 ` Markus Schneider-Pargmann
  2025-08-22 14:35   ` Rob Herring
  2025-09-02 19:59   ` Kendall Willis
  2025-08-20 12:42 ` [PATCH v9 2/4] can: m_can: Map WoL to device_set_wakeup_enable Markus Schneider-Pargmann
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 10+ messages in thread
From: Markus Schneider-Pargmann @ 2025-08-20 12:42 UTC (permalink / raw)
  To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley
  Cc: Vishal Mahaveer, Kevin Hilman, Dhruva Gole, Sebin Francis,
	Kendall Willis, Akashdeep Kaur, Simon Horman, Vincent MAILHOL,
	linux-can, devicetree, linux-kernel, Markus Schneider-Pargmann

The pins associated with m_can have to have a special configuration to
be able to wakeup the SoC from some system states. This configuration is
described in the wakeup pinctrl state while the default state describes
the default configuration. Also add the sleep state which is already in
use by some devicetrees.

Also m_can can be a wakeup-source if capable of wakeup.

Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
 .../devicetree/bindings/net/can/bosch,m_can.yaml   | 25 ++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
index c4887522e8fe97c3947357b4dbd4ecf20ee8100a..0e00be18a8be681634f25378bb2cdef034dc4e6b 100644
--- a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
+++ b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
@@ -106,6 +106,26 @@ properties:
         maximum: 32
     minItems: 1
 
+  pinctrl-0:
+    description: Default pinctrl state
+
+  pinctrl-1:
+    description: Can be Sleep or Wakeup pinctrl state
+
+  pinctrl-2:
+    description: Can be Sleep or Wakeup pinctrl state
+
+  pinctrl-names:
+    description:
+      When present should contain at least "default" describing the default pin
+      states. Other states are "sleep" which describes the pinstate when
+      sleeping and "wakeup" describing the pins if wakeup is enabled.
+    minItems: 1
+    items:
+      - const: default
+      - const: sleep
+      - const: wakeup
+
   power-domains:
     description:
       Power domain provider node and an args specifier containing
@@ -122,6 +142,11 @@ properties:
     minItems: 1
     maxItems: 2
 
+  wakeup-source:
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+    description:
+      List of phandles to system idle states in which mcan can wakeup the system.
+
 required:
   - compatible
   - reg

-- 
2.50.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v9 2/4] can: m_can: Map WoL to device_set_wakeup_enable
  2025-08-20 12:42 [PATCH v9 0/4] can: m_can: Add am62 wakeup support Markus Schneider-Pargmann
  2025-08-20 12:42 ` [PATCH v9 1/4] dt-bindings: can: m_can: Add wakeup properties Markus Schneider-Pargmann
@ 2025-08-20 12:42 ` Markus Schneider-Pargmann
  2025-08-20 12:42 ` [PATCH v9 3/4] can: m_can: Return ERR_PTR on error in allocation Markus Schneider-Pargmann
  2025-08-20 12:42 ` [PATCH v9 4/4] can: m_can: Support pinctrl wakeup state Markus Schneider-Pargmann
  3 siblings, 0 replies; 10+ messages in thread
From: Markus Schneider-Pargmann @ 2025-08-20 12:42 UTC (permalink / raw)
  To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley
  Cc: Vishal Mahaveer, Kevin Hilman, Dhruva Gole, Sebin Francis,
	Kendall Willis, Akashdeep Kaur, Simon Horman, Vincent MAILHOL,
	linux-can, devicetree, linux-kernel, Markus Schneider-Pargmann

In some devices the pins of the m_can module can act as a wakeup source.
This patch helps do that by connecting the PHY_WAKE WoL option to
device_set_wakeup_enable. By marking this device as being wakeup
enabled, this setting can be used by platform code to decide which
sleep or poweroff mode to use.

Also this prepares the driver for the next patch in which the pinctrl
settings are changed depending on the desired wakeup source.

Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
 drivers/net/can/m_can/m_can.c | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index fe74dbd2c9663b7090678ab78318698d50ffb481..c68c95cc97075ddf72dbd2f177a999a09b8a21ca 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -2222,6 +2222,36 @@ static int m_can_set_coalesce(struct net_device *dev,
 	return 0;
 }
 
+static void m_can_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+{
+	struct m_can_classdev *cdev = netdev_priv(dev);
+
+	wol->supported = device_can_wakeup(cdev->dev) ? WAKE_PHY : 0;
+	wol->wolopts = device_may_wakeup(cdev->dev) ? WAKE_PHY : 0;
+}
+
+static int m_can_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+{
+	struct m_can_classdev *cdev = netdev_priv(dev);
+	bool wol_enable = !!(wol->wolopts & WAKE_PHY);
+	int ret;
+
+	if (wol->wolopts & ~WAKE_PHY)
+		return -EINVAL;
+
+	if (wol_enable == device_may_wakeup(cdev->dev))
+		return 0;
+
+	ret = device_set_wakeup_enable(cdev->dev, wol_enable);
+	if (ret) {
+		netdev_err(cdev->net, "Failed to set wakeup enable %pE\n",
+			   ERR_PTR(ret));
+		return ret;
+	}
+
+	return 0;
+}
+
 static const struct ethtool_ops m_can_ethtool_ops_coalescing = {
 	.supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS_IRQ |
 		ETHTOOL_COALESCE_RX_MAX_FRAMES_IRQ |
@@ -2231,10 +2261,14 @@ static const struct ethtool_ops m_can_ethtool_ops_coalescing = {
 	.get_ts_info = ethtool_op_get_ts_info,
 	.get_coalesce = m_can_get_coalesce,
 	.set_coalesce = m_can_set_coalesce,
+	.get_wol = m_can_get_wol,
+	.set_wol = m_can_set_wol,
 };
 
 static const struct ethtool_ops m_can_ethtool_ops = {
 	.get_ts_info = ethtool_op_get_ts_info,
+	.get_wol = m_can_get_wol,
+	.set_wol = m_can_set_wol,
 };
 
 static int register_m_can_dev(struct m_can_classdev *cdev)
@@ -2361,6 +2395,9 @@ struct m_can_classdev *m_can_class_allocate_dev(struct device *dev,
 		goto out;
 	}
 
+	if (dev->of_node && of_property_read_bool(dev->of_node, "wakeup-source"))
+		device_set_wakeup_capable(dev, true);
+
 	/* Get TX FIFO size
 	 * Defines the total amount of echo buffers for loopback
 	 */

-- 
2.50.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v9 3/4] can: m_can: Return ERR_PTR on error in allocation
  2025-08-20 12:42 [PATCH v9 0/4] can: m_can: Add am62 wakeup support Markus Schneider-Pargmann
  2025-08-20 12:42 ` [PATCH v9 1/4] dt-bindings: can: m_can: Add wakeup properties Markus Schneider-Pargmann
  2025-08-20 12:42 ` [PATCH v9 2/4] can: m_can: Map WoL to device_set_wakeup_enable Markus Schneider-Pargmann
@ 2025-08-20 12:42 ` Markus Schneider-Pargmann
  2025-09-04  9:08   ` Dhruva Gole
  2025-08-20 12:42 ` [PATCH v9 4/4] can: m_can: Support pinctrl wakeup state Markus Schneider-Pargmann
  3 siblings, 1 reply; 10+ messages in thread
From: Markus Schneider-Pargmann @ 2025-08-20 12:42 UTC (permalink / raw)
  To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley
  Cc: Vishal Mahaveer, Kevin Hilman, Dhruva Gole, Sebin Francis,
	Kendall Willis, Akashdeep Kaur, Simon Horman, Vincent MAILHOL,
	linux-can, devicetree, linux-kernel, Markus Schneider-Pargmann

We have more detailed error values available, return them in the core
driver and the calling drivers to return proper errors to callers.

Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
 drivers/net/can/m_can/m_can.c          | 6 +++---
 drivers/net/can/m_can/m_can_pci.c      | 4 ++--
 drivers/net/can/m_can/m_can_platform.c | 4 ++--
 drivers/net/can/m_can/tcan4x5x-core.c  | 4 ++--
 4 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index c68c95cc97075ddf72dbd2f177a999a09b8a21ca..e08fae5ddf5efa8345670dd50d50954ec5d52b29 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -2392,7 +2392,7 @@ struct m_can_classdev *m_can_class_allocate_dev(struct device *dev,
 					     sizeof(mram_config_vals) / 4);
 	if (ret) {
 		dev_err(dev, "Could not get Message RAM configuration.");
-		goto out;
+		return ERR_PTR(ret);
 	}
 
 	if (dev->of_node && of_property_read_bool(dev->of_node, "wakeup-source"))
@@ -2407,7 +2407,7 @@ struct m_can_classdev *m_can_class_allocate_dev(struct device *dev,
 	net_dev = alloc_candev(sizeof_priv, tx_fifo_size);
 	if (!net_dev) {
 		dev_err(dev, "Failed to allocate CAN device");
-		goto out;
+		return ERR_PTR(-ENOMEM);
 	}
 
 	class_dev = netdev_priv(net_dev);
@@ -2417,7 +2417,7 @@ struct m_can_classdev *m_can_class_allocate_dev(struct device *dev,
 
 	m_can_of_parse_mram(class_dev, mram_config_vals);
 	spin_lock_init(&class_dev->tx_handling_spinlock);
-out:
+
 	return class_dev;
 }
 EXPORT_SYMBOL_GPL(m_can_class_allocate_dev);
diff --git a/drivers/net/can/m_can/m_can_pci.c b/drivers/net/can/m_can/m_can_pci.c
index 9ad7419f88f83016e93667f4847fe536eca39ad1..eb31ed1f964491ab41c7811be317706a09951390 100644
--- a/drivers/net/can/m_can/m_can_pci.c
+++ b/drivers/net/can/m_can/m_can_pci.c
@@ -111,8 +111,8 @@ static int m_can_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
 
 	mcan_class = m_can_class_allocate_dev(&pci->dev,
 					      sizeof(struct m_can_pci_priv));
-	if (!mcan_class)
-		return -ENOMEM;
+	if (IS_ERR(mcan_class))
+		return PTR_ERR(mcan_class);
 
 	priv = cdev_to_priv(mcan_class);
 
diff --git a/drivers/net/can/m_can/m_can_platform.c b/drivers/net/can/m_can/m_can_platform.c
index b832566efda042929486578fad1879c7ad4a0cff..40bd10f71f0e2fab847c40c5bd5f7d85d3d46712 100644
--- a/drivers/net/can/m_can/m_can_platform.c
+++ b/drivers/net/can/m_can/m_can_platform.c
@@ -87,8 +87,8 @@ static int m_can_plat_probe(struct platform_device *pdev)
 
 	mcan_class = m_can_class_allocate_dev(&pdev->dev,
 					      sizeof(struct m_can_plat_priv));
-	if (!mcan_class)
-		return -ENOMEM;
+	if (IS_ERR(mcan_class))
+		return PTR_ERR(mcan_class);
 
 	priv = cdev_to_priv(mcan_class);
 
diff --git a/drivers/net/can/m_can/tcan4x5x-core.c b/drivers/net/can/m_can/tcan4x5x-core.c
index 39b0b5277b11f5cf86137528e7ebea93a6d29c80..31cc9d0abd45360de8700d0a0270af8d3e42967d 100644
--- a/drivers/net/can/m_can/tcan4x5x-core.c
+++ b/drivers/net/can/m_can/tcan4x5x-core.c
@@ -416,8 +416,8 @@ static int tcan4x5x_can_probe(struct spi_device *spi)
 
 	mcan_class = m_can_class_allocate_dev(&spi->dev,
 					      sizeof(struct tcan4x5x_priv));
-	if (!mcan_class)
-		return -ENOMEM;
+	if (IS_ERR(mcan_class))
+		return PTR_ERR(mcan_class);
 
 	ret = m_can_check_mram_cfg(mcan_class, TCAN4X5X_MRAM_SIZE);
 	if (ret)

-- 
2.50.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v9 4/4] can: m_can: Support pinctrl wakeup state
  2025-08-20 12:42 [PATCH v9 0/4] can: m_can: Add am62 wakeup support Markus Schneider-Pargmann
                   ` (2 preceding siblings ...)
  2025-08-20 12:42 ` [PATCH v9 3/4] can: m_can: Return ERR_PTR on error in allocation Markus Schneider-Pargmann
@ 2025-08-20 12:42 ` Markus Schneider-Pargmann
  2025-09-04  9:05   ` Dhruva Gole
  3 siblings, 1 reply; 10+ messages in thread
From: Markus Schneider-Pargmann @ 2025-08-20 12:42 UTC (permalink / raw)
  To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley
  Cc: Vishal Mahaveer, Kevin Hilman, Dhruva Gole, Sebin Francis,
	Kendall Willis, Akashdeep Kaur, Simon Horman, Vincent MAILHOL,
	linux-can, devicetree, linux-kernel, Markus Schneider-Pargmann

am62 requires a wakeup flag being set in pinctrl when mcan pins acts as
a wakeup source. Add support to select the wakeup state if WOL is
enabled.

Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
 drivers/net/can/m_can/m_can.c | 69 +++++++++++++++++++++++++++++++++++++++++--
 drivers/net/can/m_can/m_can.h |  3 ++
 2 files changed, 70 insertions(+), 2 deletions(-)

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index e08fae5ddf5efa8345670dd50d50954ec5d52b29..a1fa4b2f6b6cc94e5e10259cca53bd931ab238c8 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -2249,7 +2249,26 @@ static int m_can_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 		return ret;
 	}
 
+	if (!IS_ERR_OR_NULL(cdev->pinctrl_state_wakeup)) {
+		if (wol_enable)
+			ret = pinctrl_select_state(cdev->pinctrl, cdev->pinctrl_state_wakeup);
+		else
+			ret = pinctrl_pm_select_default_state(cdev->dev);
+
+		if (ret) {
+			netdev_err(cdev->net, "Failed to select pinctrl state %pE\n",
+				   ERR_PTR(ret));
+			goto err_wakeup_enable;
+		}
+	}
+
 	return 0;
+
+err_wakeup_enable:
+	/* Revert wakeup enable */
+	device_set_wakeup_enable(cdev->dev, !wol_enable);
+
+	return ret;
 }
 
 static const struct ethtool_ops m_can_ethtool_ops_coalescing = {
@@ -2377,6 +2396,42 @@ int m_can_class_get_clocks(struct m_can_classdev *cdev)
 }
 EXPORT_SYMBOL_GPL(m_can_class_get_clocks);
 
+static bool m_can_class_wakeup_pinctrl_enabled(struct m_can_classdev *class_dev)
+{
+	return device_may_wakeup(class_dev->dev) && class_dev->pinctrl_state_wakeup;
+}
+
+static int m_can_class_setup_optional_pinctrl(struct m_can_classdev *class_dev)
+{
+	struct device *dev = class_dev->dev;
+	int ret;
+
+	class_dev->pinctrl = devm_pinctrl_get(dev);
+	if (IS_ERR(class_dev->pinctrl)) {
+		ret = PTR_ERR(class_dev->pinctrl);
+		class_dev->pinctrl = NULL;
+
+		if (ret == -ENODEV)
+			return 0;
+
+		return dev_err_probe(dev, ret, "Failed to get pinctrl\n");
+	}
+
+	class_dev->pinctrl_state_wakeup =
+		pinctrl_lookup_state(class_dev->pinctrl, "wakeup");
+	if (IS_ERR(class_dev->pinctrl_state_wakeup)) {
+		ret = PTR_ERR(class_dev->pinctrl_state_wakeup);
+		class_dev->pinctrl_state_wakeup = NULL;
+
+		if (ret == -ENODEV)
+			return 0;
+
+		return dev_err_probe(dev, ret, "Failed to lookup pinctrl wakeup state\n");
+	}
+
+	return 0;
+}
+
 struct m_can_classdev *m_can_class_allocate_dev(struct device *dev,
 						int sizeof_priv)
 {
@@ -2418,7 +2473,15 @@ struct m_can_classdev *m_can_class_allocate_dev(struct device *dev,
 	m_can_of_parse_mram(class_dev, mram_config_vals);
 	spin_lock_init(&class_dev->tx_handling_spinlock);
 
+	ret = m_can_class_setup_optional_pinctrl(class_dev);
+	if (ret)
+		goto err_free_candev;
+
 	return class_dev;
+
+err_free_candev:
+	free_candev(net_dev);
+	return ERR_PTR(ret);
 }
 EXPORT_SYMBOL_GPL(m_can_class_allocate_dev);
 
@@ -2533,7 +2596,8 @@ int m_can_class_suspend(struct device *dev)
 		m_can_clk_stop(cdev);
 	}
 
-	pinctrl_pm_select_sleep_state(dev);
+	if (!m_can_class_wakeup_pinctrl_enabled(cdev))
+		pinctrl_pm_select_sleep_state(dev);
 
 	cdev->can.state = CAN_STATE_SLEEPING;
 
@@ -2547,7 +2611,8 @@ int m_can_class_resume(struct device *dev)
 	struct net_device *ndev = cdev->net;
 	int ret = 0;
 
-	pinctrl_pm_select_default_state(dev);
+	if (!m_can_class_wakeup_pinctrl_enabled(cdev))
+		pinctrl_pm_select_default_state(dev);
 
 	cdev->can.state = CAN_STATE_ERROR_ACTIVE;
 
diff --git a/drivers/net/can/m_can/m_can.h b/drivers/net/can/m_can/m_can.h
index bd4746c63af3f0a032910644dfd48a9ebb3a6168..583c7f1d005d61b3fc8587697388522993ff11a8 100644
--- a/drivers/net/can/m_can/m_can.h
+++ b/drivers/net/can/m_can/m_can.h
@@ -128,6 +128,9 @@ struct m_can_classdev {
 	struct mram_cfg mcfg[MRAM_CFG_NUM];
 
 	struct hrtimer hrtimer;
+
+	struct pinctrl *pinctrl;
+	struct pinctrl_state *pinctrl_state_wakeup;
 };
 
 struct m_can_classdev *m_can_class_allocate_dev(struct device *dev, int sizeof_priv);

-- 
2.50.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH v9 1/4] dt-bindings: can: m_can: Add wakeup properties
  2025-08-20 12:42 ` [PATCH v9 1/4] dt-bindings: can: m_can: Add wakeup properties Markus Schneider-Pargmann
@ 2025-08-22 14:35   ` Rob Herring
  2025-08-27  8:04     ` Markus Schneider-Pargmann
  2025-09-02 19:59   ` Kendall Willis
  1 sibling, 1 reply; 10+ messages in thread
From: Rob Herring @ 2025-08-22 14:35 UTC (permalink / raw)
  To: Markus Schneider-Pargmann
  Cc: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Krzysztof Kozlowski,
	Conor Dooley, Vishal Mahaveer, Kevin Hilman, Dhruva Gole,
	Sebin Francis, Kendall Willis, Akashdeep Kaur, Simon Horman,
	Vincent MAILHOL, linux-can, devicetree, linux-kernel

On Wed, Aug 20, 2025 at 02:42:25PM +0200, Markus Schneider-Pargmann wrote:
> The pins associated with m_can have to have a special configuration to
> be able to wakeup the SoC from some system states. This configuration is
> described in the wakeup pinctrl state while the default state describes
> the default configuration. Also add the sleep state which is already in
> use by some devicetrees.
> 
> Also m_can can be a wakeup-source if capable of wakeup.
> 
> Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
> ---
>  .../devicetree/bindings/net/can/bosch,m_can.yaml   | 25 ++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
> index c4887522e8fe97c3947357b4dbd4ecf20ee8100a..0e00be18a8be681634f25378bb2cdef034dc4e6b 100644
> --- a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
> +++ b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
> @@ -106,6 +106,26 @@ properties:
>          maximum: 32
>      minItems: 1
>  
> +  pinctrl-0:
> +    description: Default pinctrl state
> +
> +  pinctrl-1:
> +    description: Can be Sleep or Wakeup pinctrl state
> +
> +  pinctrl-2:
> +    description: Can be Sleep or Wakeup pinctrl state
> +
> +  pinctrl-names:
> +    description:
> +      When present should contain at least "default" describing the default pin
> +      states. Other states are "sleep" which describes the pinstate when
> +      sleeping and "wakeup" describing the pins if wakeup is enabled.
> +    minItems: 1
> +    items:
> +      - const: default
> +      - const: sleep
> +      - const: wakeup

This doesn't allow '"default", "wakeup"' which I think you want.

"sleep" and "wakeup" seem mutually exclusive and really are just the 
same thing. Both apply to the same mode/state. Whether you can wake from 
it is just an additional property (of the state). 

So I think you want:

items:
  - const: default
  - enum: [ sleep, wakeup ]


Or you should just drop 'wakeup' and just support wakeup with 'sleep' 
when 'wakeup-source' is present.

Rob

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v9 1/4] dt-bindings: can: m_can: Add wakeup properties
  2025-08-22 14:35   ` Rob Herring
@ 2025-08-27  8:04     ` Markus Schneider-Pargmann
  0 siblings, 0 replies; 10+ messages in thread
From: Markus Schneider-Pargmann @ 2025-08-27  8:04 UTC (permalink / raw)
  To: Rob Herring
  Cc: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Krzysztof Kozlowski,
	Conor Dooley, Vishal Mahaveer, Kevin Hilman, Dhruva Gole,
	Sebin Francis, Kendall Willis, Akashdeep Kaur, Simon Horman,
	Vincent MAILHOL, linux-can, devicetree, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 3014 bytes --]

Hi Rob,

On Fri Aug 22, 2025 at 4:35 PM CEST, Rob Herring wrote:
> On Wed, Aug 20, 2025 at 02:42:25PM +0200, Markus Schneider-Pargmann wrote:
>> The pins associated with m_can have to have a special configuration to
>> be able to wakeup the SoC from some system states. This configuration is
>> described in the wakeup pinctrl state while the default state describes
>> the default configuration. Also add the sleep state which is already in
>> use by some devicetrees.
>> 
>> Also m_can can be a wakeup-source if capable of wakeup.
>> 
>> Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
>> ---
>>  .../devicetree/bindings/net/can/bosch,m_can.yaml   | 25 ++++++++++++++++++++++
>>  1 file changed, 25 insertions(+)
>> 
>> diff --git a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
>> index c4887522e8fe97c3947357b4dbd4ecf20ee8100a..0e00be18a8be681634f25378bb2cdef034dc4e6b 100644
>> --- a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
>> +++ b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
>> @@ -106,6 +106,26 @@ properties:
>>          maximum: 32
>>      minItems: 1
>>  
>> +  pinctrl-0:
>> +    description: Default pinctrl state
>> +
>> +  pinctrl-1:
>> +    description: Can be Sleep or Wakeup pinctrl state
>> +
>> +  pinctrl-2:
>> +    description: Can be Sleep or Wakeup pinctrl state
>> +
>> +  pinctrl-names:
>> +    description:
>> +      When present should contain at least "default" describing the default pin
>> +      states. Other states are "sleep" which describes the pinstate when
>> +      sleeping and "wakeup" describing the pins if wakeup is enabled.
>> +    minItems: 1
>> +    items:
>> +      - const: default
>> +      - const: sleep
>> +      - const: wakeup
>
> This doesn't allow '"default", "wakeup"' which I think you want.
>
> "sleep" and "wakeup" seem mutually exclusive and really are just the 
> same thing. Both apply to the same mode/state. Whether you can wake from 
> it is just an additional property (of the state). 
>
> So I think you want:
>
> items:
>   - const: default
>   - enum: [ sleep, wakeup ]
>
>
> Or you should just drop 'wakeup' and just support wakeup with 'sleep' 
> when 'wakeup-source' is present.

Thanks for your feedback. I see they seem to be mutually exclusive, but
I think they serve different purposes. The sleep state describes the
pins when sleeping with wakeup disabled. The wakeup state describes the
pins when sleeping or off and wakeup is enabled.

Only allowing one of the two states or only using the sleep state will
enable or disable wakeup statically, there is no way to choose one or
the other.

For my specific setup, the name of a sleep state is also kind of
misleading. The SoC is in a poweroff state and sensitive to activity on
the pins configured for wakeup. It is not just sleeping, it will do a
fresh boot once woken up. 

Best
Markus

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 289 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v9 1/4] dt-bindings: can: m_can: Add wakeup properties
  2025-08-20 12:42 ` [PATCH v9 1/4] dt-bindings: can: m_can: Add wakeup properties Markus Schneider-Pargmann
  2025-08-22 14:35   ` Rob Herring
@ 2025-09-02 19:59   ` Kendall Willis
  1 sibling, 0 replies; 10+ messages in thread
From: Kendall Willis @ 2025-09-02 19:59 UTC (permalink / raw)
  To: Markus Schneider-Pargmann, Chandrasekar Ramakrishnan,
	Marc Kleine-Budde, Rob Herring, Krzysztof Kozlowski, Conor Dooley
  Cc: Vishal Mahaveer, Kevin Hilman, Dhruva Gole, Sebin Francis,
	Akashdeep Kaur, Simon Horman, Vincent MAILHOL, linux-can,
	devicetree, linux-kernel

On 8/20/25 07:42, Markus Schneider-Pargmann wrote:
> The pins associated with m_can have to have a special configuration to
> be able to wakeup the SoC from some system states. This configuration is
> described in the wakeup pinctrl state while the default state describes
> the default configuration. Also add the sleep state which is already in
> use by some devicetrees.
> 
> Also m_can can be a wakeup-source if capable of wakeup.
> 
> Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
> ---
>   .../devicetree/bindings/net/can/bosch,m_can.yaml   | 25 ++++++++++++++++++++++
>   1 file changed, 25 insertions(+)
> 
> diff --git a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
> index c4887522e8fe97c3947357b4dbd4ecf20ee8100a..0e00be18a8be681634f25378bb2cdef034dc4e6b 100644
> --- a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
> +++ b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
> @@ -106,6 +106,26 @@ properties:
>           maximum: 32
>       minItems: 1
>   
> +  pinctrl-0:
> +    description: Default pinctrl state
> +
> +  pinctrl-1:
> +    description: Can be Sleep or Wakeup pinctrl state
> +
> +  pinctrl-2:
> +    description: Can be Sleep or Wakeup pinctrl state

nit: change Sleep and Wakeup to be in quotes, i.e. "wakeup", "sleep"

Other than that, LTGM

Reviewed-by: Kendall Willis <k-willis@ti.com>

> +
> +  pinctrl-names:
> +    description:
> +      When present should contain at least "default" describing the default pin
> +      states. Other states are "sleep" which describes the pinstate when
> +      sleeping and "wakeup" describing the pins if wakeup is enabled.
> +    minItems: 1
> +    items:
> +      - const: default
> +      - const: sleep
> +      - const: wakeup
> +
>     power-domains:
>       description:
>         Power domain provider node and an args specifier containing
> @@ -122,6 +142,11 @@ properties:
>       minItems: 1
>       maxItems: 2
>   
> +  wakeup-source:
> +    $ref: /schemas/types.yaml#/definitions/phandle-array
> +    description:
> +      List of phandles to system idle states in which mcan can wakeup the system.
> +
>   required:
>     - compatible
>     - reg
> 


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v9 4/4] can: m_can: Support pinctrl wakeup state
  2025-08-20 12:42 ` [PATCH v9 4/4] can: m_can: Support pinctrl wakeup state Markus Schneider-Pargmann
@ 2025-09-04  9:05   ` Dhruva Gole
  0 siblings, 0 replies; 10+ messages in thread
From: Dhruva Gole @ 2025-09-04  9:05 UTC (permalink / raw)
  To: Markus Schneider-Pargmann
  Cc: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Vishal Mahaveer, Kevin Hilman,
	Sebin Francis, Kendall Willis, Akashdeep Kaur, Simon Horman,
	Vincent MAILHOL, linux-can, devicetree, linux-kernel

On Aug 20, 2025 at 14:42:28 +0200, Markus Schneider-Pargmann wrote:
> am62 requires a wakeup flag being set in pinctrl when mcan pins acts as

Let's call it "TI AM62x SoC" or TI K3 SoCs? This commit goes into a driver so let's not assume
everyone knows what am62 means ;)

Also nit: s/"mcan pins acts"/"mcan pins act"/

> a wakeup source. Add support to select the wakeup state if WOL is
> enabled.
> 
> Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
> ---
>  drivers/net/can/m_can/m_can.c | 69 +++++++++++++++++++++++++++++++++++++++++--
>  drivers/net/can/m_can/m_can.h |  3 ++
>  2 files changed, 70 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
> index e08fae5ddf5efa8345670dd50d50954ec5d52b29..a1fa4b2f6b6cc94e5e10259cca53bd931ab238c8 100644
> --- a/drivers/net/can/m_can/m_can.c
> +++ b/drivers/net/can/m_can/m_can.c
> @@ -2249,7 +2249,26 @@ static int m_can_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
>  		return ret;
>  	}
>  
> +	if (!IS_ERR_OR_NULL(cdev->pinctrl_state_wakeup)) {
> +		if (wol_enable)
> +			ret = pinctrl_select_state(cdev->pinctrl, cdev->pinctrl_state_wakeup);
> +		else
> +			ret = pinctrl_pm_select_default_state(cdev->dev);
> +
> +		if (ret) {
> +			netdev_err(cdev->net, "Failed to select pinctrl state %pE\n",
> +				   ERR_PTR(ret));
> +			goto err_wakeup_enable;
> +		}
> +	}
> +
>  	return 0;
> +
> +err_wakeup_enable:
> +	/* Revert wakeup enable */
> +	device_set_wakeup_enable(cdev->dev, !wol_enable);
> +
> +	return ret;
>  }
>  
>  static const struct ethtool_ops m_can_ethtool_ops_coalescing = {
> @@ -2377,6 +2396,42 @@ int m_can_class_get_clocks(struct m_can_classdev *cdev)
>  }
>  EXPORT_SYMBOL_GPL(m_can_class_get_clocks);
>  
> +static bool m_can_class_wakeup_pinctrl_enabled(struct m_can_classdev *class_dev)
> +{
> +	return device_may_wakeup(class_dev->dev) && class_dev->pinctrl_state_wakeup;
> +}
> +
> +static int m_can_class_setup_optional_pinctrl(struct m_can_classdev *class_dev)
> +{
> +	struct device *dev = class_dev->dev;
> +	int ret;
> +
> +	class_dev->pinctrl = devm_pinctrl_get(dev);
> +	if (IS_ERR(class_dev->pinctrl)) {
> +		ret = PTR_ERR(class_dev->pinctrl);
> +		class_dev->pinctrl = NULL;
> +
> +		if (ret == -ENODEV)
> +			return 0;
> +
> +		return dev_err_probe(dev, ret, "Failed to get pinctrl\n");
> +	}
> +
> +	class_dev->pinctrl_state_wakeup =
> +		pinctrl_lookup_state(class_dev->pinctrl, "wakeup");
> +	if (IS_ERR(class_dev->pinctrl_state_wakeup)) {
> +		ret = PTR_ERR(class_dev->pinctrl_state_wakeup);
> +		class_dev->pinctrl_state_wakeup = NULL;
> +
> +		if (ret == -ENODEV)
> +			return 0;
> +
> +		return dev_err_probe(dev, ret, "Failed to lookup pinctrl wakeup state\n");
> +	}
> +
> +	return 0;
> +}
> +
>  struct m_can_classdev *m_can_class_allocate_dev(struct device *dev,
>  						int sizeof_priv)
>  {
> @@ -2418,7 +2473,15 @@ struct m_can_classdev *m_can_class_allocate_dev(struct device *dev,
>  	m_can_of_parse_mram(class_dev, mram_config_vals);
>  	spin_lock_init(&class_dev->tx_handling_spinlock);
>  
> +	ret = m_can_class_setup_optional_pinctrl(class_dev);

optional makes it sound a little confusing IMO, might make sense to call
it something like m_can_class_configure_pinctrl or m_can_class_setup_wakeup_pinctrl

> +	if (ret)
> +		goto err_free_candev;
> +
>  	return class_dev;
> +
> +err_free_candev:
> +	free_candev(net_dev);
> +	return ERR_PTR(ret);
>  }
>  EXPORT_SYMBOL_GPL(m_can_class_allocate_dev);
>  
> @@ -2533,7 +2596,8 @@ int m_can_class_suspend(struct device *dev)
>  		m_can_clk_stop(cdev);
>  	}
>  
> -	pinctrl_pm_select_sleep_state(dev);
> +	if (!m_can_class_wakeup_pinctrl_enabled(cdev))
> +		pinctrl_pm_select_sleep_state(dev);
>  
>  	cdev->can.state = CAN_STATE_SLEEPING;
>  
> @@ -2547,7 +2611,8 @@ int m_can_class_resume(struct device *dev)
>  	struct net_device *ndev = cdev->net;
>  	int ret = 0;
>  
> -	pinctrl_pm_select_default_state(dev);
> +	if (!m_can_class_wakeup_pinctrl_enabled(cdev))
> +		pinctrl_pm_select_default_state(dev);
>  
>  	cdev->can.state = CAN_STATE_ERROR_ACTIVE;
>  
> diff --git a/drivers/net/can/m_can/m_can.h b/drivers/net/can/m_can/m_can.h
> index bd4746c63af3f0a032910644dfd48a9ebb3a6168..583c7f1d005d61b3fc8587697388522993ff11a8 100644
> --- a/drivers/net/can/m_can/m_can.h
> +++ b/drivers/net/can/m_can/m_can.h
> @@ -128,6 +128,9 @@ struct m_can_classdev {
>  	struct mram_cfg mcfg[MRAM_CFG_NUM];
>  
>  	struct hrtimer hrtimer;
> +
> +	struct pinctrl *pinctrl;
> +	struct pinctrl_state *pinctrl_state_wakeup;
>  };
>  
>  struct m_can_classdev *m_can_class_allocate_dev(struct device *dev, int sizeof_priv);
> 
> -- 
> 2.50.1
> 

-- 
Best regards,
Dhruva Gole
Texas Instruments Incorporated

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v9 3/4] can: m_can: Return ERR_PTR on error in allocation
  2025-08-20 12:42 ` [PATCH v9 3/4] can: m_can: Return ERR_PTR on error in allocation Markus Schneider-Pargmann
@ 2025-09-04  9:08   ` Dhruva Gole
  0 siblings, 0 replies; 10+ messages in thread
From: Dhruva Gole @ 2025-09-04  9:08 UTC (permalink / raw)
  To: Markus Schneider-Pargmann
  Cc: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Vishal Mahaveer, Kevin Hilman,
	Sebin Francis, Kendall Willis, Akashdeep Kaur, Simon Horman,
	Vincent MAILHOL, linux-can, devicetree, linux-kernel

On Aug 20, 2025 at 14:42:27 +0200, Markus Schneider-Pargmann wrote:
> We have more detailed error values available, return them in the core
> driver and the calling drivers to return proper errors to callers.
> 
> Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
> Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
> ---
>  drivers/net/can/m_can/m_can.c          | 6 +++---
>  drivers/net/can/m_can/m_can_pci.c      | 4 ++--
>  drivers/net/can/m_can/m_can_platform.c | 4 ++--
>  drivers/net/can/m_can/tcan4x5x-core.c  | 4 ++--
>  4 files changed, 9 insertions(+), 9 deletions(-)
> 

Reviewed-by: Dhruva Gole <d-gole@ti.com>

-- 
Best regards,
Dhruva Gole
Texas Instruments Incorporated

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2025-09-04  9:08 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-20 12:42 [PATCH v9 0/4] can: m_can: Add am62 wakeup support Markus Schneider-Pargmann
2025-08-20 12:42 ` [PATCH v9 1/4] dt-bindings: can: m_can: Add wakeup properties Markus Schneider-Pargmann
2025-08-22 14:35   ` Rob Herring
2025-08-27  8:04     ` Markus Schneider-Pargmann
2025-09-02 19:59   ` Kendall Willis
2025-08-20 12:42 ` [PATCH v9 2/4] can: m_can: Map WoL to device_set_wakeup_enable Markus Schneider-Pargmann
2025-08-20 12:42 ` [PATCH v9 3/4] can: m_can: Return ERR_PTR on error in allocation Markus Schneider-Pargmann
2025-09-04  9:08   ` Dhruva Gole
2025-08-20 12:42 ` [PATCH v9 4/4] can: m_can: Support pinctrl wakeup state Markus Schneider-Pargmann
2025-09-04  9:05   ` Dhruva Gole

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).