linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v8 0/5] Add MCAN Support for Dra76 platform
@ 2018-01-16 11:37 Faiz Abbas
  2018-01-16 11:37 ` [PATCH v8 1/5] dt-bindings: can: m_can: Document new can transceiver binding Faiz Abbas
                   ` (5 more replies)
  0 siblings, 6 replies; 10+ messages in thread
From: Faiz Abbas @ 2018-01-16 11:37 UTC (permalink / raw)
  To: wg, mkl, robh+dt, mark.rutland
  Cc: linux-can, netdev, devicetree, linux-kernel, faiz_abbas, nsekhar,
	fcooper, robh, Wenyou.Yang, sergei.shtylyov, linux-omap, b29396

This patch series adds support for M_CAN on the TI Dra76
platform. Device tree patches will be sent separately.
A bunch of patches were sent before by
Franklin Cooper <fcooper@ti.com>. I have clubbed the
series together and rebased to the latest kernel.

v8 changes:
Rebased to linux-can-next/testing branch which already
has 3 patches of v7.
Changed order of the patches so that documentation comes
first.
Fixed error handling and added m_can_clk_start/stop() in
m_can_plat_probe().

patch 4 depends on patch 3.

v7 changes:
Added support for bitrate_max to be read from the netlink
interface.
Moved allocation of netdevice to probe. Cleaned up the
allocator function.
Moved enabling/disabling of clocks to pm_runtime callbacks.
Minor format changes.

patch 5 depends on patch 4 which in turn depends on patch 3.

v6 changes:
Dropped the patches to make hclk optional. Drivers
which enable hclk as the interface clock using
pm_runtime calls must still provide a hclk in the
clocks property.

Support higher speed CAN-FD bitrate:
The community decided that data sampling point be used
for the secondary sampling point here
https://patchwork.kernel.org/patch/9909845/

Faiz Abbas (2):
  can: m_can: Move allocation of net device to probe
  can: m_can: Add PM Support

Franklin S Cooper Jr (3):
  dt-bindings: can: m_can: Document new can transceiver binding
  dt-bindings: can: can-transceiver: Document new binding
  can: m_can: Support higher speed CAN-FD bitrates

 .../bindings/net/can/can-transceiver.txt           |  24 +++
 .../devicetree/bindings/net/can/m_can.txt          |   9 ++
 drivers/net/can/m_can/m_can.c                      | 168 ++++++++++++++-------
 3 files changed, 147 insertions(+), 54 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/net/can/can-transceiver.txt

-- 
2.7.4

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

* [PATCH v8 1/5] dt-bindings: can: m_can: Document new can transceiver binding
  2018-01-16 11:37 [PATCH v8 0/5] Add MCAN Support for Dra76 platform Faiz Abbas
@ 2018-01-16 11:37 ` Faiz Abbas
  2018-01-16 11:37 ` [PATCH v8 2/5] dt-bindings: can: can-transceiver: Document new binding Faiz Abbas
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Faiz Abbas @ 2018-01-16 11:37 UTC (permalink / raw)
  To: wg, mkl, robh+dt, mark.rutland
  Cc: linux-can, netdev, devicetree, linux-kernel, faiz_abbas, nsekhar,
	fcooper, robh, Wenyou.Yang, sergei.shtylyov, linux-omap, b29396

From: Franklin S Cooper Jr <fcooper@ti.com>

Add information regarding can-transceiver binding. This is especially
important for MCAN since the IP allows CAN FD mode to run significantly
faster than what most transceivers are capable of.

Signed-off-by: Franklin S Cooper Jr <fcooper@ti.com>
Signed-off-by: Sekhar Nori <nsekhar@ti.com>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
---
 Documentation/devicetree/bindings/net/can/m_can.txt | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/Documentation/devicetree/bindings/net/can/m_can.txt b/Documentation/devicetree/bindings/net/can/m_can.txt
index 63e9042..ed61438 100644
--- a/Documentation/devicetree/bindings/net/can/m_can.txt
+++ b/Documentation/devicetree/bindings/net/can/m_can.txt
@@ -43,6 +43,11 @@ Required properties:
 			  Please refer to 2.4.1 Message RAM Configuration in
 			  Bosch M_CAN user manual for details.
 
+Optional Subnode:
+- can-transceiver	: Can-transceiver subnode describing maximum speed
+			  that can be used for CAN/CAN-FD modes. See
+			  Documentation/devicetree/bindings/net/can/can-transceiver.txt
+			  for details.
 Example:
 SoC dtsi:
 m_can1: can@20e8000 {
@@ -63,4 +68,8 @@ Board dts:
 	pinctrl-names = "default";
 	pinctrl-0 = <&pinctrl_m_can1>;
 	status = "enabled";
+
+	can-transceiver {
+		max-bitrate = <5000000>;
+	};
 };
-- 
2.7.4

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

* [PATCH v8 2/5] dt-bindings: can: can-transceiver: Document new binding
  2018-01-16 11:37 [PATCH v8 0/5] Add MCAN Support for Dra76 platform Faiz Abbas
  2018-01-16 11:37 ` [PATCH v8 1/5] dt-bindings: can: m_can: Document new can transceiver binding Faiz Abbas
@ 2018-01-16 11:37 ` Faiz Abbas
  2018-01-16 11:37 ` [PATCH v8 3/5] can: m_can: Move allocation of net device to probe Faiz Abbas
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 10+ messages in thread
From: Faiz Abbas @ 2018-01-16 11:37 UTC (permalink / raw)
  To: wg, mkl, robh+dt, mark.rutland
  Cc: linux-can, netdev, devicetree, linux-kernel, faiz_abbas, nsekhar,
	fcooper, robh, Wenyou.Yang, sergei.shtylyov, linux-omap, b29396

From: Franklin S Cooper Jr <fcooper@ti.com>

Add documentation to describe usage of the new can-transceiver binding.
This new binding is applicable for any CAN device therefore it exists as
its own document.

Signed-off-by: Franklin S Cooper Jr <fcooper@ti.com>
Signed-off-by: Sekhar Nori <nsekhar@ti.com>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
---
 .../bindings/net/can/can-transceiver.txt           | 24 ++++++++++++++++++++++
 1 file changed, 24 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/net/can/can-transceiver.txt

diff --git a/Documentation/devicetree/bindings/net/can/can-transceiver.txt b/Documentation/devicetree/bindings/net/can/can-transceiver.txt
new file mode 100644
index 0000000..0011f53
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/can/can-transceiver.txt
@@ -0,0 +1,24 @@
+Generic CAN transceiver Device Tree binding
+------------------------------
+
+CAN transceiver typically limits the max speed in standard CAN and CAN FD
+modes. Typically these limitations are static and the transceivers themselves
+provide no way to detect this limitation at runtime. For this situation,
+the "can-transceiver" node can be used.
+
+Required Properties:
+ max-bitrate:	a positive non 0 value that determines the max
+		speed that CAN/CAN-FD can run. Any other value
+		will be ignored.
+
+Examples:
+
+Based on Texas Instrument's TCAN1042HGV CAN Transceiver
+
+m_can0 {
+	....
+	can-transceiver {
+		max-bitrate = <5000000>;
+	};
+	...
+};
-- 
2.7.4

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

* [PATCH v8 3/5] can: m_can: Move allocation of net device to probe
  2018-01-16 11:37 [PATCH v8 0/5] Add MCAN Support for Dra76 platform Faiz Abbas
  2018-01-16 11:37 ` [PATCH v8 1/5] dt-bindings: can: m_can: Document new can transceiver binding Faiz Abbas
  2018-01-16 11:37 ` [PATCH v8 2/5] dt-bindings: can: can-transceiver: Document new binding Faiz Abbas
@ 2018-01-16 11:37 ` Faiz Abbas
  2018-01-16 13:03   ` Marc Kleine-Budde
  2018-01-16 11:37 ` [PATCH v8 4/5] can: m_can: Add PM Support Faiz Abbas
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 10+ messages in thread
From: Faiz Abbas @ 2018-01-16 11:37 UTC (permalink / raw)
  To: wg, mkl, robh+dt, mark.rutland
  Cc: linux-can, netdev, devicetree, linux-kernel, faiz_abbas, nsekhar,
	fcooper, robh, Wenyou.Yang, sergei.shtylyov, linux-omap, b29396

With the version no longer required to allocate the net device, it can
be moved to probe and the alloc_m_can_dev() function can be simplified.

Therefore, move the allocation of net device to probe and change
alloc_m_can_dev() to setup_m_can_dev().

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
---
 drivers/net/can/m_can/m_can.c | 30 +++++++++++++-----------------
 1 file changed, 13 insertions(+), 17 deletions(-)

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index 893edbb..ebb74de 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -1207,25 +1207,20 @@ static bool m_can_niso_supported(const struct m_can_priv *priv)
 	return !niso_timeout;
 }
 
-static struct net_device *alloc_m_can_dev(struct platform_device *pdev,
-					  void __iomem *addr, u32 tx_fifo_size)
+static int setup_m_can_dev(struct platform_device *pdev, struct net_device *dev,
+			   void __iomem *addr)
 {
-	struct net_device *dev;
 	struct m_can_priv *priv;
 	int m_can_version;
 
 	m_can_version = m_can_check_core_release(addr);
 	/* return if unsupported version */
 	if (!m_can_version) {
-		dev = NULL;
-		goto return_dev;
+		dev_err(&pdev->dev, "Unsupported version number: %2d",
+			m_can_version);
+		return -EINVAL;
 	}
 
-	dev = alloc_candev(sizeof(*priv), tx_fifo_size);
-	if (!dev) {
-		dev = NULL;
-		goto return_dev;
-	}
 	priv = netdev_priv(dev);
 	netif_napi_add(dev, &priv->napi, m_can_poll, M_CAN_NAPI_WEIGHT);
 
@@ -1267,16 +1262,12 @@ static struct net_device *alloc_m_can_dev(struct platform_device *pdev,
 						: 0);
 		break;
 	default:
-		/* Unsupported device: free candev */
-		free_m_can_dev(dev);
 		dev_err(&pdev->dev, "Unsupported version number: %2d",
 			priv->version);
-		dev = NULL;
-		break;
+		return -EINVAL;
 	}
 
-return_dev:
-	return dev;
+	return 0;
 }
 
 static int m_can_open(struct net_device *dev)
@@ -1616,11 +1607,16 @@ static int m_can_plat_probe(struct platform_device *pdev)
 	tx_fifo_size = mram_config_vals[7];
 
 	/* allocate the m_can device */
-	dev = alloc_m_can_dev(pdev, addr, tx_fifo_size);
+	dev = alloc_candev(sizeof(*priv), tx_fifo_size);
 	if (!dev) {
 		ret = -ENOMEM;
 		goto disable_cclk_ret;
 	}
+
+	ret = setup_m_can_dev(pdev, dev, addr);
+	if (ret)
+		goto failed_free_dev;
+
 	priv = netdev_priv(dev);
 	dev->irq = irq;
 	priv->device = &pdev->dev;
-- 
2.7.4

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

* [PATCH v8 4/5] can: m_can: Add PM Support
  2018-01-16 11:37 [PATCH v8 0/5] Add MCAN Support for Dra76 platform Faiz Abbas
                   ` (2 preceding siblings ...)
  2018-01-16 11:37 ` [PATCH v8 3/5] can: m_can: Move allocation of net device to probe Faiz Abbas
@ 2018-01-16 11:37 ` Faiz Abbas
  2018-01-16 12:57   ` Marc Kleine-Budde
  2018-01-16 11:37 ` [PATCH v8 5/5] can: m_can: Support higher speed CAN-FD bitrates Faiz Abbas
  2018-01-16 14:12 ` [PATCH v8 0/5] Add MCAN Support for Dra76 platform Marc Kleine-Budde
  5 siblings, 1 reply; 10+ messages in thread
From: Faiz Abbas @ 2018-01-16 11:37 UTC (permalink / raw)
  To: wg, mkl, robh+dt, mark.rutland
  Cc: linux-can, netdev, devicetree, linux-kernel, faiz_abbas, nsekhar,
	fcooper, robh, Wenyou.Yang, sergei.shtylyov, linux-omap, b29396

Add support for CONFIG_PM which is the new way to handle managing clocks.

Move the clock management to pm_runtime_resume() and pm_runtime_suspend()
callbacks for the driver.

CONFIG_PM is required by OMAP based devices to handle clock management.
Therefore, this allows future Texas Instruments SoCs that have the MCAN IP
to work with this driver.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
---
 drivers/net/can/m_can/m_can.c | 100 ++++++++++++++++++++++++++----------------
 1 file changed, 62 insertions(+), 38 deletions(-)

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index ebb74de..95c5594 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/of.h>
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
 #include <linux/iopoll.h>
 #include <linux/can/dev.h>
 
@@ -625,21 +626,16 @@ static int m_can_clk_start(struct m_can_priv *priv)
 {
 	int err;
 
-	err = clk_prepare_enable(priv->hclk);
+	err = pm_runtime_get_sync(priv->device);
 	if (err)
-		return err;
-
-	err = clk_prepare_enable(priv->cclk);
-	if (err)
-		clk_disable_unprepare(priv->hclk);
+		pm_runtime_put_noidle(priv->device);
 
 	return err;
 }
 
 static void m_can_clk_stop(struct m_can_priv *priv)
 {
-	clk_disable_unprepare(priv->cclk);
-	clk_disable_unprepare(priv->hclk);
+	pm_runtime_put_sync(priv->device);
 }
 
 static int m_can_get_berr_counter(const struct net_device *dev,
@@ -1559,37 +1555,26 @@ static int m_can_plat_probe(struct platform_device *pdev)
 		goto failed_ret;
 	}
 
-	/* Enable clocks. Necessary to read Core Release in order to determine
-	 * M_CAN version
-	 */
-	ret = clk_prepare_enable(hclk);
-	if (ret)
-		goto disable_hclk_ret;
-
-	ret = clk_prepare_enable(cclk);
-	if (ret)
-		goto disable_cclk_ret;
-
 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "m_can");
 	addr = devm_ioremap_resource(&pdev->dev, res);
 	irq = platform_get_irq_byname(pdev, "int0");
 
 	if (IS_ERR(addr) || irq < 0) {
 		ret = -EINVAL;
-		goto disable_cclk_ret;
+		goto failed_ret;
 	}
 
 	/* message ram could be shared */
 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "message_ram");
 	if (!res) {
 		ret = -ENODEV;
-		goto disable_cclk_ret;
+		goto failed_ret;
 	}
 
 	mram_addr = devm_ioremap(&pdev->dev, res->start, resource_size(res));
 	if (!mram_addr) {
 		ret = -ENOMEM;
-		goto disable_cclk_ret;
+		goto failed_ret;
 	}
 
 	/* get message ram configuration */
@@ -1598,7 +1583,7 @@ static int m_can_plat_probe(struct platform_device *pdev)
 					 sizeof(mram_config_vals) / 4);
 	if (ret) {
 		dev_err(&pdev->dev, "Could not get Message RAM configuration.");
-		goto disable_cclk_ret;
+		goto failed_ret;
 	}
 
 	/* Get TX FIFO size
@@ -1610,13 +1595,9 @@ static int m_can_plat_probe(struct platform_device *pdev)
 	dev = alloc_candev(sizeof(*priv), tx_fifo_size);
 	if (!dev) {
 		ret = -ENOMEM;
-		goto disable_cclk_ret;
+		goto failed_ret;
 	}
 
-	ret = setup_m_can_dev(pdev, dev, addr);
-	if (ret)
-		goto failed_free_dev;
-
 	priv = netdev_priv(dev);
 	dev->irq = irq;
 	priv->device = &pdev->dev;
@@ -1630,11 +1611,23 @@ static int m_can_plat_probe(struct platform_device *pdev)
 	platform_set_drvdata(pdev, dev);
 	SET_NETDEV_DEV(dev, &pdev->dev);
 
+	/* Enable clocks. Necessary to read Core Release in order to determine
+	 * M_CAN version
+	 */
+	pm_runtime_enable(&pdev->dev);
+	ret = m_can_clk_start(priv);
+	if (ret)
+		goto pm_runtime_fail;
+
+	ret = setup_m_can_dev(pdev, dev, addr);
+	if (ret)
+		goto clk_disable;
+
 	ret = register_m_can_dev(dev);
 	if (ret) {
 		dev_err(&pdev->dev, "registering %s failed (err=%d)\n",
 			KBUILD_MODNAME, ret);
-		goto failed_free_dev;
+		goto clk_disable;
 	}
 
 	devm_can_led_init(dev);
@@ -1647,15 +1640,13 @@ static int m_can_plat_probe(struct platform_device *pdev)
 	/* Probe finished
 	 * Stop clocks. They will be reactivated once the M_CAN device is opened
 	 */
-
-	goto disable_cclk_ret;
-
-failed_free_dev:
-	free_m_can_dev(dev);
-disable_cclk_ret:
-	clk_disable_unprepare(cclk);
-disable_hclk_ret:
-	clk_disable_unprepare(hclk);
+clk_disable:
+	m_can_clk_stop(priv);
+pm_runtime_fail:
+	if (ret) {
+		pm_runtime_disable(&pdev->dev);
+		free_m_can_dev(dev);
+	}
 failed_ret:
 	return ret;
 }
@@ -1713,6 +1704,9 @@ static int m_can_plat_remove(struct platform_device *pdev)
 	struct net_device *dev = platform_get_drvdata(pdev);
 
 	unregister_m_can_dev(dev);
+
+	pm_runtime_disable(&pdev->dev);
+
 	platform_set_drvdata(pdev, NULL);
 
 	free_m_can_dev(dev);
@@ -1720,7 +1714,37 @@ static int m_can_plat_remove(struct platform_device *pdev)
 	return 0;
 }
 
+int m_can_runtime_suspend(struct device *dev)
+{
+	struct net_device *ndev = dev_get_drvdata(dev);
+	struct m_can_priv *priv = netdev_priv(ndev);
+
+	clk_disable_unprepare(priv->cclk);
+	clk_disable_unprepare(priv->hclk);
+
+	return 0;
+}
+
+int m_can_runtime_resume(struct device *dev)
+{
+	struct net_device *ndev = dev_get_drvdata(dev);
+	struct m_can_priv *priv = netdev_priv(ndev);
+	int err;
+
+	err = clk_prepare_enable(priv->hclk);
+	if (err)
+		return err;
+
+	err = clk_prepare_enable(priv->cclk);
+	if (err)
+		clk_disable_unprepare(priv->hclk);
+
+	return err;
+}
+
 static const struct dev_pm_ops m_can_pmops = {
+	SET_RUNTIME_PM_OPS(m_can_runtime_suspend,
+			   m_can_runtime_resume, NULL)
 	SET_SYSTEM_SLEEP_PM_OPS(m_can_suspend, m_can_resume)
 };
 
-- 
2.7.4

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

* [PATCH v8 5/5] can: m_can: Support higher speed CAN-FD bitrates
  2018-01-16 11:37 [PATCH v8 0/5] Add MCAN Support for Dra76 platform Faiz Abbas
                   ` (3 preceding siblings ...)
  2018-01-16 11:37 ` [PATCH v8 4/5] can: m_can: Add PM Support Faiz Abbas
@ 2018-01-16 11:37 ` Faiz Abbas
  2018-01-16 14:12 ` [PATCH v8 0/5] Add MCAN Support for Dra76 platform Marc Kleine-Budde
  5 siblings, 0 replies; 10+ messages in thread
From: Faiz Abbas @ 2018-01-16 11:37 UTC (permalink / raw)
  To: wg, mkl, robh+dt, mark.rutland
  Cc: linux-can, netdev, devicetree, linux-kernel, faiz_abbas, nsekhar,
	fcooper, robh, Wenyou.Yang, sergei.shtylyov, linux-omap, b29396

From: Franklin S Cooper Jr <fcooper@ti.com>

During test transmitting using CAN-FD at high bitrates (> 2 Mbps)
would fail. Scoping the signals I noticed that only a single bit
was being transmitted and with a bit more investigation realized the
actual MCAN IP would go back to initialization mode automatically.

It appears this issue is due to the MCAN needing to use the Transmitter
Delay Compensation Mode with the correct value for the transmitter delay
compensation offset (tdco). What impacts the tdco value isn't 100% clear
but to calculate it you use an equation defined in the MCAN User's Guide.

The user guide mentions that this register needs to be set based on clock
values, secondary sample point and the data bitrate. One of the key
variables that can't automatically be determined is the secondary
sample point (ssp). This ssp is similar to the sp but is specific to this
transmitter delay compensation mode. The guidelines for configuring
ssp is rather vague but via some CAN test it appears for DRA76x that
putting the value same as data sampling point works.

The CAN-CIA's "Bit Time Requirements for CAN FD" paper presented at
the International CAN Conference 2013 indicates that this TDC mode is
only needed for data bit rates above 2.5 Mbps. Therefore, only enable
this mode when the data bit rate is above 2.5 Mbps.

Signed-off-by: Franklin S Cooper Jr <fcooper@ti.com>
Signed-off-by: Sekhar Nori <nsekhar@ti.com>
Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
---
 drivers/net/can/m_can/m_can.c | 46 ++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 43 insertions(+), 3 deletions(-)

diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
index 95c5594..93bf0c6 100644
--- a/drivers/net/can/m_can/m_can.c
+++ b/drivers/net/can/m_can/m_can.c
@@ -127,6 +127,12 @@ enum m_can_mram_cfg {
 #define DBTP_DSJW_SHIFT		0
 #define DBTP_DSJW_MASK		(0xf << DBTP_DSJW_SHIFT)
 
+/* Transmitter Delay Compensation Register (TDCR) */
+#define TDCR_TDCO_SHIFT		8
+#define TDCR_TDCO_MASK		(0x7F << TDCR_TDCO_SHIFT)
+#define TDCR_TDCF_SHIFT		0
+#define TDCR_TDCF_MASK		(0x7F << TDCR_TDCF_SHIFT)
+
 /* Test Register (TEST) */
 #define TEST_LBCK		BIT(4)
 
@@ -983,13 +989,47 @@ static int m_can_set_bittiming(struct net_device *dev)
 	m_can_write(priv, M_CAN_NBTP, reg_btp);
 
 	if (priv->can.ctrlmode & CAN_CTRLMODE_FD) {
+		reg_btp = 0;
 		brp = dbt->brp - 1;
 		sjw = dbt->sjw - 1;
 		tseg1 = dbt->prop_seg + dbt->phase_seg1 - 1;
 		tseg2 = dbt->phase_seg2 - 1;
-		reg_btp = (brp << DBTP_DBRP_SHIFT) | (sjw << DBTP_DSJW_SHIFT) |
-			(tseg1 << DBTP_DTSEG1_SHIFT) |
-			(tseg2 << DBTP_DTSEG2_SHIFT);
+
+		/* TDC is only needed for bitrates beyond 2.5 MBit/s.
+		 * This is mentioned in the "Bit Time Requirements for CAN FD"
+		 * paper presented at the International CAN Conference 2013
+		 */
+		if (dbt->bitrate > 2500000) {
+			u32 tdco, ssp;
+
+			/* Use the same value of secondary sampling point
+			 * as the data sampling point
+			 */
+			ssp = dbt->sample_point;
+
+			/* Equation based on Bosch's M_CAN User Manual's
+			 * Transmitter Delay Compensation Section
+			 */
+			tdco = (priv->can.clock.freq / 1000) *
+			       ssp / dbt->bitrate;
+
+			/* Max valid TDCO value is 127 */
+			if (tdco > 127) {
+				netdev_warn(dev, "TDCO value of %u is beyond maximum. Using maximum possible value\n",
+					    tdco);
+				tdco = 127;
+			}
+
+			reg_btp |= DBTP_TDC;
+			m_can_write(priv, M_CAN_TDCR,
+				    tdco << TDCR_TDCO_SHIFT);
+		}
+
+		reg_btp |= (brp << DBTP_DBRP_SHIFT) |
+			   (sjw << DBTP_DSJW_SHIFT) |
+			   (tseg1 << DBTP_DTSEG1_SHIFT) |
+			   (tseg2 << DBTP_DTSEG2_SHIFT);
+
 		m_can_write(priv, M_CAN_DBTP, reg_btp);
 	}
 
-- 
2.7.4

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

* Re: [PATCH v8 4/5] can: m_can: Add PM Support
  2018-01-16 11:37 ` [PATCH v8 4/5] can: m_can: Add PM Support Faiz Abbas
@ 2018-01-16 12:57   ` Marc Kleine-Budde
  0 siblings, 0 replies; 10+ messages in thread
From: Marc Kleine-Budde @ 2018-01-16 12:57 UTC (permalink / raw)
  To: Faiz Abbas, wg, robh+dt, mark.rutland
  Cc: linux-can, netdev, devicetree, linux-kernel, nsekhar, fcooper,
	robh, Wenyou.Yang, sergei.shtylyov, linux-omap, b29396


[-- Attachment #1.1: Type: text/plain, Size: 1023 bytes --]

On 01/16/2018 12:37 PM, Faiz Abbas wrote:
> Add support for CONFIG_PM which is the new way to handle managing clocks.
> 
> Move the clock management to pm_runtime_resume() and pm_runtime_suspend()
> callbacks for the driver.
> 
> CONFIG_PM is required by OMAP based devices to handle clock management.
> Therefore, this allows future Texas Instruments SoCs that have the MCAN IP
> to work with this driver.
> 
> Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>

Fixed this while applying:

drivers/net/can/m_can/m_can.c:1752:5: warning: symbol
'm_can_runtime_suspend' was not declared. Should it be static?
drivers/net/can/m_can/m_can.c:1763:5: warning: symbol
'm_can_runtime_resume' was not declared. Should it be static?

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

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

* Re: [PATCH v8 3/5] can: m_can: Move allocation of net device to probe
  2018-01-16 11:37 ` [PATCH v8 3/5] can: m_can: Move allocation of net device to probe Faiz Abbas
@ 2018-01-16 13:03   ` Marc Kleine-Budde
  2018-01-16 14:00     ` Marc Kleine-Budde
  0 siblings, 1 reply; 10+ messages in thread
From: Marc Kleine-Budde @ 2018-01-16 13:03 UTC (permalink / raw)
  To: Faiz Abbas, wg, robh+dt, mark.rutland
  Cc: linux-can, netdev, devicetree, linux-kernel, nsekhar, fcooper,
	robh, Wenyou.Yang, sergei.shtylyov, linux-omap, b29396


[-- Attachment #1.1: Type: text/plain, Size: 1396 bytes --]

On 01/16/2018 12:37 PM, Faiz Abbas wrote:
> With the version no longer required to allocate the net device, it can
> be moved to probe and the alloc_m_can_dev() function can be simplified.
> 
> Therefore, move the allocation of net device to probe and change
> alloc_m_can_dev() to setup_m_can_dev().
> 
> Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
> ---
>  drivers/net/can/m_can/m_can.c | 30 +++++++++++++-----------------
>  1 file changed, 13 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
> index 893edbb..ebb74de 100644
> --- a/drivers/net/can/m_can/m_can.c
> +++ b/drivers/net/can/m_can/m_can.c
> @@ -1207,25 +1207,20 @@ static bool m_can_niso_supported(const struct m_can_priv *priv)
>  	return !niso_timeout;
>  }
>  
> -static struct net_device *alloc_m_can_dev(struct platform_device *pdev,
> -					  void __iomem *addr, u32 tx_fifo_size)
> +static int setup_m_can_dev(struct platform_device *pdev, struct net_device *dev,
> +			   void __iomem *addr)

Renamed to m_can_dev_setup() for consistent namespace.

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

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

* Re: [PATCH v8 3/5] can: m_can: Move allocation of net device to probe
  2018-01-16 13:03   ` Marc Kleine-Budde
@ 2018-01-16 14:00     ` Marc Kleine-Budde
  0 siblings, 0 replies; 10+ messages in thread
From: Marc Kleine-Budde @ 2018-01-16 14:00 UTC (permalink / raw)
  To: Faiz Abbas, wg, robh+dt, mark.rutland
  Cc: linux-can, netdev, devicetree, linux-kernel, nsekhar, fcooper,
	robh, Wenyou.Yang, sergei.shtylyov, linux-omap, b29396


[-- Attachment #1.1: Type: text/plain, Size: 1035 bytes --]

On 01/16/2018 02:03 PM, Marc Kleine-Budde wrote:
>> diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
>> index 893edbb..ebb74de 100644
>> --- a/drivers/net/can/m_can/m_can.c
>> +++ b/drivers/net/can/m_can/m_can.c
>> @@ -1207,25 +1207,20 @@ static bool m_can_niso_supported(const struct m_can_priv *priv)
>>  	return !niso_timeout;
>>  }
>>  
>> -static struct net_device *alloc_m_can_dev(struct platform_device *pdev,
>> -					  void __iomem *addr, u32 tx_fifo_size)
>> +static int setup_m_can_dev(struct platform_device *pdev, struct net_device *dev,
>> +			   void __iomem *addr)
> 
> Renamed to m_can_dev_setup() for consistent namespace.

And removed free_m_can_dev(), by calling free_candev() directly.

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

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

* Re: [PATCH v8 0/5] Add MCAN Support for Dra76 platform
  2018-01-16 11:37 [PATCH v8 0/5] Add MCAN Support for Dra76 platform Faiz Abbas
                   ` (4 preceding siblings ...)
  2018-01-16 11:37 ` [PATCH v8 5/5] can: m_can: Support higher speed CAN-FD bitrates Faiz Abbas
@ 2018-01-16 14:12 ` Marc Kleine-Budde
  5 siblings, 0 replies; 10+ messages in thread
From: Marc Kleine-Budde @ 2018-01-16 14:12 UTC (permalink / raw)
  To: Faiz Abbas, wg, robh+dt, mark.rutland
  Cc: linux-can, netdev, devicetree, linux-kernel, nsekhar, fcooper,
	robh, Wenyou.Yang, sergei.shtylyov, linux-omap, b29396


[-- Attachment #1.1: Type: text/plain, Size: 655 bytes --]

On 01/16/2018 12:37 PM, Faiz Abbas wrote:
> This patch series adds support for M_CAN on the TI Dra76
> platform. Device tree patches will be sent separately.
> A bunch of patches were sent before by
> Franklin Cooper <fcooper@ti.com>. I have clubbed the
> series together and rebased to the latest kernel.

Added all remaining patches to linux-can-next/testing.

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

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

end of thread, other threads:[~2018-01-16 14:13 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-01-16 11:37 [PATCH v8 0/5] Add MCAN Support for Dra76 platform Faiz Abbas
2018-01-16 11:37 ` [PATCH v8 1/5] dt-bindings: can: m_can: Document new can transceiver binding Faiz Abbas
2018-01-16 11:37 ` [PATCH v8 2/5] dt-bindings: can: can-transceiver: Document new binding Faiz Abbas
2018-01-16 11:37 ` [PATCH v8 3/5] can: m_can: Move allocation of net device to probe Faiz Abbas
2018-01-16 13:03   ` Marc Kleine-Budde
2018-01-16 14:00     ` Marc Kleine-Budde
2018-01-16 11:37 ` [PATCH v8 4/5] can: m_can: Add PM Support Faiz Abbas
2018-01-16 12:57   ` Marc Kleine-Budde
2018-01-16 11:37 ` [PATCH v8 5/5] can: m_can: Support higher speed CAN-FD bitrates Faiz Abbas
2018-01-16 14:12 ` [PATCH v8 0/5] Add MCAN Support for Dra76 platform Marc Kleine-Budde

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