phy-brcm-usb-init.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (C) 2014-2017 Broadcom
  4. */
  5. #ifndef _USB_BRCM_COMMON_INIT_H
  6. #define _USB_BRCM_COMMON_INIT_H
  7. #include <linux/regmap.h>
  8. #define USB_CTLR_MODE_HOST 0
  9. #define USB_CTLR_MODE_DEVICE 1
  10. #define USB_CTLR_MODE_DRD 2
  11. #define USB_CTLR_MODE_TYPEC_PD 3
  12. enum brcmusb_reg_sel {
  13. BRCM_REGS_CTRL = 0,
  14. BRCM_REGS_XHCI_EC,
  15. BRCM_REGS_XHCI_GBL,
  16. BRCM_REGS_USB_PHY,
  17. BRCM_REGS_USB_MDIO,
  18. BRCM_REGS_BDC_EC,
  19. BRCM_REGS_MAX
  20. };
  21. #define USB_CTRL_REG(base, reg) ((void __iomem *)base + USB_CTRL_##reg)
  22. #define USB_XHCI_EC_REG(base, reg) ((void __iomem *)base + USB_XHCI_EC_##reg)
  23. #define USB_CTRL_MASK(reg, field) \
  24. USB_CTRL_##reg##_##field##_MASK
  25. #define USB_CTRL_SET(base, reg, field) \
  26. brcm_usb_ctrl_set(USB_CTRL_REG(base, reg), \
  27. USB_CTRL_##reg##_##field##_MASK)
  28. #define USB_CTRL_UNSET(base, reg, field) \
  29. brcm_usb_ctrl_unset(USB_CTRL_REG(base, reg), \
  30. USB_CTRL_##reg##_##field##_MASK)
  31. #define USB_XHCI_GBL_REG(base, reg) ((void __iomem *)base + USB_XHCI_GBL_##reg)
  32. #define USB_XHCI_GBL_SET(base, reg, field) \
  33. brcm_usb_ctrl_set(USB_XHCI_GBL_REG(base, reg), \
  34. USB_XHCI_GBL_##reg##_##field##_MASK)
  35. #define USB_XHCI_GBL_UNSET(base, reg, field) \
  36. brcm_usb_ctrl_unset(USB_XHCI_GBL_REG(base, reg), \
  37. USB_XHCI_GBL_##reg##_##field##_MASK)
  38. struct brcm_usb_init_params;
  39. struct brcm_usb_init_ops {
  40. void (*init_ipp)(struct brcm_usb_init_params *params);
  41. void (*init_common)(struct brcm_usb_init_params *params);
  42. void (*init_eohci)(struct brcm_usb_init_params *params);
  43. void (*init_xhci)(struct brcm_usb_init_params *params);
  44. void (*uninit_common)(struct brcm_usb_init_params *params);
  45. void (*uninit_eohci)(struct brcm_usb_init_params *params);
  46. void (*uninit_xhci)(struct brcm_usb_init_params *params);
  47. int (*get_dual_select)(struct brcm_usb_init_params *params);
  48. void (*set_dual_select)(struct brcm_usb_init_params *params);
  49. };
  50. struct brcm_usb_init_params {
  51. void __iomem *regs[BRCM_REGS_MAX];
  52. int ioc;
  53. int ipp;
  54. int supported_port_modes;
  55. int port_mode;
  56. u32 family_id;
  57. u32 product_id;
  58. int selected_family;
  59. const char *family_name;
  60. const u32 *usb_reg_bits_map;
  61. const struct brcm_usb_init_ops *ops;
  62. struct regmap *syscon_piarbctl;
  63. bool wake_enabled;
  64. };
  65. void brcm_usb_dvr_init_74110(struct brcm_usb_init_params *params);
  66. void brcm_usb_dvr_init_4908(struct brcm_usb_init_params *params);
  67. void brcm_usb_dvr_init_7445(struct brcm_usb_init_params *params);
  68. void brcm_usb_dvr_init_7216(struct brcm_usb_init_params *params);
  69. void brcm_usb_dvr_init_7211b0(struct brcm_usb_init_params *params);
  70. static inline u32 brcm_usb_readl(void __iomem *addr)
  71. {
  72. /*
  73. * MIPS endianness is configured by boot strap, which also reverses all
  74. * bus endianness (i.e., big-endian CPU + big endian bus ==> native
  75. * endian I/O).
  76. *
  77. * Other architectures (e.g., ARM) either do not support big endian, or
  78. * else leave I/O in little endian mode.
  79. */
  80. if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
  81. return __raw_readl(addr);
  82. else
  83. return readl_relaxed(addr);
  84. }
  85. static inline void brcm_usb_writel(u32 val, void __iomem *addr)
  86. {
  87. /* See brcmnand_readl() comments */
  88. if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
  89. __raw_writel(val, addr);
  90. else
  91. writel_relaxed(val, addr);
  92. }
  93. static inline void brcm_usb_ctrl_unset(void __iomem *reg, u32 mask)
  94. {
  95. brcm_usb_writel(brcm_usb_readl(reg) & ~(mask), reg);
  96. };
  97. static inline void brcm_usb_ctrl_set(void __iomem *reg, u32 mask)
  98. {
  99. brcm_usb_writel(brcm_usb_readl(reg) | (mask), reg);
  100. };
  101. static inline void brcm_usb_init_ipp(struct brcm_usb_init_params *ini)
  102. {
  103. if (ini->ops->init_ipp)
  104. ini->ops->init_ipp(ini);
  105. }
  106. static inline void brcm_usb_init_common(struct brcm_usb_init_params *ini)
  107. {
  108. if (ini->ops->init_common)
  109. ini->ops->init_common(ini);
  110. }
  111. static inline void brcm_usb_init_eohci(struct brcm_usb_init_params *ini)
  112. {
  113. if (ini->ops->init_eohci)
  114. ini->ops->init_eohci(ini);
  115. }
  116. static inline void brcm_usb_init_xhci(struct brcm_usb_init_params *ini)
  117. {
  118. if (ini->ops->init_xhci)
  119. ini->ops->init_xhci(ini);
  120. }
  121. static inline void brcm_usb_uninit_common(struct brcm_usb_init_params *ini)
  122. {
  123. if (ini->ops->uninit_common)
  124. ini->ops->uninit_common(ini);
  125. }
  126. static inline void brcm_usb_uninit_eohci(struct brcm_usb_init_params *ini)
  127. {
  128. if (ini->ops->uninit_eohci)
  129. ini->ops->uninit_eohci(ini);
  130. }
  131. static inline void brcm_usb_uninit_xhci(struct brcm_usb_init_params *ini)
  132. {
  133. if (ini->ops->uninit_xhci)
  134. ini->ops->uninit_xhci(ini);
  135. }
  136. static inline int brcm_usb_get_dual_select(struct brcm_usb_init_params *ini)
  137. {
  138. if (ini->ops->get_dual_select)
  139. return ini->ops->get_dual_select(ini);
  140. return 0;
  141. }
  142. static inline void brcm_usb_set_dual_select(struct brcm_usb_init_params *ini)
  143. {
  144. if (ini->ops->set_dual_select)
  145. ini->ops->set_dual_select(ini);
  146. }
  147. #endif /* _USB_BRCM_COMMON_INIT_H */