linux-can.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC]: tcan4x5x: rework regmap support
@ 2020-12-15 23:17 Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 01/16] can: tcan4x5x: replace DEVICE_NAME by KBUILD_MODNAME Marc Kleine-Budde
                   ` (17 more replies)
  0 siblings, 18 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can; +Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer

Hello,

this series first cleans up the the SPI regmap and then fixes several problem:
- tcan4x5x_regmap_gather_write(), tcan4x5x_regmap_read():
  Do not place variable "addr" on stack and use it as buffer for SPI
  transfer. Buffers for SPI transfers must be allocated from DMA save
  memory.
- tcan4x5x_regmap_gather_write(), tcan4x5x_regmap_read():
  Halfe number of SPI transfers by using a single buffer + memcpy().
  This improves the performance, especially on SPI controllers, which
  use interrupt based transfers.
- Use "8" bits per word, not "32". This makes it possible to use this
  driver on SoCs like the Raspberry Pi, which SPI host controller
  drivers only support 8 bits per word.

With this series, the driver is able to detect a tcan4x5x on a Raspberry Pi.

regards,
Marc




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

* [can-next-rfc 01/16] can: tcan4x5x: replace DEVICE_NAME by KBUILD_MODNAME
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 02/16] can: tcan4x5x: beautify indention of tcan4x5x_of_match and tcan4x5x_id_table Marc Kleine-Budde
                   ` (16 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

This patch replaces the DEVICE_NAME macro by KBUILD_MODNAME and removed the
superfluous DEVICE_NAME.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/tcan4x5x.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c
index 24c737c4fc44..1b5f706674af 100644
--- a/drivers/net/can/m_can/tcan4x5x.c
+++ b/drivers/net/can/m_can/tcan4x5x.c
@@ -10,7 +10,6 @@
 
 #include "m_can.h"
 
-#define DEVICE_NAME "tcan4x5x"
 #define TCAN4X5X_EXT_CLK_DEF 40000000
 
 #define TCAN4X5X_DEV_ID0 0x00
@@ -132,7 +131,7 @@ static inline struct tcan4x5x_priv *cdev_to_priv(struct m_can_classdev *cdev)
 }
 
 static struct can_bittiming_const tcan4x5x_bittiming_const = {
-	.name = DEVICE_NAME,
+	.name = KBUILD_MODNAME,
 	.tseg1_min = 2,
 	.tseg1_max = 31,
 	.tseg2_min = 2,
@@ -144,7 +143,7 @@ static struct can_bittiming_const tcan4x5x_bittiming_const = {
 };
 
 static struct can_bittiming_const tcan4x5x_data_bittiming_const = {
-	.name = DEVICE_NAME,
+	.name = KBUILD_MODNAME,
 	.tseg1_min = 1,
 	.tseg1_max = 32,
 	.tseg2_min = 1,
@@ -544,7 +543,7 @@ MODULE_DEVICE_TABLE(spi, tcan4x5x_id_table);
 
 static struct spi_driver tcan4x5x_can_driver = {
 	.driver = {
-		.name = DEVICE_NAME,
+		.name = KBUILD_MODNAME,
 		.of_match_table = tcan4x5x_of_match,
 		.pm = NULL,
 	},

base-commit: efd5a1584537698220578227e6467638307c2a0b
-- 
2.29.2



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

* [can-next-rfc 02/16] can: tcan4x5x: beautify indention of tcan4x5x_of_match and tcan4x5x_id_table
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 01/16] can: tcan4x5x: replace DEVICE_NAME by KBUILD_MODNAME Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 03/16] can: tcan4x5x: rename tcan4x5x.c -> tcan4x5x-core.c Marc Kleine-Budde
                   ` (15 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

This patch beautifies the indention of the tcan4x5x_of_match and
tcan4x5x_id_table.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/tcan4x5x.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c
index 1b5f706674af..1b47c9d32c30 100644
--- a/drivers/net/can/m_can/tcan4x5x.c
+++ b/drivers/net/can/m_can/tcan4x5x.c
@@ -527,17 +527,20 @@ static int tcan4x5x_can_remove(struct spi_device *spi)
 }
 
 static const struct of_device_id tcan4x5x_of_match[] = {
-	{ .compatible = "ti,tcan4x5x", },
-	{ }
+	{
+		.compatible = "ti,tcan4x5x",
+	}, {
+		/* sentinel */
+	},
 };
 MODULE_DEVICE_TABLE(of, tcan4x5x_of_match);
 
 static const struct spi_device_id tcan4x5x_id_table[] = {
 	{
-		.name		= "tcan4x5x",
-		.driver_data	= 0,
+		.name = "tcan4x5x",
+	}, {
+		/* sentinel */
 	},
-	{ }
 };
 MODULE_DEVICE_TABLE(spi, tcan4x5x_id_table);
 
-- 
2.29.2



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

* [can-next-rfc 03/16] can: tcan4x5x: rename tcan4x5x.c -> tcan4x5x-core.c
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 01/16] can: tcan4x5x: replace DEVICE_NAME by KBUILD_MODNAME Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 02/16] can: tcan4x5x: beautify indention of tcan4x5x_of_match and tcan4x5x_id_table Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 04/16] can: tcan4x5x: move regmap code into seperate file Marc Kleine-Budde
                   ` (14 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

This is a preparation patch to move the regmap related code into a seperate
file. This patch removes the tcan4x5x.c to tcan4x5x-core.c.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/Makefile                        | 3 +++
 drivers/net/can/m_can/{tcan4x5x.c => tcan4x5x-core.c} | 0
 2 files changed, 3 insertions(+)
 rename drivers/net/can/m_can/{tcan4x5x.c => tcan4x5x-core.c} (100%)

diff --git a/drivers/net/can/m_can/Makefile b/drivers/net/can/m_can/Makefile
index ef7963ff2006..91f9190dc007 100644
--- a/drivers/net/can/m_can/Makefile
+++ b/drivers/net/can/m_can/Makefile
@@ -7,3 +7,6 @@ obj-$(CONFIG_CAN_M_CAN) += m_can.o
 obj-$(CONFIG_CAN_M_CAN_PCI) += m_can_pci.o
 obj-$(CONFIG_CAN_M_CAN_PLATFORM) += m_can_platform.o
 obj-$(CONFIG_CAN_M_CAN_TCAN4X5X) += tcan4x5x.o
+
+tcan4x5x-objs :=
+tcan4x5x-objs += tcan4x5x-core.o
diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x-core.c
similarity index 100%
rename from drivers/net/can/m_can/tcan4x5x.c
rename to drivers/net/can/m_can/tcan4x5x-core.c
-- 
2.29.2



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

* [can-next-rfc 04/16] can: tcan4x5x: move regmap code into seperate file
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
                   ` (2 preceding siblings ...)
  2020-12-15 23:17 ` [can-next-rfc 03/16] can: tcan4x5x: rename tcan4x5x.c -> tcan4x5x-core.c Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 05/16] can: tcan4x5x: mark struct regmap_bus tcan4x5x_bus as constant Marc Kleine-Budde
                   ` (13 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

This patch moves the regmap code into a seperate file.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/Makefile          |   1 +
 drivers/net/can/m_can/tcan4x5x-core.c   | 104 +-----------------------
 drivers/net/can/m_can/tcan4x5x-regmap.c |  95 ++++++++++++++++++++++
 drivers/net/can/m_can/tcan4x5x.h        |  34 ++++++++
 4 files changed, 133 insertions(+), 101 deletions(-)
 create mode 100644 drivers/net/can/m_can/tcan4x5x-regmap.c
 create mode 100644 drivers/net/can/m_can/tcan4x5x.h

diff --git a/drivers/net/can/m_can/Makefile b/drivers/net/can/m_can/Makefile
index 91f9190dc007..d717bbc9e033 100644
--- a/drivers/net/can/m_can/Makefile
+++ b/drivers/net/can/m_can/Makefile
@@ -10,3 +10,4 @@ obj-$(CONFIG_CAN_M_CAN_TCAN4X5X) += tcan4x5x.o
 
 tcan4x5x-objs :=
 tcan4x5x-objs += tcan4x5x-core.o
+tcan4x5x-objs += tcan4x5x-regmap.o
diff --git a/drivers/net/can/m_can/tcan4x5x-core.c b/drivers/net/can/m_can/tcan4x5x-core.c
index 1b47c9d32c30..739b8f89a335 100644
--- a/drivers/net/can/m_can/tcan4x5x-core.c
+++ b/drivers/net/can/m_can/tcan4x5x-core.c
@@ -2,13 +2,7 @@
 // SPI to CAN driver for the Texas Instruments TCAN4x5x
 // Copyright (C) 2018-19 Texas Instruments Incorporated - http://www.ti.com/
 
-#include <linux/regmap.h>
-#include <linux/spi/spi.h>
-
-#include <linux/regulator/consumer.h>
-#include <linux/gpio/consumer.h>
-
-#include "m_can.h"
+#include "tcan4x5x.h"
 
 #define TCAN4X5X_EXT_CLK_DEF 40000000
 
@@ -87,14 +81,10 @@
 
 #define TCAN4X5X_MRAM_START 0x8000
 #define TCAN4X5X_MCAN_OFFSET 0x1000
-#define TCAN4X5X_MAX_REGISTER 0x8fff
 
 #define TCAN4X5X_CLEAR_ALL_INT 0xffffffff
 #define TCAN4X5X_SET_ALL_INT 0xffffffff
 
-#define TCAN4X5X_WRITE_CMD (0x61 << 24)
-#define TCAN4X5X_READ_CMD (0x41 << 24)
-
 #define TCAN4X5X_MODE_SEL_MASK (BIT(7) | BIT(6))
 #define TCAN4X5X_MODE_SLEEP 0x00
 #define TCAN4X5X_MODE_STANDBY BIT(6)
@@ -112,18 +102,6 @@
 #define TCAN4X5X_WD_3_S_TIMER BIT(29)
 #define TCAN4X5X_WD_6_S_TIMER (BIT(28) | BIT(29))
 
-struct tcan4x5x_priv {
-	struct m_can_classdev cdev;
-
-	struct regmap *regmap;
-	struct spi_device *spi;
-
-	struct gpio_desc *reset_gpio;
-	struct gpio_desc *device_wake_gpio;
-	struct gpio_desc *device_state_gpio;
-	struct regulator *power;
-};
-
 static inline struct tcan4x5x_priv *cdev_to_priv(struct m_can_classdev *cdev)
 {
 	return container_of(cdev, struct tcan4x5x_priv, cdev);
@@ -190,72 +168,6 @@ static int tcan4x5x_reset(struct tcan4x5x_priv *priv)
 	return ret;
 }
 
-static int regmap_spi_gather_write(void *context, const void *reg,
-				   size_t reg_len, const void *val,
-				   size_t val_len)
-{
-	struct device *dev = context;
-	struct spi_device *spi = to_spi_device(dev);
-	struct spi_message m;
-	u32 addr;
-	struct spi_transfer t[2] = {
-		{ .tx_buf = &addr, .len = reg_len, .cs_change = 0,},
-		{ .tx_buf = val, .len = val_len, },
-	};
-
-	addr = TCAN4X5X_WRITE_CMD | (*((u16 *)reg) << 8) | val_len >> 2;
-
-	spi_message_init(&m);
-	spi_message_add_tail(&t[0], &m);
-	spi_message_add_tail(&t[1], &m);
-
-	return spi_sync(spi, &m);
-}
-
-static int tcan4x5x_regmap_write(void *context, const void *data, size_t count)
-{
-	u16 *reg = (u16 *)(data);
-	const u32 *val = data + 4;
-
-	return regmap_spi_gather_write(context, reg, 4, val, count - 4);
-}
-
-static int regmap_spi_async_write(void *context,
-				  const void *reg, size_t reg_len,
-				  const void *val, size_t val_len,
-				  struct regmap_async *a)
-{
-	return -ENOTSUPP;
-}
-
-static struct regmap_async *regmap_spi_async_alloc(void)
-{
-	return NULL;
-}
-
-static int tcan4x5x_regmap_read(void *context,
-				const void *reg, size_t reg_size,
-				void *val, size_t val_size)
-{
-	struct device *dev = context;
-	struct spi_device *spi = to_spi_device(dev);
-
-	u32 addr = TCAN4X5X_READ_CMD | (*((u16 *)reg) << 8) | val_size >> 2;
-
-	return spi_write_then_read(spi, &addr, reg_size, (u32 *)val, val_size);
-}
-
-static struct regmap_bus tcan4x5x_bus = {
-	.write = tcan4x5x_regmap_write,
-	.gather_write = regmap_spi_gather_write,
-	.async_write = regmap_spi_async_write,
-	.async_alloc = regmap_spi_async_alloc,
-	.read = tcan4x5x_regmap_read,
-	.read_flag_mask = 0x00,
-	.reg_format_endian_default = REGMAP_ENDIAN_NATIVE,
-	.val_format_endian_default = REGMAP_ENDIAN_NATIVE,
-};
-
 static u32 tcan4x5x_read_reg(struct m_can_classdev *cdev, int reg)
 {
 	struct tcan4x5x_priv *priv = cdev_to_priv(cdev);
@@ -410,13 +322,6 @@ static int tcan4x5x_get_gpios(struct m_can_classdev *cdev)
 	return 0;
 }
 
-static const struct regmap_config tcan4x5x_regmap = {
-	.reg_bits = 32,
-	.val_bits = 32,
-	.cache_type = REGCACHE_NONE,
-	.max_register = TCAN4X5X_MAX_REGISTER,
-};
-
 static struct m_can_ops tcan4x5x_ops = {
 	.init = tcan4x5x_init,
 	.read_reg = tcan4x5x_read_reg,
@@ -480,12 +385,9 @@ static int tcan4x5x_can_probe(struct spi_device *spi)
 	if (ret)
 		goto out_m_can_class_free_dev;
 
-	priv->regmap = devm_regmap_init(&spi->dev, &tcan4x5x_bus,
-					&spi->dev, &tcan4x5x_regmap);
-	if (IS_ERR(priv->regmap)) {
-		ret = PTR_ERR(priv->regmap);
+	ret = tcan4x5x_regmap_init(priv);
+	if (ret)
 		goto out_m_can_class_free_dev;
-	}
 
 	ret = tcan4x5x_power_enable(priv->power, 1);
 	if (ret)
diff --git a/drivers/net/can/m_can/tcan4x5x-regmap.c b/drivers/net/can/m_can/tcan4x5x-regmap.c
new file mode 100644
index 000000000000..f130c3586543
--- /dev/null
+++ b/drivers/net/can/m_can/tcan4x5x-regmap.c
@@ -0,0 +1,95 @@
+// SPDX-License-Identifier: GPL-2.0
+//
+// tcan4x5x - Texas Instruments TCAN4x5x Family CAN controller driver
+//
+// Copyright (c) 2020 Pengutronix,
+//                    Marc Kleine-Budde <kernel@pengutronix.de>
+// Copyright (c) 2018-2019 Texas Instruments Incorporated
+//                    http://www.ti.com/
+
+#include "tcan4x5x.h"
+
+#define TCAN4X5X_WRITE_CMD (0x61 << 24)
+#define TCAN4X5X_READ_CMD (0x41 << 24)
+
+#define TCAN4X5X_MAX_REGISTER 0x8fff
+
+static int regmap_spi_gather_write(void *context, const void *reg,
+				   size_t reg_len, const void *val,
+				   size_t val_len)
+{
+	struct device *dev = context;
+	struct spi_device *spi = to_spi_device(dev);
+	struct spi_message m;
+	u32 addr;
+	struct spi_transfer t[2] = {
+		{ .tx_buf = &addr, .len = reg_len, .cs_change = 0,},
+		{ .tx_buf = val, .len = val_len, },
+	};
+
+	addr = TCAN4X5X_WRITE_CMD | (*((u16 *)reg) << 8) | val_len >> 2;
+
+	spi_message_init(&m);
+	spi_message_add_tail(&t[0], &m);
+	spi_message_add_tail(&t[1], &m);
+
+	return spi_sync(spi, &m);
+}
+
+static int tcan4x5x_regmap_write(void *context, const void *data, size_t count)
+{
+	u16 *reg = (u16 *)(data);
+	const u32 *val = data + 4;
+
+	return regmap_spi_gather_write(context, reg, 4, val, count - 4);
+}
+
+static int regmap_spi_async_write(void *context,
+				  const void *reg, size_t reg_len,
+				  const void *val, size_t val_len,
+				  struct regmap_async *a)
+{
+	return -ENOTSUPP;
+}
+
+static struct regmap_async *regmap_spi_async_alloc(void)
+{
+	return NULL;
+}
+
+static int tcan4x5x_regmap_read(void *context,
+				const void *reg, size_t reg_size,
+				void *val, size_t val_size)
+{
+	struct device *dev = context;
+	struct spi_device *spi = to_spi_device(dev);
+
+	u32 addr = TCAN4X5X_READ_CMD | (*((u16 *)reg) << 8) | val_size >> 2;
+
+	return spi_write_then_read(spi, &addr, reg_size, (u32 *)val, val_size);
+}
+
+static const struct regmap_config tcan4x5x_regmap = {
+	.reg_bits = 32,
+	.val_bits = 32,
+	.cache_type = REGCACHE_NONE,
+	.max_register = TCAN4X5X_MAX_REGISTER,
+};
+
+static struct regmap_bus tcan4x5x_bus = {
+	.write = tcan4x5x_regmap_write,
+	.gather_write = regmap_spi_gather_write,
+	.async_write = regmap_spi_async_write,
+	.async_alloc = regmap_spi_async_alloc,
+	.read = tcan4x5x_regmap_read,
+	.read_flag_mask = 0x00,
+	.reg_format_endian_default = REGMAP_ENDIAN_NATIVE,
+	.val_format_endian_default = REGMAP_ENDIAN_NATIVE,
+};
+
+int tcan4x5x_regmap_init(struct tcan4x5x_priv *priv)
+{
+	priv->regmap = devm_regmap_init(&priv->spi->dev, &tcan4x5x_bus,
+					&priv->spi->dev, &tcan4x5x_regmap);
+	return PTR_ERR_OR_ZERO(priv->regmap);
+}
diff --git a/drivers/net/can/m_can/tcan4x5x.h b/drivers/net/can/m_can/tcan4x5x.h
new file mode 100644
index 000000000000..e5bdd91b8005
--- /dev/null
+++ b/drivers/net/can/m_can/tcan4x5x.h
@@ -0,0 +1,34 @@
+/* SPDX-License-Identifier: GPL-2.0
+ *
+ * tcan4x5x - Texas Instruments TCAN4x5x Family CAN controller driver
+ *
+ * Copyright (c) 2020 Pengutronix,
+ *                    Marc Kleine-Budde <kernel@pengutronix.de>
+ */
+
+#ifndef _TCAN4X5X_H
+#define _TCAN4X5X_H
+
+#include <linux/gpio/consumer.h>
+#include <linux/regmap.h>
+#include <linux/regmap.h>
+#include <linux/regulator/consumer.h>
+#include <linux/spi/spi.h>
+
+#include "m_can.h"
+
+struct tcan4x5x_priv {
+	struct m_can_classdev cdev;
+
+	struct regmap *regmap;
+	struct spi_device *spi;
+
+	struct gpio_desc *reset_gpio;
+	struct gpio_desc *device_wake_gpio;
+	struct gpio_desc *device_state_gpio;
+	struct regulator *power;
+};
+
+int tcan4x5x_regmap_init(struct tcan4x5x_priv *priv);
+
+#endif
-- 
2.29.2



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

* [can-next-rfc 05/16] can: tcan4x5x: mark struct regmap_bus tcan4x5x_bus as constant
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
                   ` (3 preceding siblings ...)
  2020-12-15 23:17 ` [can-next-rfc 04/16] can: tcan4x5x: move regmap code into seperate file Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 06/16] can: tcan4x5x: tcan4x5x_bus: remove not needed read_flag_mask Marc Kleine-Budde
                   ` (12 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

This patch marks the struct regmap_bus tcan4x5x_bus as constant.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/tcan4x5x-regmap.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/can/m_can/tcan4x5x-regmap.c b/drivers/net/can/m_can/tcan4x5x-regmap.c
index f130c3586543..1d139554fc16 100644
--- a/drivers/net/can/m_can/tcan4x5x-regmap.c
+++ b/drivers/net/can/m_can/tcan4x5x-regmap.c
@@ -76,7 +76,7 @@ static const struct regmap_config tcan4x5x_regmap = {
 	.max_register = TCAN4X5X_MAX_REGISTER,
 };
 
-static struct regmap_bus tcan4x5x_bus = {
+static const struct regmap_bus tcan4x5x_bus = {
 	.write = tcan4x5x_regmap_write,
 	.gather_write = regmap_spi_gather_write,
 	.async_write = regmap_spi_async_write,
-- 
2.29.2



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

* [can-next-rfc 06/16] can: tcan4x5x: tcan4x5x_bus: remove not needed read_flag_mask
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
                   ` (4 preceding siblings ...)
  2020-12-15 23:17 ` [can-next-rfc 05/16] can: tcan4x5x: mark struct regmap_bus tcan4x5x_bus as constant Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 07/16] can: tcan4x5x: remove regmap async support Marc Kleine-Budde
                   ` (11 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

With C99 initializers, all non mentioned members are initialzied to 0, so
remove not needed initialization of read_flag_mask.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/tcan4x5x-regmap.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/net/can/m_can/tcan4x5x-regmap.c b/drivers/net/can/m_can/tcan4x5x-regmap.c
index 1d139554fc16..20bf9a57c9b1 100644
--- a/drivers/net/can/m_can/tcan4x5x-regmap.c
+++ b/drivers/net/can/m_can/tcan4x5x-regmap.c
@@ -82,7 +82,6 @@ static const struct regmap_bus tcan4x5x_bus = {
 	.async_write = regmap_spi_async_write,
 	.async_alloc = regmap_spi_async_alloc,
 	.read = tcan4x5x_regmap_read,
-	.read_flag_mask = 0x00,
 	.reg_format_endian_default = REGMAP_ENDIAN_NATIVE,
 	.val_format_endian_default = REGMAP_ENDIAN_NATIVE,
 };
-- 
2.29.2



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

* [can-next-rfc 07/16] can: tcan4x5x: remove regmap async support
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
                   ` (5 preceding siblings ...)
  2020-12-15 23:17 ` [can-next-rfc 06/16] can: tcan4x5x: tcan4x5x_bus: remove not needed read_flag_mask Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 08/16] can: tcan4x5x: rename regmap_spi_gather_write() -> tcan4x5x_regmap_gather_write() Marc Kleine-Budde
                   ` (10 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

The driver doesn't use regmap async support, so remove the stubs.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/tcan4x5x-regmap.c | 15 ---------------
 1 file changed, 15 deletions(-)

diff --git a/drivers/net/can/m_can/tcan4x5x-regmap.c b/drivers/net/can/m_can/tcan4x5x-regmap.c
index 20bf9a57c9b1..8905fc36b00a 100644
--- a/drivers/net/can/m_can/tcan4x5x-regmap.c
+++ b/drivers/net/can/m_can/tcan4x5x-regmap.c
@@ -44,19 +44,6 @@ static int tcan4x5x_regmap_write(void *context, const void *data, size_t count)
 	return regmap_spi_gather_write(context, reg, 4, val, count - 4);
 }
 
-static int regmap_spi_async_write(void *context,
-				  const void *reg, size_t reg_len,
-				  const void *val, size_t val_len,
-				  struct regmap_async *a)
-{
-	return -ENOTSUPP;
-}
-
-static struct regmap_async *regmap_spi_async_alloc(void)
-{
-	return NULL;
-}
-
 static int tcan4x5x_regmap_read(void *context,
 				const void *reg, size_t reg_size,
 				void *val, size_t val_size)
@@ -79,8 +66,6 @@ static const struct regmap_config tcan4x5x_regmap = {
 static const struct regmap_bus tcan4x5x_bus = {
 	.write = tcan4x5x_regmap_write,
 	.gather_write = regmap_spi_gather_write,
-	.async_write = regmap_spi_async_write,
-	.async_alloc = regmap_spi_async_alloc,
 	.read = tcan4x5x_regmap_read,
 	.reg_format_endian_default = REGMAP_ENDIAN_NATIVE,
 	.val_format_endian_default = REGMAP_ENDIAN_NATIVE,
-- 
2.29.2



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

* [can-next-rfc 08/16] can: tcan4x5x: rename regmap_spi_gather_write() -> tcan4x5x_regmap_gather_write()
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
                   ` (6 preceding siblings ...)
  2020-12-15 23:17 ` [can-next-rfc 07/16] can: tcan4x5x: remove regmap async support Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 09/16] can: tcan4x5x: tcan4x5x_regmap_write(): remove not needed casts and replace 4 by sizeof Marc Kleine-Budde
                   ` (9 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

This patch renames the regmap_spi_gather_write() function to
tcan4x5x_regmap_gather_write(). Now it has a "tcan4x5x_" prefix as all other
functions in this driver.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/tcan4x5x-regmap.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/net/can/m_can/tcan4x5x-regmap.c b/drivers/net/can/m_can/tcan4x5x-regmap.c
index 8905fc36b00a..8f718f4395c3 100644
--- a/drivers/net/can/m_can/tcan4x5x-regmap.c
+++ b/drivers/net/can/m_can/tcan4x5x-regmap.c
@@ -14,9 +14,9 @@
 
 #define TCAN4X5X_MAX_REGISTER 0x8fff
 
-static int regmap_spi_gather_write(void *context, const void *reg,
-				   size_t reg_len, const void *val,
-				   size_t val_len)
+static int tcan4x5x_regmap_gather_write(void *context, const void *reg,
+					size_t reg_len, const void *val,
+					size_t val_len)
 {
 	struct device *dev = context;
 	struct spi_device *spi = to_spi_device(dev);
@@ -41,7 +41,7 @@ static int tcan4x5x_regmap_write(void *context, const void *data, size_t count)
 	u16 *reg = (u16 *)(data);
 	const u32 *val = data + 4;
 
-	return regmap_spi_gather_write(context, reg, 4, val, count - 4);
+	return tcan4x5x_regmap_gather_write(context, reg, 4, val, count - 4);
 }
 
 static int tcan4x5x_regmap_read(void *context,
@@ -65,7 +65,7 @@ static const struct regmap_config tcan4x5x_regmap = {
 
 static const struct regmap_bus tcan4x5x_bus = {
 	.write = tcan4x5x_regmap_write,
-	.gather_write = regmap_spi_gather_write,
+	.gather_write = tcan4x5x_regmap_gather_write,
 	.read = tcan4x5x_regmap_read,
 	.reg_format_endian_default = REGMAP_ENDIAN_NATIVE,
 	.val_format_endian_default = REGMAP_ENDIAN_NATIVE,
-- 
2.29.2



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

* [can-next-rfc 09/16] can: tcan4x5x: tcan4x5x_regmap_write(): remove not needed casts and replace 4 by sizeof
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
                   ` (7 preceding siblings ...)
  2020-12-15 23:17 ` [can-next-rfc 08/16] can: tcan4x5x: rename regmap_spi_gather_write() -> tcan4x5x_regmap_gather_write() Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 10/16] can: tcan4x5x: tcan4x5x_regmap_init(): use spi as context pointer Marc Kleine-Budde
                   ` (8 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

This patch simplifies the tcan4x5x_regmap_write(0 function by removing not
needed casts and replaces hardcoded "4" by appropriate sizeof()s.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/tcan4x5x-regmap.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/net/can/m_can/tcan4x5x-regmap.c b/drivers/net/can/m_can/tcan4x5x-regmap.c
index 8f718f4395c3..6345bcb7704f 100644
--- a/drivers/net/can/m_can/tcan4x5x-regmap.c
+++ b/drivers/net/can/m_can/tcan4x5x-regmap.c
@@ -38,10 +38,9 @@ static int tcan4x5x_regmap_gather_write(void *context, const void *reg,
 
 static int tcan4x5x_regmap_write(void *context, const void *data, size_t count)
 {
-	u16 *reg = (u16 *)(data);
-	const u32 *val = data + 4;
-
-	return tcan4x5x_regmap_gather_write(context, reg, 4, val, count - 4);
+	return tcan4x5x_regmap_gather_write(context, data, sizeof(u32),
+					    data + sizeof(u32),
+					    count - sizeof(u32));
 }
 
 static int tcan4x5x_regmap_read(void *context,
-- 
2.29.2



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

* [can-next-rfc 10/16] can: tcan4x5x: tcan4x5x_regmap_init(): use spi as context pointer
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
                   ` (8 preceding siblings ...)
  2020-12-15 23:17 ` [can-next-rfc 09/16] can: tcan4x5x: tcan4x5x_regmap_write(): remove not needed casts and replace 4 by sizeof Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 11/16] can: tcan4x5x: fix max register value Marc Kleine-Budde
                   ` (7 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

This patch replaces the context pointer of the regmap callback functions by a
pointer to the spi_device. This saves one level of indirection in the
callbacks.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/tcan4x5x-regmap.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/net/can/m_can/tcan4x5x-regmap.c b/drivers/net/can/m_can/tcan4x5x-regmap.c
index 6345bcb7704f..4d43c145fdec 100644
--- a/drivers/net/can/m_can/tcan4x5x-regmap.c
+++ b/drivers/net/can/m_can/tcan4x5x-regmap.c
@@ -18,8 +18,7 @@ static int tcan4x5x_regmap_gather_write(void *context, const void *reg,
 					size_t reg_len, const void *val,
 					size_t val_len)
 {
-	struct device *dev = context;
-	struct spi_device *spi = to_spi_device(dev);
+	struct spi_device *spi = context;
 	struct spi_message m;
 	u32 addr;
 	struct spi_transfer t[2] = {
@@ -47,8 +46,7 @@ static int tcan4x5x_regmap_read(void *context,
 				const void *reg, size_t reg_size,
 				void *val, size_t val_size)
 {
-	struct device *dev = context;
-	struct spi_device *spi = to_spi_device(dev);
+	struct spi_device *spi = context;
 
 	u32 addr = TCAN4X5X_READ_CMD | (*((u16 *)reg) << 8) | val_size >> 2;
 
@@ -73,6 +71,6 @@ static const struct regmap_bus tcan4x5x_bus = {
 int tcan4x5x_regmap_init(struct tcan4x5x_priv *priv)
 {
 	priv->regmap = devm_regmap_init(&priv->spi->dev, &tcan4x5x_bus,
-					&priv->spi->dev, &tcan4x5x_regmap);
+					priv->spi, &tcan4x5x_regmap);
 	return PTR_ERR_OR_ZERO(priv->regmap);
 }
-- 
2.29.2



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

* [can-next-rfc 11/16] can: tcan4x5x: fix max register value
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
                   ` (9 preceding siblings ...)
  2020-12-15 23:17 ` [can-next-rfc 10/16] can: tcan4x5x: tcan4x5x_regmap_init(): use spi as context pointer Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 12/16] can: tcan4x5x: tcan4x5x_regmap: set reg_stride to 4 Marc Kleine-Budde
                   ` (6 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

This patch fixes the max register value for the regmap.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/tcan4x5x-regmap.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/can/m_can/tcan4x5x-regmap.c b/drivers/net/can/m_can/tcan4x5x-regmap.c
index 4d43c145fdec..73be4b661305 100644
--- a/drivers/net/can/m_can/tcan4x5x-regmap.c
+++ b/drivers/net/can/m_can/tcan4x5x-regmap.c
@@ -12,7 +12,7 @@
 #define TCAN4X5X_WRITE_CMD (0x61 << 24)
 #define TCAN4X5X_READ_CMD (0x41 << 24)
 
-#define TCAN4X5X_MAX_REGISTER 0x8fff
+#define TCAN4X5X_MAX_REGISTER 0x8ffc
 
 static int tcan4x5x_regmap_gather_write(void *context, const void *reg,
 					size_t reg_len, const void *val,
-- 
2.29.2



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

* [can-next-rfc 12/16] can: tcan4x5x: tcan4x5x_regmap: set reg_stride to 4
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
                   ` (10 preceding siblings ...)
  2020-12-15 23:17 ` [can-next-rfc 11/16] can: tcan4x5x: fix max register value Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 13/16] can: tcan4x5x: add max_raw_{read,write} of 256 Marc Kleine-Budde
                   ` (5 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

This patch sets the regmap stide to 4, as the chip only supports access on 32
bit alligned access.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/tcan4x5x-regmap.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/can/m_can/tcan4x5x-regmap.c b/drivers/net/can/m_can/tcan4x5x-regmap.c
index 73be4b661305..c6963437064c 100644
--- a/drivers/net/can/m_can/tcan4x5x-regmap.c
+++ b/drivers/net/can/m_can/tcan4x5x-regmap.c
@@ -55,6 +55,7 @@ static int tcan4x5x_regmap_read(void *context,
 
 static const struct regmap_config tcan4x5x_regmap = {
 	.reg_bits = 32,
+	.reg_stride = 4,
 	.val_bits = 32,
 	.cache_type = REGCACHE_NONE,
 	.max_register = TCAN4X5X_MAX_REGISTER,
-- 
2.29.2



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

* [can-next-rfc 13/16] can: tcan4x5x: add max_raw_{read,write} of 256
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
                   ` (11 preceding siblings ...)
  2020-12-15 23:17 ` [can-next-rfc 12/16] can: tcan4x5x: tcan4x5x_regmap: set reg_stride to 4 Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 14/16] can: tcan4x5x: add {wr,rd}_table Marc Kleine-Budde
                   ` (4 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

The tcan4x5x chip support bulk read/write, but as the length field is only 8
bits wide, the maximum is 256. A length of 0 is treated as 256.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/tcan4x5x-regmap.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/can/m_can/tcan4x5x-regmap.c b/drivers/net/can/m_can/tcan4x5x-regmap.c
index c6963437064c..f113881fb012 100644
--- a/drivers/net/can/m_can/tcan4x5x-regmap.c
+++ b/drivers/net/can/m_can/tcan4x5x-regmap.c
@@ -67,6 +67,8 @@ static const struct regmap_bus tcan4x5x_bus = {
 	.read = tcan4x5x_regmap_read,
 	.reg_format_endian_default = REGMAP_ENDIAN_NATIVE,
 	.val_format_endian_default = REGMAP_ENDIAN_NATIVE,
+	.max_raw_read = 256,
+	.max_raw_write = 256,
 };
 
 int tcan4x5x_regmap_init(struct tcan4x5x_priv *priv)
-- 
2.29.2



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

* [can-next-rfc 14/16] can: tcan4x5x: add {wr,rd}_table
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
                   ` (12 preceding siblings ...)
  2020-12-15 23:17 ` [can-next-rfc 13/16] can: tcan4x5x: add max_raw_{read,write} of 256 Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 15/16] can: tcan4x5x: rework SPI access Marc Kleine-Budde
                   ` (3 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

The memory space of the chip is not fully populated, so add a regmap range
table to document this.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/tcan4x5x-regmap.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/drivers/net/can/m_can/tcan4x5x-regmap.c b/drivers/net/can/m_can/tcan4x5x-regmap.c
index f113881fb012..5ea162578619 100644
--- a/drivers/net/can/m_can/tcan4x5x-regmap.c
+++ b/drivers/net/can/m_can/tcan4x5x-regmap.c
@@ -53,10 +53,24 @@ static int tcan4x5x_regmap_read(void *context,
 	return spi_write_then_read(spi, &addr, reg_size, (u32 *)val, val_size);
 }
 
+static const struct regmap_range tcan4x5x_reg_table_yes_range[] = {
+	regmap_reg_range(0x0000, 0x002c),	/* Device ID and SPI Registers */
+	regmap_reg_range(0x0800, 0x083c),	/* Device configuration registers and Interrupt Flags*/
+	regmap_reg_range(0x1000, 0x10fc),	/* M_CAN */
+	regmap_reg_range(0x8000, 0x87fc),	/* MRAM */
+};
+
+static const struct regmap_access_table tcan4x5x_reg_table = {
+	.yes_ranges = tcan4x5x_reg_table_yes_range,
+	.n_yes_ranges = ARRAY_SIZE(tcan4x5x_reg_table_yes_range),
+};
+
 static const struct regmap_config tcan4x5x_regmap = {
 	.reg_bits = 32,
 	.reg_stride = 4,
 	.val_bits = 32,
+	.wr_table = &tcan4x5x_reg_table,
+	.rd_table = &tcan4x5x_reg_table,
 	.cache_type = REGCACHE_NONE,
 	.max_register = TCAN4X5X_MAX_REGISTER,
 };
-- 
2.29.2



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

* [can-next-rfc 15/16] can: tcan4x5x: rework SPI access
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
                   ` (13 preceding siblings ...)
  2020-12-15 23:17 ` [can-next-rfc 14/16] can: tcan4x5x: add {wr,rd}_table Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-15 23:17 ` [can-next-rfc 16/16] can: tcan4x5x: add support for half-duplex controllers Marc Kleine-Budde
                   ` (2 subsequent siblings)
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

This patch reworks the SPI access and fixes several probems:
- tcan4x5x_regmap_gather_write(), tcan4x5x_regmap_read():
  Do not place variable "addr" on stack and use it as buffer for SPI
  transfer. Buffers for SPI transfers must be allocated from DMA save
  memory.
- tcan4x5x_regmap_gather_write(), tcan4x5x_regmap_read():
  Halfe number of SPI transfers by using a single buffer + memcpy().
  This improves the performance, especially on SPI controllers, which
  use interrupt based transfers.
- Use "8" bits per word, not "32". This makes it possible to use this
  driver on SoCs like the Raspberry Pi, which SPI host controller
  drivers only support 8 bits per word.

Note: this breaks half duplex only controllers. Support for them will be
re-added in the next patch.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/tcan4x5x-core.c   |  2 +-
 drivers/net/can/m_can/tcan4x5x-regmap.c | 87 +++++++++++++++++--------
 drivers/net/can/m_can/tcan4x5x.h        | 23 +++++++
 3 files changed, 84 insertions(+), 28 deletions(-)

diff --git a/drivers/net/can/m_can/tcan4x5x-core.c b/drivers/net/can/m_can/tcan4x5x-core.c
index 739b8f89a335..d37843a74663 100644
--- a/drivers/net/can/m_can/tcan4x5x-core.c
+++ b/drivers/net/can/m_can/tcan4x5x-core.c
@@ -380,7 +380,7 @@ static int tcan4x5x_can_probe(struct spi_device *spi)
 	spi_set_drvdata(spi, priv);
 
 	/* Configure the SPI bus */
-	spi->bits_per_word = 32;
+	spi->bits_per_word = 8;
 	ret = spi_setup(spi);
 	if (ret)
 		goto out_m_can_class_free_dev;
diff --git a/drivers/net/can/m_can/tcan4x5x-regmap.c b/drivers/net/can/m_can/tcan4x5x-regmap.c
index 5ea162578619..660e9d87dffb 100644
--- a/drivers/net/can/m_can/tcan4x5x-regmap.c
+++ b/drivers/net/can/m_can/tcan4x5x-regmap.c
@@ -9,48 +9,76 @@
 
 #include "tcan4x5x.h"
 
-#define TCAN4X5X_WRITE_CMD (0x61 << 24)
-#define TCAN4X5X_READ_CMD (0x41 << 24)
+#define TCAN4X5X_SPI_INSTRUCTION_WRITE (0x61 << 24)
+#define TCAN4X5X_SPI_INSTRUCTION_READ (0x41 << 24)
 
 #define TCAN4X5X_MAX_REGISTER 0x8ffc
 
-static int tcan4x5x_regmap_gather_write(void *context, const void *reg,
-					size_t reg_len, const void *val,
-					size_t val_len)
+static int tcan4x5x_regmap_gather_write(void *context,
+					const void *reg, size_t reg_len,
+					const void *val, size_t val_len)
 {
 	struct spi_device *spi = context;
-	struct spi_message m;
-	u32 addr;
-	struct spi_transfer t[2] = {
-		{ .tx_buf = &addr, .len = reg_len, .cs_change = 0,},
-		{ .tx_buf = val, .len = val_len, },
+	struct tcan4x5x_priv *priv = spi_get_drvdata(spi);
+	struct tcan4x5x_map_buf *buf_tx = &priv->map_buf_tx;
+	struct spi_transfer xfer[] = {
+		{
+			.tx_buf = buf_tx,
+			.len = sizeof(buf_tx->cmd) + val_len,
+		},
 	};
 
-	addr = TCAN4X5X_WRITE_CMD | (*((u16 *)reg) << 8) | val_len >> 2;
+	memcpy(&buf_tx->cmd, reg, sizeof(buf_tx->cmd.cmd) +
+	       sizeof(buf_tx->cmd.addr));
+	tcan4x5x_spi_cmd_set_len(&buf_tx->cmd, val_len);
+	memcpy(buf_tx->data, val, val_len);
 
-	spi_message_init(&m);
-	spi_message_add_tail(&t[0], &m);
-	spi_message_add_tail(&t[1], &m);
-
-	return spi_sync(spi, &m);
+	return spi_sync_transfer(spi, xfer, ARRAY_SIZE(xfer));
 }
 
 static int tcan4x5x_regmap_write(void *context, const void *data, size_t count)
 {
-	return tcan4x5x_regmap_gather_write(context, data, sizeof(u32),
-					    data + sizeof(u32),
-					    count - sizeof(u32));
+	return tcan4x5x_regmap_gather_write(context, data, sizeof(__be32),
+					    data + sizeof(__be32),
+					    count - sizeof(__be32));
 }
 
 static int tcan4x5x_regmap_read(void *context,
-				const void *reg, size_t reg_size,
-				void *val, size_t val_size)
+				const void *reg_buf, size_t reg_len,
+				void *val_buf, size_t val_len)
 {
 	struct spi_device *spi = context;
+	struct tcan4x5x_priv *priv = spi_get_drvdata(spi);
+	struct tcan4x5x_map_buf *buf_rx = &priv->map_buf_rx;
+	struct tcan4x5x_map_buf *buf_tx = &priv->map_buf_tx;
+	struct spi_transfer xfer[] = {
+		{
+			.tx_buf = buf_tx,
+		}
+	};
+	struct spi_message msg;
+	int err;
+
+	spi_message_init(&msg);
+	spi_message_add_tail(&xfer[0], &msg);
+
+	memcpy(&buf_tx->cmd, reg_buf, sizeof(buf_tx->cmd.cmd) +
+	       sizeof(buf_tx->cmd.addr));
+	tcan4x5x_spi_cmd_set_len(&buf_tx->cmd, val_len);
+
+	xfer[0].rx_buf = buf_rx;
+	xfer[0].len = sizeof(buf_tx->cmd) + val_len;
 
-	u32 addr = TCAN4X5X_READ_CMD | (*((u16 *)reg) << 8) | val_size >> 2;
+	if (TCAN4X5X_SANITIZE_SPI)
+		memset(buf_tx->data, 0x0, val_len);
 
-	return spi_write_then_read(spi, &addr, reg_size, (u32 *)val, val_size);
+	err = spi_sync(spi, &msg);
+	if (err)
+		return err;
+
+	memcpy(val_buf, buf_rx->data, val_len);
+
+	return 0;
 }
 
 static const struct regmap_range tcan4x5x_reg_table_yes_range[] = {
@@ -66,21 +94,26 @@ static const struct regmap_access_table tcan4x5x_reg_table = {
 };
 
 static const struct regmap_config tcan4x5x_regmap = {
-	.reg_bits = 32,
+	.reg_bits = 24,
 	.reg_stride = 4,
+	.pad_bits = 8,
 	.val_bits = 32,
 	.wr_table = &tcan4x5x_reg_table,
 	.rd_table = &tcan4x5x_reg_table,
-	.cache_type = REGCACHE_NONE,
 	.max_register = TCAN4X5X_MAX_REGISTER,
+	.cache_type = REGCACHE_NONE,
+	.read_flag_mask = (__force unsigned long)
+		cpu_to_be32(TCAN4X5X_SPI_INSTRUCTION_READ),
+	.write_flag_mask = (__force unsigned long)
+		cpu_to_be32(TCAN4X5X_SPI_INSTRUCTION_WRITE),
 };
 
 static const struct regmap_bus tcan4x5x_bus = {
 	.write = tcan4x5x_regmap_write,
 	.gather_write = tcan4x5x_regmap_gather_write,
 	.read = tcan4x5x_regmap_read,
-	.reg_format_endian_default = REGMAP_ENDIAN_NATIVE,
-	.val_format_endian_default = REGMAP_ENDIAN_NATIVE,
+	.reg_format_endian_default = REGMAP_ENDIAN_BIG,
+	.val_format_endian_default = REGMAP_ENDIAN_BIG,
 	.max_raw_read = 256,
 	.max_raw_write = 256,
 };
diff --git a/drivers/net/can/m_can/tcan4x5x.h b/drivers/net/can/m_can/tcan4x5x.h
index e5bdd91b8005..7bf264f8e81f 100644
--- a/drivers/net/can/m_can/tcan4x5x.h
+++ b/drivers/net/can/m_can/tcan4x5x.h
@@ -17,6 +17,19 @@
 
 #include "m_can.h"
 
+#define TCAN4X5X_SANITIZE_SPI 1
+
+struct __packed tcan4x5x_buf_cmd {
+	u8 cmd;
+	__be16 addr;
+	u8 len;
+};
+
+struct __packed tcan4x5x_map_buf {
+	struct tcan4x5x_buf_cmd cmd;
+	u8 data[256 * sizeof(u32)];
+} ____cacheline_aligned;
+
 struct tcan4x5x_priv {
 	struct m_can_classdev cdev;
 
@@ -27,8 +40,18 @@ struct tcan4x5x_priv {
 	struct gpio_desc *device_wake_gpio;
 	struct gpio_desc *device_state_gpio;
 	struct regulator *power;
+
+	struct tcan4x5x_map_buf map_buf_rx;
+	struct tcan4x5x_map_buf map_buf_tx;
 };
 
+static inline void
+tcan4x5x_spi_cmd_set_len(struct tcan4x5x_buf_cmd *cmd, u8 len)
+{
+	/* number of u32 */
+	cmd->len = len >> 2;
+}
+
 int tcan4x5x_regmap_init(struct tcan4x5x_priv *priv);
 
 #endif
-- 
2.29.2



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

* [can-next-rfc 16/16] can: tcan4x5x: add support for half-duplex controllers
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
                   ` (14 preceding siblings ...)
  2020-12-15 23:17 ` [can-next-rfc 15/16] can: tcan4x5x: rework SPI access Marc Kleine-Budde
@ 2020-12-15 23:17 ` Marc Kleine-Budde
  2020-12-17 15:33 ` [RFC]: tcan4x5x: rework regmap support Dan Murphy
  2020-12-18  8:50 ` Sean Nyekjaer
  17 siblings, 0 replies; 19+ messages in thread
From: Marc Kleine-Budde @ 2020-12-15 23:17 UTC (permalink / raw)
  To: linux-can
  Cc: kernel, Dan Murphy, Sriram Dash, Sean Nyekjaer, Marc Kleine-Budde

This patch adds back support for half-duplex controllers, which was removed in
the last patch.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/m_can/tcan4x5x-regmap.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/drivers/net/can/m_can/tcan4x5x-regmap.c b/drivers/net/can/m_can/tcan4x5x-regmap.c
index 660e9d87dffb..ca80dbaf7a3f 100644
--- a/drivers/net/can/m_can/tcan4x5x-regmap.c
+++ b/drivers/net/can/m_can/tcan4x5x-regmap.c
@@ -51,7 +51,7 @@ static int tcan4x5x_regmap_read(void *context,
 	struct tcan4x5x_priv *priv = spi_get_drvdata(spi);
 	struct tcan4x5x_map_buf *buf_rx = &priv->map_buf_rx;
 	struct tcan4x5x_map_buf *buf_tx = &priv->map_buf_tx;
-	struct spi_transfer xfer[] = {
+	struct spi_transfer xfer[2] = {
 		{
 			.tx_buf = buf_tx,
 		}
@@ -66,17 +66,26 @@ static int tcan4x5x_regmap_read(void *context,
 	       sizeof(buf_tx->cmd.addr));
 	tcan4x5x_spi_cmd_set_len(&buf_tx->cmd, val_len);
 
-	xfer[0].rx_buf = buf_rx;
-	xfer[0].len = sizeof(buf_tx->cmd) + val_len;
+	if (spi->controller->flags & SPI_CONTROLLER_HALF_DUPLEX) {
+		xfer[0].len = sizeof(buf_tx->cmd);
+
+		xfer[1].rx_buf = val_buf;
+		xfer[1].len = val_len;
+		spi_message_add_tail(&xfer[1], &msg);
+	} else {
+		xfer[0].rx_buf = buf_rx;
+		xfer[0].len = sizeof(buf_tx->cmd) + val_len;
 
-	if (TCAN4X5X_SANITIZE_SPI)
-		memset(buf_tx->data, 0x0, val_len);
+		if (TCAN4X5X_SANITIZE_SPI)
+			memset(buf_tx->data, 0x0, val_len);
+	}
 
 	err = spi_sync(spi, &msg);
 	if (err)
 		return err;
 
-	memcpy(val_buf, buf_rx->data, val_len);
+	if (!(spi->controller->flags & SPI_CONTROLLER_HALF_DUPLEX))
+		memcpy(val_buf, buf_rx->data, val_len);
 
 	return 0;
 }
-- 
2.29.2



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

* Re: [RFC]: tcan4x5x: rework regmap support
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
                   ` (15 preceding siblings ...)
  2020-12-15 23:17 ` [can-next-rfc 16/16] can: tcan4x5x: add support for half-duplex controllers Marc Kleine-Budde
@ 2020-12-17 15:33 ` Dan Murphy
  2020-12-18  8:50 ` Sean Nyekjaer
  17 siblings, 0 replies; 19+ messages in thread
From: Dan Murphy @ 2020-12-17 15:33 UTC (permalink / raw)
  To: Marc Kleine-Budde, linux-can; +Cc: kernel, Sriram Dash, Sean Nyekjaer

Marc

On 12/15/20 5:17 PM, Marc Kleine-Budde wrote:
> Hello,
>
> this series first cleans up the the SPI regmap and then fixes several problem:
> - tcan4x5x_regmap_gather_write(), tcan4x5x_regmap_read():
>    Do not place variable "addr" on stack and use it as buffer for SPI
>    transfer. Buffers for SPI transfers must be allocated from DMA save
>    memory.
> - tcan4x5x_regmap_gather_write(), tcan4x5x_regmap_read():
>    Halfe number of SPI transfers by using a single buffer + memcpy().
>    This improves the performance, especially on SPI controllers, which
>    use interrupt based transfers.
> - Use "8" bits per word, not "32". This makes it possible to use this
>    driver on SoCs like the Raspberry Pi, which SPI host controller
>    drivers only support 8 bits per word.
>
> With this series, the driver is able to detect a tcan4x5x on a Raspberry Pi.
>
> regards,
> Marc
>
Thanks for the clean up.

Reviewed-by: Dan Murphy <dmurphy@ti.com>

Dan

>

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

* Re: [RFC]: tcan4x5x: rework regmap support
  2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
                   ` (16 preceding siblings ...)
  2020-12-17 15:33 ` [RFC]: tcan4x5x: rework regmap support Dan Murphy
@ 2020-12-18  8:50 ` Sean Nyekjaer
  17 siblings, 0 replies; 19+ messages in thread
From: Sean Nyekjaer @ 2020-12-18  8:50 UTC (permalink / raw)
  To: Marc Kleine-Budde, linux-can; +Cc: kernel, Dan Murphy, Sriram Dash



On 16/12/2020 00.17, Marc Kleine-Budde wrote:
> Hello,
>
> this series first cleans up the the SPI regmap and then fixes several problem:
> - tcan4x5x_regmap_gather_write(), tcan4x5x_regmap_read():
>    Do not place variable "addr" on stack and use it as buffer for SPI
>    transfer. Buffers for SPI transfers must be allocated from DMA save
>    memory.
> - tcan4x5x_regmap_gather_write(), tcan4x5x_regmap_read():
>    Halfe number of SPI transfers by using a single buffer + memcpy().
>    This improves the performance, especially on SPI controllers, which
>    use interrupt based transfers.
> - Use "8" bits per word, not "32". This makes it possible to use this
>    driver on SoCs like the Raspberry Pi, which SPI host controller
>    drivers only support 8 bits per word.
>
> With this series, the driver is able to detect a tcan4x5x on a Raspberry Pi.
>
> regards,
> Marc
>
For this series...

Tested-by: Sean Nyekjaer <sean@geanix.com>

/Sean

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

end of thread, other threads:[~2020-12-18  8:51 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-15 23:17 [RFC]: tcan4x5x: rework regmap support Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 01/16] can: tcan4x5x: replace DEVICE_NAME by KBUILD_MODNAME Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 02/16] can: tcan4x5x: beautify indention of tcan4x5x_of_match and tcan4x5x_id_table Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 03/16] can: tcan4x5x: rename tcan4x5x.c -> tcan4x5x-core.c Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 04/16] can: tcan4x5x: move regmap code into seperate file Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 05/16] can: tcan4x5x: mark struct regmap_bus tcan4x5x_bus as constant Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 06/16] can: tcan4x5x: tcan4x5x_bus: remove not needed read_flag_mask Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 07/16] can: tcan4x5x: remove regmap async support Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 08/16] can: tcan4x5x: rename regmap_spi_gather_write() -> tcan4x5x_regmap_gather_write() Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 09/16] can: tcan4x5x: tcan4x5x_regmap_write(): remove not needed casts and replace 4 by sizeof Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 10/16] can: tcan4x5x: tcan4x5x_regmap_init(): use spi as context pointer Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 11/16] can: tcan4x5x: fix max register value Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 12/16] can: tcan4x5x: tcan4x5x_regmap: set reg_stride to 4 Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 13/16] can: tcan4x5x: add max_raw_{read,write} of 256 Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 14/16] can: tcan4x5x: add {wr,rd}_table Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 15/16] can: tcan4x5x: rework SPI access Marc Kleine-Budde
2020-12-15 23:17 ` [can-next-rfc 16/16] can: tcan4x5x: add support for half-duplex controllers Marc Kleine-Budde
2020-12-17 15:33 ` [RFC]: tcan4x5x: rework regmap support Dan Murphy
2020-12-18  8:50 ` Sean Nyekjaer

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