0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef _FLEXCAN_H
0015 #define _FLEXCAN_H
0016
0017 #include <linux/can/rx-offload.h>
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040 #define FLEXCAN_QUIRK_BROKEN_WERR_STATE BIT(1)
0041
0042 #define FLEXCAN_QUIRK_DISABLE_RXFG BIT(2)
0043
0044 #define FLEXCAN_QUIRK_ENABLE_EACEN_RRS BIT(3)
0045
0046 #define FLEXCAN_QUIRK_DISABLE_MECR BIT(4)
0047
0048 #define FLEXCAN_QUIRK_USE_RX_MAILBOX BIT(5)
0049
0050 #define FLEXCAN_QUIRK_BROKEN_PERR_STATE BIT(6)
0051
0052 #define FLEXCAN_QUIRK_DEFAULT_BIG_ENDIAN BIT(7)
0053
0054 #define FLEXCAN_QUIRK_SETUP_STOP_MODE_GPR BIT(8)
0055
0056 #define FLEXCAN_QUIRK_SUPPORT_FD BIT(9)
0057
0058 #define FLEXCAN_QUIRK_SUPPORT_ECC BIT(10)
0059
0060 #define FLEXCAN_QUIRK_SETUP_STOP_MODE_SCFW BIT(11)
0061
0062 #define FLEXCAN_QUIRK_NR_IRQ_3 BIT(12)
0063
0064 #define FLEXCAN_QUIRK_NR_MB_16 BIT(13)
0065
0066 #define FLEXCAN_QUIRK_SUPPPORT_RX_MAILBOX BIT(14)
0067
0068 #define FLEXCAN_QUIRK_SUPPPORT_RX_MAILBOX_RTR BIT(15)
0069
0070 #define FLEXCAN_QUIRK_SUPPPORT_RX_FIFO BIT(16)
0071
0072 struct flexcan_devtype_data {
0073 u32 quirks;
0074 };
0075
0076 struct flexcan_stop_mode {
0077 struct regmap *gpr;
0078 u8 req_gpr;
0079 u8 req_bit;
0080 };
0081
0082 struct flexcan_priv {
0083 struct can_priv can;
0084 struct can_rx_offload offload;
0085 struct device *dev;
0086
0087 struct flexcan_regs __iomem *regs;
0088 struct flexcan_mb __iomem *tx_mb;
0089 struct flexcan_mb __iomem *tx_mb_reserved;
0090 u8 tx_mb_idx;
0091 u8 mb_count;
0092 u8 mb_size;
0093 u8 clk_src;
0094 u8 scu_idx;
0095
0096 u64 rx_mask;
0097 u64 tx_mask;
0098 u32 reg_ctrl_default;
0099
0100 struct clk *clk_ipg;
0101 struct clk *clk_per;
0102 struct flexcan_devtype_data devtype_data;
0103 struct regulator *reg_xceiver;
0104 struct flexcan_stop_mode stm;
0105
0106 int irq_boff;
0107 int irq_err;
0108
0109
0110 struct imx_sc_ipc *sc_ipc_handle;
0111
0112
0113 u32 (*read)(void __iomem *addr);
0114 void (*write)(u32 val, void __iomem *addr);
0115 };
0116
0117 extern const struct ethtool_ops flexcan_ethtool_ops;
0118
0119 static inline bool
0120 flexcan_supports_rx_mailbox(const struct flexcan_priv *priv)
0121 {
0122 const u32 quirks = priv->devtype_data.quirks;
0123
0124 return quirks & FLEXCAN_QUIRK_SUPPPORT_RX_MAILBOX;
0125 }
0126
0127 static inline bool
0128 flexcan_supports_rx_mailbox_rtr(const struct flexcan_priv *priv)
0129 {
0130 const u32 quirks = priv->devtype_data.quirks;
0131
0132 return (quirks & (FLEXCAN_QUIRK_SUPPPORT_RX_MAILBOX |
0133 FLEXCAN_QUIRK_SUPPPORT_RX_MAILBOX_RTR)) ==
0134 (FLEXCAN_QUIRK_SUPPPORT_RX_MAILBOX |
0135 FLEXCAN_QUIRK_SUPPPORT_RX_MAILBOX_RTR);
0136 }
0137
0138 static inline bool
0139 flexcan_supports_rx_fifo(const struct flexcan_priv *priv)
0140 {
0141 const u32 quirks = priv->devtype_data.quirks;
0142
0143 return quirks & FLEXCAN_QUIRK_SUPPPORT_RX_FIFO;
0144 }
0145
0146 static inline bool
0147 flexcan_active_rx_rtr(const struct flexcan_priv *priv)
0148 {
0149 const u32 quirks = priv->devtype_data.quirks;
0150
0151 if (quirks & FLEXCAN_QUIRK_USE_RX_MAILBOX) {
0152 if (quirks & FLEXCAN_QUIRK_SUPPPORT_RX_MAILBOX_RTR)
0153 return true;
0154 } else {
0155
0156 return true;
0157 }
0158
0159 return false;
0160 }
0161
0162
0163 #endif