ufs-mediatek.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2019 MediaTek Inc.
  4. */
  5. #ifndef _UFS_MEDIATEK_H
  6. #define _UFS_MEDIATEK_H
  7. #include <linux/bitops.h>
  8. /*
  9. * MCQ define and struct
  10. */
  11. #define UFSHCD_MAX_Q_NR 8
  12. #define MTK_MCQ_INVALID_IRQ 0xFFFF
  13. /* REG_UFS_MMIO_OPT_CTRL_0 160h */
  14. #define EHS_EN BIT(0)
  15. #define PFM_IMPV BIT(1)
  16. #define MCQ_MULTI_INTR_EN BIT(2)
  17. #define MCQ_CMB_INTR_EN BIT(3)
  18. #define MCQ_AH8 BIT(4)
  19. #define MON_EN BIT(5)
  20. #define MRTT_EN BIT(25)
  21. #define RDN_PFM_IMPV_DIS BIT(28)
  22. #define MCQ_INTR_EN_MSK (MCQ_MULTI_INTR_EN | MCQ_CMB_INTR_EN)
  23. /*
  24. * Vendor specific UFSHCI Registers
  25. */
  26. #define REG_UFS_XOUFS_CTRL 0x140
  27. #define REG_UFS_REFCLK_CTRL 0x144
  28. #define REG_UFS_UFS_MMIO_OTSD_CTRL 0x14C
  29. #define REG_UFS_MMIO_OPT_CTRL_0 0x160
  30. #define REG_UFS_EXTREG 0x2100
  31. #define REG_UFS_MPHYCTRL 0x2200
  32. #define REG_UFS_MTK_IP_VER 0x2240
  33. #define REG_UFS_REJECT_MON 0x22AC
  34. #define REG_UFS_DEBUG_SEL 0x22C0
  35. #define REG_UFS_PROBE 0x22C8
  36. #define REG_UFS_DEBUG_SEL_B0 0x22D0
  37. #define REG_UFS_DEBUG_SEL_B1 0x22D4
  38. #define REG_UFS_DEBUG_SEL_B2 0x22D8
  39. #define REG_UFS_DEBUG_SEL_B3 0x22DC
  40. #define REG_UFS_MTK_SQD 0x2800
  41. #define REG_UFS_MTK_SQIS 0x2814
  42. #define REG_UFS_MTK_CQD 0x281C
  43. #define REG_UFS_MTK_CQIS 0x2824
  44. #define REG_UFS_MCQ_STRIDE 0x30
  45. /*
  46. * Ref-clk control
  47. *
  48. * Values for register REG_UFS_REFCLK_CTRL
  49. */
  50. #define REFCLK_RELEASE 0x0
  51. #define REFCLK_REQUEST BIT(0)
  52. #define REFCLK_ACK BIT(1)
  53. #define REFCLK_REQ_TIMEOUT_US 3000
  54. #define REFCLK_DEFAULT_WAIT_US 32
  55. /*
  56. * Other attributes
  57. */
  58. #define VS_DEBUGCLOCKENABLE 0xD0A1
  59. #define VS_SAVEPOWERCONTROL 0xD0A6
  60. #define VS_UNIPROPOWERDOWNCONTROL 0xD0A8
  61. /*
  62. * Vendor specific link state
  63. */
  64. enum {
  65. VS_LINK_DISABLED = 0,
  66. VS_LINK_DOWN = 1,
  67. VS_LINK_UP = 2,
  68. VS_LINK_HIBERN8 = 3,
  69. VS_LINK_LOST = 4,
  70. VS_LINK_CFG = 5,
  71. };
  72. /*
  73. * Vendor specific host controller state
  74. */
  75. enum {
  76. VS_HCE_RESET = 0,
  77. VS_HCE_BASE = 1,
  78. VS_HCE_OOCPR_WAIT = 2,
  79. VS_HCE_DME_RESET = 3,
  80. VS_HCE_MIDDLE = 4,
  81. VS_HCE_DME_ENABLE = 5,
  82. VS_HCE_DEFAULTS = 6,
  83. VS_HIB_IDLEEN = 7,
  84. VS_HIB_ENTER = 8,
  85. VS_HIB_ENTER_CONF = 9,
  86. VS_HIB_MIDDLE = 10,
  87. VS_HIB_WAITTIMER = 11,
  88. VS_HIB_EXIT_CONF = 12,
  89. VS_HIB_EXIT = 13,
  90. };
  91. /*
  92. * VS_DEBUGCLOCKENABLE
  93. */
  94. enum {
  95. TX_SYMBOL_CLK_REQ_FORCE = 5,
  96. };
  97. /*
  98. * VS_SAVEPOWERCONTROL
  99. */
  100. enum {
  101. RX_SYMBOL_CLK_GATE_EN = 0,
  102. SYS_CLK_GATE_EN = 2,
  103. TX_CLK_GATE_EN = 3,
  104. };
  105. /*
  106. * Host capability
  107. */
  108. enum ufs_mtk_host_caps {
  109. UFS_MTK_CAP_BOOST_CRYPT_ENGINE = 1 << 0,
  110. UFS_MTK_CAP_VA09_PWR_CTRL = 1 << 1,
  111. UFS_MTK_CAP_DISABLE_AH8 = 1 << 2,
  112. UFS_MTK_CAP_BROKEN_VCC = 1 << 3,
  113. /*
  114. * Override UFS_MTK_CAP_BROKEN_VCC's behavior to
  115. * allow vccqx upstream to enter LPM
  116. */
  117. UFS_MTK_CAP_ALLOW_VCCQX_LPM = 1 << 5,
  118. UFS_MTK_CAP_PMC_VIA_FASTAUTO = 1 << 6,
  119. UFS_MTK_CAP_TX_SKEW_FIX = 1 << 7,
  120. UFS_MTK_CAP_DISABLE_MCQ = 1 << 8,
  121. /* Control MTCMOS with RTFF */
  122. UFS_MTK_CAP_RTFF_MTCMOS = 1 << 9,
  123. UFS_MTK_CAP_MCQ_BROKEN_RTC = 1 << 10,
  124. };
  125. struct ufs_mtk_crypt_cfg {
  126. struct regulator *reg_vcore;
  127. struct clk *clk_crypt_perf;
  128. struct clk *clk_crypt_mux;
  129. struct clk *clk_crypt_lp;
  130. int vcore_volt;
  131. };
  132. struct ufs_mtk_clk {
  133. struct ufs_clk_info *ufs_sel_clki; /* Mux */
  134. struct ufs_clk_info *ufs_sel_max_clki; /* Max src */
  135. struct ufs_clk_info *ufs_sel_min_clki; /* Min src */
  136. struct ufs_clk_info *ufs_fde_clki; /* Mux */
  137. struct ufs_clk_info *ufs_fde_max_clki; /* Max src */
  138. struct ufs_clk_info *ufs_fde_min_clki; /* Min src */
  139. struct regulator *reg_vcore;
  140. int vcore_volt;
  141. };
  142. struct ufs_mtk_hw_ver {
  143. u8 step;
  144. u8 minor;
  145. u8 major;
  146. };
  147. struct ufs_mtk_mcq_intr_info {
  148. struct ufs_hba *hba;
  149. u32 irq;
  150. u8 qid;
  151. };
  152. struct ufs_mtk_host {
  153. struct phy *mphy;
  154. struct regulator *reg_va09;
  155. struct reset_control *hci_reset;
  156. struct reset_control *unipro_reset;
  157. struct reset_control *crypto_reset;
  158. struct reset_control *mphy_reset;
  159. struct ufs_hba *hba;
  160. struct ufs_mtk_crypt_cfg *crypt;
  161. struct ufs_mtk_clk mclk;
  162. struct ufs_mtk_hw_ver hw_ver;
  163. enum ufs_mtk_host_caps caps;
  164. bool mphy_powered_on;
  165. bool unipro_lpm;
  166. bool ref_clk_enabled;
  167. bool clk_scale_up;
  168. u16 ref_clk_ungating_wait_us;
  169. u16 ref_clk_gating_wait_us;
  170. u32 ip_ver;
  171. bool legacy_ip_ver;
  172. bool mcq_set_intr;
  173. bool is_mcq_intr_enabled;
  174. int mcq_nr_intr;
  175. struct ufs_mtk_mcq_intr_info mcq_intr_info[UFSHCD_MAX_Q_NR];
  176. struct device *phy_dev;
  177. };
  178. /* MTK delay of autosuspend: 500 ms */
  179. #define MTK_RPM_AUTOSUSPEND_DELAY_MS 500
  180. /* MTK RTT support number */
  181. #define MTK_MAX_NUM_RTT 2
  182. /* UFSHCI MTK ip version value */
  183. enum {
  184. /* UFSHCI 3.1 */
  185. IP_VER_MT6983 = 0x10360000,
  186. IP_VER_MT6878 = 0x10420200,
  187. /* UFSHCI 4.0 */
  188. IP_VER_MT6897 = 0x10440000,
  189. IP_VER_MT6989 = 0x10450000,
  190. IP_VER_MT6899 = 0x10450100,
  191. IP_VER_MT6991_A0 = 0x10460000,
  192. IP_VER_MT6991_B0 = 0x10470000,
  193. IP_VER_MT6993 = 0x10480000,
  194. IP_VER_NONE = 0xFFFFFFFF
  195. };
  196. enum ip_ver_legacy {
  197. IP_LEGACY_VER_MT6781 = 0x10380000,
  198. IP_LEGACY_VER_MT6879 = 0x10360000,
  199. IP_LEGACY_VER_MT6893 = 0x20160706
  200. };
  201. #endif /* !_UFS_MEDIATEK_H */