static inline int check_dev(struct device *dev) { if (dev->bus == &parisc_bus_type) { struct parisc_device *pdev; pdev = to_parisc_device(dev); return pdev->id.hw_type != HPHW_FAULTY; } return 1; }
static int parisc_driver_remove(struct device *dev) { struct parisc_device *pa_dev = to_parisc_device(dev); struct parisc_driver *pa_drv = to_parisc_driver(dev->driver); if (pa_drv->remove) pa_drv->remove(pa_dev); return 0; }
static int gsc_fixup_irqs_callback(struct device *dev, void *data) { struct parisc_device *padev = to_parisc_device(dev); struct gsc_fixup_struct *gf = data; if (padev->id.hw_type == HPHW_FAULTY) gsc_fixup_irqs(padev, gf->ctrl, gf->choose_irq); gf->choose_irq(padev, gf->ctrl); return 0; }
static int match_and_count(struct device * dev, void * data) { struct match_count * m = data; struct parisc_device * pdev = to_parisc_device(dev); if (check_dev(dev)) { if (match_device(m->driver, pdev)) m->count++; } return 0; }
static int gsc_fixup_irqs_callback(struct device *dev, void *data) { struct parisc_device *padev = to_parisc_device(dev); struct gsc_fixup_struct *gf = data; /* work-around for 715/64 and others which have parent at path [5] and children at path [5/0/x] */ if (padev->id.hw_type == HPHW_FAULTY) gsc_fixup_irqs(padev, gf->ctrl, gf->choose_irq); gf->choose_irq(padev, gf->ctrl); return 0; }
/** * find_pa_parent_type - Find a parent of a specific type * @dev: The device to start searching from * @type: The device type to search for. * * Walks up the device tree looking for a device of the specified type. * If it finds it, it returns it. If not, it returns NULL. */ const struct parisc_device * find_pa_parent_type(const struct parisc_device *padev, int type) { const struct device *dev = &padev->dev; while (dev != &root) { struct parisc_device *candidate = to_parisc_device(dev); if (candidate->id.hw_type == type) return candidate; dev = dev->parent; } return NULL; }
static int find_device(struct device * dev, void * data) { struct parisc_device * pdev = to_parisc_device(dev); struct find_data * d = (struct find_data*)data; if (check_dev(dev)) { if (pdev->hpa.start == d->hpa) { d->dev = pdev; return 1; } } return 0; }
static int parisc_driver_probe(struct device *dev) { int rc; struct parisc_device *pa_dev = to_parisc_device(dev); struct parisc_driver *pa_drv = to_parisc_driver(dev->driver); rc = pa_drv->probe(pa_dev); if (!rc) pa_dev->driver = pa_drv; return rc; }
void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl, void (*choose_irq)(struct parisc_device *, void *)) { struct device *dev; struct klist_iter i; klist_iter_init(&parent->dev.klist_children, &i); while ((dev = next_device(&i))) { struct parisc_device *padev = to_parisc_device(dev); /* work-around for 715/64 and others which have parent at path [5] and children at path [5/0/x] */ if (padev->id.hw_type == HPHW_FAULTY) return gsc_fixup_irqs(padev, ctrl, choose_irq); choose_irq(padev, ctrl); } klist_iter_exit(&i); }
/* * get_node_path fills in @path with the firmware path to the device. * Note that if @node is a parisc device, we don't fill in the 'mod' field. * This is because both callers pass the parent and fill in the mod * themselves. If @node is a PCI device, we do fill it in, even though this * is inconsistent. */ static void get_node_path(struct device *dev, struct hardware_path *path) { int i = 5; memset(&path->bc, -1, 6); if (dev_is_pci(dev)) { unsigned int devfn = to_pci_dev(dev)->devfn; path->mod = PCI_FUNC(devfn); path->bc[i--] = PCI_SLOT(devfn); dev = dev->parent; } while (dev != &root) { if (dev_is_pci(dev)) { unsigned int devfn = to_pci_dev(dev)->devfn; path->bc[i--] = PCI_SLOT(devfn) | (PCI_FUNC(devfn)<< 5); } else if (dev->bus == &parisc_bus_type) { path->bc[i--] = to_parisc_device(dev)->hw_path; } dev = dev->parent; } }