diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-07-15 01:39:35 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-07-15 01:39:35 -0400 |
commit | 96d0d831a50054bf3fb032fba4bc65006530e362 (patch) | |
tree | 16a25c55304475524ce668a1ea903884b902e9bc | |
parent | 1ef27400c52bf54b34261da49968343b6cb79e32 (diff) | |
parent | e8158b486d5f3f55cf372c5a32b42f263bf7f123 (diff) |
Merge tag 'devprop-fix-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull device properties framework fix from Rafael Wysocki:
"This fixes a problem with bool properties that could be seen as "true"
when the property was not present at all by adding a special helper
for bool properties with checks for all of the requisute conditions
(Sakari Ailus)"
* tag 'devprop-fix-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
device property: Introduce fwnode_call_bool_op() for ops that return bool
-rw-r--r-- | drivers/base/property.c | 6 | ||||
-rw-r--r-- | include/linux/fwnode.h | 4 |
2 files changed, 7 insertions, 3 deletions
diff --git a/drivers/base/property.c b/drivers/base/property.c index 692007e5a94b..edf02c1b5845 100644 --- a/drivers/base/property.c +++ b/drivers/base/property.c | |||
@@ -253,10 +253,10 @@ bool fwnode_property_present(struct fwnode_handle *fwnode, const char *propname) | |||
253 | { | 253 | { |
254 | bool ret; | 254 | bool ret; |
255 | 255 | ||
256 | ret = fwnode_call_int_op(fwnode, property_present, propname); | 256 | ret = fwnode_call_bool_op(fwnode, property_present, propname); |
257 | if (ret == false && !IS_ERR_OR_NULL(fwnode) && | 257 | if (ret == false && !IS_ERR_OR_NULL(fwnode) && |
258 | !IS_ERR_OR_NULL(fwnode->secondary)) | 258 | !IS_ERR_OR_NULL(fwnode->secondary)) |
259 | ret = fwnode_call_int_op(fwnode->secondary, property_present, | 259 | ret = fwnode_call_bool_op(fwnode->secondary, property_present, |
260 | propname); | 260 | propname); |
261 | return ret; | 261 | return ret; |
262 | } | 262 | } |
@@ -1027,7 +1027,7 @@ EXPORT_SYMBOL_GPL(fwnode_handle_put); | |||
1027 | */ | 1027 | */ |
1028 | bool fwnode_device_is_available(struct fwnode_handle *fwnode) | 1028 | bool fwnode_device_is_available(struct fwnode_handle *fwnode) |
1029 | { | 1029 | { |
1030 | return fwnode_call_int_op(fwnode, device_is_available); | 1030 | return fwnode_call_bool_op(fwnode, device_is_available); |
1031 | } | 1031 | } |
1032 | EXPORT_SYMBOL_GPL(fwnode_device_is_available); | 1032 | EXPORT_SYMBOL_GPL(fwnode_device_is_available); |
1033 | 1033 | ||
diff --git a/include/linux/fwnode.h b/include/linux/fwnode.h index 9ab375419189..50893a1646cf 100644 --- a/include/linux/fwnode.h +++ b/include/linux/fwnode.h | |||
@@ -99,6 +99,10 @@ struct fwnode_operations { | |||
99 | (fwnode ? (fwnode_has_op(fwnode, op) ? \ | 99 | (fwnode ? (fwnode_has_op(fwnode, op) ? \ |
100 | (fwnode)->ops->op(fwnode, ## __VA_ARGS__) : -ENXIO) : \ | 100 | (fwnode)->ops->op(fwnode, ## __VA_ARGS__) : -ENXIO) : \ |
101 | -EINVAL) | 101 | -EINVAL) |
102 | #define fwnode_call_bool_op(fwnode, op, ...) \ | ||
103 | (fwnode ? (fwnode_has_op(fwnode, op) ? \ | ||
104 | (fwnode)->ops->op(fwnode, ## __VA_ARGS__) : false) : \ | ||
105 | false) | ||
102 | #define fwnode_call_ptr_op(fwnode, op, ...) \ | 106 | #define fwnode_call_ptr_op(fwnode, op, ...) \ |
103 | (fwnode_has_op(fwnode, op) ? \ | 107 | (fwnode_has_op(fwnode, op) ? \ |
104 | (fwnode)->ops->op(fwnode, ## __VA_ARGS__) : NULL) | 108 | (fwnode)->ops->op(fwnode, ## __VA_ARGS__) : NULL) |