emac-phy.c 5.4 KB

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