| From fc948409ccc1e8afe8655cee77c686eedbfbee60 Mon Sep 17 00:00:00 2001 |
| From: Gwendal Grignou <gwendal@chromium.org> |
| Date: Wed, 31 Mar 2021 11:22:22 -0700 |
| Subject: iio: sx9310: Fix write_.._debounce() |
| |
| From: Gwendal Grignou <gwendal@chromium.org> |
| |
| commit fc948409ccc1e8afe8655cee77c686eedbfbee60 upstream. |
| |
| Check input to be sure it matches Semtech sx9310 specification and |
| can fit into debounce register. |
| Compare argument writen to thresh_.._period with read from same |
| sysfs attribute: |
| |
| Before: Afer: |
| write | read write | read |
| -1 | 8 -1 fails: -EINVAL |
| 0 | 8 0 | 0 |
| 1 | 0 1 | 0 |
| 2..15 | 2^log2(N) 2..15 | 2^log2(N) |
| 16 | 0 >= 16 fails: -EINVAL |
| |
| Fixes: 1b6872015f0b ("iio: sx9310: Support setting debounce values") |
| Signed-off-by: Gwendal Grignou <gwendal@chromium.org> |
| Cc: stable@vger.kernel.org |
| Reviewed-by: Stephen Boyd <swboyd@chromium.org> |
| Link: https://lore.kernel.org/r/20210331182222.219533-1-gwendal@chromium.org |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/iio/proximity/sx9310.c | 12 ++++++++++-- |
| 1 file changed, 10 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/iio/proximity/sx9310.c |
| +++ b/drivers/iio/proximity/sx9310.c |
| @@ -763,7 +763,11 @@ static int sx9310_write_far_debounce(str |
| int ret; |
| unsigned int regval; |
| |
| - val = ilog2(val); |
| + if (val > 0) |
| + val = ilog2(val); |
| + if (!FIELD_FIT(SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK, val)) |
| + return -EINVAL; |
| + |
| regval = FIELD_PREP(SX9310_REG_PROX_CTRL10_FAR_DEBOUNCE_MASK, val); |
| |
| mutex_lock(&data->mutex); |
| @@ -780,7 +784,11 @@ static int sx9310_write_close_debounce(s |
| int ret; |
| unsigned int regval; |
| |
| - val = ilog2(val); |
| + if (val > 0) |
| + val = ilog2(val); |
| + if (!FIELD_FIT(SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK, val)) |
| + return -EINVAL; |
| + |
| regval = FIELD_PREP(SX9310_REG_PROX_CTRL10_CLOSE_DEBOUNCE_MASK, val); |
| |
| mutex_lock(&data->mutex); |