devm_request_and_ioremap.cocci 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /// Reimplement a call to devm_request_mem_region followed by a call to ioremap
  2. /// or ioremap_nocache by a call to devm_request_and_ioremap.
  3. /// Devm_request_and_ioremap was introduced in
  4. /// 72f8c0bfa0de64c68ee59f40eb9b2683bffffbb0. It makes the code much more
  5. /// concise.
  6. ///
  7. ///
  8. // Confidence: High
  9. // Copyright: (C) 2011 Julia Lawall, INRIA/LIP6. GPLv2.
  10. // Copyright: (C) 2011 Gilles Muller, INRIA/LiP6. GPLv2.
  11. // URL: http://coccinelle.lip6.fr/
  12. // Comments:
  13. // Options: -no_includes -include_headers
  14. virtual patch
  15. virtual org
  16. virtual report
  17. virtual context
  18. @nm@
  19. expression myname;
  20. identifier i;
  21. @@
  22. struct platform_driver i = { .driver = { .name = myname } };
  23. @depends on patch@
  24. expression dev,res,size;
  25. @@
  26. -if (!devm_request_mem_region(dev, res->start, size,
  27. - \(res->name\|dev_name(dev)\))) {
  28. - ...
  29. - return ...;
  30. -}
  31. ... when != res->start
  32. (
  33. -devm_ioremap(dev,res->start,size)
  34. +devm_request_and_ioremap(dev,res)
  35. |
  36. -devm_ioremap_nocache(dev,res->start,size)
  37. +devm_request_and_ioremap(dev,res)
  38. )
  39. ... when any
  40. when != res->start
  41. // this rule is separate from the previous one, because a single file can
  42. // have multiple values of myname
  43. @depends on patch@
  44. expression dev,res,size;
  45. expression nm.myname;
  46. @@
  47. -if (!devm_request_mem_region(dev, res->start, size,myname)) {
  48. - ...
  49. - return ...;
  50. -}
  51. ... when != res->start
  52. (
  53. -devm_ioremap(dev,res->start,size)
  54. +devm_request_and_ioremap(dev,res)
  55. |
  56. -devm_ioremap_nocache(dev,res->start,size)
  57. +devm_request_and_ioremap(dev,res)
  58. )
  59. ... when any
  60. when != res->start
  61. @pb depends on org || report || context@
  62. expression dev,res,size;
  63. expression nm.myname;
  64. position p1,p2;
  65. @@
  66. *if
  67. (!devm_request_mem_region@p1(dev, res->start, size,
  68. \(res->name\|dev_name(dev)\|myname\))) {
  69. ...
  70. return ...;
  71. }
  72. ... when != res->start
  73. (
  74. *devm_ioremap@p2(dev,res->start,size)
  75. |
  76. *devm_ioremap_nocache@p2(dev,res->start,size)
  77. )
  78. ... when any
  79. when != res->start
  80. @script:python depends on org@
  81. p1 << pb.p1;
  82. p2 << pb.p2;
  83. @@
  84. cocci.print_main("INFO: replace by devm_request_and_ioremap",p1)
  85. cocci.print_secs("",p2)
  86. @script:python depends on report@
  87. p1 << pb.p1;
  88. p2 << pb.p2;
  89. @@
  90. msg = "INFO: devm_request_mem_region followed by ioremap on line %s can be replaced by devm_request_and_ioremap" % (p2[0].line)
  91. coccilib.report.print_report(p1[0],msg)