int sprd_iommu_mm_init(struct sprd_iommu_dev *dev, struct sprd_iommu_init_data *data)
{
	int err=-1;
#ifdef CONFIG_OF && CONFIG_COMMON_CLK
	struct device_node *np;

	np = dev->misc_dev.this_device->of_node;
	if(!np) {
		return -1;
	}

	dev->mmu_clock=of_clk_get(np, 0) ;
	dev->mmu_mclock=of_clk_get(np,1);
#else
	dev->mmu_mclock= clk_get(NULL,"clk_mm_i");
	dev->mmu_clock=clk_get(NULL,"clk_mmu");
	if (!dev->mmu_mclock) {
		printk ("%s, cant get dev->mmu_mclock\n", __FUNCTION__);
		return -1;
	}
#endif
	if (!dev->mmu_clock) {
		printk ("%s, cant get dev->mmu_clock\n", __FUNCTION__);
		return -1;
	}

	sprd_iommu_mm_enable(dev);
	err=sprd_iommu_init(dev,data);
	sprd_iommu_mm_disable(dev);
	return err;
}
int sprd_iommu_mm_restore(struct sprd_iommu_dev *dev)
{
	int err=-1;
	sprd_iommu_mm_enable(dev);
	err=sprd_iommu_restore(dev);
	sprd_iommu_mm_disable(dev);
	return err;
}
int sprd_iommu_mm_backup(struct sprd_iommu_dev *dev)
{
	int err=-1;
	sprd_iommu_mm_enable(dev);
	err=sprd_iommu_backup(dev);
	sprd_iommu_mm_disable(dev);
	return err;
}
int sprd_iommu_mm_iova_unmap(struct sprd_iommu_dev *dev, unsigned long iova, size_t iova_length, struct ion_buffer *handle)
{
	int err=-1;
	sprd_iommu_mm_enable(dev);
	err = sprd_iommu_iova_unmap(dev,iova,iova_length,handle);
	sprd_iommu_mm_disable(dev);
	return err;
}
int sprd_iommu_mm_init(struct sprd_iommu_dev *dev, struct sprd_iommu_init_data *data)
{
	int err=-1;
	dev->mmu_mclock= clk_get(NULL,"clk_mm_i");
	dev->mmu_clock=clk_get(NULL,"clk_mmu");
	if((NULL==dev->mmu_mclock)||(NULL==dev->mmu_clock))
		return -1;
	sprd_iommu_mm_enable(dev);
	err=sprd_iommu_init(dev,data);
	sprd_iommu_mm_disable(dev);
	return err;
}
int sprd_iommu_mm_iova_unmap(struct sprd_iommu_dev *dev, unsigned long iova, size_t iova_length, struct ion_buffer *handle)
{
	int err=-1;

	err = sprd_iommu_iova_unmap(dev,iova,iova_length,handle);

	mutex_lock(&dev->mutex_clk_op);
	dev->map_count--;
	if (0 == dev->map_count)
		sprd_iommu_mm_disable(dev);
	mutex_unlock(&dev->mutex_clk_op);

	return err;
}