/** * rio_device_remove - Remove a RIO device from the system * * @dev: the RIO device structure to match against * * Remove a RIO device from the system. If it has an associated * driver, then run the driver remove() method. Then update * the reference count. */ static int rio_device_remove(struct device *dev) { struct rio_dev *rdev = to_rio_dev(dev); struct rio_driver *rdrv = rdev->driver; if (rdrv) { if (rdrv->remove) rdrv->remove(rdev); rdev->driver = NULL; } rio_dev_put(rdev); return 0; }
static int rio_uevent(struct device *dev, struct kobj_uevent_env *env) { struct rio_dev *rdev; if (!dev) return -ENODEV; rdev = to_rio_dev(dev); if (!rdev) return -ENODEV; if (add_uevent_var(env, "MODALIAS=rapidio:v%04Xd%04Xav%04Xad%04X", rdev->vid, rdev->did, rdev->asm_vid, rdev->asm_did)) return -ENOMEM; return 0; }
/** * rio_match_bus - Tell if a RIO device structure has a matching RIO driver device id structure * @dev: the standard device structure to match against * @drv: the standard driver structure containing the ids to match against * * Used by a driver to check whether a RIO device present in the * system is in its list of supported devices. Returns 1 if * there is a matching &struct rio_device_id or 0 if there is * no match. */ static int rio_match_bus(struct device *dev, struct device_driver *drv) { struct rio_dev *rdev = to_rio_dev(dev); struct rio_driver *rdrv = to_rio_driver(drv); const struct rio_device_id *id = rdrv->id_table; const struct rio_device_id *found_id; if (!id) goto out; found_id = rio_match_device(id, rdev); if (found_id) return 1; out:return 0; }
static ssize_t idtg2_show_errlog(struct device *dev, struct device_attribute *attr, char *buf) { struct rio_dev *rdev = to_rio_dev(dev); ssize_t len = 0; u32 regval; while (!rio_read_config_32(rdev, IDT_ERR_RD, ®val)) { if (!regval) /* 0 = end of log */ break; len += snprintf(buf + len, PAGE_SIZE - len, "%08x\n", regval); if (len >= (PAGE_SIZE - 10)) break; } return len; }
/** * rio_device_probe - Tell if a RIO device structure has a matching RIO device id structure * @id: the RIO device id structure to match against * @dev: the RIO device structure to match against * * return 0 and set rio_dev->driver when drv claims rio_dev, else error */ static int rio_device_probe(struct device *dev) { struct rio_driver *rdrv = to_rio_driver(dev->driver); struct rio_dev *rdev = to_rio_dev(dev); int error = -ENODEV; const struct rio_device_id *id; if (!rdev->driver && rdrv->probe) { if (!rdrv->id_table) return error; id = rio_match_device(rdrv->id_table, rdev); rio_dev_get(rdev); if (id) error = rdrv->probe(rdev, id); if (error >= 0) { rdev->driver = rdrv; error = 0; rio_dev_put(rdev); } } return error; }
static ssize_t idtg2_show_errlog(struct device *dev, struct device_attribute *attr, char *buf) { struct rio_dev *rdev = to_rio_dev(dev); struct rio_mport *mport = rdev->net->hport; u16 destid = rdev->rswitch->destid; u8 hopcount = rdev->rswitch->hopcount; ssize_t len = 0; u32 regval; while (!rio_mport_read_config_32(mport, destid, hopcount, IDT_ERR_RD, ®val)) { if (!regval) /* 0 = end of log */ break; len += snprintf(buf + len, PAGE_SIZE - len, "%08x\n", regval); if (len >= (PAGE_SIZE - 10)) break; } return len; }