phy-mtk-dp.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * MediaTek DisplayPort PHY driver
  4. *
  5. * Copyright (c) 2022, BayLibre Inc.
  6. * Copyright (c) 2022, MediaTek Inc.
  7. */
  8. #include <linux/delay.h>
  9. #include <linux/io.h>
  10. #include <linux/mfd/syscon.h>
  11. #include <linux/of.h>
  12. #include <linux/phy/phy.h>
  13. #include <linux/platform_device.h>
  14. #include <linux/regmap.h>
  15. #define PHY_OFFSET 0x1000
  16. #define MTK_DP_PHY_DIG_PLL_CTL_1 (PHY_OFFSET + 0x14)
  17. #define TPLL_SSC_EN BIT(3)
  18. #define MTK_DP_PHY_DIG_BIT_RATE (PHY_OFFSET + 0x3C)
  19. #define BIT_RATE_RBR 0
  20. #define BIT_RATE_HBR 1
  21. #define BIT_RATE_HBR2 2
  22. #define BIT_RATE_HBR3 3
  23. #define MTK_DP_PHY_DIG_SW_RST (PHY_OFFSET + 0x38)
  24. #define DP_GLB_SW_RST_PHYD BIT(0)
  25. #define MTK_DP_LANE0_DRIVING_PARAM_3 (PHY_OFFSET + 0x138)
  26. #define MTK_DP_LANE1_DRIVING_PARAM_3 (PHY_OFFSET + 0x238)
  27. #define MTK_DP_LANE2_DRIVING_PARAM_3 (PHY_OFFSET + 0x338)
  28. #define MTK_DP_LANE3_DRIVING_PARAM_3 (PHY_OFFSET + 0x438)
  29. #define XTP_LN_TX_LCTXC0_SW0_PRE0_DEFAULT BIT(4)
  30. #define XTP_LN_TX_LCTXC0_SW0_PRE1_DEFAULT (BIT(10) | BIT(12))
  31. #define XTP_LN_TX_LCTXC0_SW0_PRE2_DEFAULT GENMASK(20, 19)
  32. #define XTP_LN_TX_LCTXC0_SW0_PRE3_DEFAULT GENMASK(29, 29)
  33. #define DRIVING_PARAM_3_DEFAULT (XTP_LN_TX_LCTXC0_SW0_PRE0_DEFAULT | \
  34. XTP_LN_TX_LCTXC0_SW0_PRE1_DEFAULT | \
  35. XTP_LN_TX_LCTXC0_SW0_PRE2_DEFAULT | \
  36. XTP_LN_TX_LCTXC0_SW0_PRE3_DEFAULT)
  37. #define XTP_LN_TX_LCTXC0_SW1_PRE0_DEFAULT GENMASK(4, 3)
  38. #define XTP_LN_TX_LCTXC0_SW1_PRE1_DEFAULT GENMASK(12, 9)
  39. #define XTP_LN_TX_LCTXC0_SW1_PRE2_DEFAULT (BIT(18) | BIT(21))
  40. #define XTP_LN_TX_LCTXC0_SW2_PRE0_DEFAULT GENMASK(29, 29)
  41. #define DRIVING_PARAM_4_DEFAULT (XTP_LN_TX_LCTXC0_SW1_PRE0_DEFAULT | \
  42. XTP_LN_TX_LCTXC0_SW1_PRE1_DEFAULT | \
  43. XTP_LN_TX_LCTXC0_SW1_PRE2_DEFAULT | \
  44. XTP_LN_TX_LCTXC0_SW2_PRE0_DEFAULT)
  45. #define XTP_LN_TX_LCTXC0_SW2_PRE1_DEFAULT (BIT(3) | BIT(5))
  46. #define XTP_LN_TX_LCTXC0_SW3_PRE0_DEFAULT GENMASK(13, 12)
  47. #define DRIVING_PARAM_5_DEFAULT (XTP_LN_TX_LCTXC0_SW2_PRE1_DEFAULT | \
  48. XTP_LN_TX_LCTXC0_SW3_PRE0_DEFAULT)
  49. #define XTP_LN_TX_LCTXCP1_SW0_PRE0_DEFAULT 0
  50. #define XTP_LN_TX_LCTXCP1_SW0_PRE1_DEFAULT GENMASK(10, 10)
  51. #define XTP_LN_TX_LCTXCP1_SW0_PRE2_DEFAULT GENMASK(19, 19)
  52. #define XTP_LN_TX_LCTXCP1_SW0_PRE3_DEFAULT GENMASK(28, 28)
  53. #define DRIVING_PARAM_6_DEFAULT (XTP_LN_TX_LCTXCP1_SW0_PRE0_DEFAULT | \
  54. XTP_LN_TX_LCTXCP1_SW0_PRE1_DEFAULT | \
  55. XTP_LN_TX_LCTXCP1_SW0_PRE2_DEFAULT | \
  56. XTP_LN_TX_LCTXCP1_SW0_PRE3_DEFAULT)
  57. #define XTP_LN_TX_LCTXCP1_SW1_PRE0_DEFAULT 0
  58. #define XTP_LN_TX_LCTXCP1_SW1_PRE1_DEFAULT GENMASK(10, 9)
  59. #define XTP_LN_TX_LCTXCP1_SW1_PRE2_DEFAULT GENMASK(19, 18)
  60. #define XTP_LN_TX_LCTXCP1_SW2_PRE0_DEFAULT 0
  61. #define DRIVING_PARAM_7_DEFAULT (XTP_LN_TX_LCTXCP1_SW1_PRE0_DEFAULT | \
  62. XTP_LN_TX_LCTXCP1_SW1_PRE1_DEFAULT | \
  63. XTP_LN_TX_LCTXCP1_SW1_PRE2_DEFAULT | \
  64. XTP_LN_TX_LCTXCP1_SW2_PRE0_DEFAULT)
  65. #define XTP_LN_TX_LCTXCP1_SW2_PRE1_DEFAULT GENMASK(3, 3)
  66. #define XTP_LN_TX_LCTXCP1_SW3_PRE0_DEFAULT 0
  67. #define DRIVING_PARAM_8_DEFAULT (XTP_LN_TX_LCTXCP1_SW2_PRE1_DEFAULT | \
  68. XTP_LN_TX_LCTXCP1_SW3_PRE0_DEFAULT)
  69. struct mtk_dp_phy {
  70. struct regmap *regs;
  71. };
  72. static int mtk_dp_phy_init(struct phy *phy)
  73. {
  74. struct mtk_dp_phy *dp_phy = phy_get_drvdata(phy);
  75. static const u32 driving_params[] = {
  76. DRIVING_PARAM_3_DEFAULT,
  77. DRIVING_PARAM_4_DEFAULT,
  78. DRIVING_PARAM_5_DEFAULT,
  79. DRIVING_PARAM_6_DEFAULT,
  80. DRIVING_PARAM_7_DEFAULT,
  81. DRIVING_PARAM_8_DEFAULT
  82. };
  83. regmap_bulk_write(dp_phy->regs, MTK_DP_LANE0_DRIVING_PARAM_3,
  84. driving_params, ARRAY_SIZE(driving_params));
  85. regmap_bulk_write(dp_phy->regs, MTK_DP_LANE1_DRIVING_PARAM_3,
  86. driving_params, ARRAY_SIZE(driving_params));
  87. regmap_bulk_write(dp_phy->regs, MTK_DP_LANE2_DRIVING_PARAM_3,
  88. driving_params, ARRAY_SIZE(driving_params));
  89. regmap_bulk_write(dp_phy->regs, MTK_DP_LANE3_DRIVING_PARAM_3,
  90. driving_params, ARRAY_SIZE(driving_params));
  91. return 0;
  92. }
  93. static int mtk_dp_phy_configure(struct phy *phy, union phy_configure_opts *opts)
  94. {
  95. struct mtk_dp_phy *dp_phy = phy_get_drvdata(phy);
  96. u32 val;
  97. if (opts->dp.set_rate) {
  98. switch (opts->dp.link_rate) {
  99. default:
  100. dev_err(&phy->dev,
  101. "Implementation error, unknown linkrate %x\n",
  102. opts->dp.link_rate);
  103. return -EINVAL;
  104. case 1620:
  105. val = BIT_RATE_RBR;
  106. break;
  107. case 2700:
  108. val = BIT_RATE_HBR;
  109. break;
  110. case 5400:
  111. val = BIT_RATE_HBR2;
  112. break;
  113. case 8100:
  114. val = BIT_RATE_HBR3;
  115. break;
  116. }
  117. regmap_write(dp_phy->regs, MTK_DP_PHY_DIG_BIT_RATE, val);
  118. }
  119. regmap_update_bits(dp_phy->regs, MTK_DP_PHY_DIG_PLL_CTL_1,
  120. TPLL_SSC_EN, opts->dp.ssc ? TPLL_SSC_EN : 0);
  121. return 0;
  122. }
  123. static int mtk_dp_phy_reset(struct phy *phy)
  124. {
  125. struct mtk_dp_phy *dp_phy = phy_get_drvdata(phy);
  126. regmap_update_bits(dp_phy->regs, MTK_DP_PHY_DIG_SW_RST,
  127. DP_GLB_SW_RST_PHYD, 0);
  128. usleep_range(50, 200);
  129. regmap_update_bits(dp_phy->regs, MTK_DP_PHY_DIG_SW_RST,
  130. DP_GLB_SW_RST_PHYD, 1);
  131. return 0;
  132. }
  133. static const struct phy_ops mtk_dp_phy_dev_ops = {
  134. .init = mtk_dp_phy_init,
  135. .configure = mtk_dp_phy_configure,
  136. .reset = mtk_dp_phy_reset,
  137. .owner = THIS_MODULE,
  138. };
  139. static int mtk_dp_phy_probe(struct platform_device *pdev)
  140. {
  141. struct device *dev = &pdev->dev;
  142. struct mtk_dp_phy *dp_phy;
  143. struct phy *phy;
  144. struct regmap *regs;
  145. regs = *(struct regmap **)dev->platform_data;
  146. if (!regs)
  147. return dev_err_probe(dev, -EINVAL,
  148. "No data passed, requires struct regmap**\n");
  149. dp_phy = devm_kzalloc(dev, sizeof(*dp_phy), GFP_KERNEL);
  150. if (!dp_phy)
  151. return -ENOMEM;
  152. dp_phy->regs = regs;
  153. phy = devm_phy_create(dev, NULL, &mtk_dp_phy_dev_ops);
  154. if (IS_ERR(phy))
  155. return dev_err_probe(dev, PTR_ERR(phy),
  156. "Failed to create DP PHY\n");
  157. phy_set_drvdata(phy, dp_phy);
  158. if (!dev->of_node)
  159. phy_create_lookup(phy, "dp", dev_name(dev));
  160. return 0;
  161. }
  162. static struct platform_driver mtk_dp_phy_driver = {
  163. .probe = mtk_dp_phy_probe,
  164. .driver = {
  165. .name = "mediatek-dp-phy",
  166. },
  167. };
  168. module_platform_driver(mtk_dp_phy_driver);
  169. MODULE_AUTHOR("Markus Schneider-Pargmann <[email protected]>");
  170. MODULE_DESCRIPTION("MediaTek DP PHY Driver");
  171. MODULE_LICENSE("GPL");