diff options
Diffstat (limited to 'drivers/iommu/omap-iommu.c')
| -rw-r--r-- | drivers/iommu/omap-iommu.c | 23 | 
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/iommu/omap-iommu.c b/drivers/iommu/omap-iommu.c index f8082da6179..af9b4f31f59 100644 --- a/drivers/iommu/omap-iommu.c +++ b/drivers/iommu/omap-iommu.c @@ -143,13 +143,23 @@ EXPORT_SYMBOL_GPL(omap_iommu_arch_version);  static int iommu_enable(struct omap_iommu *obj)  {  	int err; +	struct platform_device *pdev = to_platform_device(obj->dev); +	struct iommu_platform_data *pdata = pdev->dev.platform_data; -	if (!obj) +	if (!obj || !pdata)  		return -EINVAL;  	if (!arch_iommu)  		return -ENODEV; +	if (pdata->deassert_reset) { +		err = pdata->deassert_reset(pdev, pdata->reset_name); +		if (err) { +			dev_err(obj->dev, "deassert_reset failed: %d\n", err); +			return err; +		} +	} +  	clk_enable(obj->clk);  	err = arch_iommu->enable(obj); @@ -159,12 +169,18 @@ static int iommu_enable(struct omap_iommu *obj)  static void iommu_disable(struct omap_iommu *obj)  { -	if (!obj) +	struct platform_device *pdev = to_platform_device(obj->dev); +	struct iommu_platform_data *pdata = pdev->dev.platform_data; + +	if (!obj || !pdata)  		return;  	arch_iommu->disable(obj);  	clk_disable(obj->clk); + +	if (pdata->assert_reset) +		pdata->assert_reset(pdev, pdata->reset_name);  }  /* @@ -926,9 +942,6 @@ static int __devinit omap_iommu_probe(struct platform_device *pdev)  	struct resource *res;  	struct iommu_platform_data *pdata = pdev->dev.platform_data; -	if (pdev->num_resources != 2) -		return -EINVAL; -  	obj = kzalloc(sizeof(*obj) + MMU_REG_SIZE, GFP_KERNEL);  	if (!obj)  		return -ENOMEM;  |