733-v6.3-19-net-ethernet-mtk_eth_soc-set-MDIO-bus-clock-frequenc.patch 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. From c0a440031d4314d1023c1b87f43a4233634eebdb Mon Sep 17 00:00:00 2001
  2. From: Daniel Golle <[email protected]>
  3. Date: Sun, 19 Mar 2023 12:57:15 +0000
  4. Subject: [PATCH] net: ethernet: mtk_eth_soc: set MDIO bus clock frequency
  5. MIME-Version: 1.0
  6. Content-Type: text/plain; charset=UTF-8
  7. Content-Transfer-Encoding: 8bit
  8. Set MDIO bus clock frequency and allow setting a custom maximum
  9. frequency from device tree.
  10. Reviewed-by: Andrew Lunn <[email protected]>
  11. Reviewed-by: Florian Fainelli <[email protected]>
  12. Tested-by: Bjørn Mork <[email protected]>
  13. Signed-off-by: Daniel Golle <[email protected]>
  14. Signed-off-by: Jakub Kicinski <[email protected]>
  15. ---
  16. drivers/net/ethernet/mediatek/mtk_eth_soc.c | 21 +++++++++++++++++++++
  17. drivers/net/ethernet/mediatek/mtk_eth_soc.h | 7 +++++++
  18. 2 files changed, 28 insertions(+)
  19. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  20. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  21. @@ -701,8 +701,10 @@ static const struct phylink_mac_ops mtk_
  22. static int mtk_mdio_init(struct mtk_eth *eth)
  23. {
  24. + unsigned int max_clk = 2500000, divider;
  25. struct device_node *mii_np;
  26. int ret;
  27. + u32 val;
  28. mii_np = of_get_child_by_name(eth->dev->of_node, "mdio-bus");
  29. if (!mii_np) {
  30. @@ -728,6 +730,25 @@ static int mtk_mdio_init(struct mtk_eth
  31. eth->mii_bus->parent = eth->dev;
  32. snprintf(eth->mii_bus->id, MII_BUS_ID_SIZE, "%pOFn", mii_np);
  33. +
  34. + if (!of_property_read_u32(mii_np, "clock-frequency", &val)) {
  35. + if (val > MDC_MAX_FREQ || val < MDC_MAX_FREQ / MDC_MAX_DIVIDER) {
  36. + dev_err(eth->dev, "MDIO clock frequency out of range");
  37. + ret = -EINVAL;
  38. + goto err_put_node;
  39. + }
  40. + max_clk = val;
  41. + }
  42. + divider = min_t(unsigned int, DIV_ROUND_UP(MDC_MAX_FREQ, max_clk), 63);
  43. +
  44. + /* Configure MDC Divider */
  45. + val = mtk_r32(eth, MTK_PPSC);
  46. + val &= ~PPSC_MDC_CFG;
  47. + val |= FIELD_PREP(PPSC_MDC_CFG, divider) | PPSC_MDC_TURBO;
  48. + mtk_w32(eth, val, MTK_PPSC);
  49. +
  50. + dev_dbg(eth->dev, "MDC is running on %d Hz\n", MDC_MAX_FREQ / divider);
  51. +
  52. ret = of_mdiobus_register(eth->mii_bus, mii_np);
  53. err_put_node:
  54. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  55. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  56. @@ -363,6 +363,13 @@
  57. #define RX_DMA_VTAG_V2 BIT(0)
  58. #define RX_DMA_L4_VALID_V2 BIT(2)
  59. +/* PHY Polling and SMI Master Control registers */
  60. +#define MTK_PPSC 0x10000
  61. +#define PPSC_MDC_CFG GENMASK(29, 24)
  62. +#define PPSC_MDC_TURBO BIT(20)
  63. +#define MDC_MAX_FREQ 25000000
  64. +#define MDC_MAX_DIVIDER 63
  65. +
  66. /* PHY Indirect Access Control registers */
  67. #define MTK_PHY_IAC 0x10004
  68. #define PHY_IAC_ACCESS BIT(31)