| 
									
										
										
										
											2011-12-27 18:28:50 +01:00
										 |  |  | /// 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: | 
					
						
							| 
									
										
										
										
											2013-06-20 13:10:56 +02:00
										 |  |  | // Options: --no-includes --include-headers | 
					
						
							| 
									
										
										
										
											2011-12-27 18:28:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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) |