emac-phy.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
  3. */
  4. /* Qualcomm Technologies, Inc. EMAC PHY Controller driver.
  5. */
  6. #include <linux/of_mdio.h>
  7. #include <linux/phy.h>
  8. #include <linux/iopoll.h>
  9. #include <linux/acpi.h>
  10. #include "emac.h"
  11. /* EMAC base register offsets */
  12. #define EMAC_MDIO_CTRL 0x001414
  13. #define EMAC_PHY_STS 0x001418
  14. #define EMAC_MDIO_EX_CTRL 0x001440
  15. /* EMAC_MDIO_CTRL */
  16. #define MDIO_MODE BIT(30)
  17. #define MDIO_PR BIT(29)
  18. #define MDIO_AP_EN BIT(28)
  19. #define MDIO_BUSY BIT(27)
  20. #define MDIO_CLK_SEL_BMSK 0x7000000
  21. #define MDIO_CLK_SEL_SHFT 24
  22. #define MDIO_START BIT(23)
  23. #define SUP_PREAMBLE BIT(22)
  24. #define MDIO_RD_NWR BIT(21)
  25. #define MDIO_REG_ADDR_BMSK 0x1f0000
  26. #define MDIO_REG_ADDR_SHFT 16
  27. #define MDIO_DATA_BMSK 0xffff
  28. #define MDIO_DATA_SHFT 0
  29. /* EMAC_PHY_STS */
  30. #define PHY_ADDR_BMSK 0x1f0000
  31. #define PHY_ADDR_SHFT 16
  32. #define MDIO_CLK_25_4 0
  33. #define MDIO_CLK_25_28 7
  34. #define MDIO_WAIT_TIMES 1000
  35. #define MDIO_STATUS_DELAY_TIME 1
  36. static int emac_mdio_read(struct mii_bus *bus, int addr, int regnum)
  37. {
  38. struct emac_adapter *adpt = bus->priv;
  39. u32 reg;
  40. emac_reg_update32(adpt->base + EMAC_PHY_STS, PHY_ADDR_BMSK,
  41. (addr << PHY_ADDR_SHFT));
  42. reg = SUP_PREAMBLE |
  43. ((MDIO_CLK_25_4 << MDIO_CLK_SEL_SHFT) & MDIO_CLK_SEL_BMSK) |
  44. ((regnum << MDIO_REG_ADDR_SHFT) & MDIO_REG_ADDR_BMSK) |
  45. MDIO_START | MDIO_RD_NWR;
  46. writel(reg, adpt->base + EMAC_MDIO_CTRL);
  47. if (readl_poll_timeout(adpt->base + EMAC_MDIO_CTRL, reg,
  48. !(reg & (MDIO_START | MDIO_BUSY)),
  49. MDIO_STATUS_DELAY_TIME, MDIO_WAIT_TIMES * 100))
  50. return -EIO;
  51. return (reg >> MDIO_DATA_SHFT) & MDIO_DATA_BMSK;
  52. }
  53. static int emac_mdio_write(struct mii_bus *bus, int addr, int regnum, u16 val)
  54. {
  55. struct emac_adapter *adpt = bus->priv;
  56. u32 reg;
  57. emac_reg_update32(adpt->base + EMAC_PHY_STS, PHY_ADDR_BMSK,
  58. (addr << PHY_ADDR_SHFT));
  59. reg = SUP_PREAMBLE |
  60. ((MDIO_CLK_25_4 << MDIO_CLK_SEL_SHFT) & MDIO_CLK_SEL_BMSK) |
  61. ((regnum << MDIO_REG_ADDR_SHFT) & MDIO_REG_ADDR_BMSK) |
  62. ((val << MDIO_DATA_SHFT) & MDIO_DATA_BMSK) |
  63. MDIO_START;
  64. writel(reg, adpt->base + EMAC_MDIO_CTRL);
  65. if (readl_poll_timeout(adpt->base + EMAC_MDIO_CTRL, reg,
  66. !(reg & (MDIO_START | MDIO_BUSY)),
  67. MDIO_STATUS_DELAY_TIME, MDIO_WAIT_TIMES * 100))
  68. return -EIO;
  69. return 0;
  70. }
  71. /* Configure the MDIO bus and connect the external PHY */
  72. int emac_phy_config(struct platform_device *pdev, struct emac_adapter *adpt)
  73. {
  74. struct device_node *np = pdev->dev.of_node;
  75. struct mii_bus *mii_bus;
  76. int ret;
  77. /* Create the mii_bus object for talking to the MDIO bus */
  78. adpt->mii_bus = mii_bus = devm_mdiobus_alloc(&pdev->dev);
  79. if (!mii_bus)
  80. return -ENOMEM;
  81. mii_bus->name = "emac-mdio";
  82. snprintf(mii_bus->id, MII_BUS_ID_SIZE, "%s", pdev->name);
  83. mii_bus->read = emac_mdio_read;
  84. mii_bus->write = emac_mdio_write;
  85. mii_bus->parent = &pdev->dev;
  86. mii_bus->priv = adpt;
  87. if (has_acpi_companion(&pdev->dev)) {
  88. u32 phy_addr;
  89. ret = mdiobus_register(mii_bus);
  90. if (ret) {
  91. dev_err(&pdev->dev, "could not register mdio bus\n");
  92. return ret;
  93. }
  94. ret = device_property_read_u32(&pdev->dev, "phy-channel",
  95. &phy_addr);
  96. if (ret)
  97. /* If we can't read a valid phy address, then assume
  98. * that there is only one phy on this mdio bus.
  99. */
  100. adpt->phydev = phy_find_first(mii_bus);
  101. else
  102. adpt->phydev = mdiobus_get_phy(mii_bus, phy_addr);
  103. /* of_phy_find_device() claims a reference to the phydev,
  104. * so we do that here manually as well. When the driver
  105. * later unloads, it can unilaterally drop the reference
  106. * without worrying about ACPI vs DT.
  107. */
  108. if (adpt->phydev)
  109. get_device(&adpt->phydev->mdio.dev);
  110. } else {
  111. struct device_node *phy_np;
  112. ret = of_mdiobus_register(mii_bus, np);
  113. if (ret) {
  114. dev_err(&pdev->dev, "could not register mdio bus\n");
  115. return ret;
  116. }
  117. phy_np = of_parse_phandle(np, "phy-handle", 0);
  118. adpt->phydev = of_phy_find_device(phy_np);
  119. of_node_put(phy_np);
  120. }
  121. if (!adpt->phydev) {
  122. dev_err(&pdev->dev, "could not find external phy\n");
  123. mdiobus_unregister(mii_bus);
  124. return -ENODEV;
  125. }
  126. return 0;
  127. }