本文整理汇总了C++中device_get_children函数的典型用法代码示例。如果您正苦于以下问题:C++ device_get_children函数的具体用法?C++ device_get_children怎么用?C++ device_get_children使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了device_get_children函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: rb_nand_slicer
/* Slicer operates on the NAND controller, so we have to find the chip. */
static int
rb_nand_slicer(device_t dev, struct flash_slice *slices, int *nslices)
{
struct nand_chip *chip;
device_t *children;
int n;
if (device_get_children(dev, &children, &n) != 0) {
panic("Slicer called on controller with no child!");
}
dev = children[0];
free(children, M_TEMP);
if (device_get_children(dev, &children, &n) != 0) {
panic("Slicer called on controller with nandbus but no child!");
}
dev = children[0];
free(children, M_TEMP);
chip = device_get_softc(dev);
*nslices = 2;
slices[0].base = 0;
slices[0].size = 4 * 1024 * 1024;
slices[0].label = "boot";
slices[1].base = 4 * 1024 * 1024;
slices[1].size = chip->ndisk->d_mediasize - slices[0].size;
slices[1].label = "rootfs";
return (0);
}
示例2: ata_pci_detach
int
ata_pci_detach(device_t dev)
{
struct ata_pci_controller *ctlr = device_get_softc(dev);
device_t *children;
int nchildren, i;
/* detach & delete all children */
if (!device_get_children(dev, &children, &nchildren)) {
for (i = 0; i < nchildren; i++)
device_delete_child(dev, children[i]);
kfree(children, M_TEMP);
}
if (ctlr->r_irq) {
bus_teardown_intr(dev, ctlr->r_irq, ctlr->handle);
bus_release_resource(dev, SYS_RES_IRQ, ATA_IRQ_RID, ctlr->r_irq);
ctlr->r_irq = NULL;
}
if (ctlr->r_res2) {
bus_release_resource(dev, ctlr->r_type2, ctlr->r_rid2, ctlr->r_res2);
ctlr->r_res2 = NULL;
}
if (ctlr->r_res1) {
bus_release_resource(dev, ctlr->r_type1, ctlr->r_rid1, ctlr->r_res1);
ctlr->r_res1 = NULL;
}
return 0;
}
示例3: ata_ali_reset
static void
ata_ali_reset(device_t dev)
{
struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev));
struct ata_channel *ch = device_get_softc(dev);
device_t *children;
int nchildren, i;
ata_generic_reset(dev);
/*
* workaround for datacorruption bug found on at least SUN Blade-100
* find the ISA function on the southbridge and disable then enable
* the ATA channel tristate buffer
*/
if (ctlr->chip->chiprev == 0xc3 || ctlr->chip->chiprev == 0xc2) {
if (!device_get_children(GRANDPARENT(dev), &children, &nchildren)) {
for (i = 0; i < nchildren; i++) {
if (pci_get_devid(children[i]) == ATA_ALI_1533) {
pci_write_config(children[i], 0x58,
pci_read_config(children[i], 0x58, 1) &
~(0x04 << ch->unit), 1);
pci_write_config(children[i], 0x58,
pci_read_config(children[i], 0x58, 1) |
(0x04 << ch->unit), 1);
break;
}
}
free(children, M_TEMP);
}
}
}
示例4: pccard_open
static int
pccard_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
{
device_t parent, child;
device_t *kids;
int cnt, err;
struct pccard_softc *sc;
sc = dev->si_drv1;
if (sc->cis_open)
return (EBUSY);
parent = sc->dev;
err = device_get_children(parent, &kids, &cnt);
if (err)
return err;
if (cnt == 0) {
free(kids, M_TEMP);
sc->cis_open++;
sc->cis = NULL;
return (0);
}
child = kids[0];
free(kids, M_TEMP);
sc->cis = malloc(sizeof(*sc->cis), M_TEMP, M_ZERO | M_WAITOK);
err = pccard_scan_cis(parent, child, pccard_build_cis, sc->cis);
if (err) {
free(sc->cis, M_TEMP);
sc->cis = NULL;
return (err);
}
sc->cis_open++;
return (0);
}
示例5: hdspe_intr
static void
hdspe_intr(void *p)
{
struct sc_info *sc = (struct sc_info *)p;
struct sc_pcminfo *scp;
device_t *devlist;
int devcount, status;
int i, err;
snd_mtxlock(sc->lock);
status = hdspe_read_1(sc, HDSPE_STATUS_REG);
if (status & HDSPE_AUDIO_IRQ_PENDING) {
if ((err = device_get_children(sc->dev, &devlist, &devcount)) != 0)
return;
for (i = 0; i < devcount; i++) {
scp = device_get_ivars(devlist[i]);
if (scp->ih != NULL)
scp->ih(scp);
}
hdspe_write_1(sc, HDSPE_INTERRUPT_ACK, 0);
free(devlist, M_TEMP);
}
snd_mtxunlock(sc->lock);
}
示例6: cardbus_detach_card
static int
cardbus_detach_card(device_t cbdev)
{
int numdevs;
device_t *devlist;
int tmp;
int err = 0;
if (device_get_children(cbdev, &devlist, &numdevs) != 0)
return (ENOENT);
if (numdevs == 0) {
free(devlist, M_TEMP);
return (ENOENT);
}
for (tmp = 0; tmp < numdevs; tmp++) {
struct cardbus_devinfo *dinfo = device_get_ivars(devlist[tmp]);
if (dinfo->pci.cfg.dev != devlist[tmp])
device_printf(cbdev, "devinfo dev mismatch\n");
cardbus_device_destroy(dinfo);
pci_delete_child(cbdev, devlist[tmp]);
}
POWER_DISABLE_SOCKET(device_get_parent(cbdev), cbdev);
free(devlist, M_TEMP);
return (err);
}
示例7: ofw_bus_find_child_device_by_phandle
/**
* @brief Return child of bus whose phandle is node
*
* A direct child of @p will be returned if it its phandle in the
* OFW tree is @p node. Otherwise, NULL is returned.
*
* @param bus The bus to examine
* @param node The phandle_t to look for.
*/
device_t
ofw_bus_find_child_device_by_phandle(device_t bus, phandle_t node)
{
device_t *children, retval, child;
int nkid, i;
/*
* Nothing can match the flag value for no node.
*/
if (node == -1)
return (NULL);
/*
* Search the children for a match. We microoptimize
* a bit by not using ofw_bus_get since we already know
* the parent. We do not recurse.
*/
if (device_get_children(bus, &children, &nkid) != 0)
return (NULL);
retval = NULL;
for (i = 0; i < nkid; i++) {
child = children[i];
if (OFW_BUS_GET_NODE(bus, child) == node) {
retval = child;
break;
}
}
free(children, M_TEMP);
return (retval);
}
示例8: mfi_pci_detach
static int
mfi_pci_detach(device_t dev)
{
struct mfi_softc *sc;
int error, devcount, i;
device_t *devlist;
sc = device_get_softc(dev);
sx_xlock(&sc->mfi_config_lock);
mtx_lock(&sc->mfi_io_lock);
if ((sc->mfi_flags & MFI_FLAGS_OPEN) != 0) {
mtx_unlock(&sc->mfi_io_lock);
sx_xunlock(&sc->mfi_config_lock);
return (EBUSY);
}
sc->mfi_detaching = 1;
mtx_unlock(&sc->mfi_io_lock);
if ((error = device_get_children(sc->mfi_dev, &devlist, &devcount)) != 0) {
sx_xunlock(&sc->mfi_config_lock);
return error;
}
for (i = 0; i < devcount; i++)
device_delete_child(sc->mfi_dev, devlist[i]);
free(devlist, M_TEMP);
sx_xunlock(&sc->mfi_config_lock);
EVENTHANDLER_DEREGISTER(shutdown_final, sc->mfi_eh);
mfi_shutdown(sc);
mfi_free(sc);
mfi_pci_free(sc);
return (0);
}
示例9: ata_cbuschannel_probe
static int
ata_cbuschannel_probe(device_t dev)
{
struct ata_cbus_controller *ctlr = device_get_softc(device_get_parent(dev));
struct ata_channel *ch = device_get_softc(dev);
device_t *children;
int count, i;
/* find channel number on this controller */
device_get_children(device_get_parent(dev), &children, &count);
for (i = 0; i < count; i++) {
if (children[i] == dev)
ch->unit = i;
}
free(children, M_TEMP);
/* setup the resource vectors */
for (i = ATA_DATA; i <= ATA_COMMAND; i ++) {
ch->r_io[i].res = ctlr->io;
ch->r_io[i].offset = i << 1;
}
ch->r_io[ATA_CONTROL].res = ctlr->ctlio;
ch->r_io[ATA_CONTROL].offset = 0;
ch->r_io[ATA_IDX_ADDR].res = ctlr->io;
ata_default_registers(dev);
/* initialize softc for this channel */
ch->flags |= ATA_USE_16BIT;
ata_generic_hw(dev);
return ata_probe(dev);
}
示例10: ata_via_southbridge_fixup
static void
ata_via_southbridge_fixup(device_t dev)
{
device_t *children;
int nchildren, i;
if (device_get_children(device_get_parent(dev), &children, &nchildren))
return;
for (i = 0; i < nchildren; i++) {
if (pci_get_devid(children[i]) == ATA_VIA8363 ||
pci_get_devid(children[i]) == ATA_VIA8371 ||
pci_get_devid(children[i]) == ATA_VIA8662 ||
pci_get_devid(children[i]) == ATA_VIA8361) {
u_int8_t reg76 = pci_read_config(children[i], 0x76, 1);
if ((reg76 & 0xf0) != 0xd0) {
device_printf(dev,
"Correcting VIA config for southbridge data corruption bug\n");
pci_write_config(children[i], 0x75, 0x80, 1);
pci_write_config(children[i], 0x76, (reg76 & 0x0f) | 0xd0, 1);
}
break;
}
}
free(children, M_TEMP);
}
示例11: ata_detach
int
ata_detach(device_t dev)
{
struct ata_channel *ch = device_get_softc(dev);
device_t *children;
int nchildren, i;
/* check that we have a valid channel to detach */
if (!ch->r_irq)
return ENXIO;
/* grap the channel lock so no new requests gets launched */
mtx_lock(&ch->state_mtx);
ch->state |= ATA_STALL_QUEUE;
mtx_unlock(&ch->state_mtx);
/* detach & delete all children */
if (!device_get_children(dev, &children, &nchildren)) {
for (i = 0; i < nchildren; i++)
if (children[i])
device_delete_child(dev, children[i]);
free(children, M_TEMP);
}
/* release resources */
bus_teardown_intr(dev, ch->r_irq, ch->ih);
bus_release_resource(dev, SYS_RES_IRQ, ATA_IRQ_RID, ch->r_irq);
ch->r_irq = NULL;
mtx_destroy(&ch->state_mtx);
mtx_destroy(&ch->queue_mtx);
return 0;
}
示例12: acpi_pci_save_handle
static ACPI_STATUS
acpi_pci_save_handle(ACPI_HANDLE handle, UINT32 level, void *context,
void **status)
{
struct acpi_pci_devinfo *dinfo;
device_t *devlist;
int devcount, i, func, slot;
UINT32 address;
ACPI_FUNCTION_TRACE((char *)(uintptr_t)__func__);
if (ACPI_FAILURE(acpi_GetInteger(handle, "_ADR", &address)))
return_ACPI_STATUS (AE_OK);
slot = ACPI_ADR_PCI_SLOT(address);
func = ACPI_ADR_PCI_FUNC(address);
if (device_get_children((device_t)context, &devlist, &devcount) != 0)
return_ACPI_STATUS (AE_OK);
for (i = 0; i < devcount; i++) {
dinfo = device_get_ivars(devlist[i]);
if (dinfo->ap_dinfo.cfg.func == func &&
dinfo->ap_dinfo.cfg.slot == slot) {
dinfo->ap_handle = handle;
acpi_pci_update_device(handle, devlist[i]);
break;
}
}
free(devlist, M_TEMP);
return_ACPI_STATUS (AE_OK);
}
示例13: iicbus_transfer_gen
/*
* Generic version of iicbus_transfer that calls the appropriate
* routines to accomplish this. See note above about acceptable
* buffer addresses.
*/
int
iicbus_transfer_gen(device_t dev, struct iic_msg *msgs, uint32_t nmsgs)
{
int i, error, lenread, lenwrote, nkid, rpstart, addr;
device_t *children, bus;
bool nostop;
if ((error = device_get_children(dev, &children, &nkid)) != 0)
return (IIC_ERESOURCE);
if (nkid != 1) {
free(children, M_TEMP);
return (IIC_ENOTSUPP);
}
bus = children[0];
rpstart = 0;
free(children, M_TEMP);
nostop = iicbus_get_nostop(dev);
for (i = 0, error = 0; i < nmsgs && error == 0; i++) {
addr = msgs[i].slave;
if (msgs[i].flags & IIC_M_RD)
addr |= LSB;
else
addr &= ~LSB;
if (!(msgs[i].flags & IIC_M_NOSTART)) {
if (rpstart)
error = iicbus_repeated_start(bus, addr, 0);
else
error = iicbus_start(bus, addr, 0);
}
if (error != 0)
break;
if (msgs[i].flags & IIC_M_RD)
error = iicbus_read(bus, msgs[i].buf, msgs[i].len,
&lenread, IIC_LAST_READ, 0);
else
error = iicbus_write(bus, msgs[i].buf, msgs[i].len,
&lenwrote, 0);
if (error != 0)
break;
if ((msgs[i].flags & IIC_M_NOSTOP) != 0 ||
(nostop && i + 1 < nmsgs)) {
rpstart = 1; /* Next message gets repeated start */
} else {
rpstart = 0;
iicbus_stop(bus);
}
}
if (error != 0 && !nostop)
iicbus_stop(bus);
return (error);
}
示例14: gic_v3_acpi_attach
static int
gic_v3_acpi_attach(device_t dev)
{
struct gic_v3_softc *sc;
int err;
sc = device_get_softc(dev);
sc->dev = dev;
sc->gic_bus = GIC_BUS_ACPI;
err = gic_v3_acpi_count_regions(dev);
if (err != 0)
goto error;
err = gic_v3_attach(dev);
if (err != 0)
goto error;
sc->gic_pic = intr_pic_register(dev, ACPI_INTR_XREF);
if (sc->gic_pic == NULL) {
device_printf(dev, "could not register PIC\n");
err = ENXIO;
goto error;
}
if (intr_pic_claim_root(dev, ACPI_INTR_XREF, arm_gic_v3_intr, sc,
GIC_LAST_SGI - GIC_FIRST_SGI + 1) != 0) {
err = ENXIO;
goto error;
}
/*
* Try to register the ITS driver to this GIC. The GIC will act as
* a bus in that case. Failure here will not affect the main GIC
* functionality.
*/
gic_v3_acpi_bus_attach(dev);
if (device_get_children(dev, &sc->gic_children, &sc->gic_nchildren) !=0)
sc->gic_nchildren = 0;
return (0);
error:
if (bootverbose) {
device_printf(dev,
"Failed to attach. Error %d\n", err);
}
/* Failure so free resources */
gic_v3_detach(dev);
return (err);
}
示例15: acpi_pci_suspend
int
acpi_pci_suspend(device_t dev)
{
int dstate, error, i, numdevs;
device_t acpi_dev, child, *devlist;
struct pci_devinfo *dinfo;
acpi_dev = devclass_get_device(devclass_find("acpi"), 0);
device_get_children(dev, &devlist, &numdevs);
/*
* Save the PCI configuration space for each child and set the
* device in the appropriate power state for this sleep state.
*/
for (i = 0; i < numdevs; i++) {
child = devlist[i];
dinfo = (struct pci_devinfo *)device_get_ivars(child);
pci_cfg_save(child, dinfo, 0);
}
/*
* Suspend devices before potentially powering them down.
*/
error = bus_generic_suspend(dev);
if (error) {
kfree(devlist, M_TEMP);
return (error);
}
/*
* Always set the device to D3. If ACPI suggests a different
* power state, use it instead. If ACPI is not present, the
* firmware is responsible for managing device power. Skip
* children who aren't attached since they are powered down
* separately. Only manage type 0 devices for now.
*/
for (i = 0; acpi_dev && i < numdevs; i++) {
child = devlist[i];
dinfo = (struct pci_devinfo *)device_get_ivars(child);
if (device_is_attached(child) && dinfo->cfg.hdrtype == 0) {
dstate = PCI_POWERSTATE_D3;
ACPI_PWR_FOR_SLEEP(acpi_dev, child, &dstate);
pci_set_powerstate(child, dstate);
}
}
kfree(devlist, M_TEMP);
return (0);
}