flexcan.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. /* SPDX-License-Identifier: GPL-2.0
  2. * flexcan.c - FLEXCAN CAN controller driver
  3. *
  4. * Copyright (c) 2005-2006 Varma Electronics Oy
  5. * Copyright (c) 2009 Sascha Hauer, Pengutronix
  6. * Copyright (c) 2010-2017 Pengutronix, Marc Kleine-Budde <kernel@pengutronix.de>
  7. * Copyright (c) 2014 David Jander, Protonic Holland
  8. * Copyright (C) 2022 Amarula Solutions, Dario Binacchi <dario.binacchi@amarulasolutions.com>
  9. *
  10. * Based on code originally by Andrey Volkov <avolkov@varma-el.com>
  11. *
  12. */
  13. #ifndef _FLEXCAN_H
  14. #define _FLEXCAN_H
  15. #include <linux/can/rx-offload.h>
  16. /* FLEXCAN hardware feature flags
  17. *
  18. * Below is some version info we got:
  19. * SOC Version IP-Version Glitch- [TR]WRN_INT IRQ Err Memory err RTR rece- FD Mode MB
  20. * Filter? connected? Passive detection ption in MB Supported?
  21. * MCF5441X FlexCAN2 ? no yes no no no no 16
  22. * MX25 FlexCAN2 03.00.00.00 no no no no no no 64
  23. * MX28 FlexCAN2 03.00.04.00 yes yes no no no no 64
  24. * MX35 FlexCAN2 03.00.00.00 no no no no no no 64
  25. * MX53 FlexCAN2 03.00.00.00 yes no no no no no 64
  26. * MX6s FlexCAN3 10.00.12.00 yes yes no no yes no 64
  27. * MX8QM FlexCAN3 03.00.23.00 yes yes no no yes yes 64
  28. * MX8MP FlexCAN3 03.00.17.01 yes yes no yes yes yes 64
  29. * VF610 FlexCAN3 ? no yes no yes yes? no 64
  30. * LS1021A FlexCAN2 03.00.04.00 no yes no no yes no 64
  31. * LX2160A FlexCAN3 03.00.23.00 no yes no yes yes yes 64
  32. *
  33. * Some SOCs do not have the RX_WARN & TX_WARN interrupt line connected.
  34. */
  35. /* [TR]WRN_INT not connected */
  36. #define FLEXCAN_QUIRK_BROKEN_WERR_STATE BIT(1)
  37. /* Disable RX FIFO Global mask */
  38. #define FLEXCAN_QUIRK_DISABLE_RXFG BIT(2)
  39. /* Enable EACEN and RRS bit in ctrl2 */
  40. #define FLEXCAN_QUIRK_ENABLE_EACEN_RRS BIT(3)
  41. /* Disable non-correctable errors interrupt and freeze mode */
  42. #define FLEXCAN_QUIRK_DISABLE_MECR BIT(4)
  43. /* Use mailboxes (not FIFO) for RX path */
  44. #define FLEXCAN_QUIRK_USE_RX_MAILBOX BIT(5)
  45. /* No interrupt for error passive */
  46. #define FLEXCAN_QUIRK_BROKEN_PERR_STATE BIT(6)
  47. /* default to BE register access */
  48. #define FLEXCAN_QUIRK_DEFAULT_BIG_ENDIAN BIT(7)
  49. /* Setup stop mode with GPR to support wakeup */
  50. #define FLEXCAN_QUIRK_SETUP_STOP_MODE_GPR BIT(8)
  51. /* Support CAN-FD mode */
  52. #define FLEXCAN_QUIRK_SUPPORT_FD BIT(9)
  53. /* support memory detection and correction */
  54. #define FLEXCAN_QUIRK_SUPPORT_ECC BIT(10)
  55. /* Setup stop mode with SCU firmware to support wakeup */
  56. #define FLEXCAN_QUIRK_SETUP_STOP_MODE_SCFW BIT(11)
  57. /* Setup 3 separate interrupts, main, boff and err */
  58. #define FLEXCAN_QUIRK_NR_IRQ_3 BIT(12)
  59. /* Setup 16 mailboxes */
  60. #define FLEXCAN_QUIRK_NR_MB_16 BIT(13)
  61. /* Device supports RX via mailboxes */
  62. #define FLEXCAN_QUIRK_SUPPORT_RX_MAILBOX BIT(14)
  63. /* Device supports RTR reception via mailboxes */
  64. #define FLEXCAN_QUIRK_SUPPORT_RX_MAILBOX_RTR BIT(15)
  65. /* Device supports RX via FIFO */
  66. #define FLEXCAN_QUIRK_SUPPORT_RX_FIFO BIT(16)
  67. /* Setup stop mode with ATF SCMI protocol to support wakeup */
  68. #define FLEXCAN_QUIRK_SETUP_STOP_MODE_SCMI BIT(17)
  69. /* Device has two separate interrupt lines for two mailbox ranges, which
  70. * both need to have an interrupt handler registered.
  71. */
  72. #define FLEXCAN_QUIRK_SECONDARY_MB_IRQ BIT(18)
  73. struct flexcan_devtype_data {
  74. u32 quirks; /* quirks needed for different IP cores */
  75. };
  76. struct flexcan_stop_mode {
  77. struct regmap *gpr;
  78. u8 req_gpr;
  79. u8 req_bit;
  80. };
  81. struct flexcan_priv {
  82. struct can_priv can;
  83. struct can_rx_offload offload;
  84. struct device *dev;
  85. struct flexcan_regs __iomem *regs;
  86. struct flexcan_mb __iomem *tx_mb;
  87. struct flexcan_mb __iomem *tx_mb_reserved;
  88. u8 tx_mb_idx;
  89. u8 mb_count;
  90. u8 mb_size;
  91. u8 clk_src; /* clock source of CAN Protocol Engine */
  92. u8 scu_idx;
  93. u64 rx_mask;
  94. u64 tx_mask;
  95. u32 reg_ctrl_default;
  96. struct clk *clk_ipg;
  97. struct clk *clk_per;
  98. struct flexcan_devtype_data devtype_data;
  99. struct regulator *reg_xceiver;
  100. struct flexcan_stop_mode stm;
  101. int irq_boff;
  102. int irq_err;
  103. int irq_secondary_mb;
  104. /* IPC handle when setup stop mode by System Controller firmware(scfw) */
  105. struct imx_sc_ipc *sc_ipc_handle;
  106. /* Read and Write APIs */
  107. u32 (*read)(void __iomem *addr);
  108. void (*write)(u32 val, void __iomem *addr);
  109. };
  110. extern const struct ethtool_ops flexcan_ethtool_ops;
  111. static inline bool
  112. flexcan_supports_rx_mailbox(const struct flexcan_priv *priv)
  113. {
  114. const u32 quirks = priv->devtype_data.quirks;
  115. return quirks & FLEXCAN_QUIRK_SUPPORT_RX_MAILBOX;
  116. }
  117. static inline bool
  118. flexcan_supports_rx_mailbox_rtr(const struct flexcan_priv *priv)
  119. {
  120. const u32 quirks = priv->devtype_data.quirks;
  121. return (quirks & (FLEXCAN_QUIRK_SUPPORT_RX_MAILBOX |
  122. FLEXCAN_QUIRK_SUPPORT_RX_MAILBOX_RTR)) ==
  123. (FLEXCAN_QUIRK_SUPPORT_RX_MAILBOX |
  124. FLEXCAN_QUIRK_SUPPORT_RX_MAILBOX_RTR);
  125. }
  126. static inline bool
  127. flexcan_supports_rx_fifo(const struct flexcan_priv *priv)
  128. {
  129. const u32 quirks = priv->devtype_data.quirks;
  130. return quirks & FLEXCAN_QUIRK_SUPPORT_RX_FIFO;
  131. }
  132. static inline bool
  133. flexcan_active_rx_rtr(const struct flexcan_priv *priv)
  134. {
  135. const u32 quirks = priv->devtype_data.quirks;
  136. if (quirks & FLEXCAN_QUIRK_USE_RX_MAILBOX) {
  137. if (quirks & FLEXCAN_QUIRK_SUPPORT_RX_MAILBOX_RTR)
  138. return true;
  139. } else {
  140. /* RX-FIFO is always RTR capable */
  141. return true;
  142. }
  143. return false;
  144. }
  145. #endif /* _FLEXCAN_H */