phy-brcm-usb-init.h 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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_4908(struct brcm_usb_init_params *params);
  66. void brcm_usb_dvr_init_7445(struct brcm_usb_init_params *params);
  67. void brcm_usb_dvr_init_7216(struct brcm_usb_init_params *params);
  68. void brcm_usb_dvr_init_7211b0(struct brcm_usb_init_params *params);
  69. static inline u32 brcm_usb_readl(void __iomem *addr)
  70. {
  71. /*
  72. * MIPS endianness is configured by boot strap, which also reverses all
  73. * bus endianness (i.e., big-endian CPU + big endian bus ==> native
  74. * endian I/O).
  75. *
  76. * Other architectures (e.g., ARM) either do not support big endian, or
  77. * else leave I/O in little endian mode.
  78. */
  79. if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
  80. return __raw_readl(addr);
  81. else
  82. return readl_relaxed(addr);
  83. }
  84. static inline void brcm_usb_writel(u32 val, void __iomem *addr)
  85. {
  86. /* See brcmnand_readl() comments */
  87. if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
  88. __raw_writel(val, addr);
  89. else
  90. writel_relaxed(val, addr);
  91. }
  92. static inline void brcm_usb_ctrl_unset(void __iomem *reg, u32 mask)
  93. {
  94. brcm_usb_writel(brcm_usb_readl(reg) & ~(mask), reg);
  95. };
  96. static inline void brcm_usb_ctrl_set(void __iomem *reg, u32 mask)
  97. {
  98. brcm_usb_writel(brcm_usb_readl(reg) | (mask), reg);
  99. };
  100. static inline void brcm_usb_init_ipp(struct brcm_usb_init_params *ini)
  101. {
  102. if (ini->ops->init_ipp)
  103. ini->ops->init_ipp(ini);
  104. }
  105. static inline void brcm_usb_init_common(struct brcm_usb_init_params *ini)
  106. {
  107. if (ini->ops->init_common)
  108. ini->ops->init_common(ini);
  109. }
  110. static inline void brcm_usb_init_eohci(struct brcm_usb_init_params *ini)
  111. {
  112. if (ini->ops->init_eohci)
  113. ini->ops->init_eohci(ini);
  114. }
  115. static inline void brcm_usb_init_xhci(struct brcm_usb_init_params *ini)
  116. {
  117. if (ini->ops->init_xhci)
  118. ini->ops->init_xhci(ini);
  119. }
  120. static inline void brcm_usb_uninit_common(struct brcm_usb_init_params *ini)
  121. {
  122. if (ini->ops->uninit_common)
  123. ini->ops->uninit_common(ini);
  124. }
  125. static inline void brcm_usb_uninit_eohci(struct brcm_usb_init_params *ini)
  126. {
  127. if (ini->ops->uninit_eohci)
  128. ini->ops->uninit_eohci(ini);
  129. }
  130. static inline void brcm_usb_uninit_xhci(struct brcm_usb_init_params *ini)
  131. {
  132. if (ini->ops->uninit_xhci)
  133. ini->ops->uninit_xhci(ini);
  134. }
  135. static inline int brcm_usb_get_dual_select(struct brcm_usb_init_params *ini)
  136. {
  137. if (ini->ops->get_dual_select)
  138. return ini->ops->get_dual_select(ini);
  139. return 0;
  140. }
  141. static inline void brcm_usb_set_dual_select(struct brcm_usb_init_params *ini)
  142. {
  143. if (ini->ops->set_dual_select)
  144. ini->ops->set_dual_select(ini);
  145. }
  146. #endif /* _USB_BRCM_COMMON_INIT_H */