lib: devres: Introduce devm_ioremap_resource()

The devm_request_and_ioremap() function is very useful and helps avoid a
whole lot of boilerplate. However, one issue that keeps popping up is
its lack of a specific error code to determine which of the steps that
it performs failed. Furthermore, while the function gives an example and
suggests what error code to return on failure, a wide variety of error
codes are used throughout the tree.

In an attempt to fix these problems, this patch adds a new function that
drivers can transition to. The devm_ioremap_resource() returns a pointer
to the remapped I/O memory on success or an ERR_PTR() encoded error code
on failure. Callers can check for failure using IS_ERR() and determine
its cause by extracting the error code using PTR_ERR().

devm_request_and_ioremap() is implemented as a wrapper around the new
API and return NULL on failure as before. This ensures that backwards
compatibility is maintained until all users have been converted to the
new API, at which point the old devm_request_and_ioremap() function
should be removed.

A semantic patch is included which can be used to convert from the old
devm_request_and_ioremap() API to the new devm_ioremap_resource() API.
Some non-trivial cases may require manual intervention, though.

Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
Cc: Arnd Bergmann <arnd@arndb.de>
Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Thierry Reding
2013-01-21 11:08:54 +01:00
committed by Greg Kroah-Hartman
parent 771d394fbd
commit 75096579c3
4 changed files with 151 additions and 28 deletions

View File

@ -0,0 +1,90 @@
virtual patch
virtual report
@depends on patch@
expression base, dev, res;
@@
-base = devm_request_and_ioremap(dev, res);
+base = devm_ioremap_resource(dev, res);
...
if (
-base == NULL
+IS_ERR(base)
|| ...) {
<...
- return ...;
+ return PTR_ERR(base);
...>
}
@depends on patch@
expression e, E, ret;
identifier l;
@@
e = devm_ioremap_resource(...);
...
if (IS_ERR(e) || ...) {
... when any
- ret = E;
+ ret = PTR_ERR(e);
...
(
return ret;
|
goto l;
)
}
@depends on patch@
expression e;
@@
e = devm_ioremap_resource(...);
...
if (IS_ERR(e) || ...) {
...
- \(dev_dbg\|dev_err\|pr_debug\|pr_err\|DRM_ERROR\)(...);
...
}
@depends on patch@
expression e;
identifier l;
@@
e = devm_ioremap_resource(...);
...
if (IS_ERR(e) || ...)
-{
(
return ...;
|
goto l;
)
-}
@r depends on report@
expression e;
identifier l;
position p1;
@@
*e = devm_request_and_ioremap@p1(...);
...
if (e == NULL || ...) {
...
(
return ...;
|
goto l;
)
}
@script:python depends on r@
p1 << r.p1;
@@
msg = "ERROR: deprecated devm_request_and_ioremap() API used on line %s" % (p1[0].line)
coccilib.report.print_report(p1[0], msg)