aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-07-15 01:39:35 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-07-15 01:39:35 -0400
commit96d0d831a50054bf3fb032fba4bc65006530e362 (patch)
tree16a25c55304475524ce668a1ea903884b902e9bc
parent1ef27400c52bf54b34261da49968343b6cb79e32 (diff)
parente8158b486d5f3f55cf372c5a32b42f263bf7f123 (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.c6
-rw-r--r--include/linux/fwnode.h4
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 */
1028bool fwnode_device_is_available(struct fwnode_handle *fwnode) 1028bool 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}
1032EXPORT_SYMBOL_GPL(fwnode_device_is_available); 1032EXPORT_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)