meson-gxbb-usb2.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Meson8, Meson8b and GXBB USB2 PHY driver
  4. *
  5. * Copyright (C) 2016 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
  6. * Copyright (C) 2018 BayLibre, SAS
  7. *
  8. * Author: Beniamino Galvani <b.galvani@gmail.com>
  9. */
  10. #include <common.h>
  11. #include <clk.h>
  12. #include <dm.h>
  13. #include <generic-phy.h>
  14. #include <regmap.h>
  15. #include <reset.h>
  16. #include <linux/bitops.h>
  17. #define REG_CONFIG 0x00
  18. #define REG_CONFIG_CLK_EN BIT(0)
  19. #define REG_CONFIG_CLK_SEL_MASK GENMASK(3, 1)
  20. #define REG_CONFIG_CLK_DIV_MASK GENMASK(10, 4)
  21. #define REG_CONFIG_CLK_32k_ALTSEL BIT(15)
  22. #define REG_CONFIG_TEST_TRIG BIT(31)
  23. #define REG_CTRL 0x04
  24. #define REG_CTRL_SOFT_PRST BIT(0)
  25. #define REG_CTRL_SOFT_HRESET BIT(1)
  26. #define REG_CTRL_SS_SCALEDOWN_MODE_MASK GENMASK(3, 2)
  27. #define REG_CTRL_CLK_DET_RST BIT(4)
  28. #define REG_CTRL_INTR_SEL BIT(5)
  29. #define REG_CTRL_CLK_DETECTED BIT(8)
  30. #define REG_CTRL_SOF_SENT_RCVD_TGL BIT(9)
  31. #define REG_CTRL_SOF_TOGGLE_OUT BIT(10)
  32. #define REG_CTRL_POWER_ON_RESET BIT(15)
  33. #define REG_CTRL_SLEEPM BIT(16)
  34. #define REG_CTRL_TX_BITSTUFF_ENN_H BIT(17)
  35. #define REG_CTRL_TX_BITSTUFF_ENN BIT(18)
  36. #define REG_CTRL_COMMON_ON BIT(19)
  37. #define REG_CTRL_REF_CLK_SEL_MASK GENMASK(21, 20)
  38. #define REG_CTRL_REF_CLK_SEL_SHIFT 20
  39. #define REG_CTRL_FSEL_MASK GENMASK(24, 22)
  40. #define REG_CTRL_FSEL_SHIFT 22
  41. #define REG_CTRL_PORT_RESET BIT(25)
  42. #define REG_CTRL_THREAD_ID_MASK GENMASK(31, 26)
  43. /* bits [31:26], [24:21] and [15:3] seem to be read-only */
  44. #define REG_ADP_BC 0x0c
  45. #define REG_ADP_BC_VBUS_VLD_EXT_SEL BIT(0)
  46. #define REG_ADP_BC_VBUS_VLD_EXT BIT(1)
  47. #define REG_ADP_BC_OTG_DISABLE BIT(2)
  48. #define REG_ADP_BC_ID_PULLUP BIT(3)
  49. #define REG_ADP_BC_DRV_VBUS BIT(4)
  50. #define REG_ADP_BC_ADP_PRB_EN BIT(5)
  51. #define REG_ADP_BC_ADP_DISCHARGE BIT(6)
  52. #define REG_ADP_BC_ADP_CHARGE BIT(7)
  53. #define REG_ADP_BC_SESS_END BIT(8)
  54. #define REG_ADP_BC_DEVICE_SESS_VLD BIT(9)
  55. #define REG_ADP_BC_B_VALID BIT(10)
  56. #define REG_ADP_BC_A_VALID BIT(11)
  57. #define REG_ADP_BC_ID_DIG BIT(12)
  58. #define REG_ADP_BC_VBUS_VALID BIT(13)
  59. #define REG_ADP_BC_ADP_PROBE BIT(14)
  60. #define REG_ADP_BC_ADP_SENSE BIT(15)
  61. #define REG_ADP_BC_ACA_ENABLE BIT(16)
  62. #define REG_ADP_BC_DCD_ENABLE BIT(17)
  63. #define REG_ADP_BC_VDAT_DET_EN_B BIT(18)
  64. #define REG_ADP_BC_VDAT_SRC_EN_B BIT(19)
  65. #define REG_ADP_BC_CHARGE_SEL BIT(20)
  66. #define REG_ADP_BC_CHARGE_DETECT BIT(21)
  67. #define REG_ADP_BC_ACA_PIN_RANGE_C BIT(22)
  68. #define REG_ADP_BC_ACA_PIN_RANGE_B BIT(23)
  69. #define REG_ADP_BC_ACA_PIN_RANGE_A BIT(24)
  70. #define REG_ADP_BC_ACA_PIN_GND BIT(25)
  71. #define REG_ADP_BC_ACA_PIN_FLOAT BIT(26)
  72. #define RESET_COMPLETE_TIME 500
  73. #define ACA_ENABLE_COMPLETE_TIME 50
  74. struct phy_meson_gxbb_usb2_priv {
  75. struct regmap *regmap;
  76. struct reset_ctl_bulk resets;
  77. };
  78. static int phy_meson_gxbb_usb2_power_on(struct phy *phy)
  79. {
  80. struct udevice *dev = phy->dev;
  81. struct phy_meson_gxbb_usb2_priv *priv = dev_get_priv(dev);
  82. uint val;
  83. regmap_update_bits(priv->regmap, REG_CONFIG,
  84. REG_CONFIG_CLK_32k_ALTSEL,
  85. REG_CONFIG_CLK_32k_ALTSEL);
  86. regmap_update_bits(priv->regmap, REG_CTRL,
  87. REG_CTRL_REF_CLK_SEL_MASK,
  88. 0x2 << REG_CTRL_REF_CLK_SEL_SHIFT);
  89. regmap_update_bits(priv->regmap, REG_CTRL,
  90. REG_CTRL_FSEL_MASK,
  91. 0x5 << REG_CTRL_FSEL_SHIFT);
  92. /* reset the PHY */
  93. regmap_update_bits(priv->regmap, REG_CTRL,
  94. REG_CTRL_POWER_ON_RESET,
  95. REG_CTRL_POWER_ON_RESET);
  96. udelay(RESET_COMPLETE_TIME);
  97. regmap_update_bits(priv->regmap, REG_CTRL,
  98. REG_CTRL_POWER_ON_RESET,
  99. 0);
  100. udelay(RESET_COMPLETE_TIME);
  101. regmap_update_bits(priv->regmap, REG_CTRL,
  102. REG_CTRL_SOF_TOGGLE_OUT,
  103. REG_CTRL_SOF_TOGGLE_OUT);
  104. /* Set host mode */
  105. regmap_update_bits(priv->regmap, REG_ADP_BC,
  106. REG_ADP_BC_ACA_ENABLE,
  107. REG_ADP_BC_ACA_ENABLE);
  108. udelay(ACA_ENABLE_COMPLETE_TIME);
  109. regmap_read(priv->regmap, REG_ADP_BC, &val);
  110. if (val & REG_ADP_BC_ACA_PIN_FLOAT) {
  111. pr_err("Error powering on GXBB USB PHY\n");
  112. return -EINVAL;
  113. }
  114. return 0;
  115. }
  116. static struct phy_ops meson_gxbb_usb2_phy_ops = {
  117. .power_on = phy_meson_gxbb_usb2_power_on,
  118. };
  119. static int meson_gxbb_usb2_phy_probe(struct udevice *dev)
  120. {
  121. struct phy_meson_gxbb_usb2_priv *priv = dev_get_priv(dev);
  122. struct clk clk_usb_general, clk_usb;
  123. int ret;
  124. ret = regmap_init_mem(dev_ofnode(dev), &priv->regmap);
  125. if (ret)
  126. return ret;
  127. ret = clk_get_by_name(dev, "usb_general", &clk_usb_general);
  128. if (ret)
  129. return ret;
  130. ret = clk_enable(&clk_usb_general);
  131. if (ret && ret != -ENOSYS && ret != -ENOTSUPP) {
  132. pr_err("Failed to enable PHY general clock\n");
  133. return ret;
  134. }
  135. ret = clk_get_by_name(dev, "usb", &clk_usb);
  136. if (ret)
  137. return ret;
  138. ret = clk_enable(&clk_usb);
  139. if (ret && ret != -ENOSYS && ret != -ENOTSUPP) {
  140. pr_err("Failed to enable PHY clock\n");
  141. return ret;
  142. }
  143. ret = reset_get_bulk(dev, &priv->resets);
  144. if (!ret) {
  145. ret = reset_deassert_bulk(&priv->resets);
  146. if (ret) {
  147. pr_err("Failed to deassert reset\n");
  148. return ret;
  149. }
  150. }
  151. return 0;
  152. }
  153. static int meson_gxbb_usb2_phy_remove(struct udevice *dev)
  154. {
  155. struct phy_meson_gxbb_usb2_priv *priv = dev_get_priv(dev);
  156. return reset_release_bulk(&priv->resets);
  157. }
  158. static const struct udevice_id meson_gxbb_usb2_phy_ids[] = {
  159. { .compatible = "amlogic,meson8-usb2-phy" },
  160. { .compatible = "amlogic,meson8b-usb2-phy" },
  161. { .compatible = "amlogic,meson-gxbb-usb2-phy" },
  162. { }
  163. };
  164. U_BOOT_DRIVER(meson_gxbb_usb2_phy) = {
  165. .name = "meson_gxbb_usb2_phy",
  166. .id = UCLASS_PHY,
  167. .of_match = meson_gxbb_usb2_phy_ids,
  168. .probe = meson_gxbb_usb2_phy_probe,
  169. .remove = meson_gxbb_usb2_phy_remove,
  170. .ops = &meson_gxbb_usb2_phy_ops,
  171. .priv_auto = sizeof(struct phy_meson_gxbb_usb2_priv),
  172. };