| /// 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) |