mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-05-26 11:40:24 +02:00
iio: imu: bmi160: Remove potential undefined behavior in bmi160_config_pin()
If 'pin' is not one of its expected values, the value of
'int_out_ctrl_shift' is undefined. With UBSAN enabled, this causes
Clang to generate undefined behavior, resulting in the following
warning:
drivers/iio/imu/bmi160/bmi160_core.o: warning: objtool: bmi160_setup_irq() falls through to next function __cfi_bmi160_core_runtime_resume()
Prevent the UB and improve error handling by returning an error if 'pin'
has an unexpected value.
While at it, simplify the code a bit by moving the 'pin_name' assignment
to the first switch statement.
Fixes: 895bf81e6b ("iio:bmi160: add drdy interrupt support")
Reported-by: Arnd Bergmann <arnd@arndb.de>
Closes: https://lore.kernel.org/a426d669-58bb-4be1-9eaa-6f3d83109e2d@app.fastmail.com
Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
committed by
Jonathan Cameron
parent
79a86a6cc3
commit
c05a87d9ec
@@ -573,12 +573,16 @@ static int bmi160_config_pin(struct regmap *regmap, enum bmi160_int_pin pin,
|
||||
int_out_ctrl_shift = BMI160_INT1_OUT_CTRL_SHIFT;
|
||||
int_latch_mask = BMI160_INT1_LATCH_MASK;
|
||||
int_map_mask = BMI160_INT1_MAP_DRDY_EN;
|
||||
pin_name = "INT1";
|
||||
break;
|
||||
case BMI160_PIN_INT2:
|
||||
int_out_ctrl_shift = BMI160_INT2_OUT_CTRL_SHIFT;
|
||||
int_latch_mask = BMI160_INT2_LATCH_MASK;
|
||||
int_map_mask = BMI160_INT2_MAP_DRDY_EN;
|
||||
pin_name = "INT2";
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
int_out_ctrl_mask = BMI160_INT_OUT_CTRL_MASK << int_out_ctrl_shift;
|
||||
|
||||
@@ -612,17 +616,8 @@ static int bmi160_config_pin(struct regmap *regmap, enum bmi160_int_pin pin,
|
||||
ret = bmi160_write_conf_reg(regmap, BMI160_REG_INT_MAP,
|
||||
int_map_mask, int_map_mask,
|
||||
write_usleep);
|
||||
if (ret) {
|
||||
switch (pin) {
|
||||
case BMI160_PIN_INT1:
|
||||
pin_name = "INT1";
|
||||
break;
|
||||
case BMI160_PIN_INT2:
|
||||
pin_name = "INT2";
|
||||
break;
|
||||
}
|
||||
if (ret)
|
||||
dev_err(dev, "Failed to configure %s IRQ pin", pin_name);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user