mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
iio: accel: kionix-kx022a: Prevent memory leak and fix state
The driver allocates memory for samples at buffer enable path. If regmap
operation fails in the kx022a_fifo_enable() at the buffer enable path, the
allocated memory is never freed. Furthermore, the state information and
previous hardware configuration(s) aren't undone, potentially leaving
WMI interrupts and buffers enabled, or driver state flags wrong.
Free the memory and revert the hardware configuration and state flags on
error path.
Fixes: e7123a4dfc ("iio: accel: kionix-kx022a: Refactor driver and add chip_info structure")
Signed-off-by: Matti Vaittinen <mazziesaccount@gmail.com>
Reviewed-by: Mehdi Djait <mehdi.djait@linux.intel.com>
Cc: stable@vger.kernel.org
Signed-off-by: Jonathan Cameron <jonathan.cameron@oss.qualcomm.com>
This commit is contained in:
parent
8065a6c02f
commit
e65e128b51
|
|
@ -980,26 +980,44 @@ static int kx022a_fifo_enable(struct kx022a_data *data)
|
|||
guard(mutex)(&data->mutex);
|
||||
ret = __kx022a_turn_on_off(data, false);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_free_out;
|
||||
|
||||
/* Update watermark to HW */
|
||||
ret = kx022a_fifo_set_wmi(data);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_turn_on_out;
|
||||
|
||||
/* Enable buffer */
|
||||
ret = regmap_set_bits(data->regmap, data->chip_info->buf_cntl2,
|
||||
KX022A_MASK_BUF_EN);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_turn_on_out;
|
||||
|
||||
data->state |= KX022A_STATE_FIFO;
|
||||
ret = regmap_set_bits(data->regmap, data->ien_reg,
|
||||
KX022A_MASK_WMI);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_buf_disable_out;
|
||||
|
||||
return __kx022a_turn_on_off(data, true);
|
||||
ret = __kx022a_turn_on_off(data, true);
|
||||
if (ret)
|
||||
goto err_wmi_clear_out;
|
||||
|
||||
return ret;
|
||||
|
||||
err_wmi_clear_out:
|
||||
regmap_clear_bits(data->regmap, data->ien_reg,
|
||||
KX022A_MASK_WMI);
|
||||
err_buf_disable_out:
|
||||
regmap_clear_bits(data->regmap, data->chip_info->buf_cntl2,
|
||||
KX022A_MASK_BUF_EN);
|
||||
data->state &= ~KX022A_STATE_FIFO;
|
||||
err_turn_on_out:
|
||||
__kx022a_turn_on_off(data, true);
|
||||
err_free_out:
|
||||
kfree(data->fifo_buffer);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int kx022a_buffer_postenable(struct iio_dev *idev)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user