lkml.org 
[lkml]   [2016]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 031/114] Input: pmic8xxx-pwrkey - fix algorithm for converting trigger delay
    3.16.36-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Stephen Boyd <sboyd@codeaurora.org>

    commit eda5ecc0a6b865561997e177c393f0b0136fe3b7 upstream.

    The trigger delay algorithm that converts from microseconds to
    the register value looks incorrect. According to most of the PMIC
    documentation, the equation is

    delay (Seconds) = (1 / 1024) * 2 ^ (x + 4)

    except for one case where the documentation looks to have a
    formatting issue and the equation looks like

    delay (Seconds) = (1 / 1024) * 2 x + 4

    Most likely this driver was written with the improper
    documentation to begin with. According to the downstream sources
    the valid delays are from 2 seconds to 1/64 second, and the
    latter equation just doesn't make sense for that. Let's fix the
    algorithm and the range check to match the documentation and the
    downstream sources.

    Reported-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Fixes: 92d57a73e410 ("input: Add support for Qualcomm PMIC8XXX power key")
    Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
    Tested-by: John Stultz <john.stultz@linaro.org>
    Acked-by: Bjorn Andersson <bjorn.andersson@linaro.org>
    Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/input/misc/pmic8xxx-pwrkey.c | 7 ++++---
    1 file changed, 4 insertions(+), 3 deletions(-)

    --- a/drivers/input/misc/pmic8xxx-pwrkey.c
    +++ b/drivers/input/misc/pmic8xxx-pwrkey.c
    @@ -94,7 +94,8 @@ static int pmic8xxx_pwrkey_probe(struct
    if (of_property_read_u32(pdev->dev.of_node, "debounce", &kpd_delay))
    kpd_delay = 15625;

    - if (kpd_delay > 62500 || kpd_delay == 0) {
    + /* Valid range of pwr key trigger delay is 1/64 sec to 2 seconds. */
    + if (kpd_delay > USEC_PER_SEC * 2 || kpd_delay < USEC_PER_SEC / 64) {
    dev_err(&pdev->dev, "invalid power key trigger delay\n");
    return -EINVAL;
    }
    @@ -124,8 +125,8 @@ static int pmic8xxx_pwrkey_probe(struct
    pwr->name = "pmic8xxx_pwrkey";
    pwr->phys = "pmic8xxx_pwrkey/input0";

    - delay = (kpd_delay << 10) / USEC_PER_SEC;
    - delay = 1 + ilog2(delay);
    + delay = (kpd_delay << 6) / USEC_PER_SEC;
    + delay = ilog2(delay);

    err = regmap_read(regmap, PON_CNTL_1, &pon_cntl);
    if (err < 0) {
    \
     
     \ /
      Last update: 2016-06-13 21:21    [W:4.126 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site