1 // SPDX-License-Identifier: GPL-2.0+
4 * Dirk Eibach, Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc
17 static int io_bb_mii_init(struct bb_miiphy_bus *bus)
22 static int io_bb_mdio_active(struct bb_miiphy_bus *bus)
24 struct io_bb_pinset *pins = bus->priv;
26 out_be32((void *)GPIO0_TCR,
27 in_be32((void *)GPIO0_TCR) | pins->mdio);
32 static int io_bb_mdio_tristate(struct bb_miiphy_bus *bus)
34 struct io_bb_pinset *pins = bus->priv;
36 out_be32((void *)GPIO0_TCR,
37 in_be32((void *)GPIO0_TCR) & ~pins->mdio);
42 static int io_bb_set_mdio(struct bb_miiphy_bus *bus, int v)
44 struct io_bb_pinset *pins = bus->priv;
47 out_be32((void *)GPIO0_OR,
48 in_be32((void *)GPIO0_OR) | pins->mdio);
50 out_be32((void *)GPIO0_OR,
51 in_be32((void *)GPIO0_OR) & ~pins->mdio);
56 static int io_bb_get_mdio(struct bb_miiphy_bus *bus, int *v)
58 struct io_bb_pinset *pins = bus->priv;
60 *v = ((in_be32((void *)GPIO0_IR) & pins->mdio) != 0);
65 static int io_bb_set_mdc(struct bb_miiphy_bus *bus, int v)
67 struct io_bb_pinset *pins = bus->priv;
70 out_be32((void *)GPIO0_OR,
71 in_be32((void *)GPIO0_OR) | pins->mdc);
73 out_be32((void *)GPIO0_OR,
74 in_be32((void *)GPIO0_OR) & ~pins->mdc);
79 static int io_bb_delay(struct bb_miiphy_bus *bus)
86 struct io_bb_pinset io_bb_pinsets[] = {
88 .mdio = CONFIG_SYS_MDIO_PIN,
89 .mdc = CONFIG_SYS_MDC_PIN,
91 #ifdef CONFIG_SYS_GBIT_MII1_BUSNAME
93 .mdio = CONFIG_SYS_MDIO1_PIN,
94 .mdc = CONFIG_SYS_MDC1_PIN,
99 struct bb_miiphy_bus bb_miiphy_buses[] = {
101 .name = CONFIG_SYS_GBIT_MII_BUSNAME,
102 .init = io_bb_mii_init,
103 .mdio_active = io_bb_mdio_active,
104 .mdio_tristate = io_bb_mdio_tristate,
105 .set_mdio = io_bb_set_mdio,
106 .get_mdio = io_bb_get_mdio,
107 .set_mdc = io_bb_set_mdc,
108 .delay = io_bb_delay,
109 .priv = &io_bb_pinsets[0],
111 #ifdef CONFIG_SYS_GBIT_MII1_BUSNAME
113 .name = CONFIG_SYS_GBIT_MII1_BUSNAME,
114 .init = io_bb_mii_init,
115 .mdio_active = io_bb_mdio_active,
116 .mdio_tristate = io_bb_mdio_tristate,
117 .set_mdio = io_bb_set_mdio,
118 .get_mdio = io_bb_get_mdio,
119 .set_mdc = io_bb_set_mdc,
120 .delay = io_bb_delay,
121 .priv = &io_bb_pinsets[1],
126 int bb_miiphy_buses_num = sizeof(bb_miiphy_buses) /
127 sizeof(bb_miiphy_buses[0]);