static int device_match_by_alias(struct device *dev, void *data) { struct iommu *obj = to_iommu(dev); const char *name = data; pr_debug("%s: %s %s\n", __func__, obj->name, name); return strcmp(obj->name, name) == 0; }
/** * iommu_get - Get iommu handler * @name: target iommu name **/ struct iommu *iommu_get(const char *name) { int err = -ENOMEM; struct device *dev; struct iommu *obj; int rev; dev = driver_find_device(&omap_iommu_driver.driver, NULL, (void *)name, device_match_by_alias); if (!dev) return ERR_PTR(-ENODEV); obj = to_iommu(dev); mutex_lock(&obj->iommu_lock); if (obj->refcount++ == 0) { err = iommu_enable(obj); if (err) goto err_enable; if (!strcmp(obj->name, "ducati")) { rev = GET_OMAP_REVISION(); if (rev == 0x0) iommu_set_twl(obj, false); } flush_iotlb_all(obj); } if (!try_module_get(obj->owner)) goto err_module; mutex_unlock(&obj->iommu_lock); dev_dbg(obj->dev, "%s: %s\n", __func__, obj->name); return obj; err_module: if (obj->refcount == 1) iommu_disable(obj); err_enable: obj->refcount--; mutex_unlock(&obj->iommu_lock); return ERR_PTR(err); }