* [PATCH v6 1/7] dt-bindings: can: m_can: Add wakeup properties
2024-12-19 19:57 [PATCH v6 0/7] can: m_can: Add am62 wakeup support Markus Schneider-Pargmann
@ 2024-12-19 19:57 ` Markus Schneider-Pargmann
2024-12-25 19:50 ` Marc Kleine-Budde
2024-12-19 19:57 ` [PATCH v6 2/7] can: m_can: Map WoL to device_set_wakeup_enable Markus Schneider-Pargmann
` (6 subsequent siblings)
7 siblings, 1 reply; 12+ messages in thread
From: Markus Schneider-Pargmann @ 2024-12-19 19:57 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Vincent Mailhol,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Nishanth Menon,
Vignesh Raghavendra, Tero Kristo
Cc: linux-can, netdev, devicetree, linux-kernel, linux-arm-kernel,
Matthias Schiffer, Vishal Mahaveer, Kevin Hilman, Dhruva Gole,
Simon Horman, Vincent MAILHOL, Markus Schneider-Pargmann
m_can can be a wakeup source on some devices. Especially on some of the
am62* SoCs pins, connected to m_can in the mcu, can be used to wakeup
the SoC.
The wakeup-source property defines on which devices m_can can be used
for wakeup and in which power states.
The pins associated with m_can have to have a special configuration to
be able to wakeup the SoC. This configuration is described in the wakeup
pinctrl state while the default state describes the default
configuration.
Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
.../devicetree/bindings/net/can/bosch,m_can.yaml | 27 ++++++++++++++++++++++
1 file changed, 27 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..75963b11d31964c47679370664824ea111e70ca7 100644
--- a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
+++ b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
@@ -106,6 +106,22 @@ properties:
maximum: 32
minItems: 1
+ pinctrl-0:
+ description: Default pinctrl state
+
+ pinctrl-1:
+ description: Wakeup pinctrl state
+
+ pinctrl-names:
+ description:
+ When present should contain at least "default" describing the default pin
+ states. The second state called "wakeup" describes the pins in their
+ wakeup configuration required to exit sleep states.
+ minItems: 1
+ items:
+ - const: default
+ - const: wakeup
+
power-domains:
description:
Power domain provider node and an args specifier containing
@@ -122,6 +138,17 @@ properties:
minItems: 1
maxItems: 2
+ wakeup-source:
+ oneOf:
+ - description: This device is capable of wakeup.
+ type: boolean
+ - description: This device is capable of wakeup from the defined power
+ states.
+ $ref: /schemas/types.yaml#/definitions/string-array
+ enum:
+ - suspend
+ - poweroff
+
required:
- compatible
- reg
--
2.45.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v6 1/7] dt-bindings: can: m_can: Add wakeup properties
2024-12-19 19:57 ` [PATCH v6 1/7] dt-bindings: can: m_can: Add wakeup properties Markus Schneider-Pargmann
@ 2024-12-25 19:50 ` Marc Kleine-Budde
2025-01-07 9:53 ` Markus Schneider-Pargmann
0 siblings, 1 reply; 12+ messages in thread
From: Marc Kleine-Budde @ 2024-12-25 19:50 UTC (permalink / raw)
To: Markus Schneider-Pargmann
Cc: Chandrasekar Ramakrishnan, Vincent Mailhol, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Nishanth Menon,
Vignesh Raghavendra, Tero Kristo, linux-can, netdev, devicetree,
linux-kernel, linux-arm-kernel, Matthias Schiffer,
Vishal Mahaveer, Kevin Hilman, Dhruva Gole, Simon Horman
[-- Attachment #1: Type: text/plain, Size: 2097 bytes --]
On 19.12.2024 20:57:52, Markus Schneider-Pargmann wrote:
> m_can can be a wakeup source on some devices. Especially on some of the
> am62* SoCs pins, connected to m_can in the mcu, can be used to wakeup
> the SoC.
>
> The wakeup-source property defines on which devices m_can can be used
> for wakeup and in which power states.
>
> The pins associated with m_can have to have a special configuration to
> be able to wakeup the SoC. This configuration is described in the wakeup
> pinctrl state while the default state describes the default
> configuration.
>
> Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
The DTBS check fails:
| $ make CHECK_DTBS=y ti/k3-am625-beagleplay.dtb
| DTC [C] arch/arm64/boot/dts/ti/k3-am625-beagleplay.dtb
| arch/arm64/boot/dts/ti/k3-am625-beagleplay.dtb: can@4e08000: wakeup-source: 'oneOf' conditional failed, one must be fixed:
| ['suspend', 'poweroff'] is not of type 'boolean'
| ['suspend', 'poweroff'] is too long
| from schema $id: http://devicetree.org/schemas/net/can/bosch,m_can.yaml#
| arch/arm64/boot/dts/ti/k3-am625-beagleplay.dtb: can@4e08000: wakeup-source: ['suspend', 'poweroff'] is not of type 'boolean'
| from schema $id: http://devicetree.org/schemas/wakeup-source.yaml#
| arch/arm64/boot/dts/ti/k3-am625-beagleplay.dtb: can@4e18000: wakeup-source: 'oneOf' conditional failed, one must be fixed:
| ['suspend', 'poweroff'] is not of type 'boolean'
| ['suspend', 'poweroff'] is too long
| from schema $id: http://devicetree.org/schemas/net/can/bosch,m_can.yaml#
| arch/arm64/boot/dts/ti/k3-am625-beagleplay.dtb: can@4e18000: wakeup-source: ['suspend', 'poweroff'] is not of type 'boolean'
| from schema $id: http://devicetree.org/schemas/wakeup-source.yaml#
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung Nürnberg | Phone: +49-5121-206917-129 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-9 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v6 1/7] dt-bindings: can: m_can: Add wakeup properties
2024-12-25 19:50 ` Marc Kleine-Budde
@ 2025-01-07 9:53 ` Markus Schneider-Pargmann
2025-01-07 12:05 ` Marc Kleine-Budde
0 siblings, 1 reply; 12+ messages in thread
From: Markus Schneider-Pargmann @ 2025-01-07 9:53 UTC (permalink / raw)
To: Marc Kleine-Budde
Cc: Chandrasekar Ramakrishnan, Vincent Mailhol, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Nishanth Menon,
Vignesh Raghavendra, Tero Kristo, linux-can, netdev, devicetree,
linux-kernel, linux-arm-kernel, Matthias Schiffer,
Vishal Mahaveer, Kevin Hilman, Dhruva Gole, Simon Horman
[-- Attachment #1: Type: text/plain, Size: 2174 bytes --]
On Wed, Dec 25, 2024 at 08:50:17PM +0100, Marc Kleine-Budde wrote:
> On 19.12.2024 20:57:52, Markus Schneider-Pargmann wrote:
> > m_can can be a wakeup source on some devices. Especially on some of the
> > am62* SoCs pins, connected to m_can in the mcu, can be used to wakeup
> > the SoC.
> >
> > The wakeup-source property defines on which devices m_can can be used
> > for wakeup and in which power states.
> >
> > The pins associated with m_can have to have a special configuration to
> > be able to wakeup the SoC. This configuration is described in the wakeup
> > pinctrl state while the default state describes the default
> > configuration.
> >
> > Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
>
> The DTBS check fails:
>
> | $ make CHECK_DTBS=y ti/k3-am625-beagleplay.dtb
> | DTC [C] arch/arm64/boot/dts/ti/k3-am625-beagleplay.dtb
> | arch/arm64/boot/dts/ti/k3-am625-beagleplay.dtb: can@4e08000: wakeup-source: 'oneOf' conditional failed, one must be fixed:
> | ['suspend', 'poweroff'] is not of type 'boolean'
> | ['suspend', 'poweroff'] is too long
> | from schema $id: http://devicetree.org/schemas/net/can/bosch,m_can.yaml#
> | arch/arm64/boot/dts/ti/k3-am625-beagleplay.dtb: can@4e08000: wakeup-source: ['suspend', 'poweroff'] is not of type 'boolean'
> | from schema $id: http://devicetree.org/schemas/wakeup-source.yaml#
> | arch/arm64/boot/dts/ti/k3-am625-beagleplay.dtb: can@4e18000: wakeup-source: 'oneOf' conditional failed, one must be fixed:
> | ['suspend', 'poweroff'] is not of type 'boolean'
> | ['suspend', 'poweroff'] is too long
> | from schema $id: http://devicetree.org/schemas/net/can/bosch,m_can.yaml#
> | arch/arm64/boot/dts/ti/k3-am625-beagleplay.dtb: can@4e18000: wakeup-source: ['suspend', 'poweroff'] is not of type 'boolean'
> | from schema $id: http://devicetree.org/schemas/wakeup-source.yaml#
Thanks, the bot also notified me about this issue. I wasn't able to
solve it without updating the dt-schema, so I submitted a pull request
there:
https://github.com/devicetree-org/dt-schema/pull/150
Best
Markus
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v6 1/7] dt-bindings: can: m_can: Add wakeup properties
2025-01-07 9:53 ` Markus Schneider-Pargmann
@ 2025-01-07 12:05 ` Marc Kleine-Budde
0 siblings, 0 replies; 12+ messages in thread
From: Marc Kleine-Budde @ 2025-01-07 12:05 UTC (permalink / raw)
To: Markus Schneider-Pargmann
Cc: Chandrasekar Ramakrishnan, Vincent Mailhol, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Nishanth Menon,
Vignesh Raghavendra, Tero Kristo, linux-can, netdev, devicetree,
linux-kernel, linux-arm-kernel, Matthias Schiffer,
Vishal Mahaveer, Kevin Hilman, Dhruva Gole, Simon Horman
[-- Attachment #1: Type: text/plain, Size: 2688 bytes --]
On 07.01.2025 10:53:26, Markus Schneider-Pargmann wrote:
> On Wed, Dec 25, 2024 at 08:50:17PM +0100, Marc Kleine-Budde wrote:
> > On 19.12.2024 20:57:52, Markus Schneider-Pargmann wrote:
> > > m_can can be a wakeup source on some devices. Especially on some of the
> > > am62* SoCs pins, connected to m_can in the mcu, can be used to wakeup
> > > the SoC.
> > >
> > > The wakeup-source property defines on which devices m_can can be used
> > > for wakeup and in which power states.
> > >
> > > The pins associated with m_can have to have a special configuration to
> > > be able to wakeup the SoC. This configuration is described in the wakeup
> > > pinctrl state while the default state describes the default
> > > configuration.
> > >
> > > Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
> >
> > The DTBS check fails:
> >
> > | $ make CHECK_DTBS=y ti/k3-am625-beagleplay.dtb
> > | DTC [C] arch/arm64/boot/dts/ti/k3-am625-beagleplay.dtb
> > | arch/arm64/boot/dts/ti/k3-am625-beagleplay.dtb: can@4e08000: wakeup-source: 'oneOf' conditional failed, one must be fixed:
> > | ['suspend', 'poweroff'] is not of type 'boolean'
> > | ['suspend', 'poweroff'] is too long
> > | from schema $id: http://devicetree.org/schemas/net/can/bosch,m_can.yaml#
> > | arch/arm64/boot/dts/ti/k3-am625-beagleplay.dtb: can@4e08000: wakeup-source: ['suspend', 'poweroff'] is not of type 'boolean'
> > | from schema $id: http://devicetree.org/schemas/wakeup-source.yaml#
> > | arch/arm64/boot/dts/ti/k3-am625-beagleplay.dtb: can@4e18000: wakeup-source: 'oneOf' conditional failed, one must be fixed:
> > | ['suspend', 'poweroff'] is not of type 'boolean'
> > | ['suspend', 'poweroff'] is too long
> > | from schema $id: http://devicetree.org/schemas/net/can/bosch,m_can.yaml#
> > | arch/arm64/boot/dts/ti/k3-am625-beagleplay.dtb: can@4e18000: wakeup-source: ['suspend', 'poweroff'] is not of type 'boolean'
> > | from schema $id: http://devicetree.org/schemas/wakeup-source.yaml#
>
> Thanks, the bot also notified me about this issue. I wasn't able to
> solve it without updating the dt-schema, so I submitted a pull request
> there:
>
> https://github.com/devicetree-org/dt-schema/pull/150
I see, please add to the patch description that it depends on the that
PR and re-post once it is accepted.
Thanks,
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung Nürnberg | Phone: +49-5121-206917-129 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-9 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v6 2/7] can: m_can: Map WoL to device_set_wakeup_enable
2024-12-19 19:57 [PATCH v6 0/7] can: m_can: Add am62 wakeup support Markus Schneider-Pargmann
2024-12-19 19:57 ` [PATCH v6 1/7] dt-bindings: can: m_can: Add wakeup properties Markus Schneider-Pargmann
@ 2024-12-19 19:57 ` Markus Schneider-Pargmann
2024-12-19 19:57 ` [PATCH v6 3/7] can: m_can: Return ERR_PTR on error in allocation Markus Schneider-Pargmann
` (5 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Markus Schneider-Pargmann @ 2024-12-19 19:57 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Vincent Mailhol,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Nishanth Menon,
Vignesh Raghavendra, Tero Kristo
Cc: linux-can, netdev, devicetree, linux-kernel, linux-arm-kernel,
Matthias Schiffer, Vishal Mahaveer, Kevin Hilman, Dhruva Gole,
Simon Horman, Vincent MAILHOL, 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 16e9e7d7527d9762d73a7ec47940c73c0976e05d..0dcdcde3449c7647e4bc9a92f918160a336f94c0 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -2186,6 +2186,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 |
@@ -2195,10 +2225,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)
@@ -2325,6 +2359,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.45.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v6 3/7] can: m_can: Return ERR_PTR on error in allocation
2024-12-19 19:57 [PATCH v6 0/7] can: m_can: Add am62 wakeup support Markus Schneider-Pargmann
2024-12-19 19:57 ` [PATCH v6 1/7] dt-bindings: can: m_can: Add wakeup properties Markus Schneider-Pargmann
2024-12-19 19:57 ` [PATCH v6 2/7] can: m_can: Map WoL to device_set_wakeup_enable Markus Schneider-Pargmann
@ 2024-12-19 19:57 ` Markus Schneider-Pargmann
2024-12-19 19:57 ` [PATCH v6 4/7] can: m_can: Support pinctrl wakeup state Markus Schneider-Pargmann
` (4 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Markus Schneider-Pargmann @ 2024-12-19 19:57 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Vincent Mailhol,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Nishanth Menon,
Vignesh Raghavendra, Tero Kristo
Cc: linux-can, netdev, devicetree, linux-kernel, linux-arm-kernel,
Matthias Schiffer, Vishal Mahaveer, Kevin Hilman, Dhruva Gole,
Simon Horman, Vincent MAILHOL, 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 0dcdcde3449c7647e4bc9a92f918160a336f94c0..e69e9799710b3e4cb267324e8e9db40ca02328e2 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -2356,7 +2356,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"))
@@ -2371,7 +2371,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);
@@ -2380,7 +2380,7 @@ struct m_can_classdev *m_can_class_allocate_dev(struct device *dev,
SET_NETDEV_DEV(net_dev, dev);
m_can_of_parse_mram(class_dev, mram_config_vals);
-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 d72fe771dfc7aa768c728f817e67a87b49fd9974..05a01dfdbfbf18b74f796d2efc75e2be5cbb75ed 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 2f73bf3abad889c222f15c39a3d43de1a1cf5fbb..4c40b444727585b30df33a897c398e35e7592fb2 100644
--- a/drivers/net/can/m_can/tcan4x5x-core.c
+++ b/drivers/net/can/m_can/tcan4x5x-core.c
@@ -375,8 +375,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.45.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v6 4/7] can: m_can: Support pinctrl wakeup state
2024-12-19 19:57 [PATCH v6 0/7] can: m_can: Add am62 wakeup support Markus Schneider-Pargmann
` (2 preceding siblings ...)
2024-12-19 19:57 ` [PATCH v6 3/7] can: m_can: Return ERR_PTR on error in allocation Markus Schneider-Pargmann
@ 2024-12-19 19:57 ` Markus Schneider-Pargmann
2024-12-19 19:57 ` [PATCH v6 5/7] arm64: dts: ti: k3-am62: Mark mcu_mcan0/1 as wakeup-source Markus Schneider-Pargmann
` (3 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Markus Schneider-Pargmann @ 2024-12-19 19:57 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Vincent Mailhol,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Nishanth Menon,
Vignesh Raghavendra, Tero Kristo
Cc: linux-can, netdev, devicetree, linux-kernel, linux-arm-kernel,
Matthias Schiffer, Vishal Mahaveer, Kevin Hilman, Dhruva Gole,
Simon Horman, Vincent MAILHOL, 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.
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 | 68 +++++++++++++++++++++++++++++++++++++++++++
drivers/net/can/m_can/m_can.h | 4 +++
2 files changed, 72 insertions(+)
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index e69e9799710b3e4cb267324e8e9db40ca02328e2..ce39685a7c42a2238ad8afd6cf53aa53c9bbb3bb 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -2197,6 +2197,7 @@ static void m_can_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
static int m_can_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
{
struct m_can_classdev *cdev = netdev_priv(dev);
+ struct pinctrl_state *new_pinctrl_state = NULL;
bool wol_enable = !!(wol->wolopts & WAKE_PHY);
int ret;
@@ -2213,7 +2214,28 @@ static int m_can_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
return ret;
}
+ if (wol_enable)
+ new_pinctrl_state = cdev->pinctrl_state_wakeup;
+ else
+ new_pinctrl_state = cdev->pinctrl_state_default;
+
+ if (IS_ERR_OR_NULL(new_pinctrl_state))
+ return 0;
+
+ ret = pinctrl_select_state(cdev->pinctrl, new_pinctrl_state);
+ 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 = {
@@ -2341,6 +2363,44 @@ int m_can_class_get_clocks(struct m_can_classdev *cdev)
}
EXPORT_SYMBOL_GPL(m_can_class_get_clocks);
+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");
+ }
+
+ class_dev->pinctrl_state_default =
+ pinctrl_lookup_state(class_dev->pinctrl, "default");
+ if (IS_ERR(class_dev->pinctrl_state_default)) {
+ ret = PTR_ERR(class_dev->pinctrl_state_default);
+ return dev_err_probe(dev, ret, "Failed to lookup pinctrl default state\n");
+ }
+
+ return 0;
+}
+
struct m_can_classdev *m_can_class_allocate_dev(struct device *dev,
int sizeof_priv)
{
@@ -2381,7 +2441,15 @@ struct m_can_classdev *m_can_class_allocate_dev(struct device *dev,
m_can_of_parse_mram(class_dev, mram_config_vals);
+ 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);
diff --git a/drivers/net/can/m_can/m_can.h b/drivers/net/can/m_can/m_can.h
index 92b2bd8628e6b31370f4accbc2e28f3b2257a71d..b75b0dd6ccc93973d0891daac07c92b61f81dc2a 100644
--- a/drivers/net/can/m_can/m_can.h
+++ b/drivers/net/can/m_can/m_can.h
@@ -126,6 +126,10 @@ struct m_can_classdev {
struct mram_cfg mcfg[MRAM_CFG_NUM];
struct hrtimer hrtimer;
+
+ struct pinctrl *pinctrl;
+ struct pinctrl_state *pinctrl_state_default;
+ struct pinctrl_state *pinctrl_state_wakeup;
};
struct m_can_classdev *m_can_class_allocate_dev(struct device *dev, int sizeof_priv);
--
2.45.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v6 5/7] arm64: dts: ti: k3-am62: Mark mcu_mcan0/1 as wakeup-source
2024-12-19 19:57 [PATCH v6 0/7] can: m_can: Add am62 wakeup support Markus Schneider-Pargmann
` (3 preceding siblings ...)
2024-12-19 19:57 ` [PATCH v6 4/7] can: m_can: Support pinctrl wakeup state Markus Schneider-Pargmann
@ 2024-12-19 19:57 ` Markus Schneider-Pargmann
2024-12-19 19:57 ` [PATCH v6 6/7] arm64: dts: ti: k3-am62a-mcu: " Markus Schneider-Pargmann
` (2 subsequent siblings)
7 siblings, 0 replies; 12+ messages in thread
From: Markus Schneider-Pargmann @ 2024-12-19 19:57 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Vincent Mailhol,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Nishanth Menon,
Vignesh Raghavendra, Tero Kristo
Cc: linux-can, netdev, devicetree, linux-kernel, linux-arm-kernel,
Matthias Schiffer, Vishal Mahaveer, Kevin Hilman, Dhruva Gole,
Simon Horman, Vincent MAILHOL, Markus Schneider-Pargmann
mcu_mcan0 and mcu_mcan1 can be wakeup sources for the SoC. Mark them
accordingly in the devicetree.
Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
arch/arm64/boot/dts/ti/k3-am62-mcu.dtsi | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/arm64/boot/dts/ti/k3-am62-mcu.dtsi b/arch/arm64/boot/dts/ti/k3-am62-mcu.dtsi
index 68e906796aefebc5eaaa5a231e56105a9cdd13e5..cc693be47df080e8b8dba9f1aca2cd725f4ea85f 100644
--- a/arch/arm64/boot/dts/ti/k3-am62-mcu.dtsi
+++ b/arch/arm64/boot/dts/ti/k3-am62-mcu.dtsi
@@ -160,6 +160,7 @@ mcu_mcan0: can@4e08000 {
clocks = <&k3_clks 188 6>, <&k3_clks 188 1>;
clock-names = "hclk", "cclk";
bosch,mram-cfg = <0x0 128 64 64 64 64 32 32>;
+ wakeup-source = "suspend", "poweroff";
status = "disabled";
};
@@ -172,6 +173,7 @@ mcu_mcan1: can@4e18000 {
clocks = <&k3_clks 189 6>, <&k3_clks 189 1>;
clock-names = "hclk", "cclk";
bosch,mram-cfg = <0x0 128 64 64 64 64 32 32>;
+ wakeup-source = "suspend", "poweroff";
status = "disabled";
};
--
2.45.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v6 6/7] arm64: dts: ti: k3-am62a-mcu: Mark mcu_mcan0/1 as wakeup-source
2024-12-19 19:57 [PATCH v6 0/7] can: m_can: Add am62 wakeup support Markus Schneider-Pargmann
` (4 preceding siblings ...)
2024-12-19 19:57 ` [PATCH v6 5/7] arm64: dts: ti: k3-am62: Mark mcu_mcan0/1 as wakeup-source Markus Schneider-Pargmann
@ 2024-12-19 19:57 ` Markus Schneider-Pargmann
2024-12-19 19:57 ` [PATCH v6 7/7] arm64: dts: ti: k3-am62p-mcu: " Markus Schneider-Pargmann
2024-12-22 16:53 ` [PATCH v6 0/7] can: m_can: Add am62 wakeup support Marc Kleine-Budde
7 siblings, 0 replies; 12+ messages in thread
From: Markus Schneider-Pargmann @ 2024-12-19 19:57 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Vincent Mailhol,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Nishanth Menon,
Vignesh Raghavendra, Tero Kristo
Cc: linux-can, netdev, devicetree, linux-kernel, linux-arm-kernel,
Matthias Schiffer, Vishal Mahaveer, Kevin Hilman, Dhruva Gole,
Simon Horman, Vincent MAILHOL, Markus Schneider-Pargmann
mcu_mcan0 and mcu_mcan1 can be wakeup sources for the SoC. Mark them
accordingly in the devicetree.
Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
arch/arm64/boot/dts/ti/k3-am62a-mcu.dtsi | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/arm64/boot/dts/ti/k3-am62a-mcu.dtsi b/arch/arm64/boot/dts/ti/k3-am62a-mcu.dtsi
index 0469c766b769e46068f23e0073f951aa094c456f..7f88f284ea5daeba189976d03dbd048626104b77 100644
--- a/arch/arm64/boot/dts/ti/k3-am62a-mcu.dtsi
+++ b/arch/arm64/boot/dts/ti/k3-am62a-mcu.dtsi
@@ -161,6 +161,7 @@ mcu_mcan0: can@4e08000 {
clocks = <&k3_clks 188 6>, <&k3_clks 188 1>;
clock-names = "hclk", "cclk";
bosch,mram-cfg = <0x0 128 64 64 64 64 32 32>;
+ wakeup-source = "suspend", "poweroff";
status = "disabled";
};
@@ -173,6 +174,7 @@ mcu_mcan1: can@4e18000 {
clocks = <&k3_clks 189 6>, <&k3_clks 189 1>;
clock-names = "hclk", "cclk";
bosch,mram-cfg = <0x0 128 64 64 64 64 32 32>;
+ wakeup-source = "suspend", "poweroff";
status = "disabled";
};
};
--
2.45.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v6 7/7] arm64: dts: ti: k3-am62p-mcu: Mark mcu_mcan0/1 as wakeup-source
2024-12-19 19:57 [PATCH v6 0/7] can: m_can: Add am62 wakeup support Markus Schneider-Pargmann
` (5 preceding siblings ...)
2024-12-19 19:57 ` [PATCH v6 6/7] arm64: dts: ti: k3-am62a-mcu: " Markus Schneider-Pargmann
@ 2024-12-19 19:57 ` Markus Schneider-Pargmann
2024-12-22 16:53 ` [PATCH v6 0/7] can: m_can: Add am62 wakeup support Marc Kleine-Budde
7 siblings, 0 replies; 12+ messages in thread
From: Markus Schneider-Pargmann @ 2024-12-19 19:57 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Marc Kleine-Budde, Vincent Mailhol,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Nishanth Menon,
Vignesh Raghavendra, Tero Kristo
Cc: linux-can, netdev, devicetree, linux-kernel, linux-arm-kernel,
Matthias Schiffer, Vishal Mahaveer, Kevin Hilman, Dhruva Gole,
Simon Horman, Vincent MAILHOL, Markus Schneider-Pargmann
From: Vibhore Vardhan <vibhore@ti.com>
mcu_mcan0 and mcu_mcan1 can be wakeup sources for the SoC. Mark them
accordingly in the devicetree. Based on the patch for AM62a.
Signed-off-by: Vibhore Vardhan <vibhore@ti.com>
Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
---
arch/arm64/boot/dts/ti/k3-am62p-j722s-common-mcu.dtsi | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/arm64/boot/dts/ti/k3-am62p-j722s-common-mcu.dtsi b/arch/arm64/boot/dts/ti/k3-am62p-j722s-common-mcu.dtsi
index b33aff0d65c9def755f8dda9eb9feda7bc74e5c8..cf57f954dd3e31a8747c833bcc583dbc6ba21d03 100644
--- a/arch/arm64/boot/dts/ti/k3-am62p-j722s-common-mcu.dtsi
+++ b/arch/arm64/boot/dts/ti/k3-am62p-j722s-common-mcu.dtsi
@@ -173,6 +173,7 @@ mcu_mcan0: can@4e08000 {
interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "int0", "int1";
+ wakeup-source = "suspend", "poweroff";
status = "disabled";
};
@@ -188,6 +189,7 @@ mcu_mcan1: can@4e18000 {
interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "int0", "int1";
+ wakeup-source = "suspend", "poweroff";
status = "disabled";
};
--
2.45.2
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v6 0/7] can: m_can: Add am62 wakeup support
2024-12-19 19:57 [PATCH v6 0/7] can: m_can: Add am62 wakeup support Markus Schneider-Pargmann
` (6 preceding siblings ...)
2024-12-19 19:57 ` [PATCH v6 7/7] arm64: dts: ti: k3-am62p-mcu: " Markus Schneider-Pargmann
@ 2024-12-22 16:53 ` Marc Kleine-Budde
7 siblings, 0 replies; 12+ messages in thread
From: Marc Kleine-Budde @ 2024-12-22 16:53 UTC (permalink / raw)
To: Markus Schneider-Pargmann
Cc: Chandrasekar Ramakrishnan, Vincent Mailhol, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Nishanth Menon,
Vignesh Raghavendra, Tero Kristo, linux-can, netdev, devicetree,
linux-kernel, linux-arm-kernel, Matthias Schiffer,
Vishal Mahaveer, Kevin Hilman, Dhruva Gole, Simon Horman
[-- Attachment #1: Type: text/plain, Size: 4593 bytes --]
On 19.12.2024 20:57:51, Markus Schneider-Pargmann wrote:
> Hi,
>
> Series
> ------
> am62, am62a and am62p support Partial-IO, a poweroff SoC state with a
> few pin groups being active for wakeup.
>
> 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.
>
> After feedback from Nishanth and Krzysztof, I moved to a wakeup-source
> property that can be a list of powerstates in which the device is wakeup
> capable. This describes special cases like Partial-IO where the device
> is powered off but pins can be sensible to changes and trigger a wakeup.
>
> It is based on v6.13-rc1.
>
> Partial-IO
> ----------
> This series is part of a bigger topic to support Partial-IO on am62,
> am62a and am62p. Partial-IO is a poweroff state in which some pins are
> able to wakeup the SoC. In detail MCU m_can and two serial port pins can
> trigger the wakeup.
> A documentation can also be found in section 6.2.4 in the TRM:
> https://www.ti.com/lit/pdf/spruiv7
>
> This other series is relevant for the support of Partial-IO:
>
> - firmware: ti_sci: Partial-IO support
> https://gitlab.baylibre.com/msp8/linux/-/tree/topic/am62-partialio/v6.13?ref_type=heads
>
> 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.13?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
>
> 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>
LGTM, next we need Krzysztof Kozlowski's ACK for DT bindings update. The
dts changes (patches 5...7) will not go via the CAN tree but AFAICS via
Vignesh Raghavendra.
regards,
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung Nürnberg | Phone: +49-5121-206917-129 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-9 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread