Lines Matching +full:spi +full:- +full:crc
1 /* SPDX-License-Identifier: GPL-2.0
3 * mcp251xfd - Microchip MCP251xFD Family CAN controller driver
6 * Marc Kleine-Budde <kernel@pengutronix.de>
16 #include <linux/can/rx-offload.h>
22 #include <linux/spi/spi.h>
370 /* SPI commands */
424 /* Use CRC to access registers */
426 /* Use CRC to access RX/TEF-RAM */
428 /* Use CRC to access TX-RAM */
432 /* Use Half Duplex SPI transfers */
441 /* The tx_obj_raw version is used in spi async, i.e. without
493 __be16 crc; member
494 } crc; member
505 __be16 crc; member
506 } crc; member
519 /* u8 obj_num equals tx_ring->obj_num */
572 u8 data[256 - 4];
573 __be16 crc; member
621 struct spi_device *spi; member
663 return priv->devtype_data.model == MCP251XFD_MODEL_MCP##_model; \
673 /* listen-only mode works like FD mode */ in mcp251xfd_is_fd_mode()
674 return priv->can.ctrlmode & (CAN_CTRLMODE_LISTENONLY | CAN_CTRLMODE_FD); in mcp251xfd_is_fd_mode()
699 cmd->cmd = cpu_to_be16(MCP251XFD_SPI_INSTRUCTION_READ | addr); in mcp251xfd_spi_cmd_read_nocrc()
705 cmd->cmd = cpu_to_be16(MCP251XFD_SPI_INSTRUCTION_WRITE | addr); in mcp251xfd_spi_cmd_write_nocrc()
712 MCP251XFD_RAM_START + MCP251XFD_RAM_SIZE - 4); in mcp251xfd_reg_in_ram()
723 cmd->len = len >> 2; in __mcp251xfd_spi_cmd_crc_set_len()
725 cmd->len = len; in __mcp251xfd_spi_cmd_crc_set_len()
743 cmd->cmd = cpu_to_be16(MCP251XFD_SPI_INSTRUCTION_READ_CRC | addr); in mcp251xfd_spi_cmd_read_crc_set_addr()
758 cmd->cmd = cpu_to_be16(MCP251XFD_SPI_INSTRUCTION_WRITE_CRC | addr); in mcp251xfd_spi_cmd_write_crc_set_addr()
776 if (priv->devtype_data.quirks & MCP251XFD_QUIRK_CRC_REG) { in mcp251xfd_spi_cmd_write()
777 mcp251xfd_spi_cmd_write_crc_set_addr(&write_reg_buf->crc.cmd, in mcp251xfd_spi_cmd_write()
779 data = write_reg_buf->crc.data; in mcp251xfd_spi_cmd_write()
781 mcp251xfd_spi_cmd_write_nocrc(&write_reg_buf->nocrc.cmd, in mcp251xfd_spi_cmd_write()
783 data = write_reg_buf->nocrc.data; in mcp251xfd_spi_cmd_write()
792 return regmap_read(priv->map_reg, MCP251XFD_REG_TBC, timestamp); in mcp251xfd_get_timestamp()
804 return ring->base + ring->obj_size * n; in mcp251xfd_get_tx_obj_addr()
810 return ring->base + ring->obj_size * n; in mcp251xfd_get_rx_obj_addr()
820 err = regmap_read(priv->map_reg, in mcp251xfd_tx_tail_get_from_chip()
821 MCP251XFD_REG_FIFOSTA(priv->tx->fifo_nr), in mcp251xfd_tx_tail_get_from_chip()
833 return priv->tef->head & (priv->tx->obj_num - 1); in mcp251xfd_get_tef_head()
838 return priv->tef->tail & (priv->tx->obj_num - 1); in mcp251xfd_get_tef_tail()
843 return priv->tef->head - priv->tef->tail; in mcp251xfd_get_tef_len()
852 return min_t(u8, len, priv->tx->obj_num - mcp251xfd_get_tef_tail(priv)); in mcp251xfd_get_tef_linear_len()
857 return ring->head & (ring->obj_num - 1); in mcp251xfd_get_tx_head()
862 return ring->tail & (ring->obj_num - 1); in mcp251xfd_get_tx_tail()
867 return ring->obj_num - (ring->head - ring->tail); in mcp251xfd_get_tx_free()
875 addr >= mcp251xfd_get_tx_obj_addr(tx_ring, tx_ring->obj_num)) in mcp251xfd_get_tx_nr_by_addr()
876 return -ENOENT; in mcp251xfd_get_tx_nr_by_addr()
878 *nr = (addr - mcp251xfd_get_tx_obj_addr(tx_ring, 0)) / in mcp251xfd_get_tx_nr_by_addr()
879 tx_ring->obj_size; in mcp251xfd_get_tx_nr_by_addr()
886 return ring->head & (ring->obj_num - 1); in mcp251xfd_get_rx_head()
891 return ring->tail & (ring->obj_num - 1); in mcp251xfd_get_rx_tail()
896 return ring->head - ring->tail; in mcp251xfd_get_rx_len()
906 return min_t(u8, len, ring->obj_num - mcp251xfd_get_rx_tail(ring)); in mcp251xfd_get_rx_linear_len()
910 for ((n) = 0, (_obj) = &(ring)->obj[(n)]; \
911 (n) < (ring)->obj_num; \
912 (n)++, (_obj) = &(ring)->obj[(n)])
915 for ((n) = 0, (ring) = *((priv)->rx + (n)); \
916 (n) < (priv)->rx_ring_num; \
917 (n)++, (ring) = *((priv)->rx + (n)))