phy-mtk-pcie.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2022 MediaTek Inc.
  4. * Author: Jianjun Wang <[email protected]>
  5. */
  6. #include <linux/bitfield.h>
  7. #include <linux/module.h>
  8. #include <linux/nvmem-consumer.h>
  9. #include <linux/of_device.h>
  10. #include <linux/phy/phy.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/slab.h>
  13. #include "phy-mtk-io.h"
  14. #define PEXTP_ANA_GLB_00_REG 0x9000
  15. /* Internal Resistor Selection of TX Bias Current */
  16. #define EFUSE_GLB_INTR_SEL GENMASK(28, 24)
  17. #define PEXTP_ANA_LN0_TRX_REG 0xa000
  18. #define PEXTP_ANA_TX_REG 0x04
  19. /* TX PMOS impedance selection */
  20. #define EFUSE_LN_TX_PMOS_SEL GENMASK(5, 2)
  21. /* TX NMOS impedance selection */
  22. #define EFUSE_LN_TX_NMOS_SEL GENMASK(11, 8)
  23. #define PEXTP_ANA_RX_REG 0x3c
  24. /* RX impedance selection */
  25. #define EFUSE_LN_RX_SEL GENMASK(3, 0)
  26. #define PEXTP_ANA_LANE_OFFSET 0x100
  27. /**
  28. * struct mtk_pcie_lane_efuse - eFuse data for each lane
  29. * @tx_pmos: TX PMOS impedance selection data
  30. * @tx_nmos: TX NMOS impedance selection data
  31. * @rx_data: RX impedance selection data
  32. * @lane_efuse_supported: software eFuse data is supported for this lane
  33. */
  34. struct mtk_pcie_lane_efuse {
  35. u32 tx_pmos;
  36. u32 tx_nmos;
  37. u32 rx_data;
  38. bool lane_efuse_supported;
  39. };
  40. /**
  41. * struct mtk_pcie_phy_data - phy data for each SoC
  42. * @num_lanes: supported lane numbers
  43. * @sw_efuse_supported: support software to load eFuse data
  44. */
  45. struct mtk_pcie_phy_data {
  46. int num_lanes;
  47. bool sw_efuse_supported;
  48. };
  49. /**
  50. * struct mtk_pcie_phy - PCIe phy driver main structure
  51. * @dev: pointer to device
  52. * @phy: pointer to generic phy
  53. * @sif_base: IO mapped register base address of system interface
  54. * @data: pointer to SoC dependent data
  55. * @sw_efuse_en: software eFuse enable status
  56. * @efuse_glb_intr: internal resistor selection of TX bias current data
  57. * @efuse: pointer to eFuse data for each lane
  58. */
  59. struct mtk_pcie_phy {
  60. struct device *dev;
  61. struct phy *phy;
  62. void __iomem *sif_base;
  63. const struct mtk_pcie_phy_data *data;
  64. bool sw_efuse_en;
  65. u32 efuse_glb_intr;
  66. struct mtk_pcie_lane_efuse *efuse;
  67. };
  68. static void mtk_pcie_efuse_set_lane(struct mtk_pcie_phy *pcie_phy,
  69. unsigned int lane)
  70. {
  71. struct mtk_pcie_lane_efuse *data = &pcie_phy->efuse[lane];
  72. void __iomem *addr;
  73. if (!data->lane_efuse_supported)
  74. return;
  75. addr = pcie_phy->sif_base + PEXTP_ANA_LN0_TRX_REG +
  76. lane * PEXTP_ANA_LANE_OFFSET;
  77. mtk_phy_update_field(addr + PEXTP_ANA_TX_REG, EFUSE_LN_TX_PMOS_SEL,
  78. data->tx_pmos);
  79. mtk_phy_update_field(addr + PEXTP_ANA_TX_REG, EFUSE_LN_TX_NMOS_SEL,
  80. data->tx_nmos);
  81. mtk_phy_update_field(addr + PEXTP_ANA_RX_REG, EFUSE_LN_RX_SEL,
  82. data->rx_data);
  83. }
  84. /**
  85. * mtk_pcie_phy_init() - Initialize the phy
  86. * @phy: the phy to be initialized
  87. *
  88. * Initialize the phy by setting the efuse data.
  89. * The hardware settings will be reset during suspend, it should be
  90. * reinitialized when the consumer calls phy_init() again on resume.
  91. */
  92. static int mtk_pcie_phy_init(struct phy *phy)
  93. {
  94. struct mtk_pcie_phy *pcie_phy = phy_get_drvdata(phy);
  95. int i;
  96. if (!pcie_phy->sw_efuse_en)
  97. return 0;
  98. /* Set global data */
  99. mtk_phy_update_field(pcie_phy->sif_base + PEXTP_ANA_GLB_00_REG,
  100. EFUSE_GLB_INTR_SEL, pcie_phy->efuse_glb_intr);
  101. for (i = 0; i < pcie_phy->data->num_lanes; i++)
  102. mtk_pcie_efuse_set_lane(pcie_phy, i);
  103. return 0;
  104. }
  105. static const struct phy_ops mtk_pcie_phy_ops = {
  106. .init = mtk_pcie_phy_init,
  107. .owner = THIS_MODULE,
  108. };
  109. static int mtk_pcie_efuse_read_for_lane(struct mtk_pcie_phy *pcie_phy,
  110. unsigned int lane)
  111. {
  112. struct mtk_pcie_lane_efuse *efuse = &pcie_phy->efuse[lane];
  113. struct device *dev = pcie_phy->dev;
  114. char efuse_id[16];
  115. int ret;
  116. snprintf(efuse_id, sizeof(efuse_id), "tx_ln%d_pmos", lane);
  117. ret = nvmem_cell_read_variable_le_u32(dev, efuse_id, &efuse->tx_pmos);
  118. if (ret)
  119. return dev_err_probe(dev, ret, "Failed to read %s\n", efuse_id);
  120. snprintf(efuse_id, sizeof(efuse_id), "tx_ln%d_nmos", lane);
  121. ret = nvmem_cell_read_variable_le_u32(dev, efuse_id, &efuse->tx_nmos);
  122. if (ret)
  123. return dev_err_probe(dev, ret, "Failed to read %s\n", efuse_id);
  124. snprintf(efuse_id, sizeof(efuse_id), "rx_ln%d", lane);
  125. ret = nvmem_cell_read_variable_le_u32(dev, efuse_id, &efuse->rx_data);
  126. if (ret)
  127. return dev_err_probe(dev, ret, "Failed to read %s\n", efuse_id);
  128. if (!(efuse->tx_pmos || efuse->tx_nmos || efuse->rx_data))
  129. return dev_err_probe(dev, -EINVAL,
  130. "No eFuse data found for lane%d, but dts enable it\n",
  131. lane);
  132. efuse->lane_efuse_supported = true;
  133. return 0;
  134. }
  135. static int mtk_pcie_read_efuse(struct mtk_pcie_phy *pcie_phy)
  136. {
  137. struct device *dev = pcie_phy->dev;
  138. bool nvmem_enabled;
  139. int ret, i;
  140. /* nvmem data is optional */
  141. nvmem_enabled = device_property_present(dev, "nvmem-cells");
  142. if (!nvmem_enabled)
  143. return 0;
  144. ret = nvmem_cell_read_variable_le_u32(dev, "glb_intr",
  145. &pcie_phy->efuse_glb_intr);
  146. if (ret)
  147. return dev_err_probe(dev, ret, "Failed to read glb_intr\n");
  148. pcie_phy->sw_efuse_en = true;
  149. pcie_phy->efuse = devm_kzalloc(dev, pcie_phy->data->num_lanes *
  150. sizeof(*pcie_phy->efuse), GFP_KERNEL);
  151. if (!pcie_phy->efuse)
  152. return -ENOMEM;
  153. for (i = 0; i < pcie_phy->data->num_lanes; i++) {
  154. ret = mtk_pcie_efuse_read_for_lane(pcie_phy, i);
  155. if (ret)
  156. return ret;
  157. }
  158. return 0;
  159. }
  160. static int mtk_pcie_phy_probe(struct platform_device *pdev)
  161. {
  162. struct device *dev = &pdev->dev;
  163. struct phy_provider *provider;
  164. struct mtk_pcie_phy *pcie_phy;
  165. int ret;
  166. pcie_phy = devm_kzalloc(dev, sizeof(*pcie_phy), GFP_KERNEL);
  167. if (!pcie_phy)
  168. return -ENOMEM;
  169. pcie_phy->sif_base = devm_platform_ioremap_resource_byname(pdev, "sif");
  170. if (IS_ERR(pcie_phy->sif_base))
  171. return dev_err_probe(dev, PTR_ERR(pcie_phy->sif_base),
  172. "Failed to map phy-sif base\n");
  173. pcie_phy->phy = devm_phy_create(dev, dev->of_node, &mtk_pcie_phy_ops);
  174. if (IS_ERR(pcie_phy->phy))
  175. return dev_err_probe(dev, PTR_ERR(pcie_phy->phy),
  176. "Failed to create PCIe phy\n");
  177. pcie_phy->dev = dev;
  178. pcie_phy->data = of_device_get_match_data(dev);
  179. if (!pcie_phy->data)
  180. return dev_err_probe(dev, -EINVAL, "Failed to get phy data\n");
  181. if (pcie_phy->data->sw_efuse_supported) {
  182. /*
  183. * Failed to read the efuse data is not a fatal problem,
  184. * ignore the failure and keep going.
  185. */
  186. ret = mtk_pcie_read_efuse(pcie_phy);
  187. if (ret == -EPROBE_DEFER || ret == -ENOMEM)
  188. return ret;
  189. }
  190. phy_set_drvdata(pcie_phy->phy, pcie_phy);
  191. provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate);
  192. if (IS_ERR(provider))
  193. return dev_err_probe(dev, PTR_ERR(provider),
  194. "PCIe phy probe failed\n");
  195. return 0;
  196. }
  197. static const struct mtk_pcie_phy_data mt8195_data = {
  198. .num_lanes = 2,
  199. .sw_efuse_supported = true,
  200. };
  201. static const struct of_device_id mtk_pcie_phy_of_match[] = {
  202. { .compatible = "mediatek,mt8195-pcie-phy", .data = &mt8195_data },
  203. { },
  204. };
  205. MODULE_DEVICE_TABLE(of, mtk_pcie_phy_of_match);
  206. static struct platform_driver mtk_pcie_phy_driver = {
  207. .probe = mtk_pcie_phy_probe,
  208. .driver = {
  209. .name = "mtk-pcie-phy",
  210. .of_match_table = mtk_pcie_phy_of_match,
  211. },
  212. };
  213. module_platform_driver(mtk_pcie_phy_driver);
  214. MODULE_DESCRIPTION("MediaTek PCIe PHY driver");
  215. MODULE_AUTHOR("Jianjun Wang <[email protected]>");
  216. MODULE_LICENSE("GPL");