@ -16,13 +16,13 @@
# include <linux/slab.h>
# include <linux/interrupt.h>
# include <linux/ioport.h>
# include <linux/clk.h>
# include <linux/platform_device.h>
# include <linux/iommu.h>
# include <linux/omap-iommu.h>
# include <linux/mutex.h>
# include <linux/spinlock.h>
# include <linux/io.h>
# include <linux/pm_runtime.h>
# include <asm/cacheflush.h>
@ -160,7 +160,7 @@ static int iommu_enable(struct omap_iommu *obj)
}
}
clk_enable ( obj - > clk ) ;
pm_runtime_get_sync ( obj - > dev ) ;
err = arch_iommu - > enable ( obj ) ;
@ -177,7 +177,7 @@ static void iommu_disable(struct omap_iommu *obj)
arch_iommu - > disable ( obj ) ;
clk_disable ( obj - > clk ) ;
pm_runtime_put_sync ( obj - > dev ) ;
if ( pdata - > assert_reset )
pdata - > assert_reset ( pdev , pdata - > reset_name ) ;
@ -303,7 +303,7 @@ static int load_iotlb_entry(struct omap_iommu *obj, struct iotlb_entry *e)
if ( ! obj | | ! obj - > nr_tlb_entries | | ! e )
return - EINVAL ;
clk_enable ( obj - > clk ) ;
pm_runtime_get_sync ( obj - > dev ) ;
iotlb_lock_get ( obj , & l ) ;
if ( l . base = = obj - > nr_tlb_entries ) {
@ -333,7 +333,7 @@ static int load_iotlb_entry(struct omap_iommu *obj, struct iotlb_entry *e)
cr = iotlb_alloc_cr ( obj , e ) ;
if ( IS_ERR ( cr ) ) {
clk_disable ( obj - > clk ) ;
pm_runtime_put_sync ( obj - > dev ) ;
return PTR_ERR ( cr ) ;
}
@ -347,7 +347,7 @@ static int load_iotlb_entry(struct omap_iommu *obj, struct iotlb_entry *e)
l . vict = l . base ;
iotlb_lock_set ( obj , & l ) ;
out :
clk_disable ( obj - > clk ) ;
pm_runtime_put_sync ( obj - > dev ) ;
return err ;
}
@ -377,7 +377,7 @@ static void flush_iotlb_page(struct omap_iommu *obj, u32 da)
int i ;
struct cr_regs cr ;
clk_enable ( obj - > clk ) ;
pm_runtime_get_sync ( obj - > dev ) ;
for_each_iotlb_cr ( obj , obj - > nr_tlb_entries , i , cr ) {
u32 start ;
@ -396,7 +396,7 @@ static void flush_iotlb_page(struct omap_iommu *obj, u32 da)
iommu_write_reg ( obj , 1 , MMU_FLUSH_ENTRY ) ;
}
}
clk_disable ( obj - > clk ) ;
pm_runtime_put_sync ( obj - > dev ) ;
if ( i = = obj - > nr_tlb_entries )
dev_dbg ( obj - > dev , " %s: no page for %08x \n " , __func__ , da ) ;
@ -410,7 +410,7 @@ static void flush_iotlb_all(struct omap_iommu *obj)
{
struct iotlb_lock l ;
clk_enable ( obj - > clk ) ;
pm_runtime_get_sync ( obj - > dev ) ;
l . base = 0 ;
l . vict = 0 ;
@ -418,7 +418,7 @@ static void flush_iotlb_all(struct omap_iommu *obj)
iommu_write_reg ( obj , 1 , MMU_GFLUSH ) ;
clk_disable ( obj - > clk ) ;
pm_runtime_put_sync ( obj - > dev ) ;
}
# if defined(CONFIG_OMAP_IOMMU_DEBUG) || defined(CONFIG_OMAP_IOMMU_DEBUG_MODULE)
@ -428,11 +428,11 @@ ssize_t omap_iommu_dump_ctx(struct omap_iommu *obj, char *buf, ssize_t bytes)
if ( ! obj | | ! buf )
return - EINVAL ;
clk_enable ( obj - > clk ) ;
pm_runtime_get_sync ( obj - > dev ) ;
bytes = arch_iommu - > dump_ctx ( obj , buf , bytes ) ;
clk_disable ( obj - > clk ) ;
pm_runtime_put_sync ( obj - > dev ) ;
return bytes ;
}
@ -446,7 +446,7 @@ __dump_tlb_entries(struct omap_iommu *obj, struct cr_regs *crs, int num)
struct cr_regs tmp ;
struct cr_regs * p = crs ;
clk_enable ( obj - > clk ) ;
pm_runtime_get_sync ( obj - > dev ) ;
iotlb_lock_get ( obj , & saved ) ;
for_each_iotlb_cr ( obj , num , i , tmp ) {
@ -456,7 +456,7 @@ __dump_tlb_entries(struct omap_iommu *obj, struct cr_regs *crs, int num)
}
iotlb_lock_set ( obj , & saved ) ;
clk_disable ( obj - > clk ) ;
pm_runtime_put_sync ( obj - > dev ) ;
return p - crs ;
}
@ -946,10 +946,6 @@ static int __devinit omap_iommu_probe(struct platform_device *pdev)
if ( ! obj )
return - ENOMEM ;
obj - > clk = clk_get ( & pdev - > dev , pdata - > clk_name ) ;
if ( IS_ERR ( obj - > clk ) )
goto err_clk ;
obj - > nr_tlb_entries = pdata - > nr_tlb_entries ;
obj - > name = pdata - > name ;
obj - > dev = & pdev - > dev ;
@ -992,6 +988,9 @@ static int __devinit omap_iommu_probe(struct platform_device *pdev)
goto err_irq ;
platform_set_drvdata ( pdev , obj ) ;
pm_runtime_irq_safe ( obj - > dev ) ;
pm_runtime_enable ( obj - > dev ) ;
dev_info ( & pdev - > dev , " %s registered \n " , obj - > name ) ;
return 0 ;
@ -1000,8 +999,6 @@ err_irq:
err_ioremap :
release_mem_region ( res - > start , resource_size ( res ) ) ;
err_mem :
clk_put ( obj - > clk ) ;
err_clk :
kfree ( obj ) ;
return err ;
}
@ -1022,7 +1019,8 @@ static int __devexit omap_iommu_remove(struct platform_device *pdev)
release_mem_region ( res - > start , resource_size ( res ) ) ;
iounmap ( obj - > regbase ) ;
clk_put ( obj - > clk ) ;
pm_runtime_disable ( obj - > dev ) ;
dev_info ( & pdev - > dev , " %s removed \n " , obj - > name ) ;
kfree ( obj ) ;
return 0 ;