aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
authorBenjamin Tissoires <benjamin.tissoires@redhat.com>2016-09-30 19:42:19 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2016-10-03 19:41:00 -0400
commit265d426d7470d53e900379960eef5b4482125089 (patch)
treeb29fc943d424476a178f473889e6c665965da28a /drivers/input
parent979987ded3a5ae1fb60ef751bdf185c502d70590 (diff)
Input: elan_i2c - fix return tests of i2c_smbus_read_block_data()
i2c_smbus_read_block_data() returns negative errno else the number of data bytes in the slave's response. Checking for error not null means the function always fails if the device answers properly. So given that we read 3 bytes and access those, better check that we actually read those 3 bytes. Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/mouse/elan_i2c_smbus.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/input/mouse/elan_i2c_smbus.c b/drivers/input/mouse/elan_i2c_smbus.c
index cb6aecbc1dc2..e23b2495d52e 100644
--- a/drivers/input/mouse/elan_i2c_smbus.c
+++ b/drivers/input/mouse/elan_i2c_smbus.c
@@ -222,11 +222,13 @@ static int elan_smbus_get_checksum(struct i2c_client *client,
222static int elan_smbus_get_max(struct i2c_client *client, 222static int elan_smbus_get_max(struct i2c_client *client,
223 unsigned int *max_x, unsigned int *max_y) 223 unsigned int *max_x, unsigned int *max_y)
224{ 224{
225 int ret;
225 int error; 226 int error;
226 u8 val[3]; 227 u8 val[3];
227 228
228 error = i2c_smbus_read_block_data(client, ETP_SMBUS_RANGE_CMD, val); 229 ret = i2c_smbus_read_block_data(client, ETP_SMBUS_RANGE_CMD, val);
229 if (error) { 230 if (ret != 3) {
231 error = ret < 0 ? ret : -EIO;
230 dev_err(&client->dev, "failed to get dimensions: %d\n", error); 232 dev_err(&client->dev, "failed to get dimensions: %d\n", error);
231 return error; 233 return error;
232 } 234 }
@@ -240,12 +242,13 @@ static int elan_smbus_get_max(struct i2c_client *client,
240static int elan_smbus_get_resolution(struct i2c_client *client, 242static int elan_smbus_get_resolution(struct i2c_client *client,
241 u8 *hw_res_x, u8 *hw_res_y) 243 u8 *hw_res_x, u8 *hw_res_y)
242{ 244{
245 int ret;
243 int error; 246 int error;
244 u8 val[3]; 247 u8 val[3];
245 248
246 error = i2c_smbus_read_block_data(client, 249 ret = i2c_smbus_read_block_data(client, ETP_SMBUS_RESOLUTION_CMD, val);
247 ETP_SMBUS_RESOLUTION_CMD, val); 250 if (ret != 3) {
248 if (error) { 251 error = ret < 0 ? ret : -EIO;
249 dev_err(&client->dev, "failed to get resolution: %d\n", error); 252 dev_err(&client->dev, "failed to get resolution: %d\n", error);
250 return error; 253 return error;
251 } 254 }
@@ -260,12 +263,13 @@ static int elan_smbus_get_num_traces(struct i2c_client *client,
260 unsigned int *x_traces, 263 unsigned int *x_traces,
261 unsigned int *y_traces) 264 unsigned int *y_traces)
262{ 265{
266 int ret;
263 int error; 267 int error;
264 u8 val[3]; 268 u8 val[3];
265 269
266 error = i2c_smbus_read_block_data(client, 270 ret = i2c_smbus_read_block_data(client, ETP_SMBUS_XY_TRACENUM_CMD, val);
267 ETP_SMBUS_XY_TRACENUM_CMD, val); 271 if (ret != 3) {
268 if (error) { 272 error = ret < 0 ? ret : -EIO;
269 dev_err(&client->dev, "failed to get trace info: %d\n", error); 273 dev_err(&client->dev, "failed to get trace info: %d\n", error);
270 return error; 274 return error;
271 } 275 }