Lines Matching +full:child +full:- +full:node

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
49 static void simplebus_probe_nomatch(device_t bus, device_t child);
50 static int simplebus_print_child(device_t bus, device_t child);
54 device_t child);
56 static ssize_t simplebus_get_property(device_t bus, device_t child,
63 device_t child);
125 * XXX We should attach only to pure' compatible = "simple-bus"',
128 * "syscon", "simple-bus"; is handled by fdt/syscon driver
129 * "simple-mfd", "simple-bus"; is handled by fdt/simple-mfd driver
132 ofw_bus_is_compatible(dev, "simple-mfd"))
136 * FDT data puts a "simple-bus" compatible string on many things that
140 if (!(ofw_bus_is_compatible(dev, "simple-bus") &&
155 phandle_t node;
159 if ((sc->flags & SB_FLAG_NO_RANGES) == 0 &&
160 simplebus_fill_ranges(sc->node, sc) < 0) {
170 for (node = OF_child(sc->node); node > 0; node = OF_peer(node))
171 simplebus_add_device(dev, node, 0, NULL, -1, NULL);
200 if (sc->ranges != NULL)
201 free(sc->ranges, M_DEVBUF);
207 simplebus_init(device_t dev, phandle_t node)
212 if (node == 0)
213 node = ofw_bus_get_node(dev);
214 sc->dev = dev;
215 sc->node = node;
220 sc->acells = 2;
221 OF_getencprop(node, "#address-cells", &sc->acells, sizeof(sc->acells));
222 sc->scells = 1;
223 OF_getencprop(node, "#size-cells", &sc->scells, sizeof(sc->scells));
227 simplebus_fill_ranges(phandle_t node, struct simplebus_softc *sc)
235 err = OF_searchencprop(OF_parent(node), "#address-cells",
238 return (-1);
240 nbase_ranges = OF_getproplen(node, "ranges");
242 return (-1);
243 sc->nranges = nbase_ranges / sizeof(cell_t) /
244 (sc->acells + host_address_cells + sc->scells);
245 if (sc->nranges == 0)
248 sc->ranges = malloc(sc->nranges * sizeof(sc->ranges[0]),
251 OF_getencprop(node, "ranges", base_ranges, nbase_ranges);
253 for (i = 0, j = 0; i < sc->nranges; i++) {
254 sc->ranges[i].bus = 0;
255 for (k = 0; k < sc->acells; k++) {
256 sc->ranges[i].bus <<= 32;
257 sc->ranges[i].bus |= base_ranges[j++];
259 sc->ranges[i].host = 0;
261 sc->ranges[i].host <<= 32;
262 sc->ranges[i].host |= base_ranges[j++];
264 sc->ranges[i].size = 0;
265 for (k = 0; k < sc->scells; k++) {
266 sc->ranges[i].size <<= 32;
267 sc->ranges[i].size |= base_ranges[j++];
272 return (sc->nranges);
276 simplebus_setup_dinfo(device_t dev, phandle_t node,
287 if (ofw_bus_gen_setup_devinfo(&ndi->obdinfo, node) != 0) {
293 resource_list_init(&ndi->rl);
294 ofw_bus_reg_to_rl(dev, node, sc->acells, sc->scells, &ndi->rl);
295 ofw_bus_intr_to_rl(dev, node, &ndi->rl, NULL);
301 simplebus_add_device(device_t dev, phandle_t node, u_int order,
307 if ((ndi = simplebus_setup_dinfo(dev, node, di)) == NULL)
312 ndi->obdinfo.obd_name);
313 resource_list_free(&ndi->rl);
314 ofw_bus_gen_destroy_devinfo(&ndi->obdinfo);
335 ndi->obdinfo.obd_node = -1;
336 resource_list_init(&ndi->rl);
343 simplebus_get_devinfo(device_t bus __unused, device_t child)
347 ndi = device_get_ivars(child);
350 return (&ndi->obdinfo);
354 simplebus_get_resource_list(device_t bus __unused, device_t child)
358 ndi = device_get_ivars(child);
361 return (&ndi->rl);
365 simplebus_get_property(device_t bus, device_t child, const char *propname,
368 phandle_t node, xref;
381 return (-1);
384 node = ofw_bus_get_node(child);
386 return (OF_getproplen(node, propname));
394 return (OF_getencprop(node, propname, propvalue, size));
403 ret = OF_getencprop(node, propname, propvalue, size);
418 if (size < sizeof(node))
419 return (-1);
420 ret = OF_getencprop(node, propname, &xref, sizeof(xref));
424 node = OF_node_from_xref(xref);
426 *(uint32_t *)propvalue = node;
430 return (OF_getprop(node, propname, propvalue, size));
434 simplebus_alloc_resource(device_t bus, device_t child, int type, int *rid,
449 if ((di = device_get_ivars(child)) == NULL)
452 rle = resource_list_find(&di->rl, type, *rid);
459 start = rle->start;
460 end = rle->end;
461 count = rle->count;
466 for (j = 0; j < sc->nranges; j++) {
467 if (start >= sc->ranges[j].bus && end <
468 sc->ranges[j].bus + sc->ranges[j].size) {
469 start -= sc->ranges[j].bus;
470 start += sc->ranges[j].host;
471 end -= sc->ranges[j].bus;
472 end += sc->ranges[j].host;
476 if (j == sc->nranges && sc->nranges != 0) {
479 "%#jx-%#jx\n", start, end);
485 return (bus_generic_alloc_resource(bus, child, type, rid, start, end,
497 rv += resource_list_print_type(&di->rl, "mem", SYS_RES_MEMORY, "%#jx");
498 rv += resource_list_print_type(&di->rl, "irq", SYS_RES_IRQ, "%jd");
503 simplebus_probe_nomatch(device_t bus, device_t child)
510 compat = ofw_bus_get_compat(child);
513 name = ofw_bus_get_name(child);
514 type = ofw_bus_get_type(child);
517 simplebus_print_res(device_get_ivars(child));
518 if (!ofw_bus_status_okay(child))
526 simplebus_print_child(device_t bus, device_t child)
530 rv = bus_print_child_header(bus, child);
531 rv += simplebus_print_res(device_get_ivars(child));
532 if (!ofw_bus_status_okay(child))
534 rv += bus_print_child_footer(bus, child);