Lines Matching +full:mux +full:- +full:add +full:- +full:data

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 /*------------------------------------------------------------------------------
51 * All these functions return an IIC adapter-layer error code (because we are
54 *----------------------------------------------------------------------------*/
57 iicmux_callback(device_t dev, int index, caddr_t data)
68 * Ensure that the data passed to us includes the device_t of the child
73 rd = (struct iic_reqbus_data *)data;
74 if (!(rd->flags & IIC_REQBUS_DEV))
77 for (i = 0; i <= sc->maxbus && sc->childdevs[i] != rd->bus; ++i)
79 if (i > sc->maxbus)
87 if (sc->debugmux > 0) {
89 device_get_nameunit(rd->dev),
90 device_get_nameunit(rd->bus));
93 iicbus_release_bus(sc->busdev, dev);
97 if (sc->debugmux > 0) {
99 device_get_nameunit(rd->dev), device_get_nameunit(rd->bus));
110 if ((err = iicbus_request_bus(sc->busdev, dev, rd->flags)) != 0)
118 iicbus_release_bus(sc->busdev, dev);
128 return (IICBUS_GET_FREQUENCY(sc->busdev, speed));
138 for (i = 0; i <= sc->maxbus; ++i) {
139 if (sc->childdevs[i] == child)
140 return (sc->childnodes[i]);
153 iicbus_intr(sc->busdev, event, buf);
162 return (iicbus_read(sc->busdev, buf, len, bytes, last, delay));
170 return (iicbus_repeated_start(sc->busdev, slave, timeout));
178 return (iicbus_reset(sc->busdev, speed, addr, oldaddr));
186 return (iicbus_start(sc->busdev, slave, timeout));
194 return (iicbus_stop(sc->busdev));
202 return (iicbus_transfer(sc->busdev, msgs, nmsgs));
210 return (iicbus_write(sc->busdev, buf, len, bytes, timeout));
213 /*------------------------------------------------------------------------------
214 * iicmux helper functions, called by hardware-specific drivers.
216 *----------------------------------------------------------------------------*/
223 if (busidx >= sc->numbuses) {
228 if (sc->childdevs[busidx] != NULL) {
234 sc->childdevs[busidx] = child;
235 if (sc->maxbus < busidx)
236 sc->maxbus = busidx;
253 if((node = ofw_bus_get_node(sc->dev)) == 0) {
254 device_printf(sc->dev, "cannot find FDT node\n");
259 * First we have to see if there is a child node named "i2c-mux". If it
263 if ((parent = ofw_bus_find_child(node, "i2c-mux")) == 0)
270 if (OF_getencprop(child, "reg", &idx, sizeof(idx)) == -1) {
271 device_printf(sc->dev,
275 if (idx >= sc->numbuses) {
276 device_printf(sc->dev,
279 idx, sc->numbuses);
282 sc->childdevs[idx] = device_add_child(sc->dev, "iicbus", DEVICE_UNIT_ANY);
283 sc->childnodes[idx] = child;
284 if (sc->maxbus < (int)idx)
285 sc->maxbus = idx;
288 /* If we configured anything using FDT data, we're done. */
289 if (sc->maxbus >= 0)
294 * If we make it to here, we didn't add any children based on FDT data.
295 * Add an iicbus child for every downstream bus supported by the mux.
297 for (i = 0; i < sc->numbuses; ++i) {
298 sc->childdevs[i] = device_add_child(sc->dev, "iicbus", DEVICE_UNIT_ANY);
299 sc->maxbus = i;
317 sc->dev = dev;
318 sc->busdev = busdev;
319 sc->maxbus = -1;
320 sc->numbuses = numbuses;
325 SYSCTL_ADD_UINT(device_get_sysctl_ctx(sc->dev),
326 SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), OID_AUTO,
327 "debugmux", CTLFLAG_RWTUN, &sc->debugmux, 0, "debug mux operations");
339 for (i = 0; i <= sc->maxbus; ++i) {
340 if (sc->childdevs[i] == NULL)
342 if ((err = device_delete_child(dev, sc->childdevs[i])) != 0)
344 sc->childdevs[i] = NULL;