]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
can: mcp251xfd: utilize gather_write function for all non-CRC writes
authorGregor Herburger <gregor.herburger@ew.tq-group.com>
Wed, 1 Oct 2025 09:10:02 +0000 (14:40 +0530)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 12 Nov 2025 08:36:59 +0000 (09:36 +0100)
This is a preparation patch to add errata workaround for non crc writes.

Currently for non-crc writes to the chip can go through the
.gather_write, .write or the reg_update_bits callback.

To allow the addition of the errata fix at a single location use
mcp251xfd_regmap_nocrc_gather_write for all non-CRC write instructions,
similar to the crc regmap.

Signed-off-by: Gregor Herburger <gregor.herburger@ew.tq-group.com>
Tested-by: Viken Dadhaniya <viken.dadhaniya@oss.qualcomm.com>
Signed-off-by: Viken Dadhaniya <viken.dadhaniya@oss.qualcomm.com>
Reviewed-by: Manivannan Sadhasivam <mani@kernel.org>
Link: https://patch.msgid.link/20251001091006.4003841-3-viken.dadhaniya@oss.qualcomm.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/spi/mcp251xfd/mcp251xfd-regmap.c

index 8c5be8d1c51965e0e0daac51aa86ba3b5be2b1cf..e61cbd209955b8b7cd9b68eced1342cfb9b54097 100644 (file)
 
 static const struct regmap_config mcp251xfd_regmap_crc;
 
-static int
-mcp251xfd_regmap_nocrc_write(void *context, const void *data, size_t count)
-{
-       struct spi_device *spi = context;
-
-       return spi_write(spi, data, count);
-}
-
 static int
 mcp251xfd_regmap_nocrc_gather_write(void *context,
                                    const void *reg, size_t reg_len,
@@ -47,6 +39,15 @@ mcp251xfd_regmap_nocrc_gather_write(void *context,
        return spi_sync_transfer(spi, xfer, ARRAY_SIZE(xfer));
 }
 
+static int
+mcp251xfd_regmap_nocrc_write(void *context, const void *data, size_t count)
+{
+       const size_t data_offset = sizeof(__be16);
+
+       return mcp251xfd_regmap_nocrc_gather_write(context, data, data_offset,
+                                                  data + data_offset, count - data_offset);
+}
+
 static inline bool
 mcp251xfd_update_bits_read_reg(const struct mcp251xfd_priv *priv,
                               unsigned int reg)
@@ -64,6 +65,7 @@ mcp251xfd_update_bits_read_reg(const struct mcp251xfd_priv *priv,
        case MCP251XFD_REG_CON:
        case MCP251XFD_REG_OSC:
        case MCP251XFD_REG_ECCCON:
+       case MCP251XFD_REG_IOCON:
                return true;
        default:
                mcp251xfd_for_each_rx_ring(priv, ring, n) {
@@ -139,10 +141,9 @@ mcp251xfd_regmap_nocrc_update_bits(void *context, unsigned int reg,
        tmp_le32 = orig_le32 & ~mask_le32;
        tmp_le32 |= val_le32 & mask_le32;
 
-       mcp251xfd_spi_cmd_write_nocrc(&buf_tx->cmd, reg + first_byte);
-       memcpy(buf_tx->data, &tmp_le32, len);
-
-       return spi_write(spi, buf_tx, sizeof(buf_tx->cmd) + len);
+       reg += first_byte;
+       mcp251xfd_spi_cmd_write_nocrc(&buf_tx->cmd, reg);
+       return mcp251xfd_regmap_nocrc_gather_write(context, &buf_tx->cmd, 2, &tmp_le32, len);
 }
 
 static int