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