miiphybb.c 2.4 KB

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