can: mcp251xfd: utilize gather_write function for all non-CRC writes
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>
This commit is contained in:
committed by
Marc Kleine-Budde
parent
71df9227ba
commit
f5982a679a
@@ -12,14 +12,6 @@
|
||||
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user