lkml.org 
[lkml]   [2021]   [Oct]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.14 081/151] Input: resistive-adc-touch - fix division by zero error on z1 == 0
    Date
    From: Oleksij Rempel <o.rempel@pengutronix.de>

    commit fe0a7e3d012738b0034b3c97ddb0e8bc0a3ff0e6 upstream.

    For proper pressure calculation we need at least x and z1 to be non
    zero. Even worse, in case z1 we may run in to division by zero
    error.

    Fixes: 60b7db914ddd ("Input: resistive-adc-touch - rework mapping of channels")
    Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
    Link: https://lore.kernel.org/r/20211007095727.29579-1-o.rempel@pengutronix.de
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/input/touchscreen/resistive-adc-touch.c | 29 +++++++++++++-----------
    1 file changed, 16 insertions(+), 13 deletions(-)

    --- a/drivers/input/touchscreen/resistive-adc-touch.c
    +++ b/drivers/input/touchscreen/resistive-adc-touch.c
    @@ -71,19 +71,22 @@ static int grts_cb(const void *data, voi
    unsigned int z2 = touch_info[st->ch_map[GRTS_CH_Z2]];
    unsigned int Rt;

    - Rt = z2;
    - Rt -= z1;
    - Rt *= st->x_plate_ohms;
    - Rt = DIV_ROUND_CLOSEST(Rt, 16);
    - Rt *= x;
    - Rt /= z1;
    - Rt = DIV_ROUND_CLOSEST(Rt, 256);
    - /*
    - * On increased pressure the resistance (Rt) is decreasing
    - * so, convert values to make it looks as real pressure.
    - */
    - if (Rt < GRTS_DEFAULT_PRESSURE_MAX)
    - press = GRTS_DEFAULT_PRESSURE_MAX - Rt;
    + if (likely(x && z1)) {
    + Rt = z2;
    + Rt -= z1;
    + Rt *= st->x_plate_ohms;
    + Rt = DIV_ROUND_CLOSEST(Rt, 16);
    + Rt *= x;
    + Rt /= z1;
    + Rt = DIV_ROUND_CLOSEST(Rt, 256);
    + /*
    + * On increased pressure the resistance (Rt) is
    + * decreasing so, convert values to make it looks as
    + * real pressure.
    + */
    + if (Rt < GRTS_DEFAULT_PRESSURE_MAX)
    + press = GRTS_DEFAULT_PRESSURE_MAX - Rt;
    + }
    }

    if ((!x && !y) || (st->pressure && (press < st->pressure_min))) {

    \
     
     \ /
      Last update: 2021-10-18 15:56    [W:4.100 / U:0.664 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site