devm_ functions allocate memory that is to remain allocated until the device is detached. This patch checks for opportunities for using the function devm_request_and_ioremap. Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr> Signed-off-by: Michal Marek <mmarek@suse.cz>
		
			
				
	
	
		
			105 lines
		
	
	
	
		
			2.3 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
	
		
			2.3 KiB
			
		
	
	
	
		
			Text
		
	
	
	
	
	
/// Reimplement a call to devm_request_mem_region followed by a call to ioremap
 | 
						|
/// or ioremap_nocache by a call to devm_request_and_ioremap.
 | 
						|
/// Devm_request_and_ioremap was introduced in
 | 
						|
/// 72f8c0bfa0de64c68ee59f40eb9b2683bffffbb0.  It makes the code much more
 | 
						|
/// concise.
 | 
						|
///
 | 
						|
///
 | 
						|
// Confidence: High
 | 
						|
// Copyright: (C) 2011 Julia Lawall, INRIA/LIP6.  GPLv2.
 | 
						|
// Copyright: (C) 2011 Gilles Muller, INRIA/LiP6.  GPLv2.
 | 
						|
// URL: http://coccinelle.lip6.fr/
 | 
						|
// Comments:
 | 
						|
// Options: -no_includes -include_headers
 | 
						|
 | 
						|
virtual patch
 | 
						|
virtual org
 | 
						|
virtual report
 | 
						|
virtual context
 | 
						|
 | 
						|
@nm@
 | 
						|
expression myname;
 | 
						|
identifier i;
 | 
						|
@@
 | 
						|
 | 
						|
struct platform_driver i = { .driver = { .name = myname } };
 | 
						|
 | 
						|
@depends on patch@
 | 
						|
expression dev,res,size;
 | 
						|
@@
 | 
						|
 | 
						|
-if (!devm_request_mem_region(dev, res->start, size,
 | 
						|
-                              \(res->name\|dev_name(dev)\))) {
 | 
						|
-   ...
 | 
						|
-   return ...;
 | 
						|
-}
 | 
						|
... when != res->start
 | 
						|
(
 | 
						|
-devm_ioremap(dev,res->start,size)
 | 
						|
+devm_request_and_ioremap(dev,res)
 | 
						|
|
 | 
						|
-devm_ioremap_nocache(dev,res->start,size)
 | 
						|
+devm_request_and_ioremap(dev,res)
 | 
						|
)
 | 
						|
... when any
 | 
						|
    when != res->start
 | 
						|
 | 
						|
// this rule is separate from the previous one, because a single file can
 | 
						|
// have multiple values of myname
 | 
						|
@depends on patch@
 | 
						|
expression dev,res,size;
 | 
						|
expression nm.myname;
 | 
						|
@@
 | 
						|
 | 
						|
-if (!devm_request_mem_region(dev, res->start, size,myname)) {
 | 
						|
-   ...
 | 
						|
-   return ...;
 | 
						|
-}
 | 
						|
... when != res->start
 | 
						|
(
 | 
						|
-devm_ioremap(dev,res->start,size)
 | 
						|
+devm_request_and_ioremap(dev,res)
 | 
						|
|
 | 
						|
-devm_ioremap_nocache(dev,res->start,size)
 | 
						|
+devm_request_and_ioremap(dev,res)
 | 
						|
)
 | 
						|
... when any
 | 
						|
    when != res->start
 | 
						|
 | 
						|
 | 
						|
@pb depends on org || report || context@
 | 
						|
expression dev,res,size;
 | 
						|
expression nm.myname;
 | 
						|
position p1,p2;
 | 
						|
@@
 | 
						|
 | 
						|
*if
 | 
						|
  (!devm_request_mem_region@p1(dev, res->start, size,
 | 
						|
                              \(res->name\|dev_name(dev)\|myname\))) {
 | 
						|
   ...
 | 
						|
   return ...;
 | 
						|
}
 | 
						|
... when != res->start
 | 
						|
(
 | 
						|
*devm_ioremap@p2(dev,res->start,size)
 | 
						|
|
 | 
						|
*devm_ioremap_nocache@p2(dev,res->start,size)
 | 
						|
)
 | 
						|
... when any
 | 
						|
    when != res->start
 | 
						|
 | 
						|
@script:python depends on org@
 | 
						|
p1 << pb.p1;
 | 
						|
p2 << pb.p2;
 | 
						|
@@
 | 
						|
 | 
						|
cocci.print_main("INFO: replace by devm_request_and_ioremap",p1)
 | 
						|
cocci.print_secs("",p2)
 | 
						|
 | 
						|
@script:python depends on report@
 | 
						|
p1 << pb.p1;
 | 
						|
p2 << pb.p2;
 | 
						|
@@
 | 
						|
 | 
						|
msg = "INFO: devm_request_mem_region followed by ioremap on line %s can be replaced by devm_request_and_ioremap" % (p2[0].line)
 | 
						|
coccilib.report.print_report(p1[0],msg)
 |