* [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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.