• Home
  • Raw
  • Download

Lines Matching +full:mdio +full:- +full:parent +full:- +full:bus

10 #include <linux/mdio-mux.h>
16 #define DRV_DESCRIPTION "MDIO bus multiplexer driver"
33 struct mdio_mux_parent_bus *parent; member
39 * The parent bus' lock is used to order access to the switch_fn.
41 static int mdio_mux_read(struct mii_bus *bus, int phy_id, int regnum) in mdio_mux_read() argument
43 struct mdio_mux_child_bus *cb = bus->priv; in mdio_mux_read()
44 struct mdio_mux_parent_bus *pb = cb->parent; in mdio_mux_read()
47 mutex_lock_nested(&pb->mii_bus->mdio_lock, MDIO_MUTEX_MUX); in mdio_mux_read()
48 r = pb->switch_fn(pb->current_child, cb->bus_number, pb->switch_data); in mdio_mux_read()
52 pb->current_child = cb->bus_number; in mdio_mux_read()
54 r = pb->mii_bus->read(pb->mii_bus, phy_id, regnum); in mdio_mux_read()
56 mutex_unlock(&pb->mii_bus->mdio_lock); in mdio_mux_read()
62 * The parent bus' lock is used to order access to the switch_fn.
64 static int mdio_mux_write(struct mii_bus *bus, int phy_id, in mdio_mux_write() argument
67 struct mdio_mux_child_bus *cb = bus->priv; in mdio_mux_write()
68 struct mdio_mux_parent_bus *pb = cb->parent; in mdio_mux_write()
72 mutex_lock_nested(&pb->mii_bus->mdio_lock, MDIO_MUTEX_MUX); in mdio_mux_write()
73 r = pb->switch_fn(pb->current_child, cb->bus_number, pb->switch_data); in mdio_mux_write()
77 pb->current_child = cb->bus_number; in mdio_mux_write()
79 r = pb->mii_bus->write(pb->mii_bus, phy_id, regnum, val); in mdio_mux_write()
81 mutex_unlock(&pb->mii_bus->mdio_lock); in mdio_mux_write()
103 return -ENODEV; in mdio_mux_init()
107 "mdio-parent-bus", 0); in mdio_mux_init()
110 return -ENODEV; in mdio_mux_init()
114 ret_val = -EPROBE_DEFER; in mdio_mux_init()
120 get_device(&parent_bus->dev); in mdio_mux_init()
125 ret_val = -ENOMEM; in mdio_mux_init()
129 pb->switch_data = data; in mdio_mux_init()
130 pb->switch_fn = switch_fn; in mdio_mux_init()
131 pb->current_child = -1; in mdio_mux_init()
132 pb->parent_id = parent_count++; in mdio_mux_init()
133 pb->mii_bus = parent_bus; in mdio_mux_init()
135 ret_val = -ENODEV; in mdio_mux_init()
149 ret_val = -ENOMEM; in mdio_mux_init()
152 cb->bus_number = v; in mdio_mux_init()
153 cb->parent = pb; in mdio_mux_init()
155 cb->mii_bus = mdiobus_alloc(); in mdio_mux_init()
156 if (!cb->mii_bus) { in mdio_mux_init()
157 ret_val = -ENOMEM; in mdio_mux_init()
161 cb->mii_bus->priv = cb; in mdio_mux_init()
163 cb->mii_bus->name = "mdio_mux"; in mdio_mux_init()
164 snprintf(cb->mii_bus->id, MII_BUS_ID_SIZE, "%x.%x", in mdio_mux_init()
165 pb->parent_id, v); in mdio_mux_init()
166 cb->mii_bus->parent = dev; in mdio_mux_init()
167 cb->mii_bus->read = mdio_mux_read; in mdio_mux_init()
168 cb->mii_bus->write = mdio_mux_write; in mdio_mux_init()
169 r = of_mdiobus_register(cb->mii_bus, child_bus_node); in mdio_mux_init()
172 "Error: Failed to register MDIO bus for child %pOF\n", in mdio_mux_init()
174 mdiobus_free(cb->mii_bus); in mdio_mux_init()
177 cb->next = pb->children; in mdio_mux_init()
178 pb->children = cb; in mdio_mux_init()
181 if (pb->children) { in mdio_mux_init()
189 put_device(&parent_bus->dev); in mdio_mux_init()
199 struct mdio_mux_child_bus *cb = pb->children; in mdio_mux_uninit()
202 mdiobus_unregister(cb->mii_bus); in mdio_mux_uninit()
203 mdiobus_free(cb->mii_bus); in mdio_mux_uninit()
204 cb = cb->next; in mdio_mux_uninit()
207 put_device(&pb->mii_bus->dev); in mdio_mux_uninit()