[PATCH 02/11] Input: iqs7222 - report malformed properties

Jeff LaBundy
2022-09-08T13:17:10Z

Nonzero return values of several calls to fwnode_property_read_u32()
are silenty ignored, leaving no way to know that the properties were
not applied in the event of an error.

To solve this problem, follow the design pattern used throughout the
rest of the driver by first checking if the property is present, and
then evaluating the return value of fwnode_property_read_u32().

Fixes: e505edaedcb9 ("Input: add support for Azoteq IQS7222A/B/C")
Signed-off-by: Jeff LaBundy <jeff@labundy.com>
---
drivers/input/misc/iqs7222.c | 65 ++++++++++++++++++++++++++++++------
1 file changed, 55 insertions(+), 10 deletions(-)

diff --git a/drivers/input/misc/iqs7222.c b/drivers/input/misc/iqs7222.c
index 04c1050d845c..fdade24caa8a 100644
--- a/drivers/input/misc/iqs7222.c
+++ b/drivers/input/misc/iqs7222.c
@@ -1819,8 +1819,17 @@ static int iqs7222_parse_chan(struct iqs7222_private *iqs7222, int chan_index)
chan_setup[0] |= IQS7222_CHAN_SETUP_0_REF_MODE_FOLLOW;
chan_setup[4] = val * 42 + 1048;

- if (!fwnode_property_read_u32(chan_node, "azoteq,ref-weight",
- &val)) {
+ if (fwnode_property_present(chan_node, "azoteq,ref-weight")) {
+ error = fwnode_property_read_u32(chan_node,
+ "azoteq,ref-weight",
+ &val);
+ if (error) {
+ dev_err(&client->dev,
+ "Failed to read %s reference weight: %d\n",
+ fwnode_get_name(chan_node), error);
+ goto put_chan_node;
+ }
+
if (val > U16_MAX) {
dev_err(&client->dev,
"Invalid %s reference weight: %u\n",
@@ -1921,9 +1930,8 @@ static int iqs7222_parse_chan(struct iqs7222_private *iqs7222, int chan_index)
goto put_chan_node;
}

- if (!fwnode_property_read_u32(event_node,
- "azoteq,timeout-press-ms",
- &val)) {
+ if (fwnode_property_present(event_node,
+ "azoteq,timeout-press-ms")) {
/*
* The IQS7222B employs a global pair of press timeout
* registers as opposed to channel-specific registers.
@@ -1933,6 +1941,17 @@ static int iqs7222_parse_chan(struct iqs7222_private *iqs7222, int chan_index)
&iqs7222->btn_setup[chan_index][2] :
&sys_setup[9];

+ error = fwnode_property_read_u32(event_node,
+ "azoteq,timeout-press-ms",
+ &val);
+ if (error) {
+ dev_err(&client->dev,
+ "Failed to read %s press timeout: %d\n",
+ fwnode_get_name(chan_node), error);
+ fwnode_handle_put(event_node);
+ goto put_chan_node;
+ }
+
if (val > U8_MAX * 500) {
dev_err(&client->dev,
"Invalid %s press timeout: %u\n",
@@ -2098,7 +2117,15 @@ static int iqs7222_parse_sldr(struct iqs7222_private *iqs7222, int sldr_index)
if (fwnode_property_present(sldr_node, "azoteq,use-prox"))
sldr_setup[4 + reg_offset] -= 2;

- if (!fwnode_property_read_u32(sldr_node, "azoteq,slider-size", &val)) {
+ if (fwnode_property_present(sldr_node, "azoteq,slider-size")) {
+ error = fwnode_property_read_u32(sldr_node,
+ "azoteq,slider-size", &val);
+ if (error) {
+ dev_err(&client->dev, "Failed to read %s size: %d\n",
+ fwnode_get_name(sldr_node), error);
+ goto put_sldr_node;
+ }
+
if (!val || val > dev_desc->sldr_res) {
dev_err(&client->dev, "Invalid %s size: %u\n",
fwnode_get_name(sldr_node), val);
@@ -2115,7 +2142,16 @@ static int iqs7222_parse_sldr(struct iqs7222_private *iqs7222, int sldr_index)
}
}

- if (!fwnode_property_read_u32(sldr_node, "azoteq,top-speed", &val)) {
+ if (fwnode_property_present(sldr_node, "azoteq,top-speed")) {
+ error = fwnode_property_read_u32(sldr_node,
+ "azoteq,top-speed", &val);
+ if (error) {
+ dev_err(&client->dev,
+ "Failed to read %s top speed: %d\n",
+ fwnode_get_name(sldr_node), error);
+ goto put_sldr_node;
+ }
+
if (val > (reg_offset ? U16_MAX : U8_MAX * 4)) {
dev_err(&client->dev, "Invalid %s top speed: %u\n",
fwnode_get_name(sldr_node), val);
@@ -2131,10 +2167,19 @@ static int iqs7222_parse_sldr(struct iqs7222_private *iqs7222, int sldr_index)
}
}

- if (!fwnode_property_read_u32(sldr_node, "linux,axis", &val)) {
- u16 sldr_max = sldr_setup[3] - 1;
+ if (fwnode_property_present(sldr_node, "linux,axis")) {
+ u16 sldr_max;
+
+ error = fwnode_property_read_u32(sldr_node, "linux,axis", &val);
+ if (error) {
+ dev_err(&client->dev, "Failed to read %s axis: %d\n",
+ fwnode_get_name(sldr_node), error);
+ goto put_sldr_node;
+ }

- if (!reg_offset) {
+ if (reg_offset) {
+ sldr_max = sldr_setup[3] - 1;
+ } else {
sldr_max = sldr_setup[2];

sldr_max &= IQS7222_SLDR_SETUP_2_RES_MASK;
--
2.25.1