miiphybb.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2010
  4. * Dirk Eibach, Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc
  5. */
  6. #include <common.h>
  7. #include <miiphy.h>
  8. #include <asm/io.h>
  9. struct io_bb_pinset {
  10. int mdio;
  11. int mdc;
  12. };
  13. static int io_bb_mii_init(struct bb_miiphy_bus *bus)
  14. {
  15. return 0;
  16. }
  17. static int io_bb_mdio_active(struct bb_miiphy_bus *bus)
  18. {
  19. struct io_bb_pinset *pins = bus->priv;
  20. out_be32((void *)GPIO0_TCR,
  21. in_be32((void *)GPIO0_TCR) | pins->mdio);
  22. return 0;
  23. }
  24. static int io_bb_mdio_tristate(struct bb_miiphy_bus *bus)
  25. {
  26. struct io_bb_pinset *pins = bus->priv;
  27. out_be32((void *)GPIO0_TCR,
  28. in_be32((void *)GPIO0_TCR) & ~pins->mdio);
  29. return 0;
  30. }
  31. static int io_bb_set_mdio(struct bb_miiphy_bus *bus, int v)
  32. {
  33. struct io_bb_pinset *pins = bus->priv;
  34. if (v)
  35. out_be32((void *)GPIO0_OR,
  36. in_be32((void *)GPIO0_OR) | pins->mdio);
  37. else
  38. out_be32((void *)GPIO0_OR,
  39. in_be32((void *)GPIO0_OR) & ~pins->mdio);
  40. return 0;
  41. }
  42. static int io_bb_get_mdio(struct bb_miiphy_bus *bus, int *v)
  43. {
  44. struct io_bb_pinset *pins = bus->priv;
  45. *v = ((in_be32((void *)GPIO0_IR) & pins->mdio) != 0);
  46. return 0;
  47. }
  48. static int io_bb_set_mdc(struct bb_miiphy_bus *bus, int v)
  49. {
  50. struct io_bb_pinset *pins = bus->priv;
  51. if (v)
  52. out_be32((void *)GPIO0_OR,
  53. in_be32((void *)GPIO0_OR) | pins->mdc);
  54. else
  55. out_be32((void *)GPIO0_OR,
  56. in_be32((void *)GPIO0_OR) & ~pins->mdc);
  57. return 0;
  58. }
  59. static int io_bb_delay(struct bb_miiphy_bus *bus)
  60. {
  61. udelay(1);
  62. return 0;
  63. }
  64. struct io_bb_pinset io_bb_pinsets[] = {
  65. {
  66. .mdio = CONFIG_SYS_MDIO_PIN,
  67. .mdc = CONFIG_SYS_MDC_PIN,
  68. },
  69. #ifdef CONFIG_SYS_GBIT_MII1_BUSNAME
  70. {
  71. .mdio = CONFIG_SYS_MDIO1_PIN,
  72. .mdc = CONFIG_SYS_MDC1_PIN,
  73. },
  74. #endif
  75. };
  76. struct bb_miiphy_bus bb_miiphy_buses[] = {
  77. {
  78. .name = CONFIG_SYS_GBIT_MII_BUSNAME,
  79. .init = io_bb_mii_init,
  80. .mdio_active = io_bb_mdio_active,
  81. .mdio_tristate = io_bb_mdio_tristate,
  82. .set_mdio = io_bb_set_mdio,
  83. .get_mdio = io_bb_get_mdio,
  84. .set_mdc = io_bb_set_mdc,
  85. .delay = io_bb_delay,
  86. .priv = &io_bb_pinsets[0],
  87. },
  88. #ifdef CONFIG_SYS_GBIT_MII1_BUSNAME
  89. {
  90. .name = CONFIG_SYS_GBIT_MII1_BUSNAME,
  91. .init = io_bb_mii_init,
  92. .mdio_active = io_bb_mdio_active,
  93. .mdio_tristate = io_bb_mdio_tristate,
  94. .set_mdio = io_bb_set_mdio,
  95. .get_mdio = io_bb_get_mdio,
  96. .set_mdc = io_bb_set_mdc,
  97. .delay = io_bb_delay,
  98. .priv = &io_bb_pinsets[1],
  99. },
  100. #endif
  101. };
  102. int bb_miiphy_buses_num = sizeof(bb_miiphy_buses) /
  103. sizeof(bb_miiphy_buses[0]);