linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/4] Enable multiple MCAN on AM62x
@ 2023-04-24 19:53 Judith Mendez
  2023-04-24 19:53 ` [PATCH v2 1/4] can: m_can: Add hrtimer to generate software interrupt Judith Mendez
                   ` (3 more replies)
  0 siblings, 4 replies; 17+ messages in thread
From: Judith Mendez @ 2023-04-24 19:53 UTC (permalink / raw)
  To: Chandrasekar Ramakrishnan, Wolfgang Grandegger,
	Marc Kleine-Budde, Krzysztof Kozlowski
  Cc: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	linux-can, netdev, linux-kernel, Schuyler Patton, Nishanth Menon,
	Vignesh Raghavendra, Tero Kristo, Rob Herring, linux-arm-kernel,
	devicetree, Oliver Hartkopp

On AM62x there is one MCAN in MAIN domain and two in MCU domain.
The MCANs in MCU domain were not enabled since there is no
hardware interrupt routed to A53 GIC interrupt controller.
Therefore A53 Linux cannot be interrupted by MCU MCANs.

This solution instantiates a hrtimer with 1 ms polling interval
for MCAN device when there is no hardware interrupt and there is
poll-interval property in DTB MCAN node. The hrtimer generates a
recurring software interrupt which allows to call the isr. The isr
will check if there is pending transaction by reading a register
and proceed normally if there is.

On AM62x, this series enables two MCU MCAN which will use the hrtimer
implementation. MCANs with hardware interrupt routed to A53 Linux
will continue to use the hardware interrupt as expected.

Timer polling method was tested on both classic CAN and CAN-FD
at 125 KBPS, 250 KBPS, 1 MBPS and 2.5 MBPS with 4 MBPS bitrate
switching.

Letency and CPU load benchmarks were tested on 3x MCAN on AM62x.
1 MBPS timer polling interval is the better timer polling interval
since it has comparable latency to hardware interrupt with the worse
case being 1ms + CAN frame propagation time and CPU load is not
substantial. Latency can be improved further with less than 1 ms
polling intervals, howerver it is at the cost of CPU usage since CPU
load increases at 0.5 ms.

Note that in terms of power, enabling MCU MCANs with timer-polling
implementation might have negative impact since we will have to wake
up every 1 ms whether there are CAN packets pending in the RX FIFO or
not. This might prevent the CPU from entering into deeper idle states
for extended periods of time.

This patch series depends on 'Enable CAN PHY transceiver driver':
https://lore.kernel.org/lkml/775ec9ce-7668-429c-a977-6c8995968d6e@app.fastmail.com/T/

Previously sent an RFC:
https://lore.kernel.org/linux-can/52a37e51-4143-9017-42ee-8d17c67028e3@ti.com/T/#t

Changes since v1:
- Add poll-interval property to bindings and MCAN DTB node
- Add functionality to check for 'poll-interval' property in MCAN node 
- Bindings: add an example using poll-interval
- Add 'polling' flag in driver to check if device is using polling method
- Check for both timer polling and hardware interrupt case, default to
hardware interrupt method
- Change ns_to_ktime() to ms_to_ktime()

Judith Mendez (4):
  can: m_can: Add hrtimer to generate software interrupt
  dt-bindings: net: can: Add poll-interval for MCAN
  arm64: dts: ti: Add AM62x MCAN MAIN domain transceiver overlay
  arm64: dts: ti: Enable MCU MCANs for AM62x

 .../bindings/net/can/bosch,m_can.yaml         | 26 ++++++++-
 arch/arm64/boot/dts/ti/Makefile               |  2 +
 arch/arm64/boot/dts/ti/k3-am62-mcu.dtsi       | 24 ++++++++
 .../boot/dts/ti/k3-am625-sk-mcan-main.dtso    | 35 ++++++++++++
 .../boot/dts/ti/k3-am625-sk-mcan-mcu.dtso     | 57 +++++++++++++++++++
 drivers/net/can/m_can/m_can.c                 | 30 ++++++++--
 drivers/net/can/m_can/m_can.h                 |  5 ++
 drivers/net/can/m_can/m_can_platform.c        | 31 +++++++++-
 8 files changed, 200 insertions(+), 10 deletions(-)
 create mode 100644 arch/arm64/boot/dts/ti/k3-am625-sk-mcan-main.dtso
 create mode 100644 arch/arm64/boot/dts/ti/k3-am625-sk-mcan-mcu.dtso

-- 
2.17.1


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

* [PATCH v2 1/4] can: m_can: Add hrtimer to generate software interrupt
  2023-04-24 19:53 [PATCH v2 0/4] Enable multiple MCAN on AM62x Judith Mendez
@ 2023-04-24 19:53 ` Judith Mendez
  2023-04-24 20:14   ` Marc Kleine-Budde
  2023-05-01 16:03   ` Simon Horman
  2023-04-24 19:54 ` [PATCH v2 2/4] dt-bindings: net: can: Add poll-interval for MCAN Judith Mendez
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 17+ messages in thread
From: Judith Mendez @ 2023-04-24 19:53 UTC (permalink / raw)
  To: Chandrasekar Ramakrishnan, Wolfgang Grandegger,
	Marc Kleine-Budde, Krzysztof Kozlowski
  Cc: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	linux-can, netdev, linux-kernel, Schuyler Patton, Nishanth Menon,
	Vignesh Raghavendra, Tero Kristo, Rob Herring, linux-arm-kernel,
	devicetree, Oliver Hartkopp

Add an hrtimer to MCAN class device. Each MCAN will have its own
hrtimer instantiated if there is no hardware interrupt found and
poll-interval property is defined in device tree M_CAN node.

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>
---
Changelog:
v2:
	1. Add poll-interval to MCAN class device to check if poll-interval propery is
	present in MCAN node, this enables timer polling method.
	2. Add 'polling' flag to MCAN class device to check if a device is using timer
	polling method
	3. Check if both timer polling and hardware interrupt are enabled for a MCAN
	device, default to hardware interrupt mode if both are enabled.
	4. Changed ms_to_ktime() to ns_to_ktime()
	5. Removed newlines, tabs, and restructure if/else section.

 drivers/net/can/m_can/m_can.c          | 30 ++++++++++++++++++++-----
 drivers/net/can/m_can/m_can.h          |  5 +++++
 drivers/net/can/m_can/m_can_platform.c | 31 ++++++++++++++++++++++++--
 3 files changed, 59 insertions(+), 7 deletions(-)

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index a5003435802b..33e094f88da1 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 (cdev->polling) {
+		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,15 @@ 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,
+					   IRQF_ONESHOT, dev->name, dev);
+	} else if (!cdev->polling) {
+			err = request_irq(dev->irq, m_can_isr, IRQF_SHARED, dev->name,
 				  dev);
+	} else {
+		dev_dbg(cdev->dev, "Start hrtimer\n");
+		cdev->hrtimer.function = &hrtimer_callback;
+		hrtimer_start(&cdev->hrtimer, ms_to_ktime(cdev->poll_interval), 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..1ba87eb23f8e 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,10 @@ struct m_can_classdev {
 	int is_peripheral;
 
 	struct mram_cfg mcfg[MRAM_CFG_NUM];
+
+	struct hrtimer hrtimer;
+	u32 poll_interval;
+	u8 polling;
 };
 
 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..e899c04edc01 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"
 
@@ -97,11 +98,37 @@ 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;
+	if (irq == -EPROBE_DEFER) {
+		ret = -EPROBE_DEFER;
 		goto probe_fail;
 	}
 
+	if (IS_ERR(addr)) {
+		ret = PTR_ERR(addr);
+		goto probe_fail;
+	}
+
+	mcan_class->polling = 0;
+	if (device_property_present(mcan_class->dev, "poll-interval")) {
+		mcan_class->polling = 1;
+	}
+
+	if (!mcan_class->polling && irq < 0) {
+		ret = -ENODATA;
+		dev_dbg(mcan_class->dev, "Polling not enabled\n");
+		goto probe_fail;
+	}
+
+	if (mcan_class->polling && irq > 0) {
+		mcan_class->polling = 0;
+		dev_dbg(mcan_class->dev, "Polling not enabled, hardware interrupt exists\n");
+	}
+
+	if (mcan_class->polling && irq < 0) {
+		dev_dbg(mcan_class->dev, "Polling enabled, initialize hrtimer");
+		hrtimer_init(&mcan_class->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_PINNED);
+	}
+
 	/* message ram could be shared */
 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "message_ram");
 	if (!res) {
-- 
2.17.1


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

* [PATCH v2 2/4] dt-bindings: net: can: Add poll-interval for MCAN
  2023-04-24 19:53 [PATCH v2 0/4] Enable multiple MCAN on AM62x Judith Mendez
  2023-04-24 19:53 ` [PATCH v2 1/4] can: m_can: Add hrtimer to generate software interrupt Judith Mendez
@ 2023-04-24 19:54 ` Judith Mendez
  2023-04-24 20:17   ` Marc Kleine-Budde
                     ` (2 more replies)
  2023-04-24 19:54 ` [PATCH v2 3/4] DO_NOT_MERGE arm64: dts: ti: Add AM62x MCAN MAIN domain transceiver overlay Judith Mendez
  2023-04-24 19:54 ` [PATCH v2 4/4] DO_NOT_MERGE arm64: dts: ti: Enable MCU MCANs for AM62x Judith Mendez
  3 siblings, 3 replies; 17+ messages in thread
From: Judith Mendez @ 2023-04-24 19:54 UTC (permalink / raw)
  To: Chandrasekar Ramakrishnan, Wolfgang Grandegger,
	Marc Kleine-Budde, Krzysztof Kozlowski
  Cc: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	linux-can, netdev, linux-kernel, Schuyler Patton, Nishanth Menon,
	Vignesh Raghavendra, Tero Kristo, Rob Herring, linux-arm-kernel,
	devicetree, Oliver Hartkopp

On AM62x SoC, MCANs on MCU domain do not have hardware interrupt
routed to A53 Linux, instead they will use software interrupt by
hrtimer. To enable timer method, interrupts should be optional so
remove interrupts property from required section and introduce
poll-interval property.

Signed-off-by: Judith Mendez <jm@ti.com>
---
Changelog:
v2:
  1. Add poll-interval property to enable timer polling method
  2. Add example using poll-interval property
  
 .../bindings/net/can/bosch,m_can.yaml         | 26 ++++++++++++++++---
 1 file changed, 23 insertions(+), 3 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..1c64c7a0c3df 100644
--- a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
+++ b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
@@ -40,6 +40,10 @@ properties:
       - const: int1
     minItems: 1
 
+  poll-interval:
+    $ref: /schemas/types.yaml#/definitions/flag
+    description: Poll interval time in milliseconds.
+
   clocks:
     items:
       - description: peripheral clock
@@ -122,15 +126,13 @@ required:
   - compatible
   - reg
   - reg-names
-  - interrupts
-  - interrupt-names
   - clocks
   - clock-names
   - bosch,mram-cfg
 
 additionalProperties: false
 
-examples:
+example with interrupts:
   - |
     #include <dt-bindings/clock/imx6sx-clock.h>
     can@20e8000 {
@@ -149,4 +151,22 @@ examples:
       };
     };
 
+example with timer polling:
+  - |
+    #include <dt-bindings/clock/imx6sx-clock.h>
+    can@20e8000 {
+      compatible = "bosch,m_can";
+      reg = <0x020e8000 0x4000>, <0x02298000 0x4000>;
+      reg-names = "m_can", "message_ram";
+      poll-interval;
+      clocks = <&clks IMX6SX_CLK_CANFD>,
+               <&clks IMX6SX_CLK_CANFD>;
+      clock-names = "hclk", "cclk";
+      bosch,mram-cfg = <0x0 0 0 32 0 0 0 1>;
+
+      can-transceiver {
+        max-bitrate = <5000000>;
+      };
+    };
+
 ...
-- 
2.17.1


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

* [PATCH v2 3/4] DO_NOT_MERGE arm64: dts: ti: Add AM62x MCAN MAIN domain transceiver overlay
  2023-04-24 19:53 [PATCH v2 0/4] Enable multiple MCAN on AM62x Judith Mendez
  2023-04-24 19:53 ` [PATCH v2 1/4] can: m_can: Add hrtimer to generate software interrupt Judith Mendez
  2023-04-24 19:54 ` [PATCH v2 2/4] dt-bindings: net: can: Add poll-interval for MCAN Judith Mendez
@ 2023-04-24 19:54 ` Judith Mendez
  2023-04-25 12:47   ` Nishanth Menon
  2023-04-24 19:54 ` [PATCH v2 4/4] DO_NOT_MERGE arm64: dts: ti: Enable MCU MCANs for AM62x Judith Mendez
  3 siblings, 1 reply; 17+ messages in thread
From: Judith Mendez @ 2023-04-24 19:54 UTC (permalink / raw)
  To: Chandrasekar Ramakrishnan, Wolfgang Grandegger,
	Marc Kleine-Budde, Krzysztof Kozlowski
  Cc: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	linux-can, netdev, linux-kernel, Schuyler Patton, Nishanth Menon,
	Vignesh Raghavendra, Tero Kristo, Rob Herring, linux-arm-kernel,
	devicetree, Oliver Hartkopp

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..0a7b2f394f87
--- /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 "k3-pinctrl.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] 17+ messages in thread

* [PATCH v2 4/4] DO_NOT_MERGE arm64: dts: ti: Enable MCU MCANs for AM62x
  2023-04-24 19:53 [PATCH v2 0/4] Enable multiple MCAN on AM62x Judith Mendez
                   ` (2 preceding siblings ...)
  2023-04-24 19:54 ` [PATCH v2 3/4] DO_NOT_MERGE arm64: dts: ti: Add AM62x MCAN MAIN domain transceiver overlay Judith Mendez
@ 2023-04-24 19:54 ` Judith Mendez
  3 siblings, 0 replies; 17+ messages in thread
From: Judith Mendez @ 2023-04-24 19:54 UTC (permalink / raw)
  To: Chandrasekar Ramakrishnan, Wolfgang Grandegger,
	Marc Kleine-Budde, Krzysztof Kozlowski
  Cc: David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	linux-can, netdev, linux-kernel, Schuyler Patton, Nishanth Menon,
	Vignesh Raghavendra, Tero Kristo, Rob Herring, linux-arm-kernel,
	devicetree, Oliver Hartkopp

On AM62x there are no hardware interrupts routed to A53 GIC
interrupt controller for MCU MCAN IPs, so MCU MCANs were not
added to the MCU dtsi. In this patch series an hrtimer is introduced
to MCAN driver to generate software interrupts. Now add MCU MCAN
nodes to the MCU dtsi but disable the MCAN devices by default.

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 there is no hardware interrupt and timer method is used, remove
interrupt properties and add poll-interval to enable the hrtimer
per MCAN node.

Signed-off-by: Judith Mendez <jm@ti.com>
---
Changelog:
v2:
	1. Add poll-interval in MCU MCAN nodes to enable timer polling mode

 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     | 57 +++++++++++++++++++
 3 files changed, 82 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..5145b3de4f9b
--- /dev/null
+++ b/arch/arm64/boot/dts/ti/k3-am625-sk-mcan-mcu.dtso
@@ -0,0 +1,57 @@
+// 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 "k3-pinctrl.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 {
+	poll-interval;
+	pinctrl-names = "default";
+	pinctrl-0 = <&mcu_mcan1_pins_default>;
+	phys = <&transceiver2>;
+	status = "okay";
+};
+
+&mcu_mcan2 {
+	poll-interval;
+	pinctrl-names = "default";
+	pinctrl-0 = <&mcu_mcan2_pins_default>;
+	phys = <&transceiver3>;
+	status = "okay";
+};
-- 
2.17.1


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

* Re: [PATCH v2 1/4] can: m_can: Add hrtimer to generate software interrupt
  2023-04-24 19:53 ` [PATCH v2 1/4] can: m_can: Add hrtimer to generate software interrupt Judith Mendez
@ 2023-04-24 20:14   ` Marc Kleine-Budde
  2023-04-26 16:11     ` Mendez, Judith
  2023-05-01 16:03   ` Simon Horman
  1 sibling, 1 reply; 17+ messages in thread
From: Marc Kleine-Budde @ 2023-04-24 20:14 UTC (permalink / raw)
  To: Judith Mendez
  Cc: Chandrasekar Ramakrishnan, Wolfgang Grandegger,
	Krzysztof Kozlowski, David S . Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, linux-can, netdev, linux-kernel,
	Schuyler Patton, Nishanth Menon, Vignesh Raghavendra,
	Tero Kristo, Rob Herring, linux-arm-kernel, devicetree,
	Oliver Hartkopp

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

On 24.04.2023 14:53:59, Judith Mendez wrote:
> Add an hrtimer to MCAN class device. Each MCAN will have its own
> hrtimer instantiated if there is no hardware interrupt found and
> poll-interval property is defined in device tree M_CAN node.
> 
> 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>
> ---
> Changelog:
> v2:
> 	1. Add poll-interval to MCAN class device to check if poll-interval propery is
> 	present in MCAN node, this enables timer polling method.
> 	2. Add 'polling' flag to MCAN class device to check if a device is using timer
> 	polling method
> 	3. Check if both timer polling and hardware interrupt are enabled for a MCAN
> 	device, default to hardware interrupt mode if both are enabled.
> 	4. Changed ms_to_ktime() to ns_to_ktime()
> 	5. Removed newlines, tabs, and restructure if/else section.
> 
>  drivers/net/can/m_can/m_can.c          | 30 ++++++++++++++++++++-----
>  drivers/net/can/m_can/m_can.h          |  5 +++++
>  drivers/net/can/m_can/m_can_platform.c | 31 ++++++++++++++++++++++++--
>  3 files changed, 59 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
> index a5003435802b..33e094f88da1 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>

keep the list of includes sorted

>  
>  #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 (cdev->polling) {
> +		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));

Please create a define for this

> +
> +	return HRTIMER_RESTART;
> +}
> +
>  static int m_can_open(struct net_device *dev)
>  {
>  	struct m_can_classdev *cdev = netdev_priv(dev);
> @@ -1827,13 +1845,15 @@ 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,
> +					   IRQF_ONESHOT, dev->name, dev);
> +	} else if (!cdev->polling) {
> +			err = request_irq(dev->irq, m_can_isr, IRQF_SHARED, dev->name,
>  				  dev);

No need to change the indention

> +	} else {
> +		dev_dbg(cdev->dev, "Start hrtimer\n");
> +		cdev->hrtimer.function = &hrtimer_callback;
> +		hrtimer_start(&cdev->hrtimer, ms_to_ktime(cdev->poll_interval), 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..1ba87eb23f8e 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>

keep the list of includes sorted

>  
>  /* m_can lec values */
>  enum m_can_lec_type {
> @@ -93,6 +94,10 @@ struct m_can_classdev {
>  	int is_peripheral;
>  
>  	struct mram_cfg mcfg[MRAM_CFG_NUM];
> +
> +	struct hrtimer hrtimer;
> +	u32 poll_interval;
> +	u8 polling;

bool

>  };
>  
>  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..e899c04edc01 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"
>  
> @@ -97,11 +98,37 @@ 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");

use platform_get_irq_byname_optional(), it doesn't print an error
message.

> -	if (IS_ERR(addr) || irq < 0) {
> -		ret = -EINVAL;
> +	if (irq == -EPROBE_DEFER) {
> +		ret = -EPROBE_DEFER;
>  		goto probe_fail;
>  	}
>  
> +	if (IS_ERR(addr)) {
> +		ret = PTR_ERR(addr);
> +		goto probe_fail;
> +	}

please move the error check for "addr" directly after the "addr = "
assignment.

> +
> +	mcan_class->polling = 0;

No need to init as "0"

> +	if (device_property_present(mcan_class->dev, "poll-interval")) {
> +		mcan_class->polling = 1;
> +	}

No need for the { } here.

> +
> +	if (!mcan_class->polling && irq < 0) {
> +		ret = -ENODATA;
-ENXIO
> +		dev_dbg(mcan_class->dev, "Polling not enabled\n");

print a proper error message using dev_err_probe("IRQ %s not found and
polling not activated\n")

> +		goto probe_fail;
> +	}
> +
> +	if (mcan_class->polling && irq > 0) {
> +		mcan_class->polling = 0;
> +		dev_dbg(mcan_class->dev, "Polling not enabled, hardware interrupt exists\n");
> +	}
> +
> +	if (mcan_class->polling && irq < 0) {
> +		dev_dbg(mcan_class->dev, "Polling enabled, initialize hrtimer");
> +		hrtimer_init(&mcan_class->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_PINNED);
> +	}

combine both if (mcan_class->polling) into one.

> +
>  	/* message ram could be shared */
>  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "message_ram");
>  	if (!res) {
> -- 
> 2.17.1
> 
> 

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] 17+ messages in thread

* Re: [PATCH v2 2/4] dt-bindings: net: can: Add poll-interval for MCAN
  2023-04-24 19:54 ` [PATCH v2 2/4] dt-bindings: net: can: Add poll-interval for MCAN Judith Mendez
@ 2023-04-24 20:17   ` Marc Kleine-Budde
  2023-04-25  0:13   ` Rob Herring
  2023-04-25 12:32   ` Nishanth Menon
  2 siblings, 0 replies; 17+ messages in thread
From: Marc Kleine-Budde @ 2023-04-24 20:17 UTC (permalink / raw)
  To: Judith Mendez
  Cc: Chandrasekar Ramakrishnan, Wolfgang Grandegger,
	Krzysztof Kozlowski, David S . Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, linux-can, netdev, linux-kernel,
	Schuyler Patton, Nishanth Menon, Vignesh Raghavendra,
	Tero Kristo, Rob Herring, linux-arm-kernel, devicetree,
	Oliver Hartkopp

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

On 24.04.2023 14:54:00, Judith Mendez wrote:
> On AM62x SoC, MCANs on MCU domain do not have hardware interrupt
> routed to A53 Linux, instead they will use software interrupt by
> hrtimer. To enable timer method, interrupts should be optional so
> remove interrupts property from required section and introduce
> poll-interval property.
> 
> Signed-off-by: Judith Mendez <jm@ti.com>

The bindings update should go in before the patch.

> ---
> Changelog:
> v2:
>   1. Add poll-interval property to enable timer polling method
>   2. Add example using poll-interval property
>   
>  .../bindings/net/can/bosch,m_can.yaml         | 26 ++++++++++++++++---
>  1 file changed, 23 insertions(+), 3 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..1c64c7a0c3df 100644
> --- a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
> +++ b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
> @@ -40,6 +40,10 @@ properties:
>        - const: int1
>      minItems: 1
>  
> +  poll-interval:
> +    $ref: /schemas/types.yaml#/definitions/flag
> +    description: Poll interval time in milliseconds.
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

That's not what the code does.

> +
>    clocks:
>      items:
>        - description: peripheral clock
> @@ -122,15 +126,13 @@ required:
>    - compatible
>    - reg
>    - reg-names
> -  - interrupts
> -  - interrupt-names
>    - clocks
>    - clock-names
>    - bosch,mram-cfg

Is it possible to specify that you either need "interrupts" and
"interrupt-names" or "poll-interval"?

>  
>  additionalProperties: false
>  
> -examples:
> +example with interrupts:
>    - |
>      #include <dt-bindings/clock/imx6sx-clock.h>
>      can@20e8000 {
> @@ -149,4 +151,22 @@ examples:
>        };
>      };
>  
> +example with timer polling:
> +  - |
> +    #include <dt-bindings/clock/imx6sx-clock.h>
> +    can@20e8000 {
> +      compatible = "bosch,m_can";
> +      reg = <0x020e8000 0x4000>, <0x02298000 0x4000>;
> +      reg-names = "m_can", "message_ram";
> +      poll-interval;
> +      clocks = <&clks IMX6SX_CLK_CANFD>,
> +               <&clks IMX6SX_CLK_CANFD>;
> +      clock-names = "hclk", "cclk";
> +      bosch,mram-cfg = <0x0 0 0 32 0 0 0 1>;
> +
> +      can-transceiver {
> +        max-bitrate = <5000000>;
> +      };
> +    };
> +
>  ...
> -- 
> 2.17.1
> 
> 

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] 17+ messages in thread

* Re: [PATCH v2 2/4] dt-bindings: net: can: Add poll-interval for MCAN
  2023-04-24 19:54 ` [PATCH v2 2/4] dt-bindings: net: can: Add poll-interval for MCAN Judith Mendez
  2023-04-24 20:17   ` Marc Kleine-Budde
@ 2023-04-25  0:13   ` Rob Herring
  2023-04-28 16:17     ` Mendez, Judith
  2023-04-25 12:32   ` Nishanth Menon
  2 siblings, 1 reply; 17+ messages in thread
From: Rob Herring @ 2023-04-25  0:13 UTC (permalink / raw)
  To: Judith Mendez
  Cc: Jakub Kicinski, Nishanth Menon, Rob Herring, Paolo Abeni,
	Chandrasekar Ramakrishnan, devicetree, Oliver Hartkopp,
	linux-can, linux-arm-kernel, Eric Dumazet, Tero Kristo,
	Schuyler Patton, Wolfgang Grandegger, David S . Miller,
	Krzysztof Kozlowski, Marc Kleine-Budde, Vignesh Raghavendra,
	netdev, linux-kernel


On Mon, 24 Apr 2023 14:54:00 -0500, Judith Mendez wrote:
> On AM62x SoC, MCANs on MCU domain do not have hardware interrupt
> routed to A53 Linux, instead they will use software interrupt by
> hrtimer. To enable timer method, interrupts should be optional so
> remove interrupts property from required section and introduce
> poll-interval property.
> 
> Signed-off-by: Judith Mendez <jm@ti.com>
> ---
> Changelog:
> v2:
>   1. Add poll-interval property to enable timer polling method
>   2. Add example using poll-interval property
> 
>  .../bindings/net/can/bosch,m_can.yaml         | 26 ++++++++++++++++---
>  1 file changed, 23 insertions(+), 3 deletions(-)
> 

My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check'
on your patch (DT_CHECKER_FLAGS is new in v5.13):

yamllint warnings/errors:

dtschema/dtc warnings/errors:
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml: 'example with interrupts' is not one of ['$id', '$schema', 'title', 'description', 'examples', 'required', 'allOf', 'anyOf', 'oneOf', 'definitions', '$defs', 'additionalProperties', 'dependencies', 'dependentRequired', 'dependentSchemas', 'patternProperties', 'properties', 'not', 'if', 'then', 'else', 'unevaluatedProperties', 'deprecated', 'maintainers', 'select', '$ref']
	from schema $id: http://devicetree.org/meta-schemas/base.yaml#
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml: 'example with timer polling' is not one of ['$id', '$schema', 'title', 'description', 'examples', 'required', 'allOf', 'anyOf', 'oneOf', 'definitions', '$defs', 'additionalProperties', 'dependencies', 'dependentRequired', 'dependentSchemas', 'patternProperties', 'properties', 'not', 'if', 'then', 'else', 'unevaluatedProperties', 'deprecated', 'maintainers', 'select', '$ref']
	from schema $id: http://devicetree.org/meta-schemas/base.yaml#

doc reference errors (make refcheckdocs):

See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20230424195402.516-3-jm@ti.com

The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.

If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:

pip3 install dtschema --upgrade

Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.


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

* Re: [PATCH v2 2/4] dt-bindings: net: can: Add poll-interval for MCAN
  2023-04-24 19:54 ` [PATCH v2 2/4] dt-bindings: net: can: Add poll-interval for MCAN Judith Mendez
  2023-04-24 20:17   ` Marc Kleine-Budde
  2023-04-25  0:13   ` Rob Herring
@ 2023-04-25 12:32   ` Nishanth Menon
  2 siblings, 0 replies; 17+ messages in thread
From: Nishanth Menon @ 2023-04-25 12:32 UTC (permalink / raw)
  To: Judith Mendez
  Cc: Chandrasekar Ramakrishnan, Wolfgang Grandegger,
	Marc Kleine-Budde, Krzysztof Kozlowski, David S . Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-can, netdev,
	linux-kernel, Schuyler Patton, Vignesh Raghavendra, Tero Kristo,
	Rob Herring, linux-arm-kernel, devicetree, Oliver Hartkopp

On 14:54-20230424, Judith Mendez wrote:
> On AM62x SoC, MCANs on MCU domain do not have hardware interrupt
> routed to A53 Linux, instead they will use software interrupt by
> hrtimer. To enable timer method, interrupts should be optional so
> remove interrupts property from required section and introduce
> poll-interval property.
> 
> Signed-off-by: Judith Mendez <jm@ti.com>
> ---
> Changelog:
> v2:
>   1. Add poll-interval property to enable timer polling method
>   2. Add example using poll-interval property
>   
>  .../bindings/net/can/bosch,m_can.yaml         | 26 ++++++++++++++++---
>  1 file changed, 23 insertions(+), 3 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..1c64c7a0c3df 100644
> --- a/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
> +++ b/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml
> @@ -40,6 +40,10 @@ properties:
>        - const: int1
>      minItems: 1
>  
> +  poll-interval:
> +    $ref: /schemas/types.yaml#/definitions/flag
> +    description: Poll interval time in milliseconds.
> +
>    clocks:
>      items:
>        - description: peripheral clock
> @@ -122,15 +126,13 @@ required:
>    - compatible
>    - reg
>    - reg-names
> -  - interrupts
> -  - interrupt-names
>    - clocks
>    - clock-names
>    - bosch,mram-cfg
>  
>  additionalProperties: false
>  
> -examples:
> +example with interrupts:
>    - |
>      #include <dt-bindings/clock/imx6sx-clock.h>
>      can@20e8000 {
> @@ -149,4 +151,22 @@ examples:
>        };
>      };
>  
> +example with timer polling:

did you run dt_binding_check?
make -j`nproc` ARCH=arm64 LLVM=1 dt_binding_check DT_CHECKER_FLAGS=-m DT_SCHEMA_FILES=Documentation/devicetree/bindings/net/can/bosch,m_can.yaml

tells me:

  LINT    Documentation/devicetree/bindings
  DTEX    Documentation/devicetree/bindings/net/can/bosch,m_can.example.dts
  CHKDT   Documentation/devicetree/bindings/processed-schema.json
/workdir/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml: 'example with interrupts' is not one of ['$id', '$schema', 'title', 'description', 'examples', 'required', 'allOf', 'anyOf', 'oneOf', 'definitions', '$defs', 'additionalProperties', 'dependencies', 'dependentRequired', 'dependentSchemas', 'patternProperties', 'properties', 'not', 'if', 'then', 'else', 'unevaluatedProperties', 'deprecated', 'maintainers', 'select', '$ref']
	from schema $id: http://devicetree.org/meta-schemas/base.yaml#
/workdir/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml: 'example with timer polling' is not one of ['$id', '$schema', 'title', 'description', 'examples', 'required', 'allOf', 'anyOf', 'oneOf', 'definitions', '$defs', 'additionalProperties', 'dependencies', 'dependentRequired', 'dependentSchemas', 'patternProperties', 'properties', 'not', 'if', 'then', 'else', 'unevaluatedProperties', 'deprecated', 'maintainers', 'select', '$ref']
	from schema $id: http://devicetree.org/meta-schemas/base.yaml#

> +  - |
> +    #include <dt-bindings/clock/imx6sx-clock.h>
> +    can@20e8000 {
> +      compatible = "bosch,m_can";
> +      reg = <0x020e8000 0x4000>, <0x02298000 0x4000>;
> +      reg-names = "m_can", "message_ram";
> +      poll-interval;
> +      clocks = <&clks IMX6SX_CLK_CANFD>,
> +               <&clks IMX6SX_CLK_CANFD>;
> +      clock-names = "hclk", "cclk";
> +      bosch,mram-cfg = <0x0 0 0 32 0 0 0 1>;
> +
> +      can-transceiver {
> +        max-bitrate = <5000000>;
> +      };
> +    };
> +
>  ...
> -- 
> 2.17.1
> 

-- 
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D) / Fingerprint: F8A2 8693 54EB 8232 17A3  1A34 DDB5 849D 1736 249D

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

* Re: [PATCH v2 3/4] DO_NOT_MERGE arm64: dts: ti: Add AM62x MCAN MAIN domain transceiver overlay
  2023-04-24 19:54 ` [PATCH v2 3/4] DO_NOT_MERGE arm64: dts: ti: Add AM62x MCAN MAIN domain transceiver overlay Judith Mendez
@ 2023-04-25 12:47   ` Nishanth Menon
  2023-05-01 15:54     ` Mendez, Judith
  0 siblings, 1 reply; 17+ messages in thread
From: Nishanth Menon @ 2023-04-25 12:47 UTC (permalink / raw)
  To: Judith Mendez
  Cc: Chandrasekar Ramakrishnan, Wolfgang Grandegger,
	Marc Kleine-Budde, Krzysztof Kozlowski, David S . Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-can, netdev,
	linux-kernel, Schuyler Patton, Vignesh Raghavendra, Tero Kristo,
	Rob Herring, linux-arm-kernel, devicetree, Oliver Hartkopp

On 14:54-20230424, Judith Mendez wrote:
> 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
> 

Just a headsup - for a formal patch, for the overlay, please ensure we
provide link to the specific board. I dont want to end up with 1000s
of overlay files, each enabling one specific peripheral instance of a
small subgroup of peripheral instance. Overlays should be describing a
real platform with product link.

> 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..0a7b2f394f87
> --- /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 "k3-pinctrl.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
> 

-- 
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D) / Fingerprint: F8A2 8693 54EB 8232 17A3  1A34 DDB5 849D 1736 249D

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

* Re: [PATCH v2 1/4] can: m_can: Add hrtimer to generate software interrupt
  2023-04-24 20:14   ` Marc Kleine-Budde
@ 2023-04-26 16:11     ` Mendez, Judith
  2023-04-26 17:47       ` Marc Kleine-Budde
  0 siblings, 1 reply; 17+ messages in thread
From: Mendez, Judith @ 2023-04-26 16:11 UTC (permalink / raw)
  To: Marc Kleine-Budde
  Cc: Chandrasekar Ramakrishnan, Wolfgang Grandegger,
	Krzysztof Kozlowski, David S . Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, linux-can, netdev, linux-kernel,
	Schuyler Patton, Nishanth Menon, Vignesh Raghavendra,
	Tero Kristo, Rob Herring, linux-arm-kernel, devicetree,
	Oliver Hartkopp

Hello Marc,

On 4/24/2023 3:14 PM, Marc Kleine-Budde wrote:
> On 24.04.2023 14:53:59, Judith Mendez wrote:
>> Add an hrtimer to MCAN class device. Each MCAN will have its own
>> hrtimer instantiated if there is no hardware interrupt found and
>> poll-interval property is defined in device tree M_CAN node.
>>
>> 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>
>> ---
>> Changelog:
>> v2:
>> 	1. Add poll-interval to MCAN class device to check if poll-interval propery is
>> 	present in MCAN node, this enables timer polling method.
>> 	2. Add 'polling' flag to MCAN class device to check if a device is using timer
>> 	polling method
>> 	3. Check if both timer polling and hardware interrupt are enabled for a MCAN
>> 	device, default to hardware interrupt mode if both are enabled.
>> 	4. Changed ms_to_ktime() to ns_to_ktime()
>> 	5. Removed newlines, tabs, and restructure if/else section.
>>
>>   drivers/net/can/m_can/m_can.c          | 30 ++++++++++++++++++++-----
>>   drivers/net/can/m_can/m_can.h          |  5 +++++
>>   drivers/net/can/m_can/m_can_platform.c | 31 ++++++++++++++++++++++++--
>>   3 files changed, 59 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
>> index a5003435802b..33e094f88da1 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>
> 
> keep the list of includes sorted
> 
Will do.
>>   
>>   #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 (cdev->polling) {
>> +		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));
> 
> Please create a define for this
> 
Thanks, will create a define for the 1 ms polling interval.

>> +
>> +	return HRTIMER_RESTART;
>> +}
>> +
>>   static int m_can_open(struct net_device *dev)
>>   {
>>   	struct m_can_classdev *cdev = netdev_priv(dev);
>> @@ -1827,13 +1845,15 @@ 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,
>> +					   IRQF_ONESHOT, dev->name, dev);
>> +	} else if (!cdev->polling) {
>> +			err = request_irq(dev->irq, m_can_isr, IRQF_SHARED, dev->name,
>>   				  dev);
> 
> No need to change the indention
> 
Will fix.

>> +	} else {
>> +		dev_dbg(cdev->dev, "Start hrtimer\n");
>> +		cdev->hrtimer.function = &hrtimer_callback;
>> +		hrtimer_start(&cdev->hrtimer, ms_to_ktime(cdev->poll_interval), 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..1ba87eb23f8e 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>
> 
> keep the list of includes sorted
> 
>>   
>>   /* m_can lec values */
>>   enum m_can_lec_type {
>> @@ -93,6 +94,10 @@ struct m_can_classdev {
>>   	int is_peripheral;
>>   
>>   	struct mram_cfg mcfg[MRAM_CFG_NUM];
>> +
>> +	struct hrtimer hrtimer;
>> +	u32 poll_interval;
>> +	u8 polling;
> 
> bool
> 
Will use bool instead.
>>   };
>>   
>>   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..e899c04edc01 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"
>>   
>> @@ -97,11 +98,37 @@ 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");
> 
> use platform_get_irq_byname_optional(), it doesn't print an error
> message.
> 
Thanks.

>> -	if (IS_ERR(addr) || irq < 0) {
>> -		ret = -EINVAL;
>> +	if (irq == -EPROBE_DEFER) {
>> +		ret = -EPROBE_DEFER;
>>   		goto probe_fail;
>>   	}
>>   
>> +	if (IS_ERR(addr)) {
>> +		ret = PTR_ERR(addr);
>> +		goto probe_fail;
>> +	}
> 
> please move the error check for "addr" directly after the "addr = "
> assignment.
> 
Will do.
>> +
>> +	mcan_class->polling = 0;
> 
> No need to init as "0"
> 

Awsome thanks.
>> +	if (device_property_present(mcan_class->dev, "poll-interval")) {
>> +		mcan_class->polling = 1;
>> +	}
> 
> No need for the { } here.
> 
>> +
>> +	if (!mcan_class->polling && irq < 0) {
>> +		ret = -ENODATA;
> -ENXIO
>> +		dev_dbg(mcan_class->dev, "Polling not enabled\n");
> 
> print a proper error message using dev_err_probe("IRQ %s not found and
> polling not activated\n")
> 
Why %s when MCAN requests 1 IRQ which is "int0"? If we want to print 
"int0", should it be hardcoded into the print error message?

>> +		goto probe_fail;
>> +	}
>> +
>> +	if (mcan_class->polling && irq > 0) {
>> +		mcan_class->polling = 0;
>> +		dev_dbg(mcan_class->dev, "Polling not enabled, hardware interrupt exists\n");
>> +	}
>> +
>> +	if (mcan_class->polling && irq < 0) {
>> +		dev_dbg(mcan_class->dev, "Polling enabled, initialize hrtimer");
>> +		hrtimer_init(&mcan_class->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_PINNED);
>> +	}
> 
> combine both if (mcan_class->polling) into one.
> 
Will do.
>> +
>>   	/* message ram could be shared */
>>   	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "message_ram");
>>   	if (!res) {
>> -- 
>> 2.17.1
>>
>>

regards,
Judith

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

* Re: [PATCH v2 1/4] can: m_can: Add hrtimer to generate software interrupt
  2023-04-26 16:11     ` Mendez, Judith
@ 2023-04-26 17:47       ` Marc Kleine-Budde
  0 siblings, 0 replies; 17+ messages in thread
From: Marc Kleine-Budde @ 2023-04-26 17:47 UTC (permalink / raw)
  To: Mendez, Judith
  Cc: Chandrasekar Ramakrishnan, Wolfgang Grandegger,
	Krzysztof Kozlowski, David S . Miller, Eric Dumazet,
	Jakub Kicinski, Paolo Abeni, linux-can, netdev, linux-kernel,
	Schuyler Patton, Nishanth Menon, Vignesh Raghavendra,
	Tero Kristo, Rob Herring, linux-arm-kernel, devicetree,
	Oliver Hartkopp

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

On 26.04.2023 11:11:12, Mendez, Judith wrote:
[...]
> > print a proper error message using dev_err_probe("IRQ %s not found and
> > polling not activated\n")
> > 
> Why %s when MCAN requests 1 IRQ which is "int0"? If we want to print "int0",
> should it be hardcoded into the print error message?

I think I copied the error message from platform_get_irq_byname() and
extended it. Of course it makes sense to hardcode the IRQ name.

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] 17+ messages in thread

* Re: [PATCH v2 2/4] dt-bindings: net: can: Add poll-interval for MCAN
  2023-04-25  0:13   ` Rob Herring
@ 2023-04-28 16:17     ` Mendez, Judith
  2023-05-01  7:16       ` Krzysztof Kozlowski
  0 siblings, 1 reply; 17+ messages in thread
From: Mendez, Judith @ 2023-04-28 16:17 UTC (permalink / raw)
  To: Rob Herring
  Cc: Jakub Kicinski, Nishanth Menon, Rob Herring, Paolo Abeni,
	Chandrasekar Ramakrishnan, devicetree, Oliver Hartkopp,
	linux-can, linux-arm-kernel, Eric Dumazet, Tero Kristo,
	Schuyler Patton, Wolfgang Grandegger, David S . Miller,
	Krzysztof Kozlowski, Marc Kleine-Budde, Vignesh Raghavendra,
	netdev, linux-kernel

Hello Rob,

On 4/24/2023 7:13 PM, Rob Herring wrote:
> 
> On Mon, 24 Apr 2023 14:54:00 -0500, Judith Mendez wrote:
>> On AM62x SoC, MCANs on MCU domain do not have hardware interrupt
>> routed to A53 Linux, instead they will use software interrupt by
>> hrtimer. To enable timer method, interrupts should be optional so
>> remove interrupts property from required section and introduce
>> poll-interval property.
>>
>> Signed-off-by: Judith Mendez <jm@ti.com>
>> ---
>> Changelog:
>> v2:
>>    1. Add poll-interval property to enable timer polling method
>>    2. Add example using poll-interval property
>>
>>   .../bindings/net/can/bosch,m_can.yaml         | 26 ++++++++++++++++---
>>   1 file changed, 23 insertions(+), 3 deletions(-)
>>
> 
> My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check'
> on your patch (DT_CHECKER_FLAGS is new in v5.13):
> 
> yamllint warnings/errors:
> 
> dtschema/dtc warnings/errors:
> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml: 'example with interrupts' is not one of ['$id', '$schema', 'title', 'description', 'examples', 'required', 'allOf', 'anyOf', 'oneOf', 'definitions', '$defs', 'additionalProperties', 'dependencies', 'dependentRequired', 'dependentSchemas', 'patternProperties', 'properties', 'not', 'if', 'then', 'else', 'unevaluatedProperties', 'deprecated', 'maintainers', 'select', '$ref']
> 	from schema $id: http://devicetree.org/meta-schemas/base.yaml#
> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml: 'example with timer polling' is not one of ['$id', '$schema', 'title', 'description', 'examples', 'required', 'allOf', 'anyOf', 'oneOf', 'definitions', '$defs', 'additionalProperties', 'dependencies', 'dependentRequired', 'dependentSchemas', 'patternProperties', 'properties', 'not', 'if', 'then', 'else', 'unevaluatedProperties', 'deprecated', 'maintainers', 'select', '$ref']
> 	from schema $id: http://devicetree.org/meta-schemas/base.yaml#
> 
> doc reference errors (make refcheckdocs):
> 
> See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20230424195402.516-3-jm@ti.com
> 
> The base for the series is generally the latest rc1. A different dependency
> should be noted in *this* patch.
> 
> If you already ran 'make dt_binding_check' and didn't see the above
> error(s), then make sure 'yamllint' is installed and dt-schema is up to
> date:
> 
> pip3 install dtschema --upgrade
> 
> Please check and re-submit after running the above command yourself. Note
> that DT_SCHEMA_FILES can be set to your schema file to speed up checking
> your schema. However, it must be unset to test all examples with your schema.

Thanks Rob, I was not getting the errors, but I have fixed now. Thanks.

regards,
Judith



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

* Re: [PATCH v2 2/4] dt-bindings: net: can: Add poll-interval for MCAN
  2023-04-28 16:17     ` Mendez, Judith
@ 2023-05-01  7:16       ` Krzysztof Kozlowski
  2023-05-01 15:52         ` Mendez, Judith
  0 siblings, 1 reply; 17+ messages in thread
From: Krzysztof Kozlowski @ 2023-05-01  7:16 UTC (permalink / raw)
  To: Mendez, Judith, Rob Herring
  Cc: Jakub Kicinski, Nishanth Menon, Rob Herring, Paolo Abeni,
	Chandrasekar Ramakrishnan, devicetree, Oliver Hartkopp,
	linux-can, linux-arm-kernel, Eric Dumazet, Tero Kristo,
	Schuyler Patton, Wolfgang Grandegger, David S . Miller,
	Krzysztof Kozlowski, Marc Kleine-Budde, Vignesh Raghavendra,
	netdev, linux-kernel

On 28/04/2023 18:17, Mendez, Judith wrote:
> Hello Rob,
> 
> On 4/24/2023 7:13 PM, Rob Herring wrote:
>>
>> On Mon, 24 Apr 2023 14:54:00 -0500, Judith Mendez wrote:
>>> On AM62x SoC, MCANs on MCU domain do not have hardware interrupt
>>> routed to A53 Linux, instead they will use software interrupt by
>>> hrtimer. To enable timer method, interrupts should be optional so
>>> remove interrupts property from required section and introduce
>>> poll-interval property.
>>>
>>> Signed-off-by: Judith Mendez <jm@ti.com>
>>> ---
>>> Changelog:
>>> v2:
>>>    1. Add poll-interval property to enable timer polling method
>>>    2. Add example using poll-interval property
>>>
>>>   .../bindings/net/can/bosch,m_can.yaml         | 26 ++++++++++++++++---
>>>   1 file changed, 23 insertions(+), 3 deletions(-)
>>>
>>
>> My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check'
>> on your patch (DT_CHECKER_FLAGS is new in v5.13):
>>
>> yamllint warnings/errors:
>>
>> dtschema/dtc warnings/errors:
>> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml: 'example with interrupts' is not one of ['$id', '$schema', 'title', 'description', 'examples', 'required', 'allOf', 'anyOf', 'oneOf', 'definitions', '$defs', 'additionalProperties', 'dependencies', 'dependentRequired', 'dependentSchemas', 'patternProperties', 'properties', 'not', 'if', 'then', 'else', 'unevaluatedProperties', 'deprecated', 'maintainers', 'select', '$ref']
>> 	from schema $id: http://devicetree.org/meta-schemas/base.yaml#
>> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml: 'example with timer polling' is not one of ['$id', '$schema', 'title', 'description', 'examples', 'required', 'allOf', 'anyOf', 'oneOf', 'definitions', '$defs', 'additionalProperties', 'dependencies', 'dependentRequired', 'dependentSchemas', 'patternProperties', 'properties', 'not', 'if', 'then', 'else', 'unevaluatedProperties', 'deprecated', 'maintainers', 'select', '$ref']
>> 	from schema $id: http://devicetree.org/meta-schemas/base.yaml#
>>
>> doc reference errors (make refcheckdocs):
>>
>> See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20230424195402.516-3-jm@ti.com
>>
>> The base for the series is generally the latest rc1. A different dependency
>> should be noted in *this* patch.
>>
>> If you already ran 'make dt_binding_check' and didn't see the above
>> error(s), then make sure 'yamllint' is installed and dt-schema is up to
>> date:
>>
>> pip3 install dtschema --upgrade
>>
>> Please check and re-submit after running the above command yourself. Note
>> that DT_SCHEMA_FILES can be set to your schema file to speed up checking
>> your schema. However, it must be unset to test all examples with your schema.
> 
> Thanks Rob, I was not getting the errors, but I have fixed now. Thanks.

There is no way your code have worked, so either you did not test it or
your setup misses something. In both cases you would see errors, so
please check what went wrong.

Best regards,
Krzysztof


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

* Re: [PATCH v2 2/4] dt-bindings: net: can: Add poll-interval for MCAN
  2023-05-01  7:16       ` Krzysztof Kozlowski
@ 2023-05-01 15:52         ` Mendez, Judith
  0 siblings, 0 replies; 17+ messages in thread
From: Mendez, Judith @ 2023-05-01 15:52 UTC (permalink / raw)
  To: Krzysztof Kozlowski, Rob Herring
  Cc: Jakub Kicinski, Nishanth Menon, Rob Herring, Paolo Abeni,
	Chandrasekar Ramakrishnan, devicetree, Oliver Hartkopp,
	linux-can, linux-arm-kernel, Eric Dumazet, Tero Kristo,
	Schuyler Patton, Wolfgang Grandegger, David S . Miller,
	Krzysztof Kozlowski, Marc Kleine-Budde, Vignesh Raghavendra,
	netdev, linux-kernel

Hello Krzysztof,

On 5/1/2023 2:16 AM, Krzysztof Kozlowski wrote:
> On 28/04/2023 18:17, Mendez, Judith wrote:
>> Hello Rob,
>>
>> On 4/24/2023 7:13 PM, Rob Herring wrote:
>>>
>>> On Mon, 24 Apr 2023 14:54:00 -0500, Judith Mendez wrote:
>>>> On AM62x SoC, MCANs on MCU domain do not have hardware interrupt
>>>> routed to A53 Linux, instead they will use software interrupt by
>>>> hrtimer. To enable timer method, interrupts should be optional so
>>>> remove interrupts property from required section and introduce
>>>> poll-interval property.
>>>>
>>>> Signed-off-by: Judith Mendez <jm@ti.com>
>>>> ---
>>>> Changelog:
>>>> v2:
>>>>     1. Add poll-interval property to enable timer polling method
>>>>     2. Add example using poll-interval property
>>>>
>>>>    .../bindings/net/can/bosch,m_can.yaml         | 26 ++++++++++++++++---
>>>>    1 file changed, 23 insertions(+), 3 deletions(-)
>>>>
>>>
>>> My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check'
>>> on your patch (DT_CHECKER_FLAGS is new in v5.13):
>>>
>>> yamllint warnings/errors:
>>>
>>> dtschema/dtc warnings/errors:
>>> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml: 'example with interrupts' is not one of ['$id', '$schema', 'title', 'description', 'examples', 'required', 'allOf', 'anyOf', 'oneOf', 'definitions', '$defs', 'additionalProperties', 'dependencies', 'dependentRequired', 'dependentSchemas', 'patternProperties', 'properties', 'not', 'if', 'then', 'else', 'unevaluatedProperties', 'deprecated', 'maintainers', 'select', '$ref']
>>> 	from schema $id: http://devicetree.org/meta-schemas/base.yaml#
>>> /builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/net/can/bosch,m_can.yaml: 'example with timer polling' is not one of ['$id', '$schema', 'title', 'description', 'examples', 'required', 'allOf', 'anyOf', 'oneOf', 'definitions', '$defs', 'additionalProperties', 'dependencies', 'dependentRequired', 'dependentSchemas', 'patternProperties', 'properties', 'not', 'if', 'then', 'else', 'unevaluatedProperties', 'deprecated', 'maintainers', 'select', '$ref']
>>> 	from schema $id: http://devicetree.org/meta-schemas/base.yaml#
>>>
>>> doc reference errors (make refcheckdocs):
>>>
>>> See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/20230424195402.516-3-jm@ti.com
>>>
>>> The base for the series is generally the latest rc1. A different dependency
>>> should be noted in *this* patch.
>>>
>>> If you already ran 'make dt_binding_check' and didn't see the above
>>> error(s), then make sure 'yamllint' is installed and dt-schema is up to
>>> date:
>>>
>>> pip3 install dtschema --upgrade
>>>
>>> Please check and re-submit after running the above command yourself. Note
>>> that DT_SCHEMA_FILES can be set to your schema file to speed up checking
>>> your schema. However, it must be unset to test all examples with your schema.
>>
>> Thanks Rob, I was not getting the errors, but I have fixed now. Thanks.
> 
> There is no way your code have worked, so either you did not test it or
> your setup misses something. In both cases you would see errors, so
> please check what went wrong.

Will do, thanks for taking the time to check the patch for errors.

regards,
Judith

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

* Re: [PATCH v2 3/4] DO_NOT_MERGE arm64: dts: ti: Add AM62x MCAN MAIN domain transceiver overlay
  2023-04-25 12:47   ` Nishanth Menon
@ 2023-05-01 15:54     ` Mendez, Judith
  0 siblings, 0 replies; 17+ messages in thread
From: Mendez, Judith @ 2023-05-01 15:54 UTC (permalink / raw)
  To: Nishanth Menon
  Cc: Chandrasekar Ramakrishnan, Wolfgang Grandegger,
	Marc Kleine-Budde, Krzysztof Kozlowski, David S . Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-can, netdev,
	linux-kernel, Schuyler Patton, Vignesh Raghavendra, Tero Kristo,
	Rob Herring, linux-arm-kernel, devicetree, Oliver Hartkopp

Hello Nishanth,

On 4/25/2023 7:47 AM, Nishanth Menon wrote:
> On 14:54-20230424, Judith Mendez wrote:
>> 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
>>
> 
> Just a headsup - for a formal patch, for the overlay, please ensure we
> provide link to the specific board. I dont want to end up with 1000s
> of overlay files, each enabling one specific peripheral instance of a
> small subgroup of peripheral instance. Overlays should be describing a
> real platform with product link.

Will add in the next submission, thanks.

regards,
Judith

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

* Re: [PATCH v2 1/4] can: m_can: Add hrtimer to generate software interrupt
  2023-04-24 19:53 ` [PATCH v2 1/4] can: m_can: Add hrtimer to generate software interrupt Judith Mendez
  2023-04-24 20:14   ` Marc Kleine-Budde
@ 2023-05-01 16:03   ` Simon Horman
  1 sibling, 0 replies; 17+ messages in thread
From: Simon Horman @ 2023-05-01 16:03 UTC (permalink / raw)
  To: Judith Mendez
  Cc: Chandrasekar Ramakrishnan, Wolfgang Grandegger,
	Marc Kleine-Budde, Krzysztof Kozlowski, David S . Miller,
	Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-can, netdev,
	linux-kernel, Schuyler Patton, Nishanth Menon,
	Vignesh Raghavendra, Tero Kristo, Rob Herring, linux-arm-kernel,
	devicetree, Oliver Hartkopp

On Mon, Apr 24, 2023 at 02:53:59PM -0500, Judith Mendez wrote:
> Add an hrtimer to MCAN class device. Each MCAN will have its own
> hrtimer instantiated if there is no hardware interrupt found and
> poll-interval property is defined in device tree M_CAN node.
> 
> 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>
> ---
> Changelog:
> v2:
> 	1. Add poll-interval to MCAN class device to check if poll-interval propery is
> 	present in MCAN node, this enables timer polling method.
> 	2. Add 'polling' flag to MCAN class device to check if a device is using timer
> 	polling method
> 	3. Check if both timer polling and hardware interrupt are enabled for a MCAN
> 	device, default to hardware interrupt mode if both are enabled.
> 	4. Changed ms_to_ktime() to ns_to_ktime()
> 	5. Removed newlines, tabs, and restructure if/else section.
> 
>  drivers/net/can/m_can/m_can.c          | 30 ++++++++++++++++++++-----
>  drivers/net/can/m_can/m_can.h          |  5 +++++
>  drivers/net/can/m_can/m_can_platform.c | 31 ++++++++++++++++++++++++--
>  3 files changed, 59 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
> index a5003435802b..33e094f88da1 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 (cdev->polling) {
> +		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)

Hi Judith,

This function seems to only be used in this file,
so it should be static.

> +{
> +	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;
> +}
> +

...

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

end of thread, other threads:[~2023-05-01 16:03 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-24 19:53 [PATCH v2 0/4] Enable multiple MCAN on AM62x Judith Mendez
2023-04-24 19:53 ` [PATCH v2 1/4] can: m_can: Add hrtimer to generate software interrupt Judith Mendez
2023-04-24 20:14   ` Marc Kleine-Budde
2023-04-26 16:11     ` Mendez, Judith
2023-04-26 17:47       ` Marc Kleine-Budde
2023-05-01 16:03   ` Simon Horman
2023-04-24 19:54 ` [PATCH v2 2/4] dt-bindings: net: can: Add poll-interval for MCAN Judith Mendez
2023-04-24 20:17   ` Marc Kleine-Budde
2023-04-25  0:13   ` Rob Herring
2023-04-28 16:17     ` Mendez, Judith
2023-05-01  7:16       ` Krzysztof Kozlowski
2023-05-01 15:52         ` Mendez, Judith
2023-04-25 12:32   ` Nishanth Menon
2023-04-24 19:54 ` [PATCH v2 3/4] DO_NOT_MERGE arm64: dts: ti: Add AM62x MCAN MAIN domain transceiver overlay Judith Mendez
2023-04-25 12:47   ` Nishanth Menon
2023-05-01 15:54     ` Mendez, Judith
2023-04-24 19:54 ` [PATCH v2 4/4] DO_NOT_MERGE arm64: dts: ti: Enable MCU MCANs for AM62x Judith Mendez

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).