1875347feSMarc Kleine-Budde /* SPDX-License-Identifier: GPL-2.0 2875347feSMarc Kleine-Budde * 3eb79a267SMarc Kleine-Budde * mcp251xfd - Microchip MCP251xFD Family CAN controller driver 4875347feSMarc Kleine-Budde * 5aada7422SMarc Kleine-Budde * Copyright (c) 2019, 2020, 2021 Pengutronix, 6875347feSMarc Kleine-Budde * Marc Kleine-Budde <kernel@pengutronix.de> 7875347feSMarc Kleine-Budde * Copyright (c) 2019 Martin Sperl <kernel@martin.sperl.org> 8875347feSMarc Kleine-Budde */ 9875347feSMarc Kleine-Budde 10eb79a267SMarc Kleine-Budde #ifndef _MCP251XFD_H 11eb79a267SMarc Kleine-Budde #define _MCP251XFD_H 12875347feSMarc Kleine-Budde 131e846c7aSMarc Kleine-Budde #include <linux/bitfield.h> 14875347feSMarc Kleine-Budde #include <linux/can/core.h> 15875347feSMarc Kleine-Budde #include <linux/can/dev.h> 16875347feSMarc Kleine-Budde #include <linux/can/rx-offload.h> 17875347feSMarc Kleine-Budde #include <linux/gpio/consumer.h> 18875347feSMarc Kleine-Budde #include <linux/kernel.h> 19ae2e9940SMarc Kleine-Budde #include <linux/netdevice.h> 20875347feSMarc Kleine-Budde #include <linux/regmap.h> 21875347feSMarc Kleine-Budde #include <linux/regulator/consumer.h> 22875347feSMarc Kleine-Budde #include <linux/spi/spi.h> 23efd8d98dSMarc Kleine-Budde #include <linux/timecounter.h> 24efd8d98dSMarc Kleine-Budde #include <linux/workqueue.h> 25875347feSMarc Kleine-Budde 26eb79a267SMarc Kleine-Budde /* MPC251x registers */ 27875347feSMarc Kleine-Budde 28875347feSMarc Kleine-Budde /* CAN FD Controller Module SFR */ 29eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON 0x00 30eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_TXBWS_MASK GENMASK(31, 28) 31eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_ABAT BIT(27) 32eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_REQOP_MASK GENMASK(26, 24) 33eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_MODE_MIXED 0 34eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_MODE_SLEEP 1 35eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_MODE_INT_LOOPBACK 2 36eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_MODE_LISTENONLY 3 37eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_MODE_CONFIG 4 38eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_MODE_EXT_LOOPBACK 5 39eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_MODE_CAN2_0 6 40eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_MODE_RESTRICTED 7 41eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_OPMOD_MASK GENMASK(23, 21) 42eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_TXQEN BIT(20) 43eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_STEF BIT(19) 44eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_SERR2LOM BIT(18) 45eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_ESIGM BIT(17) 46eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_RTXAT BIT(16) 47eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_BRSDIS BIT(12) 48eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_BUSY BIT(11) 49eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_WFT_MASK GENMASK(10, 9) 50eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_WFT_T00FILTER 0x0 51eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_WFT_T01FILTER 0x1 52eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_WFT_T10FILTER 0x2 53eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_WFT_T11FILTER 0x3 54eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_WAKFIL BIT(8) 55eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_PXEDIS BIT(6) 56eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_ISOCRCEN BIT(5) 57eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CON_DNCNT_MASK GENMASK(4, 0) 58875347feSMarc Kleine-Budde 59eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_NBTCFG 0x04 60eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_NBTCFG_BRP_MASK GENMASK(31, 24) 61eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_NBTCFG_TSEG1_MASK GENMASK(23, 16) 62eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_NBTCFG_TSEG2_MASK GENMASK(14, 8) 63eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_NBTCFG_SJW_MASK GENMASK(6, 0) 64875347feSMarc Kleine-Budde 65eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_DBTCFG 0x08 66eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_DBTCFG_BRP_MASK GENMASK(31, 24) 67eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_DBTCFG_TSEG1_MASK GENMASK(20, 16) 68eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_DBTCFG_TSEG2_MASK GENMASK(11, 8) 69eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_DBTCFG_SJW_MASK GENMASK(3, 0) 70875347feSMarc Kleine-Budde 71eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TDC 0x0c 72eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TDC_EDGFLTEN BIT(25) 73eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TDC_SID11EN BIT(24) 74eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TDC_TDCMOD_MASK GENMASK(17, 16) 75eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TDC_TDCMOD_AUTO 2 76eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TDC_TDCMOD_MANUAL 1 77eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TDC_TDCMOD_DISABLED 0 78eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TDC_TDCO_MASK GENMASK(14, 8) 79eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TDC_TDCV_MASK GENMASK(5, 0) 80875347feSMarc Kleine-Budde 81eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TBC 0x10 82875347feSMarc Kleine-Budde 83eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TSCON 0x14 84eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TSCON_TSRES BIT(18) 85eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TSCON_TSEOF BIT(17) 86eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TSCON_TBCEN BIT(16) 87eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TSCON_TBCPRE_MASK GENMASK(9, 0) 88875347feSMarc Kleine-Budde 89eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_VEC 0x18 90eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_VEC_RXCODE_MASK GENMASK(30, 24) 91eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_VEC_TXCODE_MASK GENMASK(22, 16) 92eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_VEC_FILHIT_MASK GENMASK(12, 8) 93eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_VEC_ICODE_MASK GENMASK(6, 0) 94875347feSMarc Kleine-Budde 95eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT 0x1c 96eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_IF_MASK GENMASK(15, 0) 97eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_IE_MASK GENMASK(31, 16) 98eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_IVMIE BIT(31) 99eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_WAKIE BIT(30) 100eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_CERRIE BIT(29) 101eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_SERRIE BIT(28) 102eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_RXOVIE BIT(27) 103eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_TXATIE BIT(26) 104eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_SPICRCIE BIT(25) 105eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_ECCIE BIT(24) 106eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_TEFIE BIT(20) 107eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_MODIE BIT(19) 108eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_TBCIE BIT(18) 109eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_RXIE BIT(17) 110eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_TXIE BIT(16) 111eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_IVMIF BIT(15) 112eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_WAKIF BIT(14) 113eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_CERRIF BIT(13) 114eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_SERRIF BIT(12) 115eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_RXOVIF BIT(11) 116eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_TXATIF BIT(10) 117eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_SPICRCIF BIT(9) 118eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_ECCIF BIT(8) 119eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_TEFIF BIT(4) 120eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_MODIF BIT(3) 121eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_TBCIF BIT(2) 122eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_RXIF BIT(1) 123eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_TXIF BIT(0) 124875347feSMarc Kleine-Budde /* These IRQ flags must be cleared by SW in the CAN_INT register */ 125eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_INT_IF_CLEARABLE_MASK \ 126eb79a267SMarc Kleine-Budde (MCP251XFD_REG_INT_IVMIF | MCP251XFD_REG_INT_WAKIF | \ 127eb79a267SMarc Kleine-Budde MCP251XFD_REG_INT_CERRIF | MCP251XFD_REG_INT_SERRIF | \ 128eb79a267SMarc Kleine-Budde MCP251XFD_REG_INT_MODIF) 129875347feSMarc Kleine-Budde 130eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_RXIF 0x20 131eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXIF 0x24 132eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_RXOVIF 0x28 133eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXATIF 0x2c 134eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXREQ 0x30 135875347feSMarc Kleine-Budde 136eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TREC 0x34 137eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TREC_TXBO BIT(21) 138eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TREC_TXBP BIT(20) 139eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TREC_RXBP BIT(19) 140eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TREC_TXWARN BIT(18) 141eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TREC_RXWARN BIT(17) 142eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TREC_EWARN BIT(16) 143eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TREC_TEC_MASK GENMASK(15, 8) 144eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TREC_REC_MASK GENMASK(7, 0) 145875347feSMarc Kleine-Budde 146eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG0 0x38 147eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG0_DTERRCNT_MASK GENMASK(31, 24) 148eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG0_DRERRCNT_MASK GENMASK(23, 16) 149eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG0_NTERRCNT_MASK GENMASK(15, 8) 150eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG0_NRERRCNT_MASK GENMASK(7, 0) 151875347feSMarc Kleine-Budde 152eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1 0x3c 153eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_DLCMM BIT(31) 154eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_ESI BIT(30) 155eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_DCRCERR BIT(29) 156eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_DSTUFERR BIT(28) 157eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_DFORMERR BIT(27) 158eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_DBIT1ERR BIT(25) 159eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_DBIT0ERR BIT(24) 160eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_TXBOERR BIT(23) 161eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_NCRCERR BIT(21) 162eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_NSTUFERR BIT(20) 163eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_NFORMERR BIT(19) 164eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_NACKERR BIT(18) 165eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_NBIT1ERR BIT(17) 166eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_NBIT0ERR BIT(16) 167eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_BERR_MASK \ 168eb79a267SMarc Kleine-Budde (MCP251XFD_REG_BDIAG1_DLCMM | MCP251XFD_REG_BDIAG1_ESI | \ 169eb79a267SMarc Kleine-Budde MCP251XFD_REG_BDIAG1_DCRCERR | MCP251XFD_REG_BDIAG1_DSTUFERR | \ 170eb79a267SMarc Kleine-Budde MCP251XFD_REG_BDIAG1_DFORMERR | MCP251XFD_REG_BDIAG1_DBIT1ERR | \ 171eb79a267SMarc Kleine-Budde MCP251XFD_REG_BDIAG1_DBIT0ERR | MCP251XFD_REG_BDIAG1_TXBOERR | \ 172eb79a267SMarc Kleine-Budde MCP251XFD_REG_BDIAG1_NCRCERR | MCP251XFD_REG_BDIAG1_NSTUFERR | \ 173eb79a267SMarc Kleine-Budde MCP251XFD_REG_BDIAG1_NFORMERR | MCP251XFD_REG_BDIAG1_NACKERR | \ 174eb79a267SMarc Kleine-Budde MCP251XFD_REG_BDIAG1_NBIT1ERR | MCP251XFD_REG_BDIAG1_NBIT0ERR) 175eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_BDIAG1_EFMSGCNT_MASK GENMASK(15, 0) 176875347feSMarc Kleine-Budde 177eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TEFCON 0x40 178eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TEFCON_FSIZE_MASK GENMASK(28, 24) 179eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TEFCON_FRESET BIT(10) 180eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TEFCON_UINC BIT(8) 181eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TEFCON_TEFTSEN BIT(5) 182eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TEFCON_TEFOVIE BIT(3) 183eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TEFCON_TEFFIE BIT(2) 184eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TEFCON_TEFHIE BIT(1) 185eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TEFCON_TEFNEIE BIT(0) 186875347feSMarc Kleine-Budde 187eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TEFSTA 0x44 188eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TEFSTA_TEFOVIF BIT(3) 189eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TEFSTA_TEFFIF BIT(2) 190eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TEFSTA_TEFHIF BIT(1) 191eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TEFSTA_TEFNEIF BIT(0) 192875347feSMarc Kleine-Budde 193eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TEFUA 0x48 194875347feSMarc Kleine-Budde 195eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON 0x50 196eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_PLSIZE_MASK GENMASK(31, 29) 197eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_PLSIZE_8 0 198eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_PLSIZE_12 1 199eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_PLSIZE_16 2 200eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_PLSIZE_20 3 201eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_PLSIZE_24 4 202eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_PLSIZE_32 5 203eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_PLSIZE_48 6 204eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_PLSIZE_64 7 205eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_FSIZE_MASK GENMASK(28, 24) 206eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_TXAT_UNLIMITED 3 207eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_TXAT_THREE_SHOT 1 208eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_TXAT_ONE_SHOT 0 209eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_TXAT_MASK GENMASK(22, 21) 210eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_TXPRI_MASK GENMASK(20, 16) 211eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_FRESET BIT(10) 212eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_TXREQ BIT(9) 213eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_UINC BIT(8) 214eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_TXEN BIT(7) 215eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_TXATIE BIT(4) 216eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_TXQEIE BIT(2) 217eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQCON_TXQNIE BIT(0) 218875347feSMarc Kleine-Budde 219eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQSTA 0x54 220eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQSTA_TXQCI_MASK GENMASK(12, 8) 221eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQSTA_TXABT BIT(7) 222eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQSTA_TXLARB BIT(6) 223eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQSTA_TXERR BIT(5) 224eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQSTA_TXATIF BIT(4) 225eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQSTA_TXQEIF BIT(2) 226eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQSTA_TXQNIF BIT(0) 227875347feSMarc Kleine-Budde 228eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_TXQUA 0x58 229875347feSMarc Kleine-Budde 230eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON(x) (0x50 + 0xc * (x)) 231eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_PLSIZE_MASK GENMASK(31, 29) 232eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_PLSIZE_8 0 233eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_PLSIZE_12 1 234eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_PLSIZE_16 2 235eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_PLSIZE_20 3 236eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_PLSIZE_24 4 237eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_PLSIZE_32 5 238eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_PLSIZE_48 6 239eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_PLSIZE_64 7 240eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_FSIZE_MASK GENMASK(28, 24) 241eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_TXAT_MASK GENMASK(22, 21) 242eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_TXAT_ONE_SHOT 0 243eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_TXAT_THREE_SHOT 1 244eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_TXAT_UNLIMITED 3 245eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_TXPRI_MASK GENMASK(20, 16) 246eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_FRESET BIT(10) 247eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_TXREQ BIT(9) 248eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_UINC BIT(8) 249eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_TXEN BIT(7) 250eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_RTREN BIT(6) 251eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_RXTSEN BIT(5) 252eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_TXATIE BIT(4) 253eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_RXOVIE BIT(3) 254eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_TFERFFIE BIT(2) 255eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_TFHRFHIE BIT(1) 256eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOCON_TFNRFNIE BIT(0) 257875347feSMarc Kleine-Budde 258eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOSTA(x) (0x54 + 0xc * (x)) 259eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOSTA_FIFOCI_MASK GENMASK(12, 8) 260eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOSTA_TXABT BIT(7) 261eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOSTA_TXLARB BIT(6) 262eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOSTA_TXERR BIT(5) 263eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOSTA_TXATIF BIT(4) 264eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOSTA_RXOVIF BIT(3) 265eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOSTA_TFERFFIF BIT(2) 266eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOSTA_TFHRFHIF BIT(1) 267eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOSTA_TFNRFNIF BIT(0) 268875347feSMarc Kleine-Budde 269eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FIFOUA(x) (0x58 + 0xc * (x)) 270875347feSMarc Kleine-Budde 271eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTCON(x) (0x1d0 + 0x4 * (x)) 272eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTCON_FLTEN3 BIT(31) 273eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTCON_F3BP_MASK GENMASK(28, 24) 274eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTCON_FLTEN2 BIT(23) 275eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTCON_F2BP_MASK GENMASK(20, 16) 276eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTCON_FLTEN1 BIT(15) 277eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTCON_F1BP_MASK GENMASK(12, 8) 278eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTCON_FLTEN0 BIT(7) 279eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTCON_F0BP_MASK GENMASK(4, 0) 280eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTCON_FLTEN(x) (BIT(7) << 8 * ((x) & 0x3)) 281eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTCON_FLT_MASK(x) (GENMASK(7, 0) << (8 * ((x) & 0x3))) 282eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTCON_FBP(x, fifo) ((fifo) << 8 * ((x) & 0x3)) 283875347feSMarc Kleine-Budde 284eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTOBJ(x) (0x1f0 + 0x8 * (x)) 285eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTOBJ_EXIDE BIT(30) 286eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTOBJ_SID11 BIT(29) 287eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTOBJ_EID_MASK GENMASK(28, 11) 288eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTOBJ_SID_MASK GENMASK(10, 0) 289875347feSMarc Kleine-Budde 290eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FLTMASK(x) (0x1f4 + 0x8 * (x)) 291eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_MASK_MIDE BIT(30) 292eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_MASK_MSID11 BIT(29) 293eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_MASK_MEID_MASK GENMASK(28, 11) 294eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_MASK_MSID_MASK GENMASK(10, 0) 295875347feSMarc Kleine-Budde 296875347feSMarc Kleine-Budde /* RAM */ 297eb79a267SMarc Kleine-Budde #define MCP251XFD_RAM_START 0x400 298eb79a267SMarc Kleine-Budde #define MCP251XFD_RAM_SIZE SZ_2K 299875347feSMarc Kleine-Budde 300875347feSMarc Kleine-Budde /* Message Object */ 301eb79a267SMarc Kleine-Budde #define MCP251XFD_OBJ_ID_SID11 BIT(29) 302eb79a267SMarc Kleine-Budde #define MCP251XFD_OBJ_ID_EID_MASK GENMASK(28, 11) 303eb79a267SMarc Kleine-Budde #define MCP251XFD_OBJ_ID_SID_MASK GENMASK(10, 0) 304eb79a267SMarc Kleine-Budde #define MCP251XFD_OBJ_FLAGS_SEQ_MCP2518FD_MASK GENMASK(31, 9) 305eb79a267SMarc Kleine-Budde #define MCP251XFD_OBJ_FLAGS_SEQ_MCP2517FD_MASK GENMASK(15, 9) 306eb79a267SMarc Kleine-Budde #define MCP251XFD_OBJ_FLAGS_SEQ_MASK MCP251XFD_OBJ_FLAGS_SEQ_MCP2518FD_MASK 307eb79a267SMarc Kleine-Budde #define MCP251XFD_OBJ_FLAGS_ESI BIT(8) 308eb79a267SMarc Kleine-Budde #define MCP251XFD_OBJ_FLAGS_FDF BIT(7) 309eb79a267SMarc Kleine-Budde #define MCP251XFD_OBJ_FLAGS_BRS BIT(6) 310eb79a267SMarc Kleine-Budde #define MCP251XFD_OBJ_FLAGS_RTR BIT(5) 311eb79a267SMarc Kleine-Budde #define MCP251XFD_OBJ_FLAGS_IDE BIT(4) 31249ffacbcSMarc Kleine-Budde #define MCP251XFD_OBJ_FLAGS_DLC_MASK GENMASK(3, 0) 313875347feSMarc Kleine-Budde 314eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FRAME_EFF_SID_MASK GENMASK(28, 18) 315eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_FRAME_EFF_EID_MASK GENMASK(17, 0) 316875347feSMarc Kleine-Budde 317875347feSMarc Kleine-Budde /* MCP2517/18FD SFR */ 318eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_OSC 0xe00 319eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_OSC_SCLKRDY BIT(12) 320eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_OSC_OSCRDY BIT(10) 321eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_OSC_PLLRDY BIT(8) 322eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_OSC_CLKODIV_10 3 323eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_OSC_CLKODIV_4 2 324eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_OSC_CLKODIV_2 1 325eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_OSC_CLKODIV_1 0 326eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_OSC_CLKODIV_MASK GENMASK(6, 5) 327eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_OSC_SCLKDIV BIT(4) 328eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_OSC_LPMEN BIT(3) /* MCP2518FD only */ 329eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_OSC_OSCDIS BIT(2) 330eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_OSC_PLLEN BIT(0) 331875347feSMarc Kleine-Budde 332eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_IOCON 0xe04 333eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_IOCON_INTOD BIT(30) 334eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_IOCON_SOF BIT(29) 335eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_IOCON_TXCANOD BIT(28) 336eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_IOCON_PM1 BIT(25) 337eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_IOCON_PM0 BIT(24) 338eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_IOCON_GPIO1 BIT(17) 339eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_IOCON_GPIO0 BIT(16) 340eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_IOCON_LAT1 BIT(9) 341eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_IOCON_LAT0 BIT(8) 342eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_IOCON_XSTBYEN BIT(6) 343eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_IOCON_TRIS1 BIT(1) 344eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_IOCON_TRIS0 BIT(0) 345875347feSMarc Kleine-Budde 346eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CRC 0xe08 347eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CRC_FERRIE BIT(25) 348eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CRC_CRCERRIE BIT(24) 349eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CRC_FERRIF BIT(17) 350eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CRC_CRCERRIF BIT(16) 351eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CRC_IF_MASK GENMASK(17, 16) 352eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_CRC_MASK GENMASK(15, 0) 353875347feSMarc Kleine-Budde 354eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_ECCCON 0xe0c 355eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_ECCCON_PARITY_MASK GENMASK(14, 8) 356eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_ECCCON_DEDIE BIT(2) 357eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_ECCCON_SECIE BIT(1) 358eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_ECCCON_ECCEN BIT(0) 359875347feSMarc Kleine-Budde 360eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_ECCSTAT 0xe10 361eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_ECCSTAT_ERRADDR_MASK GENMASK(27, 16) 362eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_ECCSTAT_IF_MASK GENMASK(2, 1) 363eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_ECCSTAT_DEDIF BIT(2) 364eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_ECCSTAT_SECIF BIT(1) 365875347feSMarc Kleine-Budde 366eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_DEVID 0xe14 /* MCP2518FD only */ 367eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_DEVID_ID_MASK GENMASK(7, 4) 368eb79a267SMarc Kleine-Budde #define MCP251XFD_REG_DEVID_REV_MASK GENMASK(3, 0) 369875347feSMarc Kleine-Budde 370875347feSMarc Kleine-Budde /* SPI commands */ 371eb79a267SMarc Kleine-Budde #define MCP251XFD_SPI_INSTRUCTION_RESET 0x0000 372eb79a267SMarc Kleine-Budde #define MCP251XFD_SPI_INSTRUCTION_WRITE 0x2000 373eb79a267SMarc Kleine-Budde #define MCP251XFD_SPI_INSTRUCTION_READ 0x3000 374eb79a267SMarc Kleine-Budde #define MCP251XFD_SPI_INSTRUCTION_WRITE_CRC 0xa000 375eb79a267SMarc Kleine-Budde #define MCP251XFD_SPI_INSTRUCTION_READ_CRC 0xb000 376eb79a267SMarc Kleine-Budde #define MCP251XFD_SPI_INSTRUCTION_WRITE_CRC_SAFE 0xc000 377eb79a267SMarc Kleine-Budde #define MCP251XFD_SPI_ADDRESS_MASK GENMASK(11, 0) 378875347feSMarc Kleine-Budde 379eb79a267SMarc Kleine-Budde #define MCP251XFD_SYSCLOCK_HZ_MAX 40000000 380eb79a267SMarc Kleine-Budde #define MCP251XFD_SYSCLOCK_HZ_MIN 1000000 381eb79a267SMarc Kleine-Budde #define MCP251XFD_SPICLOCK_HZ_MAX 20000000 382efd8d98dSMarc Kleine-Budde #define MCP251XFD_TIMESTAMP_WORK_DELAY_SEC 45 383efd8d98dSMarc Kleine-Budde static_assert(MCP251XFD_TIMESTAMP_WORK_DELAY_SEC < 384efd8d98dSMarc Kleine-Budde CYCLECOUNTER_MASK(32) / MCP251XFD_SYSCLOCK_HZ_MAX / 2); 385eb79a267SMarc Kleine-Budde #define MCP251XFD_OSC_PLL_MULTIPLIER 10 386eb79a267SMarc Kleine-Budde #define MCP251XFD_OSC_STAB_SLEEP_US (3 * USEC_PER_MSEC) 387eb79a267SMarc Kleine-Budde #define MCP251XFD_OSC_STAB_TIMEOUT_US (10 * MCP251XFD_OSC_STAB_SLEEP_US) 388eb79a267SMarc Kleine-Budde #define MCP251XFD_POLL_SLEEP_US (10) 389eb79a267SMarc Kleine-Budde #define MCP251XFD_POLL_TIMEOUT_US (USEC_PER_MSEC) 390c9e6b80dSMarc Kleine-Budde 391c9e6b80dSMarc Kleine-Budde /* Misc */ 392c9e6b80dSMarc Kleine-Budde #define MCP251XFD_NAPI_WEIGHT 32 393eb79a267SMarc Kleine-Budde #define MCP251XFD_SOFTRESET_RETRIES_MAX 3 394eb79a267SMarc Kleine-Budde #define MCP251XFD_READ_CRC_RETRIES_MAX 3 395eb79a267SMarc Kleine-Budde #define MCP251XFD_ECC_CNT_MAX 2 396eb79a267SMarc Kleine-Budde #define MCP251XFD_SANITIZE_SPI 1 397eb79a267SMarc Kleine-Budde #define MCP251XFD_SANITIZE_CAN 1 398875347feSMarc Kleine-Budde 399aada7422SMarc Kleine-Budde /* FIFO and Ring */ 400aada7422SMarc Kleine-Budde #define MCP251XFD_FIFO_TEF_NUM 1U 401aa66ae9bSMarc Kleine-Budde #define MCP251XFD_FIFO_RX_NUM 3U 402aada7422SMarc Kleine-Budde #define MCP251XFD_FIFO_TX_NUM 1U 403aada7422SMarc Kleine-Budde 4040a1f2e65SMarc Kleine-Budde #define MCP251XFD_FIFO_DEPTH 32U 4050a1f2e65SMarc Kleine-Budde 406c9e6b80dSMarc Kleine-Budde #define MCP251XFD_RX_OBJ_NUM_MIN 16U 407c9e6b80dSMarc Kleine-Budde #define MCP251XFD_RX_OBJ_NUM_MAX (MCP251XFD_FIFO_RX_NUM * MCP251XFD_FIFO_DEPTH) 408c9e6b80dSMarc Kleine-Budde #define MCP251XFD_RX_FIFO_DEPTH_MIN 4U 409846990e0SMarc Kleine-Budde #define MCP251XFD_RX_FIFO_DEPTH_COALESCE_MIN 8U 410c9e6b80dSMarc Kleine-Budde 411c9e6b80dSMarc Kleine-Budde #define MCP251XFD_TX_OBJ_NUM_MIN 2U 412aa66ae9bSMarc Kleine-Budde #define MCP251XFD_TX_OBJ_NUM_MAX 16U 413c9e6b80dSMarc Kleine-Budde #define MCP251XFD_TX_OBJ_NUM_CAN_DEFAULT 8U 414c9e6b80dSMarc Kleine-Budde #define MCP251XFD_TX_OBJ_NUM_CANFD_DEFAULT 4U 415c9e6b80dSMarc Kleine-Budde #define MCP251XFD_TX_FIFO_DEPTH_MIN 2U 416656fc12dSMarc Kleine-Budde #define MCP251XFD_TX_FIFO_DEPTH_COALESCE_MIN 2U 417c9e6b80dSMarc Kleine-Budde 418aada7422SMarc Kleine-Budde static_assert(MCP251XFD_FIFO_TEF_NUM == 1U); 419aada7422SMarc Kleine-Budde static_assert(MCP251XFD_FIFO_TEF_NUM == MCP251XFD_FIFO_TX_NUM); 420c9e6b80dSMarc Kleine-Budde static_assert(MCP251XFD_FIFO_RX_NUM <= 4U); 421aada7422SMarc Kleine-Budde 422875347feSMarc Kleine-Budde /* Silence TX MAB overflow warnings */ 423eb79a267SMarc Kleine-Budde #define MCP251XFD_QUIRK_MAB_NO_WARN BIT(0) 424875347feSMarc Kleine-Budde /* Use CRC to access registers */ 425eb79a267SMarc Kleine-Budde #define MCP251XFD_QUIRK_CRC_REG BIT(1) 426875347feSMarc Kleine-Budde /* Use CRC to access RX/TEF-RAM */ 427eb79a267SMarc Kleine-Budde #define MCP251XFD_QUIRK_CRC_RX BIT(2) 428875347feSMarc Kleine-Budde /* Use CRC to access TX-RAM */ 429eb79a267SMarc Kleine-Budde #define MCP251XFD_QUIRK_CRC_TX BIT(3) 430875347feSMarc Kleine-Budde /* Enable ECC for RAM */ 431eb79a267SMarc Kleine-Budde #define MCP251XFD_QUIRK_ECC BIT(4) 432875347feSMarc Kleine-Budde /* Use Half Duplex SPI transfers */ 433eb79a267SMarc Kleine-Budde #define MCP251XFD_QUIRK_HALF_DUPLEX BIT(5) 434875347feSMarc Kleine-Budde 435eb79a267SMarc Kleine-Budde struct mcp251xfd_hw_tef_obj { 436875347feSMarc Kleine-Budde u32 id; 437875347feSMarc Kleine-Budde u32 flags; 438875347feSMarc Kleine-Budde u32 ts; 439875347feSMarc Kleine-Budde }; 440875347feSMarc Kleine-Budde 441875347feSMarc Kleine-Budde /* The tx_obj_raw version is used in spi async, i.e. without 442875347feSMarc Kleine-Budde * regmap. We have to take care of endianness ourselves. 443875347feSMarc Kleine-Budde */ 444eb79a267SMarc Kleine-Budde struct mcp251xfd_hw_tx_obj_raw { 445875347feSMarc Kleine-Budde __le32 id; 446875347feSMarc Kleine-Budde __le32 flags; 447875347feSMarc Kleine-Budde u8 data[sizeof_field(struct canfd_frame, data)]; 448875347feSMarc Kleine-Budde }; 449875347feSMarc Kleine-Budde 450eb79a267SMarc Kleine-Budde struct mcp251xfd_hw_tx_obj_can { 451875347feSMarc Kleine-Budde u32 id; 452875347feSMarc Kleine-Budde u32 flags; 453875347feSMarc Kleine-Budde u8 data[sizeof_field(struct can_frame, data)]; 454875347feSMarc Kleine-Budde }; 455875347feSMarc Kleine-Budde 456eb79a267SMarc Kleine-Budde struct mcp251xfd_hw_tx_obj_canfd { 457875347feSMarc Kleine-Budde u32 id; 458875347feSMarc Kleine-Budde u32 flags; 459875347feSMarc Kleine-Budde u8 data[sizeof_field(struct canfd_frame, data)]; 460875347feSMarc Kleine-Budde }; 461875347feSMarc Kleine-Budde 462eb79a267SMarc Kleine-Budde struct mcp251xfd_hw_rx_obj_can { 463875347feSMarc Kleine-Budde u32 id; 464875347feSMarc Kleine-Budde u32 flags; 465875347feSMarc Kleine-Budde u32 ts; 466875347feSMarc Kleine-Budde u8 data[sizeof_field(struct can_frame, data)]; 467875347feSMarc Kleine-Budde }; 468875347feSMarc Kleine-Budde 469eb79a267SMarc Kleine-Budde struct mcp251xfd_hw_rx_obj_canfd { 470875347feSMarc Kleine-Budde u32 id; 471875347feSMarc Kleine-Budde u32 flags; 472875347feSMarc Kleine-Budde u32 ts; 473875347feSMarc Kleine-Budde u8 data[sizeof_field(struct canfd_frame, data)]; 474875347feSMarc Kleine-Budde }; 475875347feSMarc Kleine-Budde 476eb79a267SMarc Kleine-Budde struct __packed mcp251xfd_buf_cmd { 477875347feSMarc Kleine-Budde __be16 cmd; 478875347feSMarc Kleine-Budde }; 479875347feSMarc Kleine-Budde 480eb79a267SMarc Kleine-Budde struct __packed mcp251xfd_buf_cmd_crc { 481875347feSMarc Kleine-Budde __be16 cmd; 482875347feSMarc Kleine-Budde u8 len; 483875347feSMarc Kleine-Budde }; 484875347feSMarc Kleine-Budde 485eb79a267SMarc Kleine-Budde union mcp251xfd_tx_obj_load_buf { 486875347feSMarc Kleine-Budde struct __packed { 487eb79a267SMarc Kleine-Budde struct mcp251xfd_buf_cmd cmd; 488eb79a267SMarc Kleine-Budde struct mcp251xfd_hw_tx_obj_raw hw_tx_obj; 489875347feSMarc Kleine-Budde } nocrc; 490875347feSMarc Kleine-Budde struct __packed { 491eb79a267SMarc Kleine-Budde struct mcp251xfd_buf_cmd_crc cmd; 492eb79a267SMarc Kleine-Budde struct mcp251xfd_hw_tx_obj_raw hw_tx_obj; 493875347feSMarc Kleine-Budde __be16 crc; 494875347feSMarc Kleine-Budde } crc; 495875347feSMarc Kleine-Budde } ____cacheline_aligned; 496875347feSMarc Kleine-Budde 497eb79a267SMarc Kleine-Budde union mcp251xfd_write_reg_buf { 498875347feSMarc Kleine-Budde struct __packed { 499eb79a267SMarc Kleine-Budde struct mcp251xfd_buf_cmd cmd; 500875347feSMarc Kleine-Budde u8 data[4]; 501875347feSMarc Kleine-Budde } nocrc; 502875347feSMarc Kleine-Budde struct __packed { 503eb79a267SMarc Kleine-Budde struct mcp251xfd_buf_cmd_crc cmd; 504875347feSMarc Kleine-Budde u8 data[4]; 505875347feSMarc Kleine-Budde __be16 crc; 506875347feSMarc Kleine-Budde } crc; 507875347feSMarc Kleine-Budde } ____cacheline_aligned; 508875347feSMarc Kleine-Budde 509eb79a267SMarc Kleine-Budde struct mcp251xfd_tx_obj { 510875347feSMarc Kleine-Budde struct spi_message msg; 511875347feSMarc Kleine-Budde struct spi_transfer xfer[2]; 512eb79a267SMarc Kleine-Budde union mcp251xfd_tx_obj_load_buf buf; 513875347feSMarc Kleine-Budde }; 514875347feSMarc Kleine-Budde 51563e70488SMarc Kleine-Budde struct mcp251xfd_tef_ring { 51663e70488SMarc Kleine-Budde unsigned int head; 51763e70488SMarc Kleine-Budde unsigned int tail; 51863e70488SMarc Kleine-Budde 51963e70488SMarc Kleine-Budde /* u8 obj_num equals tx_ring->obj_num */ 52063e70488SMarc Kleine-Budde /* u8 obj_size equals sizeof(struct mcp251xfd_hw_tef_obj) */ 52168c0c1c7SMarc Kleine-Budde 522169d00a2SMarc Kleine-Budde union mcp251xfd_write_reg_buf irq_enable_buf; 523169d00a2SMarc Kleine-Budde struct spi_transfer irq_enable_xfer; 524169d00a2SMarc Kleine-Budde struct spi_message irq_enable_msg; 525169d00a2SMarc Kleine-Budde 52668c0c1c7SMarc Kleine-Budde union mcp251xfd_write_reg_buf uinc_buf; 527169d00a2SMarc Kleine-Budde union mcp251xfd_write_reg_buf uinc_irq_disable_buf; 52868c0c1c7SMarc Kleine-Budde struct spi_transfer uinc_xfer[MCP251XFD_TX_OBJ_NUM_MAX]; 52963e70488SMarc Kleine-Budde }; 53063e70488SMarc Kleine-Budde 531eb79a267SMarc Kleine-Budde struct mcp251xfd_tx_ring { 532875347feSMarc Kleine-Budde unsigned int head; 533875347feSMarc Kleine-Budde unsigned int tail; 534875347feSMarc Kleine-Budde 535875347feSMarc Kleine-Budde u16 base; 536c912f19eSMarc Kleine-Budde u8 nr; 537c912f19eSMarc Kleine-Budde u8 fifo_nr; 538875347feSMarc Kleine-Budde u8 obj_num; 539875347feSMarc Kleine-Budde u8 obj_size; 540875347feSMarc Kleine-Budde 541eb79a267SMarc Kleine-Budde struct mcp251xfd_tx_obj obj[MCP251XFD_TX_OBJ_NUM_MAX]; 542eb79a267SMarc Kleine-Budde union mcp251xfd_write_reg_buf rts_buf; 543875347feSMarc Kleine-Budde }; 544875347feSMarc Kleine-Budde 545eb79a267SMarc Kleine-Budde struct mcp251xfd_rx_ring { 546875347feSMarc Kleine-Budde unsigned int head; 547875347feSMarc Kleine-Budde unsigned int tail; 548875347feSMarc Kleine-Budde 549875347feSMarc Kleine-Budde u16 base; 550875347feSMarc Kleine-Budde u8 nr; 551875347feSMarc Kleine-Budde u8 fifo_nr; 552875347feSMarc Kleine-Budde u8 obj_num; 553875347feSMarc Kleine-Budde u8 obj_size; 554875347feSMarc Kleine-Budde 55560a848c5SMarc Kleine-Budde union mcp251xfd_write_reg_buf irq_enable_buf; 55660a848c5SMarc Kleine-Budde struct spi_transfer irq_enable_xfer; 55760a848c5SMarc Kleine-Budde struct spi_message irq_enable_msg; 55860a848c5SMarc Kleine-Budde 5591f652bb6SUrsula Maplehurst union mcp251xfd_write_reg_buf uinc_buf; 56060a848c5SMarc Kleine-Budde union mcp251xfd_write_reg_buf uinc_irq_disable_buf; 561c9e6b80dSMarc Kleine-Budde struct spi_transfer uinc_xfer[MCP251XFD_FIFO_DEPTH]; 562eb79a267SMarc Kleine-Budde struct mcp251xfd_hw_rx_obj_canfd obj[]; 563875347feSMarc Kleine-Budde }; 564875347feSMarc Kleine-Budde 565eb79a267SMarc Kleine-Budde struct __packed mcp251xfd_map_buf_nocrc { 566eb79a267SMarc Kleine-Budde struct mcp251xfd_buf_cmd cmd; 567875347feSMarc Kleine-Budde u8 data[256]; 568875347feSMarc Kleine-Budde } ____cacheline_aligned; 569875347feSMarc Kleine-Budde 570eb79a267SMarc Kleine-Budde struct __packed mcp251xfd_map_buf_crc { 571eb79a267SMarc Kleine-Budde struct mcp251xfd_buf_cmd_crc cmd; 572875347feSMarc Kleine-Budde u8 data[256 - 4]; 573875347feSMarc Kleine-Budde __be16 crc; 574875347feSMarc Kleine-Budde } ____cacheline_aligned; 575875347feSMarc Kleine-Budde 576eb79a267SMarc Kleine-Budde struct mcp251xfd_ecc { 577875347feSMarc Kleine-Budde u32 ecc_stat; 578875347feSMarc Kleine-Budde int cnt; 579875347feSMarc Kleine-Budde }; 580875347feSMarc Kleine-Budde 581eb79a267SMarc Kleine-Budde struct mcp251xfd_regs_status { 582875347feSMarc Kleine-Budde u32 intf; 583887e359dSMarc Kleine-Budde u32 rxif; 584875347feSMarc Kleine-Budde }; 585875347feSMarc Kleine-Budde 586eb79a267SMarc Kleine-Budde enum mcp251xfd_model { 587eb79a267SMarc Kleine-Budde MCP251XFD_MODEL_MCP2517FD = 0x2517, 588eb79a267SMarc Kleine-Budde MCP251XFD_MODEL_MCP2518FD = 0x2518, 589eb79a267SMarc Kleine-Budde MCP251XFD_MODEL_MCP251XFD = 0xffff, /* autodetect model */ 590875347feSMarc Kleine-Budde }; 591875347feSMarc Kleine-Budde 592eb79a267SMarc Kleine-Budde struct mcp251xfd_devtype_data { 593eb79a267SMarc Kleine-Budde enum mcp251xfd_model model; 594875347feSMarc Kleine-Budde u32 quirks; 595875347feSMarc Kleine-Budde }; 596875347feSMarc Kleine-Budde 5979263c2e9SMarc Kleine-Budde enum mcp251xfd_flags { 59860a848c5SMarc Kleine-Budde MCP251XFD_FLAGS_DOWN, 5999263c2e9SMarc Kleine-Budde MCP251XFD_FLAGS_FD_MODE, 6009263c2e9SMarc Kleine-Budde 6019263c2e9SMarc Kleine-Budde __MCP251XFD_FLAGS_SIZE__ 6029263c2e9SMarc Kleine-Budde }; 6039263c2e9SMarc Kleine-Budde 604eb79a267SMarc Kleine-Budde struct mcp251xfd_priv { 605875347feSMarc Kleine-Budde struct can_priv can; 606875347feSMarc Kleine-Budde struct can_rx_offload offload; 607875347feSMarc Kleine-Budde struct net_device *ndev; 608875347feSMarc Kleine-Budde 609875347feSMarc Kleine-Budde struct regmap *map_reg; /* register access */ 610875347feSMarc Kleine-Budde struct regmap *map_rx; /* RX/TEF RAM access */ 611875347feSMarc Kleine-Budde 612875347feSMarc Kleine-Budde struct regmap *map_nocrc; 613eb79a267SMarc Kleine-Budde struct mcp251xfd_map_buf_nocrc *map_buf_nocrc_rx; 614eb79a267SMarc Kleine-Budde struct mcp251xfd_map_buf_nocrc *map_buf_nocrc_tx; 615875347feSMarc Kleine-Budde 616875347feSMarc Kleine-Budde struct regmap *map_crc; 617eb79a267SMarc Kleine-Budde struct mcp251xfd_map_buf_crc *map_buf_crc_rx; 618eb79a267SMarc Kleine-Budde struct mcp251xfd_map_buf_crc *map_buf_crc_tx; 619875347feSMarc Kleine-Budde 620875347feSMarc Kleine-Budde struct spi_device *spi; 621875347feSMarc Kleine-Budde u32 spi_max_speed_hz_orig; 6222a68dd86SMarc Kleine-Budde u32 spi_max_speed_hz_fast; 6232a68dd86SMarc Kleine-Budde u32 spi_max_speed_hz_slow; 624875347feSMarc Kleine-Budde 625aada7422SMarc Kleine-Budde struct mcp251xfd_tef_ring tef[MCP251XFD_FIFO_TEF_NUM]; 626c9e6b80dSMarc Kleine-Budde struct mcp251xfd_rx_ring *rx[MCP251XFD_FIFO_RX_NUM]; 627aada7422SMarc Kleine-Budde struct mcp251xfd_tx_ring tx[MCP251XFD_FIFO_TX_NUM]; 628875347feSMarc Kleine-Budde 6299263c2e9SMarc Kleine-Budde DECLARE_BITMAP(flags, __MCP251XFD_FLAGS_SIZE__); 6309263c2e9SMarc Kleine-Budde 631875347feSMarc Kleine-Budde u8 rx_ring_num; 632d86ba8dbSMarc Kleine-Budde u8 rx_obj_num; 63360a848c5SMarc Kleine-Budde u8 rx_obj_num_coalesce_irq; 634169d00a2SMarc Kleine-Budde u8 tx_obj_num_coalesce_irq; 63560a848c5SMarc Kleine-Budde 63660a848c5SMarc Kleine-Budde u32 rx_coalesce_usecs_irq; 637169d00a2SMarc Kleine-Budde u32 tx_coalesce_usecs_irq; 63860a848c5SMarc Kleine-Budde struct hrtimer rx_irq_timer; 639169d00a2SMarc Kleine-Budde struct hrtimer tx_irq_timer; 640875347feSMarc Kleine-Budde 641eb79a267SMarc Kleine-Budde struct mcp251xfd_ecc ecc; 642eb79a267SMarc Kleine-Budde struct mcp251xfd_regs_status regs_status; 643875347feSMarc Kleine-Budde 644efd8d98dSMarc Kleine-Budde struct cyclecounter cc; 645efd8d98dSMarc Kleine-Budde struct timecounter tc; 646efd8d98dSMarc Kleine-Budde struct delayed_work timestamp; 647efd8d98dSMarc Kleine-Budde 648875347feSMarc Kleine-Budde struct gpio_desc *rx_int; 649875347feSMarc Kleine-Budde struct clk *clk; 6502a68dd86SMarc Kleine-Budde bool pll_enable; 651875347feSMarc Kleine-Budde struct regulator *reg_vdd; 652875347feSMarc Kleine-Budde struct regulator *reg_xceiver; 653875347feSMarc Kleine-Budde 654eb79a267SMarc Kleine-Budde struct mcp251xfd_devtype_data devtype_data; 655875347feSMarc Kleine-Budde struct can_berr_counter bec; 656875347feSMarc Kleine-Budde }; 657875347feSMarc Kleine-Budde 658eb79a267SMarc Kleine-Budde #define MCP251XFD_IS(_model) \ 659875347feSMarc Kleine-Budde static inline bool \ 660eb79a267SMarc Kleine-Budde mcp251xfd_is_##_model(const struct mcp251xfd_priv *priv) \ 661875347feSMarc Kleine-Budde { \ 662eb79a267SMarc Kleine-Budde return priv->devtype_data.model == MCP251XFD_MODEL_MCP##_model##FD; \ 663875347feSMarc Kleine-Budde } 664875347feSMarc Kleine-Budde 665eb79a267SMarc Kleine-Budde MCP251XFD_IS(2517); 666eb79a267SMarc Kleine-Budde MCP251XFD_IS(2518); 667eb79a267SMarc Kleine-Budde MCP251XFD_IS(251X); 668875347feSMarc Kleine-Budde 6693044a4f2SMarc Kleine-Budde static inline bool mcp251xfd_is_fd_mode(const struct mcp251xfd_priv *priv) 6703044a4f2SMarc Kleine-Budde { 6713044a4f2SMarc Kleine-Budde /* listen-only mode works like FD mode */ 6723044a4f2SMarc Kleine-Budde return priv->can.ctrlmode & (CAN_CTRLMODE_LISTENONLY | CAN_CTRLMODE_FD); 6733044a4f2SMarc Kleine-Budde } 6743044a4f2SMarc Kleine-Budde 675eb79a267SMarc Kleine-Budde static inline u8 mcp251xfd_first_byte_set(u32 mask) 676875347feSMarc Kleine-Budde { 677875347feSMarc Kleine-Budde return (mask & 0x0000ffff) ? 678875347feSMarc Kleine-Budde ((mask & 0x000000ff) ? 0 : 1) : 679875347feSMarc Kleine-Budde ((mask & 0x00ff0000) ? 2 : 3); 680875347feSMarc Kleine-Budde } 681875347feSMarc Kleine-Budde 682eb79a267SMarc Kleine-Budde static inline u8 mcp251xfd_last_byte_set(u32 mask) 683875347feSMarc Kleine-Budde { 684875347feSMarc Kleine-Budde return (mask & 0xffff0000) ? 685875347feSMarc Kleine-Budde ((mask & 0xff000000) ? 3 : 2) : 686875347feSMarc Kleine-Budde ((mask & 0x0000ff00) ? 1 : 0); 687875347feSMarc Kleine-Budde } 688875347feSMarc Kleine-Budde 689eb79a267SMarc Kleine-Budde static inline __be16 mcp251xfd_cmd_reset(void) 690875347feSMarc Kleine-Budde { 691eb79a267SMarc Kleine-Budde return cpu_to_be16(MCP251XFD_SPI_INSTRUCTION_RESET); 692875347feSMarc Kleine-Budde } 693875347feSMarc Kleine-Budde 694875347feSMarc Kleine-Budde static inline void 695eb79a267SMarc Kleine-Budde mcp251xfd_spi_cmd_read_nocrc(struct mcp251xfd_buf_cmd *cmd, u16 addr) 696875347feSMarc Kleine-Budde { 697eb79a267SMarc Kleine-Budde cmd->cmd = cpu_to_be16(MCP251XFD_SPI_INSTRUCTION_READ | addr); 698875347feSMarc Kleine-Budde } 699875347feSMarc Kleine-Budde 700875347feSMarc Kleine-Budde static inline void 701eb79a267SMarc Kleine-Budde mcp251xfd_spi_cmd_write_nocrc(struct mcp251xfd_buf_cmd *cmd, u16 addr) 702875347feSMarc Kleine-Budde { 703eb79a267SMarc Kleine-Budde cmd->cmd = cpu_to_be16(MCP251XFD_SPI_INSTRUCTION_WRITE | addr); 704875347feSMarc Kleine-Budde } 705875347feSMarc Kleine-Budde 706eb79a267SMarc Kleine-Budde static inline bool mcp251xfd_reg_in_ram(unsigned int reg) 707875347feSMarc Kleine-Budde { 708875347feSMarc Kleine-Budde static const struct regmap_range range = 709eb79a267SMarc Kleine-Budde regmap_reg_range(MCP251XFD_RAM_START, 710eb79a267SMarc Kleine-Budde MCP251XFD_RAM_START + MCP251XFD_RAM_SIZE - 4); 711875347feSMarc Kleine-Budde 712875347feSMarc Kleine-Budde return regmap_reg_in_range(reg, &range); 713875347feSMarc Kleine-Budde } 714875347feSMarc Kleine-Budde 715875347feSMarc Kleine-Budde static inline void 716eb79a267SMarc Kleine-Budde __mcp251xfd_spi_cmd_crc_set_len(struct mcp251xfd_buf_cmd_crc *cmd, 717875347feSMarc Kleine-Budde u16 len, bool in_ram) 718875347feSMarc Kleine-Budde { 719875347feSMarc Kleine-Budde /* Number of u32 for RAM access, number of u8 otherwise. */ 720875347feSMarc Kleine-Budde if (in_ram) 721875347feSMarc Kleine-Budde cmd->len = len >> 2; 722875347feSMarc Kleine-Budde else 723875347feSMarc Kleine-Budde cmd->len = len; 724875347feSMarc Kleine-Budde } 725875347feSMarc Kleine-Budde 726875347feSMarc Kleine-Budde static inline void 727eb79a267SMarc Kleine-Budde mcp251xfd_spi_cmd_crc_set_len_in_ram(struct mcp251xfd_buf_cmd_crc *cmd, u16 len) 728875347feSMarc Kleine-Budde { 729eb79a267SMarc Kleine-Budde __mcp251xfd_spi_cmd_crc_set_len(cmd, len, true); 730875347feSMarc Kleine-Budde } 731875347feSMarc Kleine-Budde 732875347feSMarc Kleine-Budde static inline void 733eb79a267SMarc Kleine-Budde mcp251xfd_spi_cmd_crc_set_len_in_reg(struct mcp251xfd_buf_cmd_crc *cmd, u16 len) 734875347feSMarc Kleine-Budde { 735eb79a267SMarc Kleine-Budde __mcp251xfd_spi_cmd_crc_set_len(cmd, len, false); 736875347feSMarc Kleine-Budde } 737875347feSMarc Kleine-Budde 738875347feSMarc Kleine-Budde static inline void 739eb79a267SMarc Kleine-Budde mcp251xfd_spi_cmd_read_crc_set_addr(struct mcp251xfd_buf_cmd_crc *cmd, u16 addr) 740875347feSMarc Kleine-Budde { 741eb79a267SMarc Kleine-Budde cmd->cmd = cpu_to_be16(MCP251XFD_SPI_INSTRUCTION_READ_CRC | addr); 742875347feSMarc Kleine-Budde } 743875347feSMarc Kleine-Budde 744875347feSMarc Kleine-Budde static inline void 745eb79a267SMarc Kleine-Budde mcp251xfd_spi_cmd_read_crc(struct mcp251xfd_buf_cmd_crc *cmd, 746875347feSMarc Kleine-Budde u16 addr, u16 len) 747875347feSMarc Kleine-Budde { 748eb79a267SMarc Kleine-Budde mcp251xfd_spi_cmd_read_crc_set_addr(cmd, addr); 749eb79a267SMarc Kleine-Budde __mcp251xfd_spi_cmd_crc_set_len(cmd, len, mcp251xfd_reg_in_ram(addr)); 750875347feSMarc Kleine-Budde } 751875347feSMarc Kleine-Budde 752875347feSMarc Kleine-Budde static inline void 753eb79a267SMarc Kleine-Budde mcp251xfd_spi_cmd_write_crc_set_addr(struct mcp251xfd_buf_cmd_crc *cmd, 754875347feSMarc Kleine-Budde u16 addr) 755875347feSMarc Kleine-Budde { 756eb79a267SMarc Kleine-Budde cmd->cmd = cpu_to_be16(MCP251XFD_SPI_INSTRUCTION_WRITE_CRC | addr); 757875347feSMarc Kleine-Budde } 758875347feSMarc Kleine-Budde 759875347feSMarc Kleine-Budde static inline void 760eb79a267SMarc Kleine-Budde mcp251xfd_spi_cmd_write_crc(struct mcp251xfd_buf_cmd_crc *cmd, 761875347feSMarc Kleine-Budde u16 addr, u16 len) 762875347feSMarc Kleine-Budde { 763eb79a267SMarc Kleine-Budde mcp251xfd_spi_cmd_write_crc_set_addr(cmd, addr); 764eb79a267SMarc Kleine-Budde __mcp251xfd_spi_cmd_crc_set_len(cmd, len, mcp251xfd_reg_in_ram(addr)); 765875347feSMarc Kleine-Budde } 766875347feSMarc Kleine-Budde 767875347feSMarc Kleine-Budde static inline u8 * 768eb79a267SMarc Kleine-Budde mcp251xfd_spi_cmd_write(const struct mcp251xfd_priv *priv, 769eb79a267SMarc Kleine-Budde union mcp251xfd_write_reg_buf *write_reg_buf, 770875347feSMarc Kleine-Budde u16 addr) 771875347feSMarc Kleine-Budde { 772875347feSMarc Kleine-Budde u8 *data; 773875347feSMarc Kleine-Budde 774eb79a267SMarc Kleine-Budde if (priv->devtype_data.quirks & MCP251XFD_QUIRK_CRC_REG) { 775eb79a267SMarc Kleine-Budde mcp251xfd_spi_cmd_write_crc_set_addr(&write_reg_buf->crc.cmd, 776875347feSMarc Kleine-Budde addr); 777875347feSMarc Kleine-Budde data = write_reg_buf->crc.data; 778875347feSMarc Kleine-Budde } else { 779eb79a267SMarc Kleine-Budde mcp251xfd_spi_cmd_write_nocrc(&write_reg_buf->nocrc.cmd, 780875347feSMarc Kleine-Budde addr); 781875347feSMarc Kleine-Budde data = write_reg_buf->nocrc.data; 782875347feSMarc Kleine-Budde } 783875347feSMarc Kleine-Budde 784875347feSMarc Kleine-Budde return data; 785875347feSMarc Kleine-Budde } 786875347feSMarc Kleine-Budde 787dc09e7e3SMarc Kleine-Budde static inline int mcp251xfd_get_timestamp(const struct mcp251xfd_priv *priv, 788dc09e7e3SMarc Kleine-Budde u32 *timestamp) 789dc09e7e3SMarc Kleine-Budde { 790dc09e7e3SMarc Kleine-Budde return regmap_read(priv->map_reg, MCP251XFD_REG_TBC, timestamp); 791dc09e7e3SMarc Kleine-Budde } 792dc09e7e3SMarc Kleine-Budde 793eb79a267SMarc Kleine-Budde static inline u16 mcp251xfd_get_tef_obj_addr(u8 n) 794875347feSMarc Kleine-Budde { 795eb79a267SMarc Kleine-Budde return MCP251XFD_RAM_START + 796eb79a267SMarc Kleine-Budde sizeof(struct mcp251xfd_hw_tef_obj) * n; 797875347feSMarc Kleine-Budde } 798875347feSMarc Kleine-Budde 799875347feSMarc Kleine-Budde static inline u16 800eb79a267SMarc Kleine-Budde mcp251xfd_get_tx_obj_addr(const struct mcp251xfd_tx_ring *ring, u8 n) 801875347feSMarc Kleine-Budde { 802875347feSMarc Kleine-Budde return ring->base + ring->obj_size * n; 803875347feSMarc Kleine-Budde } 804875347feSMarc Kleine-Budde 805875347feSMarc Kleine-Budde static inline u16 806eb79a267SMarc Kleine-Budde mcp251xfd_get_rx_obj_addr(const struct mcp251xfd_rx_ring *ring, u8 n) 807875347feSMarc Kleine-Budde { 808875347feSMarc Kleine-Budde return ring->base + ring->obj_size * n; 809875347feSMarc Kleine-Budde } 810875347feSMarc Kleine-Budde 8111e846c7aSMarc Kleine-Budde static inline int 8121e846c7aSMarc Kleine-Budde mcp251xfd_tx_tail_get_from_chip(const struct mcp251xfd_priv *priv, 8131e846c7aSMarc Kleine-Budde u8 *tx_tail) 8141e846c7aSMarc Kleine-Budde { 8151e846c7aSMarc Kleine-Budde u32 fifo_sta; 8161e846c7aSMarc Kleine-Budde int err; 8171e846c7aSMarc Kleine-Budde 8181e846c7aSMarc Kleine-Budde err = regmap_read(priv->map_reg, 819c912f19eSMarc Kleine-Budde MCP251XFD_REG_FIFOSTA(priv->tx->fifo_nr), 8201e846c7aSMarc Kleine-Budde &fifo_sta); 8211e846c7aSMarc Kleine-Budde if (err) 8221e846c7aSMarc Kleine-Budde return err; 8231e846c7aSMarc Kleine-Budde 8241e846c7aSMarc Kleine-Budde *tx_tail = FIELD_GET(MCP251XFD_REG_FIFOSTA_FIFOCI_MASK, fifo_sta); 8251e846c7aSMarc Kleine-Budde 8261e846c7aSMarc Kleine-Budde return 0; 8271e846c7aSMarc Kleine-Budde } 8281e846c7aSMarc Kleine-Budde 829eb79a267SMarc Kleine-Budde static inline u8 mcp251xfd_get_tef_head(const struct mcp251xfd_priv *priv) 830875347feSMarc Kleine-Budde { 831dada6a6cSMarc Kleine-Budde return priv->tef->head & (priv->tx->obj_num - 1); 832875347feSMarc Kleine-Budde } 833875347feSMarc Kleine-Budde 834eb79a267SMarc Kleine-Budde static inline u8 mcp251xfd_get_tef_tail(const struct mcp251xfd_priv *priv) 835875347feSMarc Kleine-Budde { 836dada6a6cSMarc Kleine-Budde return priv->tef->tail & (priv->tx->obj_num - 1); 837875347feSMarc Kleine-Budde } 838875347feSMarc Kleine-Budde 839eb79a267SMarc Kleine-Budde static inline u8 mcp251xfd_get_tef_len(const struct mcp251xfd_priv *priv) 840875347feSMarc Kleine-Budde { 841dada6a6cSMarc Kleine-Budde return priv->tef->head - priv->tef->tail; 842875347feSMarc Kleine-Budde } 843875347feSMarc Kleine-Budde 844eb79a267SMarc Kleine-Budde static inline u8 mcp251xfd_get_tef_linear_len(const struct mcp251xfd_priv *priv) 845875347feSMarc Kleine-Budde { 846875347feSMarc Kleine-Budde u8 len; 847875347feSMarc Kleine-Budde 848eb79a267SMarc Kleine-Budde len = mcp251xfd_get_tef_len(priv); 849875347feSMarc Kleine-Budde 850eb79a267SMarc Kleine-Budde return min_t(u8, len, priv->tx->obj_num - mcp251xfd_get_tef_tail(priv)); 851875347feSMarc Kleine-Budde } 852875347feSMarc Kleine-Budde 853eb79a267SMarc Kleine-Budde static inline u8 mcp251xfd_get_tx_head(const struct mcp251xfd_tx_ring *ring) 854875347feSMarc Kleine-Budde { 855875347feSMarc Kleine-Budde return ring->head & (ring->obj_num - 1); 856875347feSMarc Kleine-Budde } 857875347feSMarc Kleine-Budde 858eb79a267SMarc Kleine-Budde static inline u8 mcp251xfd_get_tx_tail(const struct mcp251xfd_tx_ring *ring) 859875347feSMarc Kleine-Budde { 860875347feSMarc Kleine-Budde return ring->tail & (ring->obj_num - 1); 861875347feSMarc Kleine-Budde } 862875347feSMarc Kleine-Budde 863eb79a267SMarc Kleine-Budde static inline u8 mcp251xfd_get_tx_free(const struct mcp251xfd_tx_ring *ring) 864875347feSMarc Kleine-Budde { 865875347feSMarc Kleine-Budde return ring->obj_num - (ring->head - ring->tail); 866875347feSMarc Kleine-Budde } 867875347feSMarc Kleine-Budde 868875347feSMarc Kleine-Budde static inline int 869eb79a267SMarc Kleine-Budde mcp251xfd_get_tx_nr_by_addr(const struct mcp251xfd_tx_ring *tx_ring, u8 *nr, 870875347feSMarc Kleine-Budde u16 addr) 871875347feSMarc Kleine-Budde { 872eb79a267SMarc Kleine-Budde if (addr < mcp251xfd_get_tx_obj_addr(tx_ring, 0) || 873eb79a267SMarc Kleine-Budde addr >= mcp251xfd_get_tx_obj_addr(tx_ring, tx_ring->obj_num)) 874875347feSMarc Kleine-Budde return -ENOENT; 875875347feSMarc Kleine-Budde 876eb79a267SMarc Kleine-Budde *nr = (addr - mcp251xfd_get_tx_obj_addr(tx_ring, 0)) / 877875347feSMarc Kleine-Budde tx_ring->obj_size; 878875347feSMarc Kleine-Budde 879875347feSMarc Kleine-Budde return 0; 880875347feSMarc Kleine-Budde } 881875347feSMarc Kleine-Budde 882eb79a267SMarc Kleine-Budde static inline u8 mcp251xfd_get_rx_head(const struct mcp251xfd_rx_ring *ring) 883875347feSMarc Kleine-Budde { 884875347feSMarc Kleine-Budde return ring->head & (ring->obj_num - 1); 885875347feSMarc Kleine-Budde } 886875347feSMarc Kleine-Budde 887eb79a267SMarc Kleine-Budde static inline u8 mcp251xfd_get_rx_tail(const struct mcp251xfd_rx_ring *ring) 888875347feSMarc Kleine-Budde { 889875347feSMarc Kleine-Budde return ring->tail & (ring->obj_num - 1); 890875347feSMarc Kleine-Budde } 891875347feSMarc Kleine-Budde 892eb79a267SMarc Kleine-Budde static inline u8 mcp251xfd_get_rx_len(const struct mcp251xfd_rx_ring *ring) 893875347feSMarc Kleine-Budde { 894875347feSMarc Kleine-Budde return ring->head - ring->tail; 895875347feSMarc Kleine-Budde } 896875347feSMarc Kleine-Budde 897875347feSMarc Kleine-Budde static inline u8 898eb79a267SMarc Kleine-Budde mcp251xfd_get_rx_linear_len(const struct mcp251xfd_rx_ring *ring) 899875347feSMarc Kleine-Budde { 900875347feSMarc Kleine-Budde u8 len; 901875347feSMarc Kleine-Budde 902eb79a267SMarc Kleine-Budde len = mcp251xfd_get_rx_len(ring); 903875347feSMarc Kleine-Budde 904eb79a267SMarc Kleine-Budde return min_t(u8, len, ring->obj_num - mcp251xfd_get_rx_tail(ring)); 905875347feSMarc Kleine-Budde } 906875347feSMarc Kleine-Budde 907eb79a267SMarc Kleine-Budde #define mcp251xfd_for_each_tx_obj(ring, _obj, n) \ 908875347feSMarc Kleine-Budde for ((n) = 0, (_obj) = &(ring)->obj[(n)]; \ 909875347feSMarc Kleine-Budde (n) < (ring)->obj_num; \ 910875347feSMarc Kleine-Budde (n)++, (_obj) = &(ring)->obj[(n)]) 911875347feSMarc Kleine-Budde 912eb79a267SMarc Kleine-Budde #define mcp251xfd_for_each_rx_ring(priv, ring, n) \ 913875347feSMarc Kleine-Budde for ((n) = 0, (ring) = *((priv)->rx + (n)); \ 914875347feSMarc Kleine-Budde (n) < (priv)->rx_ring_num; \ 915875347feSMarc Kleine-Budde (n)++, (ring) = *((priv)->rx + (n))) 916875347feSMarc Kleine-Budde 917335c818cSMarc Kleine-Budde int mcp251xfd_chip_fifo_init(const struct mcp251xfd_priv *priv); 918eb79a267SMarc Kleine-Budde u16 mcp251xfd_crc16_compute2(const void *cmd, size_t cmd_size, 919875347feSMarc Kleine-Budde const void *data, size_t data_size); 920eb79a267SMarc Kleine-Budde u16 mcp251xfd_crc16_compute(const void *data, size_t data_size); 921d86ba8dbSMarc Kleine-Budde void mcp251xfd_ethtool_init(struct mcp251xfd_priv *priv); 922cae9071bSMarc Kleine-Budde int mcp251xfd_regmap_init(struct mcp251xfd_priv *priv); 9239263c2e9SMarc Kleine-Budde extern const struct can_ram_config mcp251xfd_ram_config; 924fa0b68dfSMarc Kleine-Budde int mcp251xfd_ring_init(struct mcp251xfd_priv *priv); 92555bc37c8SMarc Kleine-Budde void mcp251xfd_ring_free(struct mcp251xfd_priv *priv); 92655bc37c8SMarc Kleine-Budde int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv); 927319fdbc9SMarc Kleine-Budde int mcp251xfd_handle_rxif(struct mcp251xfd_priv *priv); 9281e846c7aSMarc Kleine-Budde int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv); 929b2fcc707SMarc Kleine-Budde void mcp251xfd_skb_set_timestamp(const struct mcp251xfd_priv *priv, 930efd8d98dSMarc Kleine-Budde struct sk_buff *skb, u32 timestamp); 931efd8d98dSMarc Kleine-Budde void mcp251xfd_timestamp_init(struct mcp251xfd_priv *priv); 932efd8d98dSMarc Kleine-Budde void mcp251xfd_timestamp_stop(struct mcp251xfd_priv *priv); 933875347feSMarc Kleine-Budde 93409b0eb92SMarc Kleine-Budde netdev_tx_t mcp251xfd_start_xmit(struct sk_buff *skb, 93509b0eb92SMarc Kleine-Budde struct net_device *ndev); 93609b0eb92SMarc Kleine-Budde 937e0ab3dd5SMarc Kleine-Budde #if IS_ENABLED(CONFIG_DEV_COREDUMP) 938e0ab3dd5SMarc Kleine-Budde void mcp251xfd_dump(const struct mcp251xfd_priv *priv); 939e0ab3dd5SMarc Kleine-Budde #else 940e0ab3dd5SMarc Kleine-Budde static inline void mcp251xfd_dump(const struct mcp251xfd_priv *priv) 941e0ab3dd5SMarc Kleine-Budde { 942e0ab3dd5SMarc Kleine-Budde } 943e0ab3dd5SMarc Kleine-Budde #endif 944e0ab3dd5SMarc Kleine-Budde 945875347feSMarc Kleine-Budde #endif 946