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]);