* [PATCH 1/4] can: m_can: Add hrtimer to generate software interrupt
2023-04-19 22:33 [PATCH 0/4] Enable multiple MCAN on AM62x Judith Mendez
@ 2023-04-19 22:33 ` Judith Mendez
2023-04-20 9:37 ` Marc Kleine-Budde
2023-04-19 22:33 ` [PATCH 2/4] dt-bindings: net: can: Make interrupt attributes optional for MCAN Judith Mendez
` (2 subsequent siblings)
3 siblings, 1 reply; 10+ messages in thread
From: Judith Mendez @ 2023-04-19 22:33 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Wolfgang Grandegger, Marc Kleine-Budde
Cc: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Schuyler Patton, Nishanth Menon, Vignesh Raghavendra, Tero Kristo,
Rob Herring, Krzysztof Kozlowski, Oliver Hartkopp, Judith Mendez,
linux-arm-kernel, devicetree, linux-kernel, linux-can, netdev
Add an hrtimer to MCAN struct. Each MCAN will have its own
hrtimer instantiated if there is no hardware interrupt found.
The hrtimer will generate a software interrupt every 1 ms. In
hrtimer callback, we check if there is a transaction pending by
reading a register, then process by calling the isr if there is.
Signed-off-by: Judith Mendez <jm@ti.com>
---
drivers/net/can/m_can/m_can.c | 30 ++++++++++++++++++++++++--
drivers/net/can/m_can/m_can.h | 3 +++
drivers/net/can/m_can/m_can_platform.c | 13 +++++++++--
3 files changed, 42 insertions(+), 4 deletions(-)
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index a5003435802b..8784bdea300a 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -23,6 +23,7 @@
#include <linux/pinctrl/consumer.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
+#include <linux/hrtimer.h>
#include "m_can.h"
@@ -1587,6 +1588,11 @@ static int m_can_close(struct net_device *dev)
if (!cdev->is_peripheral)
napi_disable(&cdev->napi);
+ if (dev->irq < 0) {
+ dev_dbg(cdev->dev, "Disabling the hrtimer\n");
+ hrtimer_cancel(&cdev->hrtimer);
+ }
+
m_can_stop(dev);
m_can_clk_stop(cdev);
free_irq(dev->irq, dev);
@@ -1793,6 +1799,18 @@ static netdev_tx_t m_can_start_xmit(struct sk_buff *skb,
return NETDEV_TX_OK;
}
+enum hrtimer_restart hrtimer_callback(struct hrtimer *timer)
+{
+ struct m_can_classdev *cdev =
+ container_of(timer, struct m_can_classdev, hrtimer);
+
+ m_can_isr(0, cdev->net);
+
+ hrtimer_forward_now(timer, ms_to_ktime(1));
+
+ return HRTIMER_RESTART;
+}
+
static int m_can_open(struct net_device *dev)
{
struct m_can_classdev *cdev = netdev_priv(dev);
@@ -1827,13 +1845,21 @@ static int m_can_open(struct net_device *dev)
}
INIT_WORK(&cdev->tx_work, m_can_tx_work_queue);
-
err = request_threaded_irq(dev->irq, NULL, m_can_isr,
IRQF_ONESHOT,
dev->name, dev);
+
} else {
- err = request_irq(dev->irq, m_can_isr, IRQF_SHARED, dev->name,
+ if (dev->irq > 0) {
+ err = request_irq(dev->irq, m_can_isr, IRQF_SHARED, dev->name,
dev);
+ }
+
+ else {
+ dev_dbg(cdev->dev, "Enabling the hrtimer\n");
+ cdev->hrtimer.function = &hrtimer_callback;
+ hrtimer_start(&cdev->hrtimer, ns_to_ktime(0), HRTIMER_MODE_REL_PINNED);
+ }
}
if (err < 0) {
diff --git a/drivers/net/can/m_can/m_can.h b/drivers/net/can/m_can/m_can.h
index a839dc71dc9b..ed046d77fdb9 100644
--- a/drivers/net/can/m_can/m_can.h
+++ b/drivers/net/can/m_can/m_can.h
@@ -28,6 +28,7 @@
#include <linux/pm_runtime.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
+#include <linux/hrtimer.h>
/* m_can lec values */
enum m_can_lec_type {
@@ -93,6 +94,8 @@ struct m_can_classdev {
int is_peripheral;
struct mram_cfg mcfg[MRAM_CFG_NUM];
+
+ struct hrtimer hrtimer;
};
struct m_can_classdev *m_can_class_allocate_dev(struct device *dev, int sizeof_priv);
diff --git a/drivers/net/can/m_can/m_can_platform.c b/drivers/net/can/m_can/m_can_platform.c
index 9c1dcf838006..7540db74b7d0 100644
--- a/drivers/net/can/m_can/m_can_platform.c
+++ b/drivers/net/can/m_can/m_can_platform.c
@@ -7,6 +7,7 @@
#include <linux/phy/phy.h>
#include <linux/platform_device.h>
+#include <linux/hrtimer.h>
#include "m_can.h"
@@ -98,8 +99,16 @@ static int m_can_plat_probe(struct platform_device *pdev)
addr = devm_platform_ioremap_resource_byname(pdev, "m_can");
irq = platform_get_irq_byname(pdev, "int0");
if (IS_ERR(addr) || irq < 0) {
- ret = -EINVAL;
- goto probe_fail;
+ if (irq == -EPROBE_DEFER) {
+ ret = -EPROBE_DEFER;
+ goto probe_fail;
+ }
+ if (IS_ERR(addr)) {
+ ret = PTR_ERR(addr);
+ goto probe_fail;
+ }
+ dev_dbg(mcan_class->dev, "Failed to get irq, initialize hrtimer\n");
+ hrtimer_init(&mcan_class->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_PINNED);
}
/* message ram could be shared */
--
2.17.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH 1/4] can: m_can: Add hrtimer to generate software interrupt
2023-04-19 22:33 ` [PATCH 1/4] can: m_can: Add hrtimer to generate software interrupt Judith Mendez
@ 2023-04-20 9:37 ` Marc Kleine-Budde
0 siblings, 0 replies; 10+ messages in thread
From: Marc Kleine-Budde @ 2023-04-20 9:37 UTC (permalink / raw)
To: Judith Mendez
Cc: Chandrasekar Ramakrishnan, Wolfgang Grandegger, David S . Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Schuyler Patton,
Nishanth Menon, Vignesh Raghavendra, Tero Kristo, Rob Herring,
Krzysztof Kozlowski, Oliver Hartkopp, linux-arm-kernel,
devicetree, linux-kernel, linux-can, netdev
[-- Attachment #1: Type: text/plain, Size: 5852 bytes --]
On 19.04.2023 17:33:20, Judith Mendez wrote:
> Add an hrtimer to MCAN struct. Each MCAN will have its own
> hrtimer instantiated if there is no hardware interrupt found.
>
> The hrtimer will generate a software interrupt every 1 ms. In
> hrtimer callback, we check if there is a transaction pending by
> reading a register, then process by calling the isr if there is.
>
> Signed-off-by: Judith Mendez <jm@ti.com>
> ---
> drivers/net/can/m_can/m_can.c | 30 ++++++++++++++++++++++++--
> drivers/net/can/m_can/m_can.h | 3 +++
> drivers/net/can/m_can/m_can_platform.c | 13 +++++++++--
> 3 files changed, 42 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
> index a5003435802b..8784bdea300a 100644
> --- a/drivers/net/can/m_can/m_can.c
> +++ b/drivers/net/can/m_can/m_can.c
> @@ -23,6 +23,7 @@
> #include <linux/pinctrl/consumer.h>
> #include <linux/platform_device.h>
> #include <linux/pm_runtime.h>
> +#include <linux/hrtimer.h>
>
> #include "m_can.h"
>
> @@ -1587,6 +1588,11 @@ static int m_can_close(struct net_device *dev)
> if (!cdev->is_peripheral)
> napi_disable(&cdev->napi);
>
> + if (dev->irq < 0) {
> + dev_dbg(cdev->dev, "Disabling the hrtimer\n");
> + hrtimer_cancel(&cdev->hrtimer);
> + }
> +
> m_can_stop(dev);
> m_can_clk_stop(cdev);
> free_irq(dev->irq, dev);
> @@ -1793,6 +1799,18 @@ static netdev_tx_t m_can_start_xmit(struct sk_buff *skb,
> return NETDEV_TX_OK;
> }
>
> +enum hrtimer_restart hrtimer_callback(struct hrtimer *timer)
> +{
> + struct m_can_classdev *cdev =
> + container_of(timer, struct m_can_classdev, hrtimer);
> +
> + m_can_isr(0, cdev->net);
> +
> + hrtimer_forward_now(timer, ms_to_ktime(1));
> +
> + return HRTIMER_RESTART;
> +}
> +
> static int m_can_open(struct net_device *dev)
> {
> struct m_can_classdev *cdev = netdev_priv(dev);
> @@ -1827,13 +1845,21 @@ static int m_can_open(struct net_device *dev)
> }
>
> INIT_WORK(&cdev->tx_work, m_can_tx_work_queue);
> -
> err = request_threaded_irq(dev->irq, NULL, m_can_isr,
> IRQF_ONESHOT,
> dev->name, dev);
> +
nitpick:
Please remove these 2 newline changes.
> } else {
> - err = request_irq(dev->irq, m_can_isr, IRQF_SHARED, dev->name,
> + if (dev->irq > 0) {
Please follow the kernel coding style and use a space not a tab after
the closing ")" of the "if".
> + err = request_irq(dev->irq, m_can_isr, IRQF_SHARED, dev->name,
> dev);
> + }
> +
> + else {
Please use kernel coding style: "} else {"
> + dev_dbg(cdev->dev, "Enabling the hrtimer\n");
> + cdev->hrtimer.function = &hrtimer_callback;
> + hrtimer_start(&cdev->hrtimer, ns_to_ktime(0), HRTIMER_MODE_REL_PINNED);
> + }
I think there's no need to have nested else branches, what about this
approach?
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -1831,9 +1831,11 @@ static int m_can_open(struct net_device *dev)
err = request_threaded_irq(dev->irq, NULL, m_can_isr,
IRQF_ONESHOT,
dev->name, dev);
- } else {
+ } else if (dev->irq) {
err = request_irq(dev->irq, m_can_isr, IRQF_SHARED, dev->name,
dev);
+ } else {
+ // polling
}
if (err < 0) {
> }
>
> if (err < 0) {
> diff --git a/drivers/net/can/m_can/m_can.h b/drivers/net/can/m_can/m_can.h
> index a839dc71dc9b..ed046d77fdb9 100644
> --- a/drivers/net/can/m_can/m_can.h
> +++ b/drivers/net/can/m_can/m_can.h
> @@ -28,6 +28,7 @@
> #include <linux/pm_runtime.h>
> #include <linux/slab.h>
> #include <linux/uaccess.h>
> +#include <linux/hrtimer.h>
>
> /* m_can lec values */
> enum m_can_lec_type {
> @@ -93,6 +94,8 @@ struct m_can_classdev {
> int is_peripheral;
>
> struct mram_cfg mcfg[MRAM_CFG_NUM];
> +
> + struct hrtimer hrtimer;
> };
>
> struct m_can_classdev *m_can_class_allocate_dev(struct device *dev, int sizeof_priv);
> diff --git a/drivers/net/can/m_can/m_can_platform.c b/drivers/net/can/m_can/m_can_platform.c
> index 9c1dcf838006..7540db74b7d0 100644
> --- a/drivers/net/can/m_can/m_can_platform.c
> +++ b/drivers/net/can/m_can/m_can_platform.c
> @@ -7,6 +7,7 @@
>
> #include <linux/phy/phy.h>
> #include <linux/platform_device.h>
> +#include <linux/hrtimer.h>
>
> #include "m_can.h"
>
> @@ -98,8 +99,16 @@ static int m_can_plat_probe(struct platform_device *pdev)
> addr = devm_platform_ioremap_resource_byname(pdev, "m_can");
> irq = platform_get_irq_byname(pdev, "int0");
> if (IS_ERR(addr) || irq < 0) {
> - ret = -EINVAL;
> - goto probe_fail;
> + if (irq == -EPROBE_DEFER) {
> + ret = -EPROBE_DEFER;
> + goto probe_fail;
> + }
> + if (IS_ERR(addr)) {
> + ret = PTR_ERR(addr);
> + goto probe_fail;
> + }
> + dev_dbg(mcan_class->dev, "Failed to get irq, initialize hrtimer\n");
> + hrtimer_init(&mcan_class->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_PINNED);
Looks better. Please remove the outer "if (IS_ERR(addr) || irq < 0)" and
move the error checking directly after "addr = devm_platform_ioremap_resource_byname()".
What do you think about introducing the "poll-interval" property and
only enable polling if it is set?
> }
>
> /* message ram could be shared */
> --
> 2.17.1
>
>
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] 10+ messages in thread
* [PATCH 2/4] dt-bindings: net: can: Make interrupt attributes optional for MCAN
2023-04-19 22:33 [PATCH 0/4] Enable multiple MCAN on AM62x Judith Mendez
2023-04-19 22:33 ` [PATCH 1/4] can: m_can: Add hrtimer to generate software interrupt Judith Mendez
@ 2023-04-19 22:33 ` Judith Mendez
2023-04-20 10:01 ` Marc Kleine-Budde
2023-04-20 15:47 ` Krzysztof Kozlowski
2023-04-19 22:33 ` [PATCH 3/4] DO_NOT_MERGE arm64: dts: ti: Add AM62x MCAN MAIN domain transceiver overlay Judith Mendez
2023-04-19 22:33 ` [PATCH 4/4] DO_NOT_MERGE arm64: dts: ti: Enable MCU MCANs for AM62x Judith Mendez
3 siblings, 2 replies; 10+ messages in thread
From: Judith Mendez @ 2023-04-19 22:33 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Wolfgang Grandegger, Marc Kleine-Budde
Cc: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Schuyler Patton, Nishanth Menon, Vignesh Raghavendra, Tero Kristo,
Rob Herring, Krzysztof Kozlowski, Oliver Hartkopp, Judith Mendez,
linux-arm-kernel, devicetree, linux-kernel, linux-can, netdev
For MCAN, remove interrupt and interrupt names from the required
section.
On AM62x SoC, MCANs on MCU domain do not have hardware interrupt
routed to A53 Linux, instead they will use software interrupt
by hrtimer. Make interrupt attributes optional in MCAN node
by removing from required section.
Signed-off-by: Judith Mendez <jm@ti.com>
---
Documentation/devicetree/bindings/net/can/bosch,m_can.yaml | 2 --
1 file changed, 2 deletions(-)
diff --git a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
index 67879aab623b..43f1aa9addc0 100644
--- a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
+++ b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
@@ -122,8 +122,6 @@ required:
- compatible
- reg
- reg-names
- - interrupts
- - interrupt-names
- clocks
- clock-names
- bosch,mram-cfg
--
2.17.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 2/4] dt-bindings: net: can: Make interrupt attributes optional for MCAN
2023-04-19 22:33 ` [PATCH 2/4] dt-bindings: net: can: Make interrupt attributes optional for MCAN Judith Mendez
@ 2023-04-20 10:01 ` Marc Kleine-Budde
2023-04-20 15:47 ` Krzysztof Kozlowski
2023-04-20 15:47 ` Krzysztof Kozlowski
1 sibling, 1 reply; 10+ messages in thread
From: Marc Kleine-Budde @ 2023-04-20 10:01 UTC (permalink / raw)
To: Judith Mendez
Cc: Chandrasekar Ramakrishnan, Wolfgang Grandegger, David S . Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Schuyler Patton,
Nishanth Menon, Vignesh Raghavendra, Tero Kristo, Rob Herring,
Krzysztof Kozlowski, Oliver Hartkopp, linux-arm-kernel,
devicetree, linux-kernel, linux-can, netdev
[-- Attachment #1: Type: text/plain, Size: 2728 bytes --]
On 19.04.2023 17:33:21, Judith Mendez wrote:
> For MCAN, remove interrupt and interrupt names from the required
> section.
>
> On AM62x SoC, MCANs on MCU domain do not have hardware interrupt
> routed to A53 Linux, instead they will use software interrupt
> by hrtimer. Make interrupt attributes optional in MCAN node
> by removing from required section.
>
> Signed-off-by: Judith Mendez <jm@ti.com>
This series basically adds polling support to the driver, which is
needed due to HW limitations.
The proposed logic in the driver is to use polling if
platform_get_irq_byname() fails (due to whatever reason) use polling
with a hard-coded interval.
In the kernel I've found the following properties that describe the
polling interval:
bindings/input/input.yaml:
| poll-interval:
| description: Poll interval time in milliseconds.
| $ref: /schemas/types.yaml#/definitions/uint32
bindings/thermal/thermal-zones.yaml:
| polling-delay:
| $ref: /schemas/types.yaml#/definitions/uint32
| description:
| The maximum number of milliseconds to wait between polls when
| checking this thermal zone. Setting this to 0 disables the polling
| timers setup by the thermal framework and assumes that the thermal
| sensors in this zone support interrupts.
bindings/regulator/dlg,da9121.yaml
| dlg,irq-polling-delay-passive-ms:
| minimum: 1000
| maximum: 10000
| description: |
| Specify the polling period, measured in milliseconds, between interrupt status
| update checks. Range 1000-10000 ms.
From my point of view the poll-interval from the input subsystem looks
good. Any objections to use it to specify the polling interval for
IRQ-less devices, too?
> ---
> Documentation/devicetree/bindings/net/can/bosch,m_can.yaml | 2 --
> 1 file changed, 2 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
> index 67879aab623b..43f1aa9addc0 100644
> --- a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
> +++ b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
> @@ -122,8 +122,6 @@ required:
> - compatible
> - reg
> - reg-names
> - - interrupts
> - - interrupt-names
> - clocks
> - clock-names
> - bosch,mram-cfg
> --
> 2.17.1
>
>
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] 10+ messages in thread
* Re: [PATCH 2/4] dt-bindings: net: can: Make interrupt attributes optional for MCAN
2023-04-20 10:01 ` Marc Kleine-Budde
@ 2023-04-20 15:47 ` Krzysztof Kozlowski
0 siblings, 0 replies; 10+ messages in thread
From: Krzysztof Kozlowski @ 2023-04-20 15:47 UTC (permalink / raw)
To: Marc Kleine-Budde, Judith Mendez
Cc: Chandrasekar Ramakrishnan, Wolfgang Grandegger, David S . Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Schuyler Patton,
Nishanth Menon, Vignesh Raghavendra, Tero Kristo, Rob Herring,
Krzysztof Kozlowski, Oliver Hartkopp, linux-arm-kernel,
devicetree, linux-kernel, linux-can, netdev
On 20/04/2023 12:01, Marc Kleine-Budde wrote:
> On 19.04.2023 17:33:21, Judith Mendez wrote:
>> For MCAN, remove interrupt and interrupt names from the required
>> section.
>>
>> On AM62x SoC, MCANs on MCU domain do not have hardware interrupt
>> routed to A53 Linux, instead they will use software interrupt
>> by hrtimer. Make interrupt attributes optional in MCAN node
>> by removing from required section.
>>
>> Signed-off-by: Judith Mendez <jm@ti.com>
>
> This series basically adds polling support to the driver, which is
> needed due to HW limitations.
>
> The proposed logic in the driver is to use polling if
> platform_get_irq_byname() fails (due to whatever reason) use polling
> with a hard-coded interval.
>
> In the kernel I've found the following properties that describe the
> polling interval:
>
> bindings/input/input.yaml:
>
> | poll-interval:
> | description: Poll interval time in milliseconds.
> | $ref: /schemas/types.yaml#/definitions/uint32
>
>
> bindings/thermal/thermal-zones.yaml:
>
> | polling-delay:
> | $ref: /schemas/types.yaml#/definitions/uint32
> | description:
> | The maximum number of milliseconds to wait between polls when
> | checking this thermal zone. Setting this to 0 disables the polling
> | timers setup by the thermal framework and assumes that the thermal
> | sensors in this zone support interrupts.
>
> bindings/regulator/dlg,da9121.yaml
>
> | dlg,irq-polling-delay-passive-ms:
> | minimum: 1000
> | maximum: 10000
> | description: |
> | Specify the polling period, measured in milliseconds, between interrupt status
> | update checks. Range 1000-10000 ms.
>
> From my point of view the poll-interval from the input subsystem looks
> good. Any objections to use it to specify the polling interval for
> IRQ-less devices, too?
Better to skip it, if delay can be figured out by driver based on
something else (e.g. clocks).
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/4] dt-bindings: net: can: Make interrupt attributes optional for MCAN
2023-04-19 22:33 ` [PATCH 2/4] dt-bindings: net: can: Make interrupt attributes optional for MCAN Judith Mendez
2023-04-20 10:01 ` Marc Kleine-Budde
@ 2023-04-20 15:47 ` Krzysztof Kozlowski
1 sibling, 0 replies; 10+ messages in thread
From: Krzysztof Kozlowski @ 2023-04-20 15:47 UTC (permalink / raw)
To: Judith Mendez, Chandrasekar Ramakrishnan, Wolfgang Grandegger,
Marc Kleine-Budde
Cc: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Schuyler Patton, Nishanth Menon, Vignesh Raghavendra, Tero Kristo,
Rob Herring, Krzysztof Kozlowski, Oliver Hartkopp,
linux-arm-kernel, devicetree, linux-kernel, linux-can, netdev
On 20/04/2023 00:33, Judith Mendez wrote:
> For MCAN, remove interrupt and interrupt names from the required
> section.
>
> On AM62x SoC, MCANs on MCU domain do not have hardware interrupt
> routed to A53 Linux, instead they will use software interrupt
> by hrtimer. Make interrupt attributes optional in MCAN node
> by removing from required section.
>
> Signed-off-by: Judith Mendez <jm@ti.com>
> ---
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/4] DO_NOT_MERGE arm64: dts: ti: Add AM62x MCAN MAIN domain transceiver overlay
2023-04-19 22:33 [PATCH 0/4] Enable multiple MCAN on AM62x Judith Mendez
2023-04-19 22:33 ` [PATCH 1/4] can: m_can: Add hrtimer to generate software interrupt Judith Mendez
2023-04-19 22:33 ` [PATCH 2/4] dt-bindings: net: can: Make interrupt attributes optional for MCAN Judith Mendez
@ 2023-04-19 22:33 ` Judith Mendez
2023-04-19 22:33 ` [PATCH 4/4] DO_NOT_MERGE arm64: dts: ti: Enable MCU MCANs for AM62x Judith Mendez
3 siblings, 0 replies; 10+ messages in thread
From: Judith Mendez @ 2023-04-19 22:33 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Wolfgang Grandegger, Marc Kleine-Budde
Cc: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Schuyler Patton, Nishanth Menon, Vignesh Raghavendra, Tero Kristo,
Rob Herring, Krzysztof Kozlowski, Oliver Hartkopp, Judith Mendez,
linux-arm-kernel, devicetree, linux-kernel, linux-can, netdev
Add an overlay for main domain MCAN on AM62x SK. The AM62x
SK board does not have on-board CAN transceiver so instead
of changing the DTB permanently, add an overlay to enable
MAIN domain MCAN and support for 1 CAN transceiver.
Signed-off-by: Judith Mendez <jm@ti.com>
---
arch/arm64/boot/dts/ti/Makefile | 2 ++
.../boot/dts/ti/k3-am625-sk-mcan-main.dtso | 35 +++++++++++++++++++
2 files changed, 37 insertions(+)
create mode 100644 arch/arm64/boot/dts/ti/k3-am625-sk-mcan-main.dtso
diff --git a/arch/arm64/boot/dts/ti/Makefile b/arch/arm64/boot/dts/ti/Makefile
index c83c9d772b81..abe15e76b614 100644
--- a/arch/arm64/boot/dts/ti/Makefile
+++ b/arch/arm64/boot/dts/ti/Makefile
@@ -9,8 +9,10 @@
# alphabetically.
# Boards with AM62x SoC
+k3-am625-sk-mcan-dtbs := k3-am625-sk.dtb k3-am625-sk-mcan-main.dtbo
dtb-$(CONFIG_ARCH_K3) += k3-am625-beagleplay.dtb
dtb-$(CONFIG_ARCH_K3) += k3-am625-sk.dtb
+dtb-$(CONFIG_ARCH_K3) += k3-am625-sk-mcan.dtb
dtb-$(CONFIG_ARCH_K3) += k3-am62-lp-sk.dtb
# Boards with AM62Ax SoC
diff --git a/arch/arm64/boot/dts/ti/k3-am625-sk-mcan-main.dtso b/arch/arm64/boot/dts/ti/k3-am625-sk-mcan-main.dtso
new file mode 100644
index 000000000000..72b68fd51121
--- /dev/null
+++ b/arch/arm64/boot/dts/ti/k3-am625-sk-mcan-main.dtso
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: GPL-2.0
+/**
+ * DT overlay for MCAN transceiver in main domain on AM625 SK
+ *
+ * Copyright (C) 2022 Texas Instruments Incorporated - https://www.ti.com/
+ */
+
+/dts-v1/;
+/plugin/;
+
+#include <dt-bindings/pinctrl/k3.h>
+
+&{/} {
+ transceiver1: can-phy0 {
+ compatible = "ti,tcan1042";
+ #phy-cells = <0>;
+ max-bitrate = <5000000>;
+ };
+};
+
+&main_pmx0 {
+ main_mcan0_pins_default: main-mcan0-pins-default {
+ pinctrl-single,pins = <
+ AM62X_IOPAD(0x1dc, PIN_INPUT, 0) /* (E15) MCAN0_RX */
+ AM62X_IOPAD(0x1d8, PIN_OUTPUT, 0) /* (C15) MCAN0_TX */
+ >;
+ };
+};
+
+&main_mcan0 {
+ status = "okay";
+ pinctrl-names = "default";
+ pinctrl-0 = <&main_mcan0_pins_default>;
+ phys = <&transceiver1>;
+};
--
2.17.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH 4/4] DO_NOT_MERGE arm64: dts: ti: Enable MCU MCANs for AM62x
2023-04-19 22:33 [PATCH 0/4] Enable multiple MCAN on AM62x Judith Mendez
` (2 preceding siblings ...)
2023-04-19 22:33 ` [PATCH 3/4] DO_NOT_MERGE arm64: dts: ti: Add AM62x MCAN MAIN domain transceiver overlay Judith Mendez
@ 2023-04-19 22:33 ` Judith Mendez
2023-06-16 12:01 ` Francesco Dolcini
3 siblings, 1 reply; 10+ messages in thread
From: Judith Mendez @ 2023-04-19 22:33 UTC (permalink / raw)
To: Chandrasekar Ramakrishnan, Wolfgang Grandegger, Marc Kleine-Budde
Cc: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Schuyler Patton, Nishanth Menon, Vignesh Raghavendra, Tero Kristo,
Rob Herring, Krzysztof Kozlowski, Oliver Hartkopp, Judith Mendez,
linux-arm-kernel, devicetree, linux-kernel, linux-can, netdev
On AM62x there are no hardware interrupts routed to GIC interrupt
controller for MCU MCAN IP, A53 Linux cannot receive hardware
interrupts. Since an hrtimer will be used to generate software
interrupts, add MCU MCAN nodes to dtsi and default to disabled.
AM62x does not carry on-board CAN transceivers, so instead of
changing DTB permanently use an overlay to enable MCU MCANs and to
add CAN transceiver nodes.
If an hrtimer is used to generate software interrupts, the two
required interrupt attributes in the MCAN node do not have to be
included.
Signed-off-by: Judith Mendez <jm@ti.com>
---
arch/arm64/boot/dts/ti/Makefile | 2 +-
arch/arm64/boot/dts/ti/k3-am62-mcu.dtsi | 24 ++++++++
.../boot/dts/ti/k3-am625-sk-mcan-mcu.dtso | 55 +++++++++++++++++++
3 files changed, 80 insertions(+), 1 deletion(-)
create mode 100644 arch/arm64/boot/dts/ti/k3-am625-sk-mcan-mcu.dtso
diff --git a/arch/arm64/boot/dts/ti/Makefile b/arch/arm64/boot/dts/ti/Makefile
index abe15e76b614..c76be3888e4d 100644
--- a/arch/arm64/boot/dts/ti/Makefile
+++ b/arch/arm64/boot/dts/ti/Makefile
@@ -9,7 +9,7 @@
# alphabetically.
# Boards with AM62x SoC
-k3-am625-sk-mcan-dtbs := k3-am625-sk.dtb k3-am625-sk-mcan-main.dtbo
+k3-am625-sk-mcan-dtbs := k3-am625-sk.dtb k3-am625-sk-mcan-main.dtbo k3-am625-sk-mcan-mcu.dtbo
dtb-$(CONFIG_ARCH_K3) += k3-am625-beagleplay.dtb
dtb-$(CONFIG_ARCH_K3) += k3-am625-sk.dtb
dtb-$(CONFIG_ARCH_K3) += k3-am625-sk-mcan.dtb
diff --git a/arch/arm64/boot/dts/ti/k3-am62-mcu.dtsi b/arch/arm64/boot/dts/ti/k3-am62-mcu.dtsi
index 076601a41e84..20462f457643 100644
--- a/arch/arm64/boot/dts/ti/k3-am62-mcu.dtsi
+++ b/arch/arm64/boot/dts/ti/k3-am62-mcu.dtsi
@@ -141,4 +141,28 @@
/* Tightly coupled to M4F */
status = "reserved";
};
+
+ mcu_mcan1: can@4e00000 {
+ compatible = "bosch,m_can";
+ reg = <0x00 0x4e00000 0x00 0x8000>,
+ <0x00 0x4e08000 0x00 0x200>;
+ reg-names = "message_ram", "m_can";
+ power-domains = <&k3_pds 188 TI_SCI_PD_EXCLUSIVE>;
+ clocks = <&k3_clks 188 6>, <&k3_clks 188 1>;
+ clock-names = "hclk", "cclk";
+ bosch,mram-cfg = <0x0 128 64 64 64 64 32 32>;
+ status = "disabled";
+ };
+
+ mcu_mcan2: can@4e10000 {
+ compatible = "bosch,m_can";
+ reg = <0x00 0x4e10000 0x00 0x8000>,
+ <0x00 0x4e18000 0x00 0x200>;
+ reg-names = "message_ram", "m_can";
+ power-domains = <&k3_pds 189 TI_SCI_PD_EXCLUSIVE>;
+ clocks = <&k3_clks 189 6>, <&k3_clks 189 1>;
+ clock-names = "hclk", "cclk";
+ bosch,mram-cfg = <0x0 128 64 64 64 64 32 32>;
+ status = "disabled";
+ };
};
diff --git a/arch/arm64/boot/dts/ti/k3-am625-sk-mcan-mcu.dtso b/arch/arm64/boot/dts/ti/k3-am625-sk-mcan-mcu.dtso
new file mode 100644
index 000000000000..7a527fdd4981
--- /dev/null
+++ b/arch/arm64/boot/dts/ti/k3-am625-sk-mcan-mcu.dtso
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: GPL-2.0
+/**
+ * DT overlay for MCAN in MCU domain on AM625 SK
+ *
+ * Copyright (C) 2022 Texas Instruments Incorporated - https://www.ti.com/
+ */
+
+/dts-v1/;
+/plugin/;
+
+#include <dt-bindings/pinctrl/k3.h>
+
+&{/} {
+ transceiver2: can-phy1 {
+ compatible = "ti,tcan1042";
+ #phy-cells = <0>;
+ max-bitrate = <5000000>;
+ };
+
+ transceiver3: can-phy2 {
+ compatible = "ti,tcan1042";
+ #phy-cells = <0>;
+ max-bitrate = <5000000>;
+ };
+};
+
+&mcu_pmx0 {
+ mcu_mcan1_pins_default: mcu-mcan1-pins-default {
+ pinctrl-single,pins = <
+ AM62X_IOPAD(0x038, PIN_INPUT, 0) /* (B3) MCU_MCAN0_RX */
+ AM62X_IOPAD(0x034, PIN_OUTPUT, 0) /* (D6) MCU_MCAN0_TX */
+ >;
+ };
+
+ mcu_mcan2_pins_default: mcu-mcan2-pins-default {
+ pinctrl-single,pins = <
+ AM62X_IOPAD(0x040, PIN_INPUT, 0) /* (D4) MCU_MCAN1_RX */
+ AM62X_IOPAD(0x03C, PIN_OUTPUT, 0) /* (E5) MCU_MCAN1_TX */
+ >;
+ };
+};
+
+&mcu_mcan1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mcu_mcan1_pins_default>;
+ phys = <&transceiver2>;
+ status = "okay";
+};
+
+&mcu_mcan2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&mcu_mcan2_pins_default>;
+ phys = <&transceiver3>;
+ status = "okay";
+};
--
2.17.1
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH 4/4] DO_NOT_MERGE arm64: dts: ti: Enable MCU MCANs for AM62x
2023-04-19 22:33 ` [PATCH 4/4] DO_NOT_MERGE arm64: dts: ti: Enable MCU MCANs for AM62x Judith Mendez
@ 2023-06-16 12:01 ` Francesco Dolcini
0 siblings, 0 replies; 10+ messages in thread
From: Francesco Dolcini @ 2023-06-16 12:01 UTC (permalink / raw)
To: Judith Mendez
Cc: Chandrasekar Ramakrishnan, Wolfgang Grandegger, Marc Kleine-Budde,
David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Schuyler Patton, Nishanth Menon, Vignesh Raghavendra, Tero Kristo,
Rob Herring, Krzysztof Kozlowski, Oliver Hartkopp,
linux-arm-kernel, devicetree, linux-kernel, linux-can, netdev
On Wed, Apr 19, 2023 at 05:33:23PM -0500, Judith Mendez wrote:
> On AM62x there are no hardware interrupts routed to GIC interrupt
> controller for MCU MCAN IP, A53 Linux cannot receive hardware
> interrupts. Since an hrtimer will be used to generate software
> interrupts, add MCU MCAN nodes to dtsi and default to disabled.
>
> AM62x does not carry on-board CAN transceivers, so instead of
> changing DTB permanently use an overlay to enable MCU MCANs and to
> add CAN transceiver nodes.
>
> If an hrtimer is used to generate software interrupts, the two
> required interrupt attributes in the MCAN node do not have to be
> included.
>
> Signed-off-by: Judith Mendez <jm@ti.com>
[...]
> + mcu_mcan1: can@4e00000 {
this should be mcu_mcan0
> + compatible = "bosch,m_can";
> + reg = <0x00 0x4e00000 0x00 0x8000>,
> + <0x00 0x4e08000 0x00 0x200>;
[...]
> + mcu_mcan2: can@4e10000 {
mcu_mcan1
> + compatible = "bosch,m_can";
> + reg = <0x00 0x4e10000 0x00 0x8000>,
> + <0x00 0x4e18000 0x00 0x200>;
Francesco
^ permalink raw reply [flat|nested] 10+ messages in thread