phy-brcm-usb-init.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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. struct brcm_usb_init_params;
  32. struct brcm_usb_init_ops {
  33. void (*init_ipp)(struct brcm_usb_init_params *params);
  34. void (*init_common)(struct brcm_usb_init_params *params);
  35. void (*init_eohci)(struct brcm_usb_init_params *params);
  36. void (*init_xhci)(struct brcm_usb_init_params *params);
  37. void (*uninit_common)(struct brcm_usb_init_params *params);
  38. void (*uninit_eohci)(struct brcm_usb_init_params *params);
  39. void (*uninit_xhci)(struct brcm_usb_init_params *params);
  40. int (*get_dual_select)(struct brcm_usb_init_params *params);
  41. void (*set_dual_select)(struct brcm_usb_init_params *params, int mode);
  42. };
  43. struct brcm_usb_init_params {
  44. void __iomem *regs[BRCM_REGS_MAX];
  45. int ioc;
  46. int ipp;
  47. int mode;
  48. u32 family_id;
  49. u32 product_id;
  50. int selected_family;
  51. const char *family_name;
  52. const u32 *usb_reg_bits_map;
  53. const struct brcm_usb_init_ops *ops;
  54. struct regmap *syscon_piarbctl;
  55. bool wake_enabled;
  56. };
  57. void brcm_usb_dvr_init_4908(struct brcm_usb_init_params *params);
  58. void brcm_usb_dvr_init_7445(struct brcm_usb_init_params *params);
  59. void brcm_usb_dvr_init_7216(struct brcm_usb_init_params *params);
  60. void brcm_usb_dvr_init_7211b0(struct brcm_usb_init_params *params);
  61. static inline u32 brcm_usb_readl(void __iomem *addr)
  62. {
  63. /*
  64. * MIPS endianness is configured by boot strap, which also reverses all
  65. * bus endianness (i.e., big-endian CPU + big endian bus ==> native
  66. * endian I/O).
  67. *
  68. * Other architectures (e.g., ARM) either do not support big endian, or
  69. * else leave I/O in little endian mode.
  70. */
  71. if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
  72. return __raw_readl(addr);
  73. else
  74. return readl_relaxed(addr);
  75. }
  76. static inline void brcm_usb_writel(u32 val, void __iomem *addr)
  77. {
  78. /* See brcmnand_readl() comments */
  79. if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
  80. __raw_writel(val, addr);
  81. else
  82. writel_relaxed(val, addr);
  83. }
  84. static inline void brcm_usb_ctrl_unset(void __iomem *reg, u32 mask)
  85. {
  86. brcm_usb_writel(brcm_usb_readl(reg) & ~(mask), reg);
  87. };
  88. static inline void brcm_usb_ctrl_set(void __iomem *reg, u32 mask)
  89. {
  90. brcm_usb_writel(brcm_usb_readl(reg) | (mask), reg);
  91. };
  92. static inline void brcm_usb_init_ipp(struct brcm_usb_init_params *ini)
  93. {
  94. if (ini->ops->init_ipp)
  95. ini->ops->init_ipp(ini);
  96. }
  97. static inline void brcm_usb_init_common(struct brcm_usb_init_params *ini)
  98. {
  99. if (ini->ops->init_common)
  100. ini->ops->init_common(ini);
  101. }
  102. static inline void brcm_usb_init_eohci(struct brcm_usb_init_params *ini)
  103. {
  104. if (ini->ops->init_eohci)
  105. ini->ops->init_eohci(ini);
  106. }
  107. static inline void brcm_usb_init_xhci(struct brcm_usb_init_params *ini)
  108. {
  109. if (ini->ops->init_xhci)
  110. ini->ops->init_xhci(ini);
  111. }
  112. static inline void brcm_usb_uninit_common(struct brcm_usb_init_params *ini)
  113. {
  114. if (ini->ops->uninit_common)
  115. ini->ops->uninit_common(ini);
  116. }
  117. static inline void brcm_usb_uninit_eohci(struct brcm_usb_init_params *ini)
  118. {
  119. if (ini->ops->uninit_eohci)
  120. ini->ops->uninit_eohci(ini);
  121. }
  122. static inline void brcm_usb_uninit_xhci(struct brcm_usb_init_params *ini)
  123. {
  124. if (ini->ops->uninit_xhci)
  125. ini->ops->uninit_xhci(ini);
  126. }
  127. static inline int brcm_usb_get_dual_select(struct brcm_usb_init_params *ini)
  128. {
  129. if (ini->ops->get_dual_select)
  130. return ini->ops->get_dual_select(ini);
  131. return 0;
  132. }
  133. static inline void brcm_usb_set_dual_select(struct brcm_usb_init_params *ini,
  134. int mode)
  135. {
  136. if (ini->ops->set_dual_select)
  137. ini->ops->set_dual_select(ini, mode);
  138. }
  139. #endif /* _USB_BRCM_COMMON_INIT_H */