emac-phy.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. static int emac_mdio_read(struct mii_bus *bus, int addr, int regnum)
  44. {
  45. struct emac_adapter *adpt = bus->priv;
  46. u32 reg;
  47. emac_reg_update32(adpt->base + EMAC_PHY_STS, PHY_ADDR_BMSK,
  48. (addr << PHY_ADDR_SHFT));
  49. reg = SUP_PREAMBLE |
  50. ((MDIO_CLK_25_4 << MDIO_CLK_SEL_SHFT) & MDIO_CLK_SEL_BMSK) |
  51. ((regnum << MDIO_REG_ADDR_SHFT) & MDIO_REG_ADDR_BMSK) |
  52. MDIO_START | MDIO_RD_NWR;
  53. writel(reg, adpt->base + EMAC_MDIO_CTRL);
  54. if (readl_poll_timeout(adpt->base + EMAC_MDIO_CTRL, reg,
  55. !(reg & (MDIO_START | MDIO_BUSY)),
  56. 100, MDIO_WAIT_TIMES * 100))
  57. return -EIO;
  58. return (reg >> MDIO_DATA_SHFT) & MDIO_DATA_BMSK;
  59. }
  60. static int emac_mdio_write(struct mii_bus *bus, int addr, int regnum, u16 val)
  61. {
  62. struct emac_adapter *adpt = bus->priv;
  63. u32 reg;
  64. emac_reg_update32(adpt->base + EMAC_PHY_STS, PHY_ADDR_BMSK,
  65. (addr << PHY_ADDR_SHFT));
  66. reg = SUP_PREAMBLE |
  67. ((MDIO_CLK_25_4 << MDIO_CLK_SEL_SHFT) & MDIO_CLK_SEL_BMSK) |
  68. ((regnum << MDIO_REG_ADDR_SHFT) & MDIO_REG_ADDR_BMSK) |
  69. ((val << MDIO_DATA_SHFT) & MDIO_DATA_BMSK) |
  70. MDIO_START;
  71. writel(reg, adpt->base + EMAC_MDIO_CTRL);
  72. if (readl_poll_timeout(adpt->base + EMAC_MDIO_CTRL, reg,
  73. !(reg & (MDIO_START | MDIO_BUSY)), 100,
  74. MDIO_WAIT_TIMES * 100))
  75. return -EIO;
  76. return 0;
  77. }
  78. /* Configure the MDIO bus and connect the external PHY */
  79. int emac_phy_config(struct platform_device *pdev, struct emac_adapter *adpt)
  80. {
  81. struct device_node *np = pdev->dev.of_node;
  82. struct mii_bus *mii_bus;
  83. int ret;
  84. /* Create the mii_bus object for talking to the MDIO bus */
  85. adpt->mii_bus = mii_bus = devm_mdiobus_alloc(&pdev->dev);
  86. if (!mii_bus)
  87. return -ENOMEM;
  88. mii_bus->name = "emac-mdio";
  89. snprintf(mii_bus->id, MII_BUS_ID_SIZE, "%s", pdev->name);
  90. mii_bus->read = emac_mdio_read;
  91. mii_bus->write = emac_mdio_write;
  92. mii_bus->parent = &pdev->dev;
  93. mii_bus->priv = adpt;
  94. if (has_acpi_companion(&pdev->dev)) {
  95. u32 phy_addr;
  96. ret = mdiobus_register(mii_bus);
  97. if (ret) {
  98. dev_err(&pdev->dev, "could not register mdio bus\n");
  99. return ret;
  100. }
  101. ret = device_property_read_u32(&pdev->dev, "phy-channel",
  102. &phy_addr);
  103. if (ret)
  104. /* If we can't read a valid phy address, then assume
  105. * that there is only one phy on this mdio bus.
  106. */
  107. adpt->phydev = phy_find_first(mii_bus);
  108. else
  109. adpt->phydev = mdiobus_get_phy(mii_bus, phy_addr);
  110. /* of_phy_find_device() claims a reference to the phydev,
  111. * so we do that here manually as well. When the driver
  112. * later unloads, it can unilaterally drop the reference
  113. * without worrying about ACPI vs DT.
  114. */
  115. if (adpt->phydev)
  116. get_device(&adpt->phydev->mdio.dev);
  117. } else {
  118. struct device_node *phy_np;
  119. ret = of_mdiobus_register(mii_bus, np);
  120. if (ret) {
  121. dev_err(&pdev->dev, "could not register mdio bus\n");
  122. return ret;
  123. }
  124. phy_np = of_parse_phandle(np, "phy-handle", 0);
  125. adpt->phydev = of_phy_find_device(phy_np);
  126. of_node_put(phy_np);
  127. }
  128. if (!adpt->phydev) {
  129. dev_err(&pdev->dev, "could not find external phy\n");
  130. mdiobus_unregister(mii_bus);
  131. return -ENODEV;
  132. }
  133. return 0;
  134. }